33 #include "libavutil/mem.h"
34 #include "libavcodec/avcodec.h"
42 #define XMIN(a,b) ((a) < (b) ? (a) : (b))
48 { 0*4, 48*4, 12*4, 60*4, 3*4, 51*4, 15*4, 63*4, },
49 { 32*4, 16*4, 44*4, 28*4, 35*4, 19*4, 47*4, 31*4, },
50 { 8*4, 56*4, 4*4, 52*4, 11*4, 59*4, 7*4, 55*4, },
51 { 40*4, 24*4, 36*4, 20*4, 43*4, 27*4, 39*4, 23*4, },
52 { 2*4, 50*4, 14*4, 62*4, 1*4, 49*4, 13*4, 61*4, },
53 { 34*4, 18*4, 46*4, 30*4, 33*4, 17*4, 45*4, 29*4, },
54 { 10*4, 58*4, 6*4, 54*4, 9*4, 57*4, 5*4, 53*4, },
55 { 42*4, 26*4, 38*4, 22*4, 41*4, 25*4, 37*4, 21*4, },
61 { 0, 0}, { 4, 4}, {12, 8}, { 8,12},
62 { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14},
64 { 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14},
65 { 5, 1}, {15, 3}, { 9, 5}, { 3, 7}, {13, 9}, { 7,11}, { 1,13}, {11,15},
67 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
68 { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
69 { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13},
70 { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 3, 7}, {11, 7}, { 3,15}, {11,15},
72 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8},
73 { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9},
74 { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 2}, {15, 2}, { 7,10}, {15,10},
75 { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 3}, {14, 3}, { 6,11}, {14,11},
76 { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 4}, {12, 4}, { 4,12}, {12,12},
77 { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 5}, {13, 5}, { 5,13}, {13,13},
78 { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 6}, {15, 6}, { 7,14}, {15,14},
79 { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 7}, {14, 7}, { 6,15}, {14,15},
81 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10},
82 { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14},
83 { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11},
84 { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15},
85 { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10},
86 { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 2, 6}, {10, 6}, { 2,14}, {10,14},
87 { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11},
88 { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 3, 7}, {11, 7}, { 3,15}, {11,15},
89 { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 4, 2}, {12, 2}, { 4,10}, {12,10},
90 { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 4, 6}, {12, 6}, { 4,14}, {12,14},
91 { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 5, 3}, {13, 3}, { 5,11}, {13,11},
92 { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 5, 7}, {13, 7}, { 5,15}, {13,15},
93 { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 6, 2}, {14, 2}, { 6,10}, {14,10},
94 { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 6, 6}, {14, 6}, { 6,14}, {14,14},
95 { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 7, 3}, {15, 3}, { 7,11}, {15,11},
96 { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 7, 7}, {15, 7}, { 7,15}, {15,15},
98 { 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 2, 6}, {10, 6}, { 2,14}, {10,14}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, { 3, 1}, {11, 1}
99 , { 3, 9}, {11, 9}, { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 0, 1}, { 8, 1}, { 0, 9}, { 8, 9}, { 4, 5}, {12, 5}, { 4,13}, {12,13}, { 0, 5}, { 8, 5}, { 0,13}, { 8,13}, { 4, 1}, {12, 1}, { 4, 9}, {12, 9}, { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, { 0, 3}, { 8, 3}, { 0,11}, { 8,11}, { 4, 7}, {12, 7}, { 4,15}, {12,15}, { 0, 7}, { 8, 7}, { 0,15}, { 8,15}, { 4, 3}, {12, 3}, { 4,11}, {12,11}, { 2, 1}, {10, 1}, { 2, 9}, {10, 9}, { 6, 5}, {14, 5}, { 6,13}, {14,13}, { 2, 5}, {10, 5}, { 2,13}, {10,13}, { 6, 1}, {14, 1}, { 6, 9}, {14, 9}, { 1, 0}, { 9, 0}, { 1, 8}, { 9, 8}, { 5, 4}, {13, 4}, { 5,12}, {13,12}, { 1, 4}, { 9, 4}, { 1,12}, { 9,12}, { 5, 0}, {13, 0}, { 5, 8}, {13, 8}, { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, { 1, 2}, { 9, 2}, { 1,10}, { 9,
100 10}, { 5, 6}, {13, 6}, { 5,14}, {13,14}, { 1, 6}, { 9, 6}, { 1,14}, { 9,14}, { 5, 2}, {13, 2}, { 5,10}, {13,10}, { 3, 0}, {11, 0}, { 3, 8}, {11, 8}, { 7, 4}, {15, 4}, { 7,12}, {15,12}, { 3, 4}, {11, 4}, { 3,12}, {11,12}, { 7, 0}, {15, 0}, { 7, 8}, {15, 8},
122 temp= ((src[x + y*src_stride + pos]<<log2_scale) + d[pos])>>8;\
123 if(temp & 0x100) temp= ~(temp>>31);\
124 dst[x + y*dst_stride + pos]= temp;
128 for(x=0; x<
width; x+=8){
148 int w= width >>is_chroma;
149 int h= height>>is_chroma;
153 if (!src[i] || !dst[i])
158 for(x=0; x<
block; x++){
159 p->
src[i][index - x - 1]= p->
src[i][index + x ];
160 p->
src[i][index + w + x ]= p->
src[i][index + w - x - 1];
163 for(y=0; y<
block; y++){
164 fast_memcpy(p->
src[i] + ( block-1-y)*stride, p->
src[i] + ( y+block )*stride, stride);
165 fast_memcpy(p->
src[i] + (h+block +y)*stride, p->
src[i] + (h-y+block-1)*stride, stride);
169 memset(p->
temp[i], 0, (h+2*block)*stride*
sizeof(int16_t));
178 for(i=0; i<
count; i++){
179 const int x1= offset[i+count-1][0];
180 const int y1= offset[i+count-1][1];
192 for(x=0; x<
width; x++){
197 for(y=0; y<height/2; y++){
198 for(x=0; x<width/2; x++){
213 static int config(
struct vf_instance *vf,
215 unsigned int flags,
unsigned int outfmt){
221 int w= ((width + 4*
BLOCK-1) & (~(2*
BLOCK-1)))>>is_chroma;
222 int h= ((height + 4*
BLOCK-1) & (~(2*
BLOCK-1)))>>is_chroma;
224 vf->priv->temp_stride[i]= w;
225 vf->priv->temp[i]= malloc(vf->priv->temp_stride[i]*h*
sizeof(int16_t));
226 vf->priv->src [i]= malloc(vf->priv->temp_stride[i]*h*
sizeof(
uint8_t));
228 for(i=0; i< (1<<vf->priv->log2_count); i++){
246 assert(avctx_enc->
codec);
251 vf->priv->outbuf_size= (width +
BLOCK)*(height +
BLOCK)*10;
252 vf->priv->outbuf= malloc(vf->priv->outbuf_size);
262 mpi->
planes[0]=vf->dmpi->planes[0];
263 mpi->
stride[0]=vf->dmpi->stride[0];
264 mpi->
width=vf->dmpi->width;
266 mpi->
planes[1]=vf->dmpi->planes[1];
267 mpi->
planes[2]=vf->dmpi->planes[2];
268 mpi->
stride[1]=vf->dmpi->stride[1];
269 mpi->
stride[2]=vf->dmpi->stride[2];
290 if(mpi->
qscale || vf->priv->qp){
309 static void uninit(
struct vf_instance *vf){
311 if(!vf->priv)
return;
314 free(vf->priv->temp[i]);
315 vf->priv->temp[i]= NULL;
316 free(vf->priv->src[i]);
317 vf->priv->src[i]= NULL;
340 static int control(
struct vf_instance *vf,
int request,
void*
data){
345 vf->priv->log2_count= *((
unsigned int*)data);
369 if (args) sscanf(args,
"%d:%d:%d", &log2c, &vf->
priv->
qp, &vf->
priv->
mode);
371 if( log2c >=0 && log2c <=8 )
387 "ultra simple/slow postprocess",
389 "Michael Niedermayer",
static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt)
This structure describes decoded (raw) audio or video data.
static int query_format(struct vf_instance *vf, unsigned int fmt)
#define VFCTRL_SET_PP_LEVEL
int(* query_format)(struct vf_instance *vf, unsigned int fmt)
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
AVFrame * avcodec_alloc_frame(void)
Allocate an AVFrame and set its fields to default values.
mp_image_t * ff_vf_get_image(vf_instance_t *vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const vf_info_t ff_vf_info_uspp
#define MP_IMGFLAG_PRESERVE
#define MP_IMGFLAG_READABLE
static void store_slice_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale)
static const uint8_t dither[8][8]
void(* get_image)(struct vf_instance *vf, mp_image_t *mpi)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
int ff_vf_next_config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt)
static const uint8_t offset[511][2]
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
int(* put_image)(struct vf_instance *vf, mp_image_t *mpi, double pts)
AVCodec * avcodec_find_encoder(enum AVCodecID id)
Find a registered encoder with a matching codec ID.
int ff_vf_next_control(struct vf_instance *vf, int request, void *data)
void av_dict_free(AVDictionary **m)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
#define CODEC_FLAG_QSCALE
Use fixed qscale.
void(* uninit)(struct vf_instance *vf)
static void get_image(struct vf_instance *vf, mp_image_t *mpi)
AVCodecContext * avctx_enc[BLOCK *BLOCK]
#define CODEC_FLAG_LOW_DELAY
Force low delay.
int(* control)(struct vf_instance *vf, int request, void *data)
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
#define MP_IMGFLAG_PREFER_ALIGNED_STRIDE
int width
picture width / height.
static void uninit(struct vf_instance *vf)
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
void ff_init_avcodec(void)
void ff_vf_clone_mpi_attributes(mp_image_t *dst, mp_image_t *src)
#define VFCTRL_QUERY_MAX_PP_LEVEL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
main external API structure.
#define memcpy_pic(d, s, b, h, ds, ss)
attribute_deprecated int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, const AVFrame *pict)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
int stride[MP_MAX_PLANES]
BYTE int const BYTE int int int height
static int control(struct vf_instance *vf, int request, void *data)
rational number numerator/denominator
AVFrame * coded_frame
the picture in the bitstream
unsigned char * planes[MP_MAX_PLANES]
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height, uint8_t *qp_store, int qp_stride)
int global_quality
Global quality for codecs which cannot change it per frame.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int(* config)(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt)
#define MP_IMGFLAG_PLANAR
void * fast_memcpy(void *to, const void *from, size_t len)
static int vf_open(vf_instance_t *vf, char *args)
int ff_vf_next_put_image(struct vf_instance *vf, mp_image_t *mpi, double pts)
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
#define MP_IMGFLAG_ACCEPT_STRIDE
#define MP_IMGFLAG_DIRECT
static int norm_qscale(int qscale, int type)
int strict_std_compliance
strictly follow the standard (MPEG4, ...).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int ff_vf_next_query_format(struct vf_instance *vf, unsigned int fmt)