Statistics
| Branch: | Revision:

ffmpeg / libavfilter / libmpcodecs / vf_qp.c @ e4852fb3

History | View | Annotate | Download (5.38 KB)

1
/*
2
 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
3
 *
4
 * This file is part of MPlayer.
5
 *
6
 * MPlayer is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * MPlayer is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License along
17
 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
 */
20

    
21
#include <stdio.h>
22
#include <stdlib.h>
23
#include <string.h>
24
#include <math.h>
25
#include <inttypes.h>
26

    
27
#include "mp_msg.h"
28
#include "cpudetect.h"
29
#include "img_format.h"
30
#include "mp_image.h"
31
#include "vf.h"
32
#include "libvo/fastmemcpy.h"
33

    
34
#include "libavcodec/avcodec.h"
35
#include "libavutil/eval.h"
36

    
37

    
38
struct vf_priv_s {
39
        char eq[200];
40
        int8_t *qp;
41
        int8_t lut[257];
42
        int qp_stride;
43
};
44

    
45
static int config(struct vf_instance *vf,
46
        int width, int height, int d_width, int d_height,
47
        unsigned int flags, unsigned int outfmt){
48
        int h= (height+15)>>4;
49
        int i;
50

    
51
        vf->priv->qp_stride= (width+15)>>4;
52
        vf->priv->qp= av_malloc(vf->priv->qp_stride*h*sizeof(int8_t));
53

    
54
        for(i=-129; i<128; i++){
55
            double const_values[]={
56
                M_PI,
57
                M_E,
58
                i != -129,
59
                i,
60
                0
61
            };
62
            static const char *const_names[]={
63
                "PI",
64
                "E",
65
                "known",
66
                "qp",
67
                NULL
68
            };
69
            double temp_val;
70
            int res;
71

    
72
            res= av_parse_and_eval_expr(&temp_val, vf->priv->eq, const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, NULL);
73

    
74
            if (res < 0){
75
                mp_msg(MSGT_VFILTER, MSGL_ERR, "qp: Error evaluating \"%s\" \n", vf->priv->eq);
76
                return 0;
77
            }
78
            vf->priv->lut[i+129]= lrintf(temp_val);
79
        }
80

    
81
        return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt);
82
}
83

    
84
static void get_image(struct vf_instance *vf, mp_image_t *mpi){
85
    if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
86
    // ok, we can do pp in-place (or pp disabled):
87
    vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
88
        mpi->type, mpi->flags, mpi->w, mpi->h);
89
    mpi->planes[0]=vf->dmpi->planes[0];
90
    mpi->stride[0]=vf->dmpi->stride[0];
91
    mpi->width=vf->dmpi->width;
92
    if(mpi->flags&MP_IMGFLAG_PLANAR){
93
        mpi->planes[1]=vf->dmpi->planes[1];
94
        mpi->planes[2]=vf->dmpi->planes[2];
95
        mpi->stride[1]=vf->dmpi->stride[1];
96
        mpi->stride[2]=vf->dmpi->stride[2];
97
    }
98
    mpi->flags|=MP_IMGFLAG_DIRECT;
99
}
100

    
101
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){
102
        mp_image_t *dmpi;
103
        int x,y;
104

    
105
        if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
106
                // no DR, so get a new image! hope we'll get DR buffer:
107
                vf->dmpi=vf_get_image(vf->next,mpi->imgfmt,
108
                MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE,
109
                mpi->w,mpi->h);
110
        }
111

    
112
        dmpi= vf->dmpi;
113

    
114
        if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
115
                memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]);
116
                    if(mpi->flags&MP_IMGFLAG_PLANAR){
117
                    memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]);
118
                    memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]);
119
                }
120
        }
121
        vf_clone_mpi_attributes(dmpi, mpi);
122

    
123
        dmpi->qscale = vf->priv->qp;
124
        dmpi->qstride= vf->priv->qp_stride;
125
        if(mpi->qscale){
126
            for(y=0; y<((dmpi->h+15)>>4); y++){
127
                for(x=0; x<vf->priv->qp_stride; x++){
128
                    dmpi->qscale[x + dmpi->qstride*y]=
129
                        vf->priv->lut[ 129 + ((int8_t)mpi->qscale[x + mpi->qstride*y]) ];
130
                }
131
            }
132
        }else{
133
            int qp= vf->priv->lut[0];
134
            for(y=0; y<((dmpi->h+15)>>4); y++){
135
                for(x=0; x<vf->priv->qp_stride; x++){
136
                    dmpi->qscale[x + dmpi->qstride*y]= qp;
137
                }
138
            }
139
        }
140

    
141
        return vf_next_put_image(vf,dmpi, pts);
142
}
143

    
144
static void uninit(struct vf_instance *vf){
145
        if(!vf->priv) return;
146

    
147
        av_free(vf->priv->qp);
148
        vf->priv->qp= NULL;
149

    
150
        av_free(vf->priv);
151
        vf->priv=NULL;
152
}
153

    
154
//===========================================================================//
155
static int vf_open(vf_instance_t *vf, char *args){
156
    vf->config=config;
157
    vf->put_image=put_image;
158
    vf->get_image=get_image;
159
    vf->uninit=uninit;
160
    vf->priv=av_malloc(sizeof(struct vf_priv_s));
161
    memset(vf->priv, 0, sizeof(struct vf_priv_s));
162

    
163
//    avcodec_init();
164

    
165
    if (args) strncpy(vf->priv->eq, args, 199);
166

    
167
    return 1;
168
}
169

    
170
const vf_info_t vf_info_qp = {
171
    "QP changer",
172
    "qp",
173
    "Michael Niedermayer",
174
    "",
175
    vf_open,
176
    NULL
177
};