2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library 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 GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
35 #include "fastmemcpy.h"
41 #ifdef CONFIG_ENCODERS
42 static void encode_picture(MpegEncContext *s, int picture_number);
43 #endif //CONFIG_ENCODERS
44 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void dct_unquantize_h261_intra_c(MpegEncContext *s,
57 DCTELEM *block, int n, int qscale);
58 static void dct_unquantize_h261_inter_c(MpegEncContext *s,
59 DCTELEM *block, int n, int qscale);
60 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
61 #ifdef CONFIG_ENCODERS
62 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
63 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
64 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
65 static int sse_mb(MpegEncContext *s);
66 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
67 #endif //CONFIG_ENCODERS
70 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
71 extern void XVMC_field_end(MpegEncContext *s);
72 extern void XVMC_decode_mb(MpegEncContext *s);
75 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
78 /* enable all paranoid tests for rounding, overflows, etc... */
84 /* for jpeg fast DCT */
87 static const uint16_t aanscales[64] = {
88 /* precomputed values scaled up by 14 bits */
89 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
90 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
91 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
92 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
93 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
94 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
95 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
96 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
99 static const uint8_t h263_chroma_roundtab[16] = {
100 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
101 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
104 static const uint8_t ff_default_chroma_qscale_table[32]={
105 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
106 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
109 #ifdef CONFIG_ENCODERS
110 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
111 static uint8_t default_fcode_tab[MAX_MV*2+1];
113 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
115 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
116 const uint16_t *quant_matrix, int bias, int qmin, int qmax)
120 for(qscale=qmin; qscale<=qmax; qscale++){
122 if (dsp->fdct == ff_jpeg_fdct_islow
123 #ifdef FAAN_POSTSCALE
124 || dsp->fdct == ff_faandct
128 const int j= dsp->idct_permutation[i];
129 /* 16 <= qscale * quant_matrix[i] <= 7905 */
130 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
131 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
132 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
134 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
135 (qscale * quant_matrix[j]));
137 } else if (dsp->fdct == fdct_ifast
138 #ifndef FAAN_POSTSCALE
139 || dsp->fdct == ff_faandct
143 const int j= dsp->idct_permutation[i];
144 /* 16 <= qscale * quant_matrix[i] <= 7905 */
145 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
146 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
147 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
149 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
150 (aanscales[i] * qscale * quant_matrix[j]));
154 const int j= dsp->idct_permutation[i];
155 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
156 So 16 <= qscale * quant_matrix[i] <= 7905
157 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
158 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
160 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
161 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
162 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
164 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
165 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
171 static inline void update_qscale(MpegEncContext *s){
172 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
173 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
175 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
177 #endif //CONFIG_ENCODERS
179 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
183 st->scantable= src_scantable;
187 j = src_scantable[i];
188 st->permutated[i] = permutation[j];
197 j = st->permutated[i];
199 st->raster_end[i]= end;
203 #ifdef CONFIG_ENCODERS
204 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
210 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
215 #endif //CONFIG_ENCODERS
217 /* init common dct for both encoder and decoder */
218 int DCT_common_init(MpegEncContext *s)
220 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
221 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
222 s->dct_unquantize_h261_intra = dct_unquantize_h261_intra_c;
223 s->dct_unquantize_h261_inter = dct_unquantize_h261_inter_c;
224 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
225 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
226 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
227 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
229 #ifdef CONFIG_ENCODERS
230 s->dct_quantize= dct_quantize_c;
231 s->denoise_dct= denoise_dct_c;
235 MPV_common_init_mmx(s);
238 MPV_common_init_axp(s);
241 MPV_common_init_mlib(s);
244 MPV_common_init_mmi(s);
247 MPV_common_init_armv4l(s);
250 MPV_common_init_ppc(s);
253 #ifdef CONFIG_ENCODERS
254 s->fast_dct_quantize= s->dct_quantize;
256 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
257 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
260 #endif //CONFIG_ENCODERS
262 /* load & permutate scantables
263 note: only wmv uses differnt ones
265 if(s->alternate_scan){
266 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
267 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
269 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
270 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
272 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
273 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
278 static void copy_picture(Picture *dst, Picture *src){
280 dst->type= FF_BUFFER_TYPE_COPY;
283 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
286 dst->pict_type = src->pict_type;
287 dst->quality = src->quality;
288 dst->coded_picture_number = src->coded_picture_number;
289 dst->display_picture_number = src->display_picture_number;
290 // dst->reference = src->reference;
292 dst->interlaced_frame = src->interlaced_frame;
293 dst->top_field_first = src->top_field_first;
295 if(s->avctx->me_threshold){
296 if(!src->motion_val[0])
297 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
299 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
300 if(!src->ref_index[0])
301 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
302 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
303 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesnt match! (%d!=%d)\n",
304 src->motion_subsample_log2, dst->motion_subsample_log2);
306 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
309 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
310 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
312 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
313 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
315 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
316 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
323 * allocates a Picture
324 * The pixels are allocated/set by calling get_buffer() if shared=0
326 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
327 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
328 const int mb_array_size= s->mb_stride*s->mb_height;
329 const int b8_array_size= s->b8_stride*s->mb_height*2;
330 const int b4_array_size= s->b4_stride*s->mb_height*4;
334 assert(pic->data[0]);
335 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
336 pic->type= FF_BUFFER_TYPE_SHARED;
340 assert(!pic->data[0]);
342 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
344 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
345 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
349 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
350 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
354 if(pic->linesize[1] != pic->linesize[2]){
355 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride missmatch)\n");
359 s->linesize = pic->linesize[0];
360 s->uvlinesize= pic->linesize[1];
363 if(pic->qscale_table==NULL){
365 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
366 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
367 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
370 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
371 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
372 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
373 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
374 if(s->out_format == FMT_H264){
376 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+2) * sizeof(int16_t))
377 pic->motion_val[i]= pic->motion_val_base[i]+2;
378 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
380 pic->motion_subsample_log2= 2;
381 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
383 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+2) * sizeof(int16_t))
384 pic->motion_val[i]= pic->motion_val_base[i]+2;
385 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
387 pic->motion_subsample_log2= 3;
389 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
390 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
392 pic->qstride= s->mb_stride;
393 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
396 //it might be nicer if the application would keep track of these but it would require a API change
397 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
398 s->prev_pict_types[0]= s->pict_type;
399 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
400 pic->age= INT_MAX; // skiped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
403 fail: //for the CHECKED_ALLOCZ macro
408 * deallocates a picture
410 static void free_picture(MpegEncContext *s, Picture *pic){
413 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
414 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
417 av_freep(&pic->mb_var);
418 av_freep(&pic->mc_mb_var);
419 av_freep(&pic->mb_mean);
420 av_freep(&pic->mbskip_table);
421 av_freep(&pic->qscale_table);
422 av_freep(&pic->mb_type_base);
423 av_freep(&pic->dct_coeff);
424 av_freep(&pic->pan_scan);
427 av_freep(&pic->motion_val_base[i]);
428 av_freep(&pic->ref_index[i]);
431 if(pic->type == FF_BUFFER_TYPE_SHARED){
440 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
443 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
444 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
445 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
447 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
448 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
449 s->rd_scratchpad= s->me.scratchpad;
450 s->b_scratchpad= s->me.scratchpad;
451 s->obmc_scratchpad= s->me.scratchpad + 16;
453 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
454 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
455 if(s->avctx->noise_reduction){
456 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
459 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
460 s->block= s->blocks[0];
463 s->pblocks[i] = (short *)(&s->block[i]);
467 return -1; //free() through MPV_common_end()
470 static void free_duplicate_context(MpegEncContext *s){
473 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
474 av_freep(&s->me.scratchpad);
477 s->obmc_scratchpad= NULL;
479 av_freep(&s->dct_error_sum);
480 av_freep(&s->me.map);
481 av_freep(&s->me.score_map);
482 av_freep(&s->blocks);
486 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
487 #define COPY(a) bak->a= src->a
488 COPY(allocated_edge_emu_buffer);
489 COPY(edge_emu_buffer);
493 COPY(obmc_scratchpad);
500 COPY(me.map_generation);
508 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
511 //FIXME copy only needed parts
513 backup_duplicate_context(&bak, dst);
514 memcpy(dst, src, sizeof(MpegEncContext));
515 backup_duplicate_context(dst, &bak);
517 dst->pblocks[i] = (short *)(&dst->block[i]);
519 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
522 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
523 #define COPY(a) dst->a= src->a
525 COPY(current_picture);
531 COPY(picture_in_gop_number);
532 COPY(gop_picture_number);
533 COPY(frame_pred_frame_dct); //FIXME dont set in encode_header
534 COPY(progressive_frame); //FIXME dont set in encode_header
535 COPY(partitioned_frame); //FIXME dont set in encode_header
540 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
541 * the changed fields will not depend upon the prior state of the MpegEncContext.
543 static void MPV_common_defaults(MpegEncContext *s){
545 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
546 s->chroma_qscale_table= ff_default_chroma_qscale_table;
547 s->progressive_frame= 1;
548 s->progressive_sequence= 1;
549 s->picture_structure= PICT_FRAME;
551 s->coded_picture_number = 0;
552 s->picture_number = 0;
553 s->input_picture_number = 0;
555 s->picture_in_gop_number = 0;
562 * sets the given MpegEncContext to defaults for decoding.
563 * the changed fields will not depend upon the prior state of the MpegEncContext.
565 void MPV_decode_defaults(MpegEncContext *s){
566 MPV_common_defaults(s);
570 * sets the given MpegEncContext to defaults for encoding.
571 * the changed fields will not depend upon the prior state of the MpegEncContext.
574 #ifdef CONFIG_ENCODERS
575 static void MPV_encode_defaults(MpegEncContext *s){
578 MPV_common_defaults(s);
584 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
585 memset(default_mv_penalty, 0, sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1));
586 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
588 for(i=-16; i<16; i++){
589 default_fcode_tab[i + MAX_MV]= 1;
592 s->me.mv_penalty= default_mv_penalty;
593 s->fcode_tab= default_fcode_tab;
595 #endif //CONFIG_ENCODERS
598 * init common structure for both encoder and decoder.
599 * this assumes that some variables like width/height are already set
601 int MPV_common_init(MpegEncContext *s)
603 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
605 if(s->avctx->thread_count > MAX_THREADS || (16*s->avctx->thread_count > s->height && s->height)){
606 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
610 dsputil_init(&s->dsp, s->avctx);
613 s->flags= s->avctx->flags;
614 s->flags2= s->avctx->flags2;
616 s->mb_width = (s->width + 15) / 16;
617 s->mb_height = (s->height + 15) / 16;
618 s->mb_stride = s->mb_width + 1;
619 s->b8_stride = s->mb_width*2 + 1;
620 s->b4_stride = s->mb_width*4 + 1;
621 mb_array_size= s->mb_height * s->mb_stride;
622 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
624 /* set chroma shifts */
625 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
626 &(s->chroma_y_shift) );
628 /* set default edge pos, will be overriden in decode_header if needed */
629 s->h_edge_pos= s->mb_width*16;
630 s->v_edge_pos= s->mb_height*16;
632 s->mb_num = s->mb_width * s->mb_height;
637 s->block_wrap[3]= s->b8_stride;
639 s->block_wrap[5]= s->mb_stride;
641 y_size = s->b8_stride * (2 * s->mb_height + 1);
642 c_size = s->mb_stride * (s->mb_height + 1);
643 yc_size = y_size + 2 * c_size;
645 /* convert fourcc to upper case */
646 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
647 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
648 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
649 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
651 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
652 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
653 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
654 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
656 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
658 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
659 for(y=0; y<s->mb_height; y++){
660 for(x=0; x<s->mb_width; x++){
661 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
664 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
667 /* Allocate MV tables */
668 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
669 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
670 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
671 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
672 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
673 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
674 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
675 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
676 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
677 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
678 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
679 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
681 if(s->msmpeg4_version){
682 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
684 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
686 /* Allocate MB type table */
687 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
689 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
691 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
692 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
693 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
694 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
695 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
696 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
698 if(s->avctx->noise_reduction){
699 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
702 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
704 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
706 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
707 /* interlaced direct mode decoding tables */
712 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
713 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
715 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
716 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
717 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
719 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
722 if (s->out_format == FMT_H263) {
724 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
725 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
726 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
727 s->ac_val[2] = s->ac_val[1] + c_size;
730 CHECKED_ALLOCZ(s->coded_block_base, y_size);
731 s->coded_block= s->coded_block_base + s->b8_stride + 1;
733 /* divx501 bitstream reorder buffer */
734 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
736 /* cbp, ac_pred, pred_dir */
737 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
738 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
741 if (s->h263_pred || s->h263_plus || !s->encoding) {
743 //MN: we need these for error resilience of intra-frames
744 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
745 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
746 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
747 s->dc_val[2] = s->dc_val[1] + c_size;
748 for(i=0;i<yc_size;i++)
749 s->dc_val_base[i] = 1024;
752 /* which mb is a intra block */
753 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
754 memset(s->mbintra_table, 1, mb_array_size);
756 /* init macroblock skip table */
757 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
758 //Note the +1 is for a quicker mpeg4 slice_end detection
759 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
761 s->parse_context.state= -1;
762 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
763 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
764 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
765 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
768 s->context_initialized = 1;
770 s->thread_context[0]= s;
771 for(i=1; i<s->avctx->thread_count; i++){
772 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
773 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
776 for(i=0; i<s->avctx->thread_count; i++){
777 if(init_duplicate_context(s->thread_context[i], s) < 0)
779 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
780 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
789 /* init common structure for both encoder and decoder */
790 void MPV_common_end(MpegEncContext *s)
794 for(i=0; i<s->avctx->thread_count; i++){
795 free_duplicate_context(s->thread_context[i]);
797 for(i=1; i<s->avctx->thread_count; i++){
798 av_freep(&s->thread_context[i]);
801 av_freep(&s->parse_context.buffer);
802 s->parse_context.buffer_size=0;
804 av_freep(&s->mb_type);
805 av_freep(&s->p_mv_table_base);
806 av_freep(&s->b_forw_mv_table_base);
807 av_freep(&s->b_back_mv_table_base);
808 av_freep(&s->b_bidir_forw_mv_table_base);
809 av_freep(&s->b_bidir_back_mv_table_base);
810 av_freep(&s->b_direct_mv_table_base);
812 s->b_forw_mv_table= NULL;
813 s->b_back_mv_table= NULL;
814 s->b_bidir_forw_mv_table= NULL;
815 s->b_bidir_back_mv_table= NULL;
816 s->b_direct_mv_table= NULL;
820 av_freep(&s->b_field_mv_table_base[i][j][k]);
821 s->b_field_mv_table[i][j][k]=NULL;
823 av_freep(&s->b_field_select_table[i][j]);
824 av_freep(&s->p_field_mv_table_base[i][j]);
825 s->p_field_mv_table[i][j]=NULL;
827 av_freep(&s->p_field_select_table[i]);
830 av_freep(&s->dc_val_base);
831 av_freep(&s->ac_val_base);
832 av_freep(&s->coded_block_base);
833 av_freep(&s->mbintra_table);
834 av_freep(&s->cbp_table);
835 av_freep(&s->pred_dir_table);
837 av_freep(&s->mbskip_table);
838 av_freep(&s->prev_pict_types);
839 av_freep(&s->bitstream_buffer);
840 av_freep(&s->avctx->stats_out);
841 av_freep(&s->ac_stats);
842 av_freep(&s->error_status_table);
843 av_freep(&s->mb_index2xy);
844 av_freep(&s->lambda_table);
845 av_freep(&s->q_intra_matrix);
846 av_freep(&s->q_inter_matrix);
847 av_freep(&s->q_intra_matrix16);
848 av_freep(&s->q_inter_matrix16);
849 av_freep(&s->input_picture);
850 av_freep(&s->reordered_input_picture);
851 av_freep(&s->dct_offset);
854 for(i=0; i<MAX_PICTURE_COUNT; i++){
855 free_picture(s, &s->picture[i]);
858 av_freep(&s->picture);
859 s->context_initialized = 0;
862 s->current_picture_ptr= NULL;
863 s->linesize= s->uvlinesize= 0;
866 av_freep(&s->visualization_buffer[i]);
868 avcodec_default_free_buffers(s->avctx);
871 #ifdef CONFIG_ENCODERS
873 /* init video encoder */
874 int MPV_encode_init(AVCodecContext *avctx)
876 MpegEncContext *s = avctx->priv_data;
878 int chroma_h_shift, chroma_v_shift;
880 MPV_encode_defaults(s);
882 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
884 s->bit_rate = avctx->bit_rate;
885 s->width = avctx->width;
886 s->height = avctx->height;
887 if(avctx->gop_size > 600){
888 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
891 s->gop_size = avctx->gop_size;
893 s->flags= avctx->flags;
894 s->flags2= avctx->flags2;
895 s->max_b_frames= avctx->max_b_frames;
896 s->codec_id= avctx->codec->id;
897 s->luma_elim_threshold = avctx->luma_elim_threshold;
898 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
899 s->strict_std_compliance= avctx->strict_std_compliance;
900 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
901 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
902 s->mpeg_quant= avctx->mpeg_quant;
903 s->rtp_mode= !!avctx->rtp_payload_size;
904 s->intra_dc_precision= avctx->intra_dc_precision;
906 if (s->gop_size <= 1) {
913 s->me_method = avctx->me_method;
916 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
918 s->adaptive_quant= ( s->avctx->lumi_masking
919 || s->avctx->dark_masking
920 || s->avctx->temporal_cplx_masking
921 || s->avctx->spatial_cplx_masking
922 || s->avctx->p_masking
923 || (s->flags&CODEC_FLAG_QP_RD))
926 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
927 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
928 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
930 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
931 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
935 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
936 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");
939 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
940 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
944 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
945 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
949 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
950 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
951 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
953 av_log(avctx, AV_LOG_INFO, "Warning vbv_delay will be set to 0xFFFF (=VBR) as the specified vbv buffer is too large for the given bitrate!\n");
956 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
957 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
958 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
962 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
963 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
967 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
968 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
972 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
973 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
977 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
978 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
982 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
983 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
987 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
988 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
989 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
993 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
994 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");
998 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
999 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1003 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1004 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1008 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1009 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1013 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1014 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1015 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1016 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1020 if(s->avctx->thread_count > 1)
1023 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
1025 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1026 avctx->frame_rate /= i;
1027 avctx->frame_rate_base /= i;
1031 if(s->codec_id==CODEC_ID_MJPEG){
1032 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1033 s->inter_quant_bias= 0;
1034 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1035 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1036 s->inter_quant_bias= 0;
1038 s->intra_quant_bias=0;
1039 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1042 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1043 s->intra_quant_bias= avctx->intra_quant_bias;
1044 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1045 s->inter_quant_bias= avctx->inter_quant_bias;
1047 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1049 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
1050 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1052 switch(avctx->codec->id) {
1053 case CODEC_ID_MPEG1VIDEO:
1054 s->out_format = FMT_MPEG1;
1055 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1056 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1058 case CODEC_ID_MPEG2VIDEO:
1059 s->out_format = FMT_MPEG1;
1060 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1061 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1064 case CODEC_ID_LJPEG:
1065 case CODEC_ID_MJPEG:
1066 s->out_format = FMT_MJPEG;
1067 s->intra_only = 1; /* force intra only for jpeg */
1068 s->mjpeg_write_tables = 1; /* write all tables */
1069 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1070 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1071 s->mjpeg_vsample[1] = 1;
1072 s->mjpeg_vsample[2] = 1;
1073 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1074 s->mjpeg_hsample[1] = 1;
1075 s->mjpeg_hsample[2] = 1;
1076 if (mjpeg_init(s) < 0)
1083 if (h263_get_picture_format(s->width, s->height) == 7) {
1084 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
1087 s->out_format = FMT_H263;
1088 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1092 case CODEC_ID_H263P:
1093 s->out_format = FMT_H263;
1096 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1097 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1098 s->modified_quant= s->h263_aic;
1099 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1100 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1101 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1102 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1103 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1106 /* These are just to be sure */
1111 s->out_format = FMT_H263;
1112 s->h263_flv = 2; /* format = 1; 11-bit codes */
1113 s->unrestricted_mv = 1;
1114 s->rtp_mode=0; /* don't allow GOB */
1119 s->out_format = FMT_H263;
1123 case CODEC_ID_MPEG4:
1124 s->out_format = FMT_H263;
1126 s->unrestricted_mv = 1;
1127 s->low_delay= s->max_b_frames ? 0 : 1;
1128 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1130 case CODEC_ID_MSMPEG4V1:
1131 s->out_format = FMT_H263;
1132 s->h263_msmpeg4 = 1;
1134 s->unrestricted_mv = 1;
1135 s->msmpeg4_version= 1;
1139 case CODEC_ID_MSMPEG4V2:
1140 s->out_format = FMT_H263;
1141 s->h263_msmpeg4 = 1;
1143 s->unrestricted_mv = 1;
1144 s->msmpeg4_version= 2;
1148 case CODEC_ID_MSMPEG4V3:
1149 s->out_format = FMT_H263;
1150 s->h263_msmpeg4 = 1;
1152 s->unrestricted_mv = 1;
1153 s->msmpeg4_version= 3;
1154 s->flipflop_rounding=1;
1159 s->out_format = FMT_H263;
1160 s->h263_msmpeg4 = 1;
1162 s->unrestricted_mv = 1;
1163 s->msmpeg4_version= 4;
1164 s->flipflop_rounding=1;
1169 s->out_format = FMT_H263;
1170 s->h263_msmpeg4 = 1;
1172 s->unrestricted_mv = 1;
1173 s->msmpeg4_version= 5;
1174 s->flipflop_rounding=1;
1183 avctx->has_b_frames= !s->low_delay;
1188 if (MPV_common_init(s) < 0)
1191 if(s->modified_quant)
1192 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1193 s->progressive_frame=
1194 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1195 s->quant_precision=5;
1197 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1199 #ifdef CONFIG_ENCODERS
1201 if (s->out_format == FMT_H263)
1202 h263_encode_init(s);
1203 if(s->msmpeg4_version)
1204 ff_msmpeg4_encode_init(s);
1206 if (s->out_format == FMT_MPEG1)
1207 ff_mpeg1_encode_init(s);
1212 int j= s->dsp.idct_permutation[i];
1214 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1215 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1216 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1217 }else if(s->out_format == FMT_H263){
1218 s->intra_matrix[j] =
1219 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1223 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1224 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1226 if(s->avctx->intra_matrix)
1227 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1228 if(s->avctx->inter_matrix)
1229 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1232 /* precompute matrix */
1233 /* for mjpeg, we do include qscale in the matrix */
1234 if (s->out_format != FMT_MJPEG) {
1235 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1236 s->intra_matrix, s->intra_quant_bias, 1, 31);
1237 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1238 s->inter_matrix, s->inter_quant_bias, 1, 31);
1241 if(ff_rate_control_init(s) < 0)
1247 int MPV_encode_end(AVCodecContext *avctx)
1249 MpegEncContext *s = avctx->priv_data;
1255 ff_rate_control_uninit(s);
1258 if (s->out_format == FMT_MJPEG)
1261 av_freep(&avctx->extradata);
1266 #endif //CONFIG_ENCODERS
1268 void init_rl(RLTable *rl)
1270 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1271 uint8_t index_run[MAX_RUN+1];
1272 int last, run, level, start, end, i;
1274 /* compute max_level[], max_run[] and index_run[] */
1275 for(last=0;last<2;last++) {
1284 memset(max_level, 0, MAX_RUN + 1);
1285 memset(max_run, 0, MAX_LEVEL + 1);
1286 memset(index_run, rl->n, MAX_RUN + 1);
1287 for(i=start;i<end;i++) {
1288 run = rl->table_run[i];
1289 level = rl->table_level[i];
1290 if (index_run[run] == rl->n)
1292 if (level > max_level[run])
1293 max_level[run] = level;
1294 if (run > max_run[level])
1295 max_run[level] = run;
1297 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1298 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1299 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1300 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1301 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1302 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1306 /* draw the edges of width 'w' of an image of size width, height */
1307 //FIXME check that this is ok for mpeg4 interlaced
1308 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1310 uint8_t *ptr, *last_line;
1313 last_line = buf + (height - 1) * wrap;
1315 /* top and bottom */
1316 memcpy(buf - (i + 1) * wrap, buf, width);
1317 memcpy(last_line + (i + 1) * wrap, last_line, width);
1319 /* left and right */
1321 for(i=0;i<height;i++) {
1322 memset(ptr - w, ptr[0], w);
1323 memset(ptr + width, ptr[width-1], w);
1328 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1329 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1330 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1331 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1335 int ff_find_unused_picture(MpegEncContext *s, int shared){
1339 for(i=0; i<MAX_PICTURE_COUNT; i++){
1340 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1343 for(i=0; i<MAX_PICTURE_COUNT; i++){
1344 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1346 for(i=0; i<MAX_PICTURE_COUNT; i++){
1347 if(s->picture[i].data[0]==NULL) return i;
1355 static void update_noise_reduction(MpegEncContext *s){
1358 for(intra=0; intra<2; intra++){
1359 if(s->dct_count[intra] > (1<<16)){
1360 for(i=0; i<64; i++){
1361 s->dct_error_sum[intra][i] >>=1;
1363 s->dct_count[intra] >>= 1;
1366 for(i=0; i<64; i++){
1367 s->dct_offset[intra][i]= (s->avctx->noise_reduction * s->dct_count[intra] + s->dct_error_sum[intra][i]/2) / (s->dct_error_sum[intra][i]+1);
1373 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1375 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1381 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1383 /* mark&release old frames */
1384 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1385 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1387 /* release forgotten pictures */
1388 /* if(mpeg124/h263) */
1390 for(i=0; i<MAX_PICTURE_COUNT; i++){
1391 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1392 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1393 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1400 /* release non refernce frames */
1401 for(i=0; i<MAX_PICTURE_COUNT; i++){
1402 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1403 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1407 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1408 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1410 i= ff_find_unused_picture(s, 0);
1411 pic= (AVFrame*)&s->picture[i];
1414 pic->reference= s->pict_type != B_TYPE && !s->dropable ? 3 : 0;
1416 pic->coded_picture_number= s->coded_picture_number++;
1418 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1421 s->current_picture_ptr= (Picture*)pic;
1422 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1423 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1426 s->current_picture_ptr->pict_type= s->pict_type;
1427 // if(s->flags && CODEC_FLAG_QSCALE)
1428 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1429 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1431 copy_picture(&s->current_picture, s->current_picture_ptr);
1433 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1434 if (s->pict_type != B_TYPE) {
1435 s->last_picture_ptr= s->next_picture_ptr;
1437 s->next_picture_ptr= s->current_picture_ptr;
1439 /* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1440 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1441 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1442 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1443 s->pict_type, s->dropable);*/
1445 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1446 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1448 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1449 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1450 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1454 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1456 if(s->picture_structure!=PICT_FRAME){
1459 if(s->picture_structure == PICT_BOTTOM_FIELD){
1460 s->current_picture.data[i] += s->current_picture.linesize[i];
1462 s->current_picture.linesize[i] *= 2;
1463 s->last_picture.linesize[i] *=2;
1464 s->next_picture.linesize[i] *=2;
1469 s->hurry_up= s->avctx->hurry_up;
1470 s->error_resilience= avctx->error_resilience;
1472 /* set dequantizer, we cant do it during init as it might change for mpeg4
1473 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1474 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1475 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1476 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1477 }else if(s->out_format == FMT_H263){
1478 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1479 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1480 }else if(s->out_format == FMT_H261){
1481 s->dct_unquantize_intra = s->dct_unquantize_h261_intra;
1482 s->dct_unquantize_inter = s->dct_unquantize_h261_inter;
1484 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1485 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1488 if(s->dct_error_sum){
1489 assert(s->avctx->noise_reduction && s->encoding);
1491 update_noise_reduction(s);
1495 if(s->avctx->xvmc_acceleration)
1496 return XVMC_field_start(s, avctx);
1501 /* generic function for encode/decode called after a frame has been coded/decoded */
1502 void MPV_frame_end(MpegEncContext *s)
1505 /* draw edge for correct motion prediction if outside */
1507 //just to make sure that all data is rendered.
1508 if(s->avctx->xvmc_acceleration){
1512 if(s->unrestricted_mv && s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1513 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1514 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1515 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1519 s->last_pict_type = s->pict_type;
1520 if(s->pict_type!=B_TYPE){
1521 s->last_non_b_pict_type= s->pict_type;
1524 /* copy back current_picture variables */
1525 for(i=0; i<MAX_PICTURE_COUNT; i++){
1526 if(s->picture[i].data[0] == s->current_picture.data[0]){
1527 s->picture[i]= s->current_picture;
1531 assert(i<MAX_PICTURE_COUNT);
1535 /* release non refernce frames */
1536 for(i=0; i<MAX_PICTURE_COUNT; i++){
1537 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1538 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1542 // clear copies, to avoid confusion
1544 memset(&s->last_picture, 0, sizeof(Picture));
1545 memset(&s->next_picture, 0, sizeof(Picture));
1546 memset(&s->current_picture, 0, sizeof(Picture));
1548 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1552 * draws an line from (ex, ey) -> (sx, sy).
1553 * @param w width of the image
1554 * @param h height of the image
1555 * @param stride stride/linesize of the image
1556 * @param color color of the arrow
1558 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1561 sx= clip(sx, 0, w-1);
1562 sy= clip(sy, 0, h-1);
1563 ex= clip(ex, 0, w-1);
1564 ey= clip(ey, 0, h-1);
1566 buf[sy*stride + sx]+= color;
1568 if(ABS(ex - sx) > ABS(ey - sy)){
1573 buf+= sx + sy*stride;
1575 f= ((ey-sy)<<16)/ex;
1576 for(x= 0; x <= ex; x++){
1579 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1580 buf[(y+1)*stride + x]+= (color* fr )>>16;
1587 buf+= sx + sy*stride;
1589 if(ey) f= ((ex-sx)<<16)/ey;
1591 for(y= 0; y <= ey; y++){
1594 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1595 buf[y*stride + x+1]+= (color* fr )>>16;;
1601 * draws an arrow from (ex, ey) -> (sx, sy).
1602 * @param w width of the image
1603 * @param h height of the image
1604 * @param stride stride/linesize of the image
1605 * @param color color of the arrow
1607 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1610 sx= clip(sx, -100, w+100);
1611 sy= clip(sy, -100, h+100);
1612 ex= clip(ex, -100, w+100);
1613 ey= clip(ey, -100, h+100);
1618 if(dx*dx + dy*dy > 3*3){
1621 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1623 //FIXME subpixel accuracy
1624 rx= ROUNDED_DIV(rx*3<<4, length);
1625 ry= ROUNDED_DIV(ry*3<<4, length);
1627 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1628 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1630 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1634 * prints debuging info for the given picture.
1636 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1638 if(!pict || !pict->mb_type) return;
1640 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1643 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1644 switch (pict->pict_type) {
1645 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1646 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1647 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1648 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1649 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1650 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1652 for(y=0; y<s->mb_height; y++){
1653 for(x=0; x<s->mb_width; x++){
1654 if(s->avctx->debug&FF_DEBUG_SKIP){
1655 int count= s->mbskip_table[x + y*s->mb_stride];
1656 if(count>9) count=9;
1657 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1659 if(s->avctx->debug&FF_DEBUG_QP){
1660 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1662 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1663 int mb_type= pict->mb_type[x + y*s->mb_stride];
1664 //Type & MV direction
1666 av_log(s->avctx, AV_LOG_DEBUG, "P");
1667 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1668 av_log(s->avctx, AV_LOG_DEBUG, "A");
1669 else if(IS_INTRA4x4(mb_type))
1670 av_log(s->avctx, AV_LOG_DEBUG, "i");
1671 else if(IS_INTRA16x16(mb_type))
1672 av_log(s->avctx, AV_LOG_DEBUG, "I");
1673 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1674 av_log(s->avctx, AV_LOG_DEBUG, "d");
1675 else if(IS_DIRECT(mb_type))
1676 av_log(s->avctx, AV_LOG_DEBUG, "D");
1677 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1678 av_log(s->avctx, AV_LOG_DEBUG, "g");
1679 else if(IS_GMC(mb_type))
1680 av_log(s->avctx, AV_LOG_DEBUG, "G");
1681 else if(IS_SKIP(mb_type))
1682 av_log(s->avctx, AV_LOG_DEBUG, "S");
1683 else if(!USES_LIST(mb_type, 1))
1684 av_log(s->avctx, AV_LOG_DEBUG, ">");
1685 else if(!USES_LIST(mb_type, 0))
1686 av_log(s->avctx, AV_LOG_DEBUG, "<");
1688 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1689 av_log(s->avctx, AV_LOG_DEBUG, "X");
1694 av_log(s->avctx, AV_LOG_DEBUG, "+");
1695 else if(IS_16X8(mb_type))
1696 av_log(s->avctx, AV_LOG_DEBUG, "-");
1697 else if(IS_8X16(mb_type))
1698 av_log(s->avctx, AV_LOG_DEBUG, "¦");
1699 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1700 av_log(s->avctx, AV_LOG_DEBUG, " ");
1702 av_log(s->avctx, AV_LOG_DEBUG, "?");
1705 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1706 av_log(s->avctx, AV_LOG_DEBUG, "=");
1708 av_log(s->avctx, AV_LOG_DEBUG, " ");
1710 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1712 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1716 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1717 const int shift= 1 + s->quarter_sample;
1721 int h_chroma_shift, v_chroma_shift;
1722 s->low_delay=0; //needed to see the vectors without trashing the buffers
1724 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1726 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*s->height:pict->linesize[i]*s->height >> v_chroma_shift);
1727 pict->data[i]= s->visualization_buffer[i];
1729 pict->type= FF_BUFFER_TYPE_COPY;
1732 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1734 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1735 const int mb_index= mb_x + mb_y*s->mb_stride;
1736 if((s->avctx->debug_mv) && pict->motion_val){
1738 for(type=0; type<3; type++){
1741 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1745 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1749 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1754 if(!USES_LIST(pict->mb_type[mb_index], direction))
1758 if(IS_8X8(pict->mb_type[mb_index])){
1761 int sx= mb_x*16 + 4 + 8*(i&1);
1762 int sy= mb_y*16 + 4 + 8*(i>>1);
1763 int xy= mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride;
1764 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1765 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1766 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1768 }else if(IS_16X8(pict->mb_type[mb_index])){
1772 int sy=mb_y*16 + 4 + 8*i;
1773 int xy= mb_x*2 + (mb_y*2 + i)*s->b8_stride;
1774 int mx=(pict->motion_val[direction][xy][0]>>shift);
1775 int my=(pict->motion_val[direction][xy][1]>>shift);
1777 if(IS_INTERLACED(pict->mb_type[mb_index]))
1780 draw_arrow(ptr, sx, sy, mx+sx, my+sy, s->width, s->height, s->linesize, 100);
1783 int sx= mb_x*16 + 8;
1784 int sy= mb_y*16 + 8;
1785 int xy= mb_x*2 + mb_y*2*s->b8_stride;
1786 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1787 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1788 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1792 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1793 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1796 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1797 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1800 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1801 int mb_type= pict->mb_type[mb_index];
1804 #define COLOR(theta, r)\
1805 u= (int)(128 + r*cos(theta*3.141592/180));\
1806 v= (int)(128 + r*sin(theta*3.141592/180));
1810 if(IS_PCM(mb_type)){
1812 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1814 }else if(IS_INTRA4x4(mb_type)){
1816 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1818 }else if(IS_DIRECT(mb_type)){
1820 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1822 }else if(IS_GMC(mb_type)){
1824 }else if(IS_SKIP(mb_type)){
1826 }else if(!USES_LIST(mb_type, 1)){
1828 }else if(!USES_LIST(mb_type, 0)){
1831 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1835 u*= 0x0101010101010101ULL;
1836 v*= 0x0101010101010101ULL;
1838 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1839 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1843 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1844 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1845 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1847 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1849 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1852 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1856 s->mbskip_table[mb_index]=0;
1862 #ifdef CONFIG_ENCODERS
1864 static int get_sae(uint8_t *src, int ref, int stride){
1868 for(y=0; y<16; y++){
1869 for(x=0; x<16; x++){
1870 acc+= ABS(src[x+y*stride] - ref);
1877 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1884 for(y=0; y<h; y+=16){
1885 for(x=0; x<w; x+=16){
1886 int offset= x + y*stride;
1887 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1888 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1889 int sae = get_sae(src + offset, mean, stride);
1891 acc+= sae + 500 < sad;
1898 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1901 const int encoding_delay= s->max_b_frames;
1905 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1906 if(pic_arg->linesize[0] != s->linesize) direct=0;
1907 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1908 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1910 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1913 i= ff_find_unused_picture(s, 1);
1915 pic= (AVFrame*)&s->picture[i];
1919 pic->data[i]= pic_arg->data[i];
1920 pic->linesize[i]= pic_arg->linesize[i];
1922 alloc_picture(s, (Picture*)pic, 1);
1925 i= ff_find_unused_picture(s, 0);
1927 pic= (AVFrame*)&s->picture[i];
1930 alloc_picture(s, (Picture*)pic, 0);
1932 if( pic->data[0] + offset == pic_arg->data[0]
1933 && pic->data[1] + offset == pic_arg->data[1]
1934 && pic->data[2] + offset == pic_arg->data[2]){
1937 int h_chroma_shift, v_chroma_shift;
1938 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1941 int src_stride= pic_arg->linesize[i];
1942 int dst_stride= i ? s->uvlinesize : s->linesize;
1943 int h_shift= i ? h_chroma_shift : 0;
1944 int v_shift= i ? v_chroma_shift : 0;
1945 int w= s->width >>h_shift;
1946 int h= s->height>>v_shift;
1947 uint8_t *src= pic_arg->data[i];
1948 uint8_t *dst= pic->data[i] + offset;
1950 if(src_stride==dst_stride)
1951 memcpy(dst, src, src_stride*h);
1954 memcpy(dst, src, w);
1962 copy_picture_attributes(s, pic, pic_arg);
1964 pic->display_picture_number= s->input_picture_number++;
1965 if(pic->pts != AV_NOPTS_VALUE){
1966 s->user_specified_pts= pic->pts;
1968 if(s->user_specified_pts){
1969 pic->pts= s->user_specified_pts + AV_TIME_BASE*(int64_t)s->avctx->frame_rate_base / s->avctx->frame_rate;
1970 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pic->pts);
1972 pic->pts= av_rescale(pic->display_picture_number*(int64_t)s->avctx->frame_rate_base, AV_TIME_BASE, s->avctx->frame_rate);
1977 /* shift buffer entries */
1978 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1979 s->input_picture[i-1]= s->input_picture[i];
1981 s->input_picture[encoding_delay]= (Picture*)pic;
1986 static void select_input_picture(MpegEncContext *s){
1989 for(i=1; i<MAX_PICTURE_COUNT; i++)
1990 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
1991 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
1993 /* set next picture types & ordering */
1994 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
1995 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
1996 s->reordered_input_picture[0]= s->input_picture[0];
1997 s->reordered_input_picture[0]->pict_type= I_TYPE;
1998 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2002 if(s->flags&CODEC_FLAG_PASS2){
2003 for(i=0; i<s->max_b_frames+1; i++){
2004 int pict_num= s->input_picture[0]->display_picture_number + i;
2005 int pict_type= s->rc_context.entry[pict_num].new_pict_type;
2006 s->input_picture[i]->pict_type= pict_type;
2008 if(i + 1 >= s->rc_context.num_entries) break;
2012 if(s->input_picture[0]->pict_type){
2013 /* user selected pict_type */
2014 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
2015 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
2018 if(b_frames > s->max_b_frames){
2019 av_log(s->avctx, AV_LOG_ERROR, "warning, too many bframes in a row\n");
2020 b_frames = s->max_b_frames;
2022 }else if(s->avctx->b_frame_strategy==0){
2023 b_frames= s->max_b_frames;
2024 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2025 }else if(s->avctx->b_frame_strategy==1){
2026 for(i=1; i<s->max_b_frames+1; i++){
2027 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2028 s->input_picture[i]->b_frame_score=
2029 get_intra_count(s, s->input_picture[i ]->data[0],
2030 s->input_picture[i-1]->data[0], s->linesize) + 1;
2033 for(i=0; i<s->max_b_frames; i++){
2034 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2037 b_frames= FFMAX(0, i-1);
2040 for(i=0; i<b_frames+1; i++){
2041 s->input_picture[i]->b_frame_score=0;
2044 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2049 //static int b_count=0;
2050 //b_count+= b_frames;
2051 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2052 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2053 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2055 s->input_picture[b_frames]->pict_type= I_TYPE;
2058 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2060 && s->input_picture[b_frames]->pict_type== I_TYPE)
2063 s->reordered_input_picture[0]= s->input_picture[b_frames];
2064 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2065 s->reordered_input_picture[0]->pict_type= P_TYPE;
2066 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2067 for(i=0; i<b_frames; i++){
2068 s->reordered_input_picture[i+1]= s->input_picture[i];
2069 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2070 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2075 if(s->reordered_input_picture[0]){
2076 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2078 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2080 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2081 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
2083 int i= ff_find_unused_picture(s, 0);
2084 Picture *pic= &s->picture[i];
2086 /* mark us unused / free shared pic */
2088 s->reordered_input_picture[0]->data[i]= NULL;
2089 s->reordered_input_picture[0]->type= 0;
2091 pic->reference = s->reordered_input_picture[0]->reference;
2093 alloc_picture(s, pic, 0);
2095 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2097 s->current_picture_ptr= pic;
2099 // input is not a shared pix -> reuse buffer for current_pix
2101 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2102 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2104 s->current_picture_ptr= s->reordered_input_picture[0];
2106 s->new_picture.data[i]+=16;
2109 copy_picture(&s->current_picture, s->current_picture_ptr);
2111 s->picture_number= s->new_picture.display_picture_number;
2112 //printf("dpn:%d\n", s->picture_number);
2114 memset(&s->new_picture, 0, sizeof(Picture));
2118 int MPV_encode_picture(AVCodecContext *avctx,
2119 unsigned char *buf, int buf_size, void *data)
2121 MpegEncContext *s = avctx->priv_data;
2122 AVFrame *pic_arg = data;
2123 int i, stuffing_count;
2125 if(avctx->pix_fmt != PIX_FMT_YUV420P){
2126 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2130 for(i=0; i<avctx->thread_count; i++){
2131 int start_y= s->thread_context[i]->start_mb_y;
2132 int end_y= s->thread_context[i]-> end_mb_y;
2133 int h= s->mb_height;
2134 uint8_t *start= buf + buf_size*start_y/h;
2135 uint8_t *end = buf + buf_size* end_y/h;
2137 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2140 s->picture_in_gop_number++;
2142 load_input_picture(s, pic_arg);
2144 select_input_picture(s);
2147 if(s->new_picture.data[0]){
2148 s->pict_type= s->new_picture.pict_type;
2150 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2151 MPV_frame_start(s, avctx);
2153 encode_picture(s, s->picture_number);
2155 avctx->real_pict_num = s->picture_number;
2156 avctx->header_bits = s->header_bits;
2157 avctx->mv_bits = s->mv_bits;
2158 avctx->misc_bits = s->misc_bits;
2159 avctx->i_tex_bits = s->i_tex_bits;
2160 avctx->p_tex_bits = s->p_tex_bits;
2161 avctx->i_count = s->i_count;
2162 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2163 avctx->skip_count = s->skip_count;
2167 if (s->out_format == FMT_MJPEG)
2168 mjpeg_picture_trailer(s);
2170 if(s->flags&CODEC_FLAG_PASS1)
2171 ff_write_pass1_stats(s);
2174 avctx->error[i] += s->current_picture_ptr->error[i];
2177 flush_put_bits(&s->pb);
2178 s->frame_bits = put_bits_count(&s->pb);
2180 stuffing_count= ff_vbv_update(s, s->frame_bits);
2182 switch(s->codec_id){
2183 case CODEC_ID_MPEG1VIDEO:
2184 case CODEC_ID_MPEG2VIDEO:
2185 while(stuffing_count--){
2186 put_bits(&s->pb, 8, 0);
2189 case CODEC_ID_MPEG4:
2190 put_bits(&s->pb, 16, 0);
2191 put_bits(&s->pb, 16, 0x1C3);
2192 stuffing_count -= 4;
2193 while(stuffing_count--){
2194 put_bits(&s->pb, 8, 0xFF);
2198 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2200 flush_put_bits(&s->pb);
2201 s->frame_bits = put_bits_count(&s->pb);
2204 /* update mpeg1/2 vbv_delay for CBR */
2205 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2206 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2209 assert(s->repeat_first_field==0);
2211 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2212 assert(vbv_delay < 0xFFFF);
2214 s->vbv_delay_ptr[0] &= 0xF8;
2215 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2216 s->vbv_delay_ptr[1] = vbv_delay>>5;
2217 s->vbv_delay_ptr[2] &= 0x07;
2218 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2220 s->total_bits += s->frame_bits;
2221 avctx->frame_bits = s->frame_bits;
2223 assert((pbBufPtr(&s->pb) == s->pb.buf));
2226 assert((s->frame_bits&7)==0);
2228 return s->frame_bits/8;
2231 #endif //CONFIG_ENCODERS
2233 static inline void gmc1_motion(MpegEncContext *s,
2234 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2235 uint8_t **ref_picture)
2238 int offset, src_x, src_y, linesize, uvlinesize;
2239 int motion_x, motion_y;
2242 motion_x= s->sprite_offset[0][0];
2243 motion_y= s->sprite_offset[0][1];
2244 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2245 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2246 motion_x<<=(3-s->sprite_warping_accuracy);
2247 motion_y<<=(3-s->sprite_warping_accuracy);
2248 src_x = clip(src_x, -16, s->width);
2249 if (src_x == s->width)
2251 src_y = clip(src_y, -16, s->height);
2252 if (src_y == s->height)
2255 linesize = s->linesize;
2256 uvlinesize = s->uvlinesize;
2258 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2260 if(s->flags&CODEC_FLAG_EMU_EDGE){
2261 if( (unsigned)src_x >= s->h_edge_pos - 17
2262 || (unsigned)src_y >= s->v_edge_pos - 17){
2263 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2264 ptr= s->edge_emu_buffer;
2268 if((motion_x|motion_y)&7){
2269 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2270 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2274 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2275 if (s->no_rounding){
2276 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2278 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2282 if(s->flags&CODEC_FLAG_GRAY) return;
2284 motion_x= s->sprite_offset[1][0];
2285 motion_y= s->sprite_offset[1][1];
2286 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2287 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2288 motion_x<<=(3-s->sprite_warping_accuracy);
2289 motion_y<<=(3-s->sprite_warping_accuracy);
2290 src_x = clip(src_x, -8, s->width>>1);
2291 if (src_x == s->width>>1)
2293 src_y = clip(src_y, -8, s->height>>1);
2294 if (src_y == s->height>>1)
2297 offset = (src_y * uvlinesize) + src_x;
2298 ptr = ref_picture[1] + offset;
2299 if(s->flags&CODEC_FLAG_EMU_EDGE){
2300 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2301 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2302 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2303 ptr= s->edge_emu_buffer;
2307 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2309 ptr = ref_picture[2] + offset;
2311 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2312 ptr= s->edge_emu_buffer;
2314 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2319 static inline void gmc_motion(MpegEncContext *s,
2320 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2321 uint8_t **ref_picture)
2324 int linesize, uvlinesize;
2325 const int a= s->sprite_warping_accuracy;
2328 linesize = s->linesize;
2329 uvlinesize = s->uvlinesize;
2331 ptr = ref_picture[0];
2333 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2334 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2336 s->dsp.gmc(dest_y, ptr, linesize, 16,
2339 s->sprite_delta[0][0], s->sprite_delta[0][1],
2340 s->sprite_delta[1][0], s->sprite_delta[1][1],
2341 a+1, (1<<(2*a+1)) - s->no_rounding,
2342 s->h_edge_pos, s->v_edge_pos);
2343 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2344 ox + s->sprite_delta[0][0]*8,
2345 oy + s->sprite_delta[1][0]*8,
2346 s->sprite_delta[0][0], s->sprite_delta[0][1],
2347 s->sprite_delta[1][0], s->sprite_delta[1][1],
2348 a+1, (1<<(2*a+1)) - s->no_rounding,
2349 s->h_edge_pos, s->v_edge_pos);
2351 if(s->flags&CODEC_FLAG_GRAY) return;
2353 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2354 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2356 ptr = ref_picture[1];
2357 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2360 s->sprite_delta[0][0], s->sprite_delta[0][1],
2361 s->sprite_delta[1][0], s->sprite_delta[1][1],
2362 a+1, (1<<(2*a+1)) - s->no_rounding,
2363 s->h_edge_pos>>1, s->v_edge_pos>>1);
2365 ptr = ref_picture[2];
2366 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2369 s->sprite_delta[0][0], s->sprite_delta[0][1],
2370 s->sprite_delta[1][0], s->sprite_delta[1][1],
2371 a+1, (1<<(2*a+1)) - s->no_rounding,
2372 s->h_edge_pos>>1, s->v_edge_pos>>1);
2376 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2377 * @param buf destination buffer
2378 * @param src source buffer
2379 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2380 * @param block_w width of block
2381 * @param block_h height of block
2382 * @param src_x x coordinate of the top left sample of the block in the source buffer
2383 * @param src_y y coordinate of the top left sample of the block in the source buffer
2384 * @param w width of the source buffer
2385 * @param h height of the source buffer
2387 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2388 int src_x, int src_y, int w, int h){
2390 int start_y, start_x, end_y, end_x;
2393 src+= (h-1-src_y)*linesize;
2395 }else if(src_y<=-block_h){
2396 src+= (1-block_h-src_y)*linesize;
2402 }else if(src_x<=-block_w){
2403 src+= (1-block_w-src_x);
2407 start_y= FFMAX(0, -src_y);
2408 start_x= FFMAX(0, -src_x);
2409 end_y= FFMIN(block_h, h-src_y);
2410 end_x= FFMIN(block_w, w-src_x);
2412 // copy existing part
2413 for(y=start_y; y<end_y; y++){
2414 for(x=start_x; x<end_x; x++){
2415 buf[x + y*linesize]= src[x + y*linesize];
2420 for(y=0; y<start_y; y++){
2421 for(x=start_x; x<end_x; x++){
2422 buf[x + y*linesize]= buf[x + start_y*linesize];
2427 for(y=end_y; y<block_h; y++){
2428 for(x=start_x; x<end_x; x++){
2429 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2433 for(y=0; y<block_h; y++){
2435 for(x=0; x<start_x; x++){
2436 buf[x + y*linesize]= buf[start_x + y*linesize];
2440 for(x=end_x; x<block_w; x++){
2441 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2446 static inline int hpel_motion(MpegEncContext *s,
2447 uint8_t *dest, uint8_t *src,
2448 int field_based, int field_select,
2449 int src_x, int src_y,
2450 int width, int height, int stride,
2451 int h_edge_pos, int v_edge_pos,
2452 int w, int h, op_pixels_func *pix_op,
2453 int motion_x, int motion_y)
2458 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2459 src_x += motion_x >> 1;
2460 src_y += motion_y >> 1;
2462 /* WARNING: do no forget half pels */
2463 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2466 src_y = clip(src_y, -16, height);
2467 if (src_y == height)
2469 src += src_y * stride + src_x;
2471 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2472 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2473 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2474 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2475 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2476 src= s->edge_emu_buffer;
2482 pix_op[dxy](dest, src, stride, h);
2486 /* apply one mpeg motion vector to the three components */
2487 static always_inline void mpeg_motion(MpegEncContext *s,
2488 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2489 int field_based, int bottom_field, int field_select,
2490 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2491 int motion_x, int motion_y, int h)
2493 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2494 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2497 if(s->quarter_sample)
2504 v_edge_pos = s->v_edge_pos >> field_based;
2505 linesize = s->current_picture.linesize[0] << field_based;
2506 uvlinesize = s->current_picture.linesize[1] << field_based;
2508 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2509 src_x = s->mb_x* 16 + (motion_x >> 1);
2510 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2512 if (s->out_format == FMT_H263) {
2513 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2514 mx = (motion_x>>1)|(motion_x&1);
2516 uvdxy = ((my & 1) << 1) | (mx & 1);
2517 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2518 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2520 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2524 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2528 uvsrc_x = s->mb_x*8 + mx;
2529 uvsrc_y = s->mb_y*8 + my;
2531 if(s->chroma_y_shift){
2534 uvdxy = ((my & 1) << 1) | (mx & 1);
2535 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2536 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2538 if(s->chroma_x_shift){
2541 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2542 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2553 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2554 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2555 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2557 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2558 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2559 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2560 s->codec_id == CODEC_ID_MPEG1VIDEO){
2561 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2564 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2565 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2566 ptr_y = s->edge_emu_buffer;
2567 if(!(s->flags&CODEC_FLAG_GRAY)){
2568 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2569 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2570 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2571 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2572 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2578 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2579 dest_y += s->linesize;
2580 dest_cb+= s->uvlinesize;
2581 dest_cr+= s->uvlinesize;
2585 ptr_y += s->linesize;
2586 ptr_cb+= s->uvlinesize;
2587 ptr_cr+= s->uvlinesize;
2590 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2592 if(!(s->flags&CODEC_FLAG_GRAY)){
2593 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2594 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2597 //FIXME move to dsputil, avg variant, 16x16 version
2598 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2600 uint8_t * const top = src[1];
2601 uint8_t * const left = src[2];
2602 uint8_t * const mid = src[0];
2603 uint8_t * const right = src[3];
2604 uint8_t * const bottom= src[4];
2605 #define OBMC_FILTER(x, t, l, m, r, b)\
2606 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2607 #define OBMC_FILTER4(x, t, l, m, r, b)\
2608 OBMC_FILTER(x , t, l, m, r, b);\
2609 OBMC_FILTER(x+1 , t, l, m, r, b);\
2610 OBMC_FILTER(x +stride, t, l, m, r, b);\
2611 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2614 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2615 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2616 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2617 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2618 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2619 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2621 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2622 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2623 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2624 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2626 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2627 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2628 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2629 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2631 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2632 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2633 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2634 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2636 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2637 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2638 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2639 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2640 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2641 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2643 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2644 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2645 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2646 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2649 /* obmc for 1 8x8 luma block */
2650 static inline void obmc_motion(MpegEncContext *s,
2651 uint8_t *dest, uint8_t *src,
2652 int src_x, int src_y,
2653 op_pixels_func *pix_op,
2654 int16_t mv[5][2]/* mid top left right bottom*/)
2660 assert(s->quarter_sample==0);
2663 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2666 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2667 hpel_motion(s, ptr[i], src, 0, 0,
2669 s->width, s->height, s->linesize,
2670 s->h_edge_pos, s->v_edge_pos,
2672 mv[i][0], mv[i][1]);
2676 put_obmc(dest, ptr, s->linesize);
2679 static inline void qpel_motion(MpegEncContext *s,
2680 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2681 int field_based, int bottom_field, int field_select,
2682 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2683 qpel_mc_func (*qpix_op)[16],
2684 int motion_x, int motion_y, int h)
2686 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2687 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
2689 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2690 src_x = s->mb_x * 16 + (motion_x >> 2);
2691 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
2693 v_edge_pos = s->v_edge_pos >> field_based;
2694 linesize = s->linesize << field_based;
2695 uvlinesize = s->uvlinesize << field_based;
2700 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2701 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2702 mx= (motion_x>>1) + rtab[motion_x&7];
2703 my= (motion_y>>1) + rtab[motion_y&7];
2704 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2705 mx= (motion_x>>1)|(motion_x&1);
2706 my= (motion_y>>1)|(motion_y&1);
2714 uvdxy= (mx&1) | ((my&1)<<1);
2718 uvsrc_x = s->mb_x * 8 + mx;
2719 uvsrc_y = s->mb_y * (8 >> field_based) + my;
2721 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2722 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2723 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2725 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
2726 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
2727 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2728 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2729 ptr_y= s->edge_emu_buffer;
2730 if(!(s->flags&CODEC_FLAG_GRAY)){
2731 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
2732 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
2733 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2734 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
2735 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2742 qpix_op[0][dxy](dest_y, ptr_y, linesize);
2745 dest_y += s->linesize;
2746 dest_cb+= s->uvlinesize;
2747 dest_cr+= s->uvlinesize;
2751 ptr_y += s->linesize;
2752 ptr_cb += s->uvlinesize;
2753 ptr_cr += s->uvlinesize;
2755 //damn interlaced mode
2756 //FIXME boundary mirroring is not exactly correct here
2757 qpix_op[1][dxy](dest_y , ptr_y , linesize);
2758 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
2760 if(!(s->flags&CODEC_FLAG_GRAY)){
2761 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
2762 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
2766 inline int ff_h263_round_chroma(int x){
2768 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2771 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2776 * h263 chorma 4mv motion compensation.
2778 static inline void chroma_4mv_motion(MpegEncContext *s,
2779 uint8_t *dest_cb, uint8_t *dest_cr,
2780 uint8_t **ref_picture,
2781 op_pixels_func *pix_op,
2783 int dxy, emu=0, src_x, src_y, offset;
2786 /* In case of 8X8, we construct a single chroma motion vector
2787 with a special rounding */
2788 mx= ff_h263_round_chroma(mx);
2789 my= ff_h263_round_chroma(my);
2791 dxy = ((my & 1) << 1) | (mx & 1);
2795 src_x = s->mb_x * 8 + mx;
2796 src_y = s->mb_y * 8 + my;
2797 src_x = clip(src_x, -8, s->width/2);
2798 if (src_x == s->width/2)
2800 src_y = clip(src_y, -8, s->height/2);
2801 if (src_y == s->height/2)
2804 offset = (src_y * (s->uvlinesize)) + src_x;
2805 ptr = ref_picture[1] + offset;
2806 if(s->flags&CODEC_FLAG_EMU_EDGE){
2807 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
2808 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
2809 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2810 ptr= s->edge_emu_buffer;
2814 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
2816 ptr = ref_picture[2] + offset;
2818 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
2819 ptr= s->edge_emu_buffer;
2821 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
2825 * motion compesation of a single macroblock
2827 * @param dest_y luma destination pointer
2828 * @param dest_cb chroma cb/u destination pointer
2829 * @param dest_cr chroma cr/v destination pointer
2830 * @param dir direction (0->forward, 1->backward)
2831 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2832 * @param pic_op halfpel motion compensation function (average or put normally)
2833 * @param pic_op qpel motion compensation function (average or put normally)
2834 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2836 static inline void MPV_motion(MpegEncContext *s,
2837 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2838 int dir, uint8_t **ref_picture,
2839 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
2841 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
2843 uint8_t *ptr, *dest;
2848 if(s->obmc && s->pict_type != B_TYPE){
2849 int16_t mv_cache[4][4][2];
2850 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2851 const int mot_stride= s->b8_stride;
2852 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
2854 assert(!s->mb_skiped);
2856 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
2857 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2858 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2860 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
2861 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
2863 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
2866 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
2867 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
2868 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
2870 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
2871 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
2874 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
2875 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
2876 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
2878 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
2879 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
2885 const int x= (i&1)+1;
2886 const int y= (i>>1)+1;
2888 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
2889 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
2890 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
2891 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
2892 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
2894 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
2896 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
2903 if(!(s->flags&CODEC_FLAG_GRAY))
2904 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
2909 switch(s->mv_type) {
2913 if(s->real_sprite_warping_points==1){
2914 gmc1_motion(s, dest_y, dest_cb, dest_cr,
2917 gmc_motion(s, dest_y, dest_cb, dest_cr,
2920 }else if(s->quarter_sample){
2921 qpel_motion(s, dest_y, dest_cb, dest_cr,
2923 ref_picture, pix_op, qpix_op,
2924 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2926 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
2927 ref_picture, pix_op,
2928 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2932 mpeg_motion(s, dest_y, dest_cb, dest_cr,
2934 ref_picture, pix_op,
2935 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2941 if(s->quarter_sample){
2943 motion_x = s->mv[dir][i][0];
2944 motion_y = s->mv[dir][i][1];
2946 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2947 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
2948 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
2950 /* WARNING: do no forget half pels */
2951 src_x = clip(src_x, -16, s->width);
2952 if (src_x == s->width)
2954 src_y = clip(src_y, -16, s->height);
2955 if (src_y == s->height)
2958 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2959 if(s->flags&CODEC_FLAG_EMU_EDGE){
2960 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
2961 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
2962 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->linesize, 9, 9, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2963 ptr= s->edge_emu_buffer;
2966 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2967 qpix_op[1][dxy](dest, ptr, s->linesize);
2969 mx += s->mv[dir][i][0]/2;
2970 my += s->mv[dir][i][1]/2;
2974 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
2975 ref_picture[0], 0, 0,
2976 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
2977 s->width, s->height, s->linesize,
2978 s->h_edge_pos, s->v_edge_pos,
2980 s->mv[dir][i][0], s->mv[dir][i][1]);
2982 mx += s->mv[dir][i][0];
2983 my += s->mv[dir][i][1];
2987 if(!(s->flags&CODEC_FLAG_GRAY))
2988 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
2991 if (s->picture_structure == PICT_FRAME) {
2992 if(s->quarter_sample){
2994 qpel_motion(s, dest_y, dest_cb, dest_cr,
2995 1, i, s->field_select[dir][i],
2996 ref_picture, pix_op, qpix_op,
2997 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3001 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3002 1, 0, s->field_select[dir][0],
3003 ref_picture, pix_op,
3004 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3006 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3007 1, 1, s->field_select[dir][1],
3008 ref_picture, pix_op,
3009 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3012 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3013 ref_picture= s->current_picture_ptr->data;
3016 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3017 0, 0, s->field_select[dir][0],
3018 ref_picture, pix_op,
3019 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3024 uint8_t ** ref2picture;
3026 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3027 ref2picture= ref_picture;
3029 ref2picture= s->current_picture_ptr->data;
3032 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3033 0, 0, s->field_select[dir][i],
3034 ref2picture, pix_op,
3035 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3037 dest_y += 16*s->linesize;
3038 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3039 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3043 if(s->picture_structure == PICT_FRAME){
3047 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3049 ref_picture, pix_op,
3050 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3052 pix_op = s->dsp.avg_pixels_tab;
3056 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3057 0, 0, s->picture_structure != i+1,
3058 ref_picture, pix_op,
3059 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3061 // after put we make avg of the same block
3062 pix_op=s->dsp.avg_pixels_tab;
3064 //opposite parity is always in the same frame if this is second field
3065 if(!s->first_field){
3066 ref_picture = s->current_picture_ptr->data;
3076 /* put block[] to dest[] */
3077 static inline void put_dct(MpegEncContext *s,
3078 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3080 s->dct_unquantize_intra(s, block, i, qscale);
3081 s->dsp.idct_put (dest, line_size, block);
3084 /* add block[] to dest[] */
3085 static inline void add_dct(MpegEncContext *s,
3086 DCTELEM *block, int i, uint8_t *dest, int line_size)
3088 if (s->block_last_index[i] >= 0) {
3089 s->dsp.idct_add (dest, line_size, block);
3093 static inline void add_dequant_dct(MpegEncContext *s,
3094 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3096 if (s->block_last_index[i] >= 0) {
3097 s->dct_unquantize_inter(s, block, i, qscale);
3099 s->dsp.idct_add (dest, line_size, block);
3104 * cleans dc, ac, coded_block for the current non intra MB
3106 void ff_clean_intra_table_entries(MpegEncContext *s)
3108 int wrap = s->b8_stride;
3109 int xy = s->block_index[0];
3112 s->dc_val[0][xy + 1 ] =
3113 s->dc_val[0][xy + wrap] =
3114 s->dc_val[0][xy + 1 + wrap] = 1024;
3116 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3117 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3118 if (s->msmpeg4_version>=3) {
3119 s->coded_block[xy ] =
3120 s->coded_block[xy + 1 ] =
3121 s->coded_block[xy + wrap] =
3122 s->coded_block[xy + 1 + wrap] = 0;
3125 wrap = s->mb_stride;
3126 xy = s->mb_x + s->mb_y * wrap;
3128 s->dc_val[2][xy] = 1024;
3130 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3131 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3133 s->mbintra_table[xy]= 0;
3136 /* generic function called after a macroblock has been parsed by the
3137 decoder or after it has been encoded by the encoder.
3139 Important variables used:
3140 s->mb_intra : true if intra macroblock
3141 s->mv_dir : motion vector direction
3142 s->mv_type : motion vector type
3143 s->mv : motion vector
3144 s->interlaced_dct : true if interlaced dct used (mpeg2)
3146 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
3149 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3151 if(s->avctx->xvmc_acceleration){
3152 XVMC_decode_mb(s);//xvmc uses pblocks
3160 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3161 /* save DCT coefficients */
3163 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3166 *dct++ = block[i][s->dsp.idct_permutation[j]];
3169 s->current_picture.qscale_table[mb_xy]= s->qscale;
3171 /* update DC predictors for P macroblocks */
3173 if (s->h263_pred || s->h263_aic) {
3174 if(s->mbintra_table[mb_xy])
3175 ff_clean_intra_table_entries(s);
3179 s->last_dc[2] = 128 << s->intra_dc_precision;
3182 else if (s->h263_pred || s->h263_aic)
3183 s->mbintra_table[mb_xy]=1;
3185 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3186 uint8_t *dest_y, *dest_cb, *dest_cr;
3187 int dct_linesize, dct_offset;
3188 op_pixels_func (*op_pix)[4];
3189 qpel_mc_func (*op_qpix)[16];
3190 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3191 const int uvlinesize= s->current_picture.linesize[1];
3192 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band;
3194 /* avoid copy if macroblock skipped in last frame too */
3195 /* skip only during decoding as we might trash the buffers during encoding a bit */
3197 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3198 const int age= s->current_picture.age;
3204 assert(s->pict_type!=I_TYPE);
3206 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
3207 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3209 /* if previous was skipped too, then nothing to do ! */
3210 if (*mbskip_ptr >= age && s->current_picture.reference){
3213 } else if(!s->current_picture.reference){
3214 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3215 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3217 *mbskip_ptr = 0; /* not skipped */
3221 dct_linesize = linesize << s->interlaced_dct;
3222 dct_offset =(s->interlaced_dct)? linesize : linesize*8;
3226 dest_cb= s->dest[1];
3227 dest_cr= s->dest[2];
3229 dest_y = s->b_scratchpad;
3230 dest_cb= s->b_scratchpad+16*linesize;
3231 dest_cr= s->b_scratchpad+32*linesize;
3234 /* motion handling */
3235 /* decoding or more than one mb_type (MC was allready done otherwise) */
3237 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3238 op_pix = s->dsp.put_pixels_tab;
3239 op_qpix= s->dsp.put_qpel_pixels_tab;
3241 op_pix = s->dsp.put_no_rnd_pixels_tab;
3242 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3245 if (s->mv_dir & MV_DIR_FORWARD) {
3246 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3247 op_pix = s->dsp.avg_pixels_tab;
3248 op_qpix= s->dsp.avg_qpel_pixels_tab;
3250 if (s->mv_dir & MV_DIR_BACKWARD) {
3251 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3255 /* skip dequant / idct if we are really late ;) */
3256 if(s->hurry_up>1) return;
3258 /* add dct residue */
3259 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3260 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3261 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
3262 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
3263 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
3264 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
3266 if(!(s->flags&CODEC_FLAG_GRAY)){
3267 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3268 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3270 } else if(s->codec_id != CODEC_ID_WMV2){
3271 add_dct(s, block[0], 0, dest_y, dct_linesize);
3272 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
3273 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
3274 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
3276 if(!(s->flags&CODEC_FLAG_GRAY)){
3277 if(s->chroma_y_shift){//Chroma420
3278 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3279 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3282 dct_linesize = uvlinesize << s->interlaced_dct;
3283 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3285 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3286 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3287 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3288 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3289 if(!s->chroma_x_shift){//Chroma444
3290 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3291 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3292 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3293 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3300 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3304 /* dct only in intra block */
3305 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3306 put_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
3307 put_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
3308 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
3309 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
3311 if(!(s->flags&CODEC_FLAG_GRAY)){
3312 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3313 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3316 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3317 s->dsp.idct_put(dest_y + 8, dct_linesize, block[1]);
3318 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3319 s->dsp.idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]);
3321 if(!(s->flags&CODEC_FLAG_GRAY)){
3322 if(s->chroma_y_shift){
3323 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3324 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3327 dct_linesize = uvlinesize << s->interlaced_dct;
3328 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3330 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3331 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3332 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3333 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3334 if(!s->chroma_x_shift){//Chroma444
3335 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3336 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3337 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3338 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3345 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3346 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3347 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3352 #ifdef CONFIG_ENCODERS
3354 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3356 static const char tab[64]=
3368 DCTELEM *block= s->block[n];
3369 const int last_index= s->block_last_index[n];
3374 threshold= -threshold;
3378 /* are all which we could set to zero are allready zero? */
3379 if(last_index<=skip_dc - 1) return;
3381 for(i=0; i<=last_index; i++){
3382 const int j = s->intra_scantable.permutated[i];
3383 const int level = ABS(block[j]);
3385 if(skip_dc && i==0) continue;
3394 if(score >= threshold) return;
3395 for(i=skip_dc; i<=last_index; i++){
3396 const int j = s->intra_scantable.permutated[i];
3399 if(block[0]) s->block_last_index[n]= 0;
3400 else s->block_last_index[n]= -1;
3403 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3406 const int maxlevel= s->max_qcoeff;
3407 const int minlevel= s->min_qcoeff;
3411 i=1; //skip clipping of intra dc
3415 for(;i<=last_index; i++){
3416 const int j= s->intra_scantable.permutated[i];
3417 int level = block[j];
3419 if (level>maxlevel){
3422 }else if(level<minlevel){
3430 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3431 av_log(s->avctx, AV_LOG_INFO, "warning, cliping %d dct coefficents to %d..%d\n", overflow, minlevel, maxlevel);
3434 #endif //CONFIG_ENCODERS
3438 * @param h is the normal height, this will be reduced automatically if needed for the last row
3440 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3441 if (s->avctx->draw_horiz_band) {
3445 if(s->picture_structure != PICT_FRAME){
3448 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3451 h= FFMIN(h, s->height - y);
3453 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3454 src= (AVFrame*)s->current_picture_ptr;
3455 else if(s->last_picture_ptr)
3456 src= (AVFrame*)s->last_picture_ptr;
3460 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
3466 offset[0]= y * s->linesize;;
3468 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
3474 s->avctx->draw_horiz_band(s->avctx, src, offset,
3475 y, s->picture_structure, h);
3479 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
3480 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3481 const int uvlinesize= s->current_picture.linesize[1];
3483 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
3484 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
3485 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
3486 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
3487 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3488 s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3489 //block_index is not used by mpeg2, so it is not affected by chroma_format
3491 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << 4);
3492 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (4 - s->chroma_x_shift));
3493 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (4 - s->chroma_x_shift));
3495 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
3497 s->dest[0] += s->mb_y * linesize << 4;
3498 s->dest[1] += s->mb_y * uvlinesize << (4 - s->chroma_y_shift);
3499 s->dest[2] += s->mb_y * uvlinesize << (4 - s->chroma_y_shift);
3503 #ifdef CONFIG_ENCODERS
3505 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
3515 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
3516 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
3517 int v= ptr[x2 + y2*stride];
3523 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
3528 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
3530 int16_t weight[6][64];
3531 DCTELEM orig[6][64];
3532 const int mb_x= s->mb_x;
3533 const int mb_y= s->mb_y;
3536 int dct_offset = s->linesize*8; //default for progressive frames
3537 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3540 for(i=0; i<6; i++) skip_dct[i]=0;
3542 if(s->adaptive_quant){
3543 const int last_qp= s->qscale;
3544 const int mb_xy= mb_x + mb_y*s->mb_stride;
3546 s->lambda= s->lambda_table[mb_xy];
3549 if(!(s->flags&CODEC_FLAG_QP_RD)){
3550 s->dquant= s->qscale - last_qp;
3552 if(s->out_format==FMT_H263){
3553 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
3555 if(s->codec_id==CODEC_ID_MPEG4){
3557 if(s->pict_type == B_TYPE){
3559 s->dquant= (s->dquant/2)*2;
3560 if(s->mv_dir&MV_DIRECT)
3563 if(s->mv_type==MV_TYPE_8X8)
3569 ff_set_qscale(s, last_qp + s->dquant);
3570 }else if(s->flags&CODEC_FLAG_QP_RD)
3571 ff_set_qscale(s, s->qscale + s->dquant);
3573 wrap_y = s->linesize;
3574 wrap_c = s->uvlinesize;
3575 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
3576 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
3577 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
3579 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
3580 uint8_t *ebuf= s->edge_emu_buffer + 32;
3581 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
3583 ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3584 ptr_cb= ebuf+18*wrap_y;
3585 ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3586 ptr_cr= ebuf+18*wrap_y+8;
3590 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3591 int progressive_score, interlaced_score;
3593 s->interlaced_dct=0;
3594 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
3595 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
3597 if(progressive_score > 0){
3598 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
3599 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
3600 if(progressive_score > interlaced_score){
3601 s->interlaced_dct=1;
3609 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
3610 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
3611 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
3612 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
3614 if(s->flags&CODEC_FLAG_GRAY){
3618 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
3619 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
3622 op_pixels_func (*op_pix)[4];
3623 qpel_mc_func (*op_qpix)[16];
3624 uint8_t *dest_y, *dest_cb, *dest_cr;
3626 dest_y = s->dest[0];
3627 dest_cb = s->dest[1];
3628 dest_cr = s->dest[2];
3630 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3631 op_pix = s->dsp.put_pixels_tab;
3632 op_qpix= s->dsp.put_qpel_pixels_tab;
3634 op_pix = s->dsp.put_no_rnd_pixels_tab;
3635 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3638 if (s->mv_dir & MV_DIR_FORWARD) {
3639 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3640 op_pix = s->dsp.avg_pixels_tab;
3641 op_qpix= s->dsp.avg_qpel_pixels_tab;
3643 if (s->mv_dir & MV_DIR_BACKWARD) {
3644 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3647 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3648 int progressive_score, interlaced_score;
3650 s->interlaced_dct=0;
3651 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
3652 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
3654 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
3656 if(progressive_score>0){
3657 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
3658 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
3660 if(progressive_score > interlaced_score){
3661 s->interlaced_dct=1;
3669 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
3670 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
3671 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
3672 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
3674 if(s->flags&CODEC_FLAG_GRAY){
3678 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
3679 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
3681 /* pre quantization */
3682 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
3684 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
3685 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
3686 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
3687 if(s->dsp.sad[1](NULL, ptr_y +dct_offset+ 8, dest_y +dct_offset+ 8, wrap_y, 8) < 20*s->qscale) skip_dct[3]= 1;
3688 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
3689 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
3693 if(s->avctx->quantizer_noise_shaping){
3694 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
3695 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
3696 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
3697 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
3698 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
3699 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
3700 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
3703 /* DCT & quantize */
3704 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
3709 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
3710 // FIXME we could decide to change to quantizer instead of clipping
3711 // JS: I don't think that would be a good idea it could lower quality instead
3712 // of improve it. Just INTRADC clipping deserves changes in quantizer
3713 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3715 s->block_last_index[i]= -1;
3717 if(s->avctx->quantizer_noise_shaping){
3720 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
3725 if(s->luma_elim_threshold && !s->mb_intra)
3727 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
3728 if(s->chroma_elim_threshold && !s->mb_intra)
3730 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
3732 if(s->flags & CODEC_FLAG_CBP_RD){
3734 if(s->block_last_index[i] == -1)
3735 s->coded_score[i]= INT_MAX/256;
3740 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3741 s->block_last_index[4]=
3742 s->block_last_index[5]= 0;
3744 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
3747 //non c quantize code returns incorrect block_last_index FIXME
3748 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
3751 if(s->block_last_index[i]>0){
3752 for(j=63; j>0; j--){
3753 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
3755 s->block_last_index[i]= j;
3760 /* huffman encode */
3761 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
3762 case CODEC_ID_MPEG1VIDEO:
3763 case CODEC_ID_MPEG2VIDEO:
3764 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
3766 case CODEC_ID_MPEG4:
3767 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3768 case CODEC_ID_MSMPEG4V2:
3769 case CODEC_ID_MSMPEG4V3:
3771 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3773 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
3775 case CODEC_ID_H263P:
3778 h263_encode_mb(s, s->block, motion_x, motion_y); break;
3780 case CODEC_ID_MJPEG:
3781 mjpeg_encode_mb(s, s->block); break;
3787 #endif //CONFIG_ENCODERS
3789 void ff_mpeg_flush(AVCodecContext *avctx){
3791 MpegEncContext *s = avctx->priv_data;
3793 if(s==NULL || s->picture==NULL)
3796 for(i=0; i<MAX_PICTURE_COUNT; i++){
3797 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
3798 || s->picture[i].type == FF_BUFFER_TYPE_USER))
3799 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
3801 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
3803 s->parse_context.state= -1;
3804 s->parse_context.frame_start_found= 0;
3805 s->parse_context.overread= 0;
3806 s->parse_context.overread_index= 0;
3807 s->parse_context.index= 0;
3808 s->parse_context.last_index= 0;
3809 s->bitstream_buffer_size=0;
3812 #ifdef CONFIG_ENCODERS
3813 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
3815 const uint16_t *srcw= (uint16_t*)src;
3816 int words= length>>4;
3817 int bits= length&15;
3820 if(length==0) return;
3823 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
3824 }else if(put_bits_count(pb)&7){
3825 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
3827 for(i=0; put_bits_count(pb)&31; i++)
3828 put_bits(pb, 8, src[i]);
3830 memcpy(pbBufPtr(pb), src+i, 2*words-i);
3831 skip_put_bytes(pb, 2*words-i);
3834 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
3837 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
3840 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3843 d->mb_skip_run= s->mb_skip_run;
3845 d->last_dc[i]= s->last_dc[i];
3848 d->mv_bits= s->mv_bits;
3849 d->i_tex_bits= s->i_tex_bits;
3850 d->p_tex_bits= s->p_tex_bits;
3851 d->i_count= s->i_count;
3852 d->f_count= s->f_count;
3853 d->b_count= s->b_count;
3854 d->skip_count= s->skip_count;
3855 d->misc_bits= s->misc_bits;
3859 d->qscale= s->qscale;
3860 d->dquant= s->dquant;
3863 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
3866 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
3867 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3870 d->mb_skip_run= s->mb_skip_run;
3872 d->last_dc[i]= s->last_dc[i];
3875 d->mv_bits= s->mv_bits;
3876 d->i_tex_bits= s->i_tex_bits;
3877 d->p_tex_bits= s->p_tex_bits;
3878 d->i_count= s->i_count;
3879 d->f_count= s->f_count;
3880 d->b_count= s->b_count;
3881 d->skip_count= s->skip_count;
3882 d->misc_bits= s->misc_bits;
3884 d->mb_intra= s->mb_intra;
3885 d->mb_skiped= s->mb_skiped;
3886 d->mv_type= s->mv_type;
3887 d->mv_dir= s->mv_dir;
3889 if(s->data_partitioning){
3891 d->tex_pb= s->tex_pb;
3895 d->block_last_index[i]= s->block_last_index[i];
3896 d->interlaced_dct= s->interlaced_dct;
3897 d->qscale= s->qscale;
3900 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
3901 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
3902 int *dmin, int *next_block, int motion_x, int motion_y)
3905 uint8_t *dest_backup[3];
3907 copy_context_before_encode(s, backup, type);
3909 s->block= s->blocks[*next_block];
3910 s->pb= pb[*next_block];
3911 if(s->data_partitioning){
3912 s->pb2 = pb2 [*next_block];
3913 s->tex_pb= tex_pb[*next_block];
3917 memcpy(dest_backup, s->dest, sizeof(s->dest));
3918 s->dest[0] = s->rd_scratchpad;
3919 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
3920 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
3921 assert(s->linesize >= 32); //FIXME
3924 encode_mb(s, motion_x, motion_y);
3926 score= put_bits_count(&s->pb);
3927 if(s->data_partitioning){
3928 score+= put_bits_count(&s->pb2);
3929 score+= put_bits_count(&s->tex_pb);
3932 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
3933 MPV_decode_mb(s, s->block);
3935 score *= s->lambda2;
3936 score += sse_mb(s) << FF_LAMBDA_SHIFT;
3940 memcpy(s->dest, dest_backup, sizeof(s->dest));
3947 copy_context_after_encode(best, s, type);
3951 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
3952 uint32_t *sq = squareTbl + 256;
3957 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
3958 else if(w==8 && h==8)
3959 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
3963 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
3972 static int sse_mb(MpegEncContext *s){
3976 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3977 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3980 if(s->avctx->mb_cmp == FF_CMP_NSSE){
3981 return s->dsp.nsse[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
3982 +s->dsp.nsse[1](s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
3983 +s->dsp.nsse[1](s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
3985 return s->dsp.sse[0](NULL, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
3986 +s->dsp.sse[1](NULL, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
3987 +s->dsp.sse[1](NULL, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
3990 return sse(s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], w, h, s->linesize)
3991 +sse(s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], w>>1, h>>1, s->uvlinesize)
3992 +sse(s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], w>>1, h>>1, s->uvlinesize);
3995 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
3996 MpegEncContext *s= arg;
4000 s->me.dia_size= s->avctx->pre_dia_size;
4001 s->first_slice_line=1;
4002 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4003 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4004 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4006 s->first_slice_line=0;
4014 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4015 MpegEncContext *s= arg;
4017 s->me.dia_size= s->avctx->dia_size;
4018 s->first_slice_line=1;
4019 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4020 s->mb_x=0; //for block init below
4021 ff_init_block_index(s);
4022 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4023 s->block_index[0]+=2;
4024 s->block_index[1]+=2;
4025 s->block_index[2]+=2;
4026 s->block_index[3]+=2;
4028 /* compute motion vector & mb_type and store in context */
4029 if(s->pict_type==B_TYPE)
4030 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4032 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4034 s->first_slice_line=0;
4039 static int mb_var_thread(AVCodecContext *c, void *arg){
4040 MpegEncContext *s= arg;
4043 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4044 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4047 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4049 int sum = s->dsp.pix_sum(pix, s->linesize);
4051 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4053 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4054 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4055 s->me.mb_var_sum_temp += varc;
4061 static void write_slice_end(MpegEncContext *s){
4062 if(s->codec_id==CODEC_ID_MPEG4){
4063 if(s->partitioned_frame){
4064 ff_mpeg4_merge_partitions(s);
4067 ff_mpeg4_stuffing(&s->pb);
4068 }else if(s->out_format == FMT_MJPEG){
4069 ff_mjpeg_stuffing(&s->pb);
4072 align_put_bits(&s->pb);
4073 flush_put_bits(&s->pb);
4076 static int encode_thread(AVCodecContext *c, void *arg){
4077 MpegEncContext *s= arg;
4078 int mb_x, mb_y, pdif = 0;
4080 MpegEncContext best_s, backup_s;
4081 uint8_t bit_buf[2][3000];
4082 uint8_t bit_buf2[2][3000];
4083 uint8_t bit_buf_tex[2][3000];
4084 PutBitContext pb[2], pb2[2], tex_pb[2];
4085 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4088 init_put_bits(&pb [i], bit_buf [i], 3000);
4089 init_put_bits(&pb2 [i], bit_buf2 [i], 3000);
4090 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000);
4093 s->last_bits= put_bits_count(&s->pb);
4104 /* init last dc values */
4105 /* note: quant matrix value (8) is implied here */
4106 s->last_dc[i] = 128 << s->intra_dc_precision;
4108 s->current_picture_ptr->error[i] = 0;
4111 memset(s->last_mv, 0, sizeof(s->last_mv));
4116 switch(s->codec_id){
4118 case CODEC_ID_H263P:
4120 s->gob_index = ff_h263_get_gob_height(s);
4122 case CODEC_ID_MPEG4:
4123 if(s->partitioned_frame)
4124 ff_mpeg4_init_partitions(s);
4131 s->first_slice_line = 1;
4132 s->ptr_lastgob = s->pb.buf;
4133 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4134 // printf("row %d at %X\n", s->mb_y, (int)s);
4138 ff_set_qscale(s, s->qscale);
4139 ff_init_block_index(s);
4141 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4142 const int xy= mb_y*s->mb_stride + mb_x;
4143 int mb_type= s->mb_type[xy];
4149 ff_update_block_index(s);
4151 /* write gob / video packet header */
4154 int current_packet_size, is_gob_start;
4156 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4158 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4160 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4162 switch(s->codec_id){
4164 case CODEC_ID_H263P:
4165 if(!s->h263_slice_structured)
4166 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4168 case CODEC_ID_MPEG2VIDEO:
4169 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4170 case CODEC_ID_MPEG1VIDEO:
4171 if(s->mb_skip_run) is_gob_start=0;
4176 if(s->start_mb_y != mb_y || mb_x!=0){
4179 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4180 ff_mpeg4_init_partitions(s);
4184 assert((put_bits_count(&s->pb)&7) == 0);
4185 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4187 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4188 int r= put_bits_count(&s->pb)/8 + s->picture_number + s->codec_id + s->mb_x + s->mb_y;
4189 int d= 100 / s->avctx->error_rate;
4191 current_packet_size=0;
4192 #ifndef ALT_BITSTREAM_WRITER
4193 s->pb.buf_ptr= s->ptr_lastgob;
4195 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4199 if (s->avctx->rtp_callback)
4200 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, 0);
4202 switch(s->codec_id){
4203 case CODEC_ID_MPEG4:
4204 ff_mpeg4_encode_video_packet_header(s);
4205 ff_mpeg4_clean_buffers(s);
4207 case CODEC_ID_MPEG1VIDEO:
4208 case CODEC_ID_MPEG2VIDEO:
4209 ff_mpeg1_encode_slice_header(s);
4210 ff_mpeg1_clean_buffers(s);
4213 case CODEC_ID_H263P:
4214 h263_encode_gob_header(s, mb_y);
4218 if(s->flags&CODEC_FLAG_PASS1){
4219 int bits= put_bits_count(&s->pb);
4220 s->misc_bits+= bits - s->last_bits;
4224 s->ptr_lastgob += current_packet_size;
4225 s->first_slice_line=1;
4226 s->resync_mb_x=mb_x;
4227 s->resync_mb_y=mb_y;
4232 if( (s->resync_mb_x == s->mb_x)
4233 && s->resync_mb_y+1 == s->mb_y){
4234 s->first_slice_line=0;
4238 s->dquant=0; //only for QP_RD
4240 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4242 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4244 copy_context_before_encode(&backup_s, s, -1);
4246 best_s.data_partitioning= s->data_partitioning;
4247 best_s.partitioned_frame= s->partitioned_frame;
4248 if(s->data_partitioning){
4249 backup_s.pb2= s->pb2;
4250 backup_s.tex_pb= s->tex_pb;
4253 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4254 s->mv_dir = MV_DIR_FORWARD;
4255 s->mv_type = MV_TYPE_16X16;
4257 s->mv[0][0][0] = s->p_mv_table[xy][0];
4258 s->mv[0][0][1] = s->p_mv_table[xy][1];
4259 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4260 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4262 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4263 s->mv_dir = MV_DIR_FORWARD;
4264 s->mv_type = MV_TYPE_FIELD;
4267 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4268 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4269 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4271 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4272 &dmin, &next_block, 0, 0);
4274 if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4275 s->mv_dir = MV_DIR_FORWARD;
4276 s->mv_type = MV_TYPE_16X16;
4280 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb,
4281 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4283 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4284 s->mv_dir = MV_DIR_FORWARD;
4285 s->mv_type = MV_TYPE_8X8;
4288 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4289 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4291 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4292 &dmin, &next_block, 0, 0);
4294 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4295 s->mv_dir = MV_DIR_FORWARD;
4296 s->mv_type = MV_TYPE_16X16;
4298 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4299 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4300 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4301 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4303 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4304 s->mv_dir = MV_DIR_BACKWARD;
4305 s->mv_type = MV_TYPE_16X16;
4307 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4308 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4309 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4310 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4312 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4313 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4314 s->mv_type = MV_TYPE_16X16;
4316 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4317 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4318 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4319 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4320 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4321 &dmin, &next_block, 0, 0);
4323 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4324 int mx= s->b_direct_mv_table[xy][0];
4325 int my= s->b_direct_mv_table[xy][1];
4327 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4330 ff_mpeg4_set_direct_mv(s, mx, my);
4332 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4333 &dmin, &next_block, mx, my);
4335 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4336 s->mv_dir = MV_DIR_FORWARD;
4337 s->mv_type = MV_TYPE_FIELD;
4340 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4341 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4342 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4344 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4345 &dmin, &next_block, 0, 0);
4347 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4348 s->mv_dir = MV_DIR_BACKWARD;
4349 s->mv_type = MV_TYPE_FIELD;
4352 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4353 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4354 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4356 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4357 &dmin, &next_block, 0, 0);
4359 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4360 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4361 s->mv_type = MV_TYPE_FIELD;
4363 for(dir=0; dir<2; dir++){
4365 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4366 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4367 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4370 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4371 &dmin, &next_block, 0, 0);
4373 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4375 s->mv_type = MV_TYPE_16X16;
4379 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4380 &dmin, &next_block, 0, 0);
4381 if(s->h263_pred || s->h263_aic){
4383 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4385 ff_clean_intra_table_entries(s); //old mode?
4389 if(s->flags & CODEC_FLAG_QP_RD){
4390 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4391 const int last_qp= backup_s.qscale;
4392 int dquant, dir, qp, dc[6];
4394 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4396 assert(backup_s.dquant == 0);
4399 s->mv_dir= best_s.mv_dir;
4400 s->mv_type = MV_TYPE_16X16;
4401 s->mb_intra= best_s.mb_intra;
4402 s->mv[0][0][0] = best_s.mv[0][0][0];
4403 s->mv[0][0][1] = best_s.mv[0][0][1];
4404 s->mv[1][0][0] = best_s.mv[1][0][0];
4405 s->mv[1][0][1] = best_s.mv[1][0][1];
4407 dir= s->pict_type == B_TYPE ? 2 : 1;
4408 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4409 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4410 qp= last_qp + dquant;
4411 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4413 backup_s.dquant= dquant;
4414 if(s->mb_intra && s->dc_val[0]){
4416 dc[i]= s->dc_val[0][ s->block_index[i] ];
4417 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4421 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4422 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4423 if(best_s.qscale != qp){
4424 if(s->mb_intra && s->dc_val[0]){
4426 s->dc_val[0][ s->block_index[i] ]= dc[i];
4427 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4430 if(dir > 0 && dquant==dir){
4438 s->current_picture.qscale_table[xy]= qp;
4442 copy_context_after_encode(s, &best_s, -1);
4444 pb_bits_count= put_bits_count(&s->pb);
4445 flush_put_bits(&s->pb);
4446 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
4449 if(s->data_partitioning){
4450 pb2_bits_count= put_bits_count(&s->pb2);
4451 flush_put_bits(&s->pb2);
4452 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
4453 s->pb2= backup_s.pb2;
4455 tex_pb_bits_count= put_bits_count(&s->tex_pb);
4456 flush_put_bits(&s->tex_pb);
4457 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
4458 s->tex_pb= backup_s.tex_pb;
4460 s->last_bits= put_bits_count(&s->pb);
4463 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4464 ff_h263_update_motion_val(s);
4467 if(next_block==0){ //FIXME 16 vs linesize16
4468 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
4469 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
4470 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
4473 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
4474 MPV_decode_mb(s, s->block);
4476 int motion_x, motion_y;
4477 s->mv_type=MV_TYPE_16X16;
4478 // only one MB-Type possible
4481 case CANDIDATE_MB_TYPE_INTRA:
4484 motion_x= s->mv[0][0][0] = 0;
4485 motion_y= s->mv[0][0][1] = 0;
4487 case CANDIDATE_MB_TYPE_INTER:
4488 s->mv_dir = MV_DIR_FORWARD;
4490 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
4491 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
4493 case CANDIDATE_MB_TYPE_INTER_I:
4494 s->mv_dir = MV_DIR_FORWARD;
4495 s->mv_type = MV_TYPE_FIELD;
4498 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4499 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4500 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4502 motion_x = motion_y = 0;
4504 case CANDIDATE_MB_TYPE_INTER4V:
4505 s->mv_dir = MV_DIR_FORWARD;
4506 s->mv_type = MV_TYPE_8X8;
4509 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4510 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4512 motion_x= motion_y= 0;
4514 case CANDIDATE_MB_TYPE_DIRECT:
4515 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4517 motion_x=s->b_direct_mv_table[xy][0];
4518 motion_y=s->b_direct_mv_table[xy][1];
4520 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
4523 case CANDIDATE_MB_TYPE_BIDIR:
4524 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4528 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4529 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4530 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4531 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4533 case CANDIDATE_MB_TYPE_BACKWARD:
4534 s->mv_dir = MV_DIR_BACKWARD;
4536 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4537 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4539 case CANDIDATE_MB_TYPE_FORWARD:
4540 s->mv_dir = MV_DIR_FORWARD;
4542 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4543 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4544 // printf(" %d %d ", motion_x, motion_y);
4546 case CANDIDATE_MB_TYPE_FORWARD_I:
4547 s->mv_dir = MV_DIR_FORWARD;
4548 s->mv_type = MV_TYPE_FIELD;
4551 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4552 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4553 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4555 motion_x=motion_y=0;
4557 case CANDIDATE_MB_TYPE_BACKWARD_I:
4558 s->mv_dir = MV_DIR_BACKWARD;
4559 s->mv_type = MV_TYPE_FIELD;
4562 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4563 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4564 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4566 motion_x=motion_y=0;
4568 case CANDIDATE_MB_TYPE_BIDIR_I:
4569 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4570 s->mv_type = MV_TYPE_FIELD;
4572 for(dir=0; dir<2; dir++){
4574 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4575 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4576 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4579 motion_x=motion_y=0;
4582 motion_x=motion_y=0; //gcc warning fix
4583 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
4586 encode_mb(s, motion_x, motion_y);
4588 // RAL: Update last macrobloc type
4589 s->last_mv_dir = s->mv_dir;
4592 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4593 ff_h263_update_motion_val(s);
4596 MPV_decode_mb(s, s->block);
4599 /* clean the MV table in IPS frames for direct mode in B frames */
4600 if(s->mb_intra /* && I,P,S_TYPE */){
4601 s->p_mv_table[xy][0]=0;
4602 s->p_mv_table[xy][1]=0;
4605 if(s->flags&CODEC_FLAG_PSNR){
4609 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4610 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4612 s->current_picture_ptr->error[0] += sse(
4613 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
4614 s->dest[0], w, h, s->linesize);
4615 s->current_picture_ptr->error[1] += sse(
4616 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4617 s->dest[1], w>>1, h>>1, s->uvlinesize);
4618 s->current_picture_ptr->error[2] += sse(
4619 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4620 s->dest[2], w>>1, h>>1, s->uvlinesize);
4623 ff_h263_loop_filter(s);
4624 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
4629 //not beautifull here but we must write it before flushing so it has to be here
4630 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
4631 msmpeg4_encode_ext_header(s);
4636 /* Send the last GOB if RTP */
4637 if (s->avctx->rtp_callback) {
4638 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
4639 /* Call the RTP callback to send the last GOB */
4641 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, 0);
4647 #define MERGE(field) dst->field += src->field; src->field=0
4648 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
4649 MERGE(me.scene_change_score);
4650 MERGE(me.mc_mb_var_sum_temp);
4651 MERGE(me.mb_var_sum_temp);
4654 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
4657 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
4658 MERGE(dct_count[1]);
4668 MERGE(padding_bug_score);
4670 if(dst->avctx->noise_reduction){
4671 for(i=0; i<64; i++){
4672 MERGE(dct_error_sum[0][i]);
4673 MERGE(dct_error_sum[1][i]);
4677 assert(put_bits_count(&src->pb) % 8 ==0);
4678 assert(put_bits_count(&dst->pb) % 8 ==0);
4679 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
4680 flush_put_bits(&dst->pb);
4683 static void encode_picture(MpegEncContext *s, int picture_number)
4688 s->picture_number = picture_number;
4690 /* Reset the average MB variance */
4691 s->me.mb_var_sum_temp =
4692 s->me.mc_mb_var_sum_temp = 0;
4695 /* we need to initialize some time vars before we can encode b-frames */
4696 // RAL: Condition added for MPEG1VIDEO
4697 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
4698 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
4701 s->me.scene_change_score=0;
4703 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
4705 if(s->pict_type==I_TYPE){
4706 if(s->msmpeg4_version >= 3) s->no_rounding=1;
4707 else s->no_rounding=0;
4708 }else if(s->pict_type!=B_TYPE){
4709 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
4710 s->no_rounding ^= 1;
4713 s->mb_intra=0; //for the rate distoration & bit compare functions
4714 for(i=1; i<s->avctx->thread_count; i++){
4715 ff_update_duplicate_context(s->thread_context[i], s);
4720 /* Estimate motion for every MB */
4721 if(s->pict_type != I_TYPE){
4722 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
4723 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
4724 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4728 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4729 }else /* if(s->pict_type == I_TYPE) */{
4731 for(i=0; i<s->mb_stride*s->mb_height; i++)
4732 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4734 if(!s->fixed_qscale){
4735 /* finding spatial complexity for I-frame rate control */
4736 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4739 for(i=1; i<s->avctx->thread_count; i++){
4740 merge_context_after_me(s, s->thread_context[i]);
4742 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
4743 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
4746 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
4747 s->pict_type= I_TYPE;
4748 for(i=0; i<s->mb_stride*s->mb_height; i++)
4749 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4750 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
4754 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
4755 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
4757 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4759 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
4760 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
4761 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
4764 ff_fix_long_p_mvs(s);
4765 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
4766 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4770 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
4771 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
4776 if(s->pict_type==B_TYPE){
4779 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
4780 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4781 s->f_code = FFMAX(a, b);
4783 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
4784 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4785 s->b_code = FFMAX(a, b);
4787 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
4788 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
4789 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4790 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4791 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4793 for(dir=0; dir<2; dir++){
4796 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
4797 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
4798 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
4799 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
4807 if (!s->fixed_qscale)
4808 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
4810 if(s->adaptive_quant){
4812 switch(s->codec_id){
4813 case CODEC_ID_MPEG4:
4814 ff_clean_mpeg4_qscales(s);
4817 case CODEC_ID_H263P:
4819 ff_clean_h263_qscales(s);
4824 s->lambda= s->lambda_table[0];
4827 s->lambda= s->current_picture.quality;
4828 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
4831 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
4832 s->qscale= 3; //reduce cliping problems
4834 if (s->out_format == FMT_MJPEG) {
4835 /* for mjpeg, we do include qscale in the matrix */
4836 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
4838 int j= s->dsp.idct_permutation[i];
4840 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
4842 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
4843 s->intra_matrix, s->intra_quant_bias, 8, 8);
4847 //FIXME var duplication
4848 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
4849 s->current_picture.pict_type= s->pict_type;
4851 if(s->current_picture.key_frame)
4852 s->picture_in_gop_number=0;
4854 s->last_bits= put_bits_count(&s->pb);
4855 switch(s->out_format) {
4857 mjpeg_picture_header(s);
4861 if (s->codec_id == CODEC_ID_WMV2)
4862 ff_wmv2_encode_picture_header(s, picture_number);
4863 else if (s->h263_msmpeg4)
4864 msmpeg4_encode_picture_header(s, picture_number);
4865 else if (s->h263_pred)
4866 mpeg4_encode_picture_header(s, picture_number);
4867 else if (s->codec_id == CODEC_ID_RV10)
4868 rv10_encode_picture_header(s, picture_number);
4869 else if (s->codec_id == CODEC_ID_FLV1)
4870 ff_flv_encode_picture_header(s, picture_number);
4872 h263_encode_picture_header(s, picture_number);
4876 mpeg1_encode_picture_header(s, picture_number);
4883 bits= put_bits_count(&s->pb);
4884 s->header_bits= bits - s->last_bits;
4886 for(i=1; i<s->avctx->thread_count; i++){
4887 update_duplicate_context_after_me(s->thread_context[i], s);
4889 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4890 for(i=1; i<s->avctx->thread_count; i++){
4891 merge_context_after_encode(s, s->thread_context[i]);
4896 #endif //CONFIG_ENCODERS
4898 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
4899 const int intra= s->mb_intra;
4902 s->dct_count[intra]++;
4904 for(i=0; i<64; i++){
4905 int level= block[i];
4909 s->dct_error_sum[intra][i] += level;
4910 level -= s->dct_offset[intra][i];
4911 if(level<0) level=0;
4913 s->dct_error_sum[intra][i] -= level;
4914 level += s->dct_offset[intra][i];
4915 if(level>0) level=0;
4922 #ifdef CONFIG_ENCODERS
4924 static int dct_quantize_trellis_c(MpegEncContext *s,
4925 DCTELEM *block, int n,
4926 int qscale, int *overflow){
4928 const uint8_t *scantable= s->intra_scantable.scantable;
4929 const uint8_t *perm_scantable= s->intra_scantable.permutated;
4931 unsigned int threshold1, threshold2;
4943 int coeff_count[64];
4944 int qmul, qadd, start_i, last_non_zero, i, dc;
4945 const int esc_length= s->ac_esc_length;
4947 uint8_t * last_length;
4948 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
4950 s->dsp.fdct (block);
4952 if(s->dct_error_sum)
4953 s->denoise_dct(s, block);
4955 qadd= ((qscale-1)|1)*8;
4966 /* For AIC we skip quant/dequant of INTRADC */
4971 /* note: block[0] is assumed to be positive */
4972 block[0] = (block[0] + (q >> 1)) / q;
4975 qmat = s->q_intra_matrix[qscale];
4976 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4977 bias= 1<<(QMAT_SHIFT-1);
4978 length = s->intra_ac_vlc_length;
4979 last_length= s->intra_ac_vlc_last_length;
4983 qmat = s->q_inter_matrix[qscale];
4984 length = s->inter_ac_vlc_length;
4985 last_length= s->inter_ac_vlc_last_length;
4989 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4990 threshold2= (threshold1<<1);
4992 for(i=63; i>=start_i; i--) {
4993 const int j = scantable[i];
4994 int level = block[j] * qmat[j];
4996 if(((unsigned)(level+threshold1))>threshold2){
5002 for(i=start_i; i<=last_non_zero; i++) {
5003 const int j = scantable[i];
5004 int level = block[j] * qmat[j];
5006 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5007 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5008 if(((unsigned)(level+threshold1))>threshold2){
5010 level= (bias + level)>>QMAT_SHIFT;
5012 coeff[1][i]= level-1;
5013 // coeff[2][k]= level-2;
5015 level= (bias - level)>>QMAT_SHIFT;
5016 coeff[0][i]= -level;
5017 coeff[1][i]= -level+1;
5018 // coeff[2][k]= -level+2;
5020 coeff_count[i]= FFMIN(level, 2);
5021 assert(coeff_count[i]);
5024 coeff[0][i]= (level>>31)|1;
5029 *overflow= s->max_qcoeff < max; //overflow might have happend
5031 if(last_non_zero < start_i){
5032 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5033 return last_non_zero;
5036 score_tab[start_i]= 0;
5037 survivor[0]= start_i;
5040 for(i=start_i; i<=last_non_zero; i++){
5042 const int dct_coeff= ABS(block[ scantable[i] ]);
5043 const int zero_distoration= dct_coeff*dct_coeff;
5044 int best_score=256*256*256*120;
5045 for(level_index=0; level_index < coeff_count[i]; level_index++){
5047 int level= coeff[level_index][i];
5048 const int alevel= ABS(level);
5053 if(s->out_format == FMT_H263){
5054 unquant_coeff= alevel*qmul + qadd;
5056 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5058 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5059 unquant_coeff = (unquant_coeff - 1) | 1;
5061 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5062 unquant_coeff = (unquant_coeff - 1) | 1;
5067 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5069 if((level&(~127)) == 0){
5070 for(j=survivor_count-1; j>=0; j--){
5071 int run= i - survivor[j];
5072 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5073 score += score_tab[i-run];
5075 if(score < best_score){
5078 level_tab[i+1]= level-64;
5082 if(s->out_format == FMT_H263){
5083 for(j=survivor_count-1; j>=0; j--){
5084 int run= i - survivor[j];
5085 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5086 score += score_tab[i-run];
5087 if(score < last_score){
5090 last_level= level-64;
5096 distoration += esc_length*lambda;
5097 for(j=survivor_count-1; j>=0; j--){
5098 int run= i - survivor[j];
5099 int score= distoration + score_tab[i-run];
5101 if(score < best_score){
5104 level_tab[i+1]= level-64;
5108 if(s->out_format == FMT_H263){
5109 for(j=survivor_count-1; j>=0; j--){
5110 int run= i - survivor[j];
5111 int score= distoration + score_tab[i-run];
5112 if(score < last_score){
5115 last_level= level-64;
5123 score_tab[i+1]= best_score;
5125 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5126 if(last_non_zero <= 27){
5127 for(; survivor_count; survivor_count--){
5128 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5132 for(; survivor_count; survivor_count--){
5133 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5138 survivor[ survivor_count++ ]= i+1;
5141 if(s->out_format != FMT_H263){
5142 last_score= 256*256*256*120;
5143 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5144 int score= score_tab[i];
5145 if(i) score += lambda*2; //FIXME exacter?
5147 if(score < last_score){
5150 last_level= level_tab[i];
5151 last_run= run_tab[i];
5156 s->coded_score[n] = last_score;
5159 last_non_zero= last_i - 1;
5160 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5162 if(last_non_zero < start_i)
5163 return last_non_zero;
5165 if(last_non_zero == 0 && start_i == 0){
5167 int best_score= dc * dc;
5169 for(i=0; i<coeff_count[0]; i++){
5170 int level= coeff[i][0];
5171 int alevel= ABS(level);
5172 int unquant_coeff, score, distortion;
5174 if(s->out_format == FMT_H263){
5175 unquant_coeff= (alevel*qmul + qadd)>>3;
5177 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5178 unquant_coeff = (unquant_coeff - 1) | 1;
5180 unquant_coeff = (unquant_coeff + 4) >> 3;
5181 unquant_coeff<<= 3 + 3;
5183 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5185 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5186 else score= distortion + esc_length*lambda;
5188 if(score < best_score){
5190 best_level= level - 64;
5193 block[0]= best_level;
5194 s->coded_score[n] = best_score - dc*dc;
5195 if(best_level == 0) return -1;
5196 else return last_non_zero;
5202 block[ perm_scantable[last_non_zero] ]= last_level;
5205 for(; i>start_i; i -= run_tab[i] + 1){
5206 block[ perm_scantable[i-1] ]= level_tab[i];
5209 return last_non_zero;
5212 //#define REFINE_STATS 1
5213 static int16_t basis[64][64];
5215 static void build_basis(uint8_t *perm){
5222 double s= 0.25*(1<<BASIS_SHIFT);
5224 int perm_index= perm[index];
5225 if(i==0) s*= sqrt(0.5);
5226 if(j==0) s*= sqrt(0.5);
5227 basis[perm_index][8*x + y]= lrintf(s * cos((M_PI/8.0)*i*(x+0.5)) * cos((M_PI/8.0)*j*(y+0.5)));
5234 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5235 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5240 const uint8_t *scantable= s->intra_scantable.scantable;
5241 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5242 // unsigned int threshold1, threshold2;
5247 int qmul, qadd, start_i, last_non_zero, i, dc;
5249 uint8_t * last_length;
5251 int rle_index, run, q, sum;
5254 static int after_last=0;
5255 static int to_zero=0;
5256 static int from_zero=0;
5259 static int messed_sign=0;
5262 if(basis[0][0] == 0)
5263 build_basis(s->dsp.idct_permutation);
5274 /* For AIC we skip quant/dequant of INTRADC */
5278 q <<= RECON_SHIFT-3;
5279 /* note: block[0] is assumed to be positive */
5281 // block[0] = (block[0] + (q >> 1)) / q;
5283 qmat = s->q_intra_matrix[qscale];
5284 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5285 // bias= 1<<(QMAT_SHIFT-1);
5286 length = s->intra_ac_vlc_length;
5287 last_length= s->intra_ac_vlc_last_length;
5291 qmat = s->q_inter_matrix[qscale];
5292 length = s->inter_ac_vlc_length;
5293 last_length= s->inter_ac_vlc_last_length;
5295 last_non_zero = s->block_last_index[n];
5300 dc += (1<<(RECON_SHIFT-1));
5301 for(i=0; i<64; i++){
5302 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly insteadof copying to rem[]
5305 STOP_TIMER("memset rem[]")}
5308 for(i=0; i<64; i++){
5313 w= ABS(weight[i]) + qns*one;
5314 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5317 // w=weight[i] = (63*qns + (w/2)) / w;
5323 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5329 for(i=start_i; i<=last_non_zero; i++){
5330 int j= perm_scantable[i];
5331 const int level= block[j];
5335 if(level<0) coeff= qmul*level - qadd;
5336 else coeff= qmul*level + qadd;
5337 run_tab[rle_index++]=run;
5340 s->dsp.add_8x8basis(rem, basis[j], coeff);
5346 if(last_non_zero>0){
5347 STOP_TIMER("init rem[]")
5354 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5357 int run2, best_unquant_change=0, analyze_gradient;
5361 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5363 if(analyze_gradient){
5367 for(i=0; i<64; i++){
5370 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5373 STOP_TIMER("rem*w*w")}
5383 const int level= block[0];
5384 int change, old_coeff;
5386 assert(s->mb_intra);
5390 for(change=-1; change<=1; change+=2){
5391 int new_level= level + change;
5392 int score, new_coeff;
5394 new_coeff= q*new_level;
5395 if(new_coeff >= 2048 || new_coeff < 0)
5398 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5399 if(score<best_score){
5402 best_change= change;
5403 best_unquant_change= new_coeff - old_coeff;
5410 run2= run_tab[rle_index++];
5414 for(i=start_i; i<64; i++){
5415 int j= perm_scantable[i];
5416 const int level= block[j];
5417 int change, old_coeff;
5419 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
5423 if(level<0) old_coeff= qmul*level - qadd;
5424 else old_coeff= qmul*level + qadd;
5425 run2= run_tab[rle_index++]; //FIXME ! maybe after last
5429 assert(run2>=0 || i >= last_non_zero );
5432 for(change=-1; change<=1; change+=2){
5433 int new_level= level + change;
5434 int score, new_coeff, unquant_change;
5437 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
5441 if(new_level<0) new_coeff= qmul*new_level - qadd;
5442 else new_coeff= qmul*new_level + qadd;
5443 if(new_coeff >= 2048 || new_coeff <= -2048)
5445 //FIXME check for overflow
5448 if(level < 63 && level > -63){
5449 if(i < last_non_zero)
5450 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
5451 - length[UNI_AC_ENC_INDEX(run, level+64)];
5453 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
5454 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
5457 assert(ABS(new_level)==1);
5459 if(analyze_gradient){
5460 int g= d1[ scantable[i] ];
5461 if(g && (g^new_level) >= 0)
5465 if(i < last_non_zero){
5466 int next_i= i + run2 + 1;
5467 int next_level= block[ perm_scantable[next_i] ] + 64;
5469 if(next_level&(~127))
5472 if(next_i < last_non_zero)
5473 score += length[UNI_AC_ENC_INDEX(run, 65)]
5474 + length[UNI_AC_ENC_INDEX(run2, next_level)]
5475 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5477 score += length[UNI_AC_ENC_INDEX(run, 65)]
5478 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5479 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5481 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
5483 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5484 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5490 assert(ABS(level)==1);
5492 if(i < last_non_zero){
5493 int next_i= i + run2 + 1;
5494 int next_level= block[ perm_scantable[next_i] ] + 64;
5496 if(next_level&(~127))
5499 if(next_i < last_non_zero)
5500 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5501 - length[UNI_AC_ENC_INDEX(run2, next_level)]
5502 - length[UNI_AC_ENC_INDEX(run, 65)];
5504 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5505 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5506 - length[UNI_AC_ENC_INDEX(run, 65)];
5508 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
5510 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5511 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5518 unquant_change= new_coeff - old_coeff;
5519 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
5521 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
5522 if(score<best_score){
5525 best_change= change;
5526 best_unquant_change= unquant_change;
5530 prev_level= level + 64;
5531 if(prev_level&(~127))
5540 STOP_TIMER("iterative step")}
5544 int j= perm_scantable[ best_coeff ];
5546 block[j] += best_change;
5548 if(best_coeff > last_non_zero){
5549 last_non_zero= best_coeff;
5557 if(block[j] - best_change){
5558 if(ABS(block[j]) > ABS(block[j] - best_change)){
5570 for(; last_non_zero>=start_i; last_non_zero--){
5571 if(block[perm_scantable[last_non_zero]])
5577 if(256*256*256*64 % count == 0){
5578 printf("after_last:%d to_zero:%d from_zero:%d raise:%d lower:%d sign:%d xyp:%d/%d/%d\n", after_last, to_zero, from_zero, raise, lower, messed_sign, s->mb_x, s->mb_y, s->picture_number);
5583 for(i=start_i; i<=last_non_zero; i++){
5584 int j= perm_scantable[i];
5585 const int level= block[j];
5588 run_tab[rle_index++]=run;
5595 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
5601 if(last_non_zero>0){
5602 STOP_TIMER("iterative search")
5607 return last_non_zero;
5610 static int dct_quantize_c(MpegEncContext *s,
5611 DCTELEM *block, int n,
5612 int qscale, int *overflow)
5614 int i, j, level, last_non_zero, q, start_i;
5616 const uint8_t *scantable= s->intra_scantable.scantable;
5619 unsigned int threshold1, threshold2;
5621 s->dsp.fdct (block);
5623 if(s->dct_error_sum)
5624 s->denoise_dct(s, block);
5634 /* For AIC we skip quant/dequant of INTRADC */
5637 /* note: block[0] is assumed to be positive */
5638 block[0] = (block[0] + (q >> 1)) / q;
5641 qmat = s->q_intra_matrix[qscale];
5642 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5646 qmat = s->q_inter_matrix[qscale];
5647 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5649 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5650 threshold2= (threshold1<<1);
5651 for(i=63;i>=start_i;i--) {
5653 level = block[j] * qmat[j];
5655 if(((unsigned)(level+threshold1))>threshold2){
5662 for(i=start_i; i<=last_non_zero; i++) {
5664 level = block[j] * qmat[j];
5666 // if( bias+level >= (1<<QMAT_SHIFT)
5667 // || bias-level >= (1<<QMAT_SHIFT)){
5668 if(((unsigned)(level+threshold1))>threshold2){
5670 level= (bias + level)>>QMAT_SHIFT;
5673 level= (bias - level)>>QMAT_SHIFT;
5681 *overflow= s->max_qcoeff < max; //overflow might have happend
5683 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
5684 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
5685 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
5687 return last_non_zero;
5690 #endif //CONFIG_ENCODERS
5692 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
5693 DCTELEM *block, int n, int qscale)
5695 int i, level, nCoeffs;
5696 const uint16_t *quant_matrix;
5698 nCoeffs= s->block_last_index[n];
5701 block[0] = block[0] * s->y_dc_scale;
5703 block[0] = block[0] * s->c_dc_scale;
5704 /* XXX: only mpeg1 */
5705 quant_matrix = s->intra_matrix;
5706 for(i=1;i<=nCoeffs;i++) {
5707 int j= s->intra_scantable.permutated[i];
5712 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5713 level = (level - 1) | 1;
5716 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5717 level = (level - 1) | 1;
5724 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
5725 DCTELEM *block, int n, int qscale)
5727 int i, level, nCoeffs;
5728 const uint16_t *quant_matrix;
5730 nCoeffs= s->block_last_index[n];
5732 quant_matrix = s->inter_matrix;
5733 for(i=0; i<=nCoeffs; i++) {
5734 int j= s->intra_scantable.permutated[i];
5739 level = (((level << 1) + 1) * qscale *
5740 ((int) (quant_matrix[j]))) >> 4;
5741 level = (level - 1) | 1;
5744 level = (((level << 1) + 1) * qscale *
5745 ((int) (quant_matrix[j]))) >> 4;
5746 level = (level - 1) | 1;
5753 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
5754 DCTELEM *block, int n, int qscale)
5756 int i, level, nCoeffs;
5757 const uint16_t *quant_matrix;
5759 if(s->alternate_scan) nCoeffs= 63;
5760 else nCoeffs= s->block_last_index[n];
5763 block[0] = block[0] * s->y_dc_scale;
5765 block[0] = block[0] * s->c_dc_scale;
5766 quant_matrix = s->intra_matrix;
5767 for(i=1;i<=nCoeffs;i++) {
5768 int j= s->intra_scantable.permutated[i];
5773 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5776 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5783 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
5784 DCTELEM *block, int n, int qscale)
5786 int i, level, nCoeffs;
5787 const uint16_t *quant_matrix;
5790 if(s->alternate_scan) nCoeffs= 63;
5791 else nCoeffs= s->block_last_index[n];
5793 quant_matrix = s->inter_matrix;
5794 for(i=0; i<=nCoeffs; i++) {
5795 int j= s->intra_scantable.permutated[i];
5800 level = (((level << 1) + 1) * qscale *
5801 ((int) (quant_matrix[j]))) >> 4;
5804 level = (((level << 1) + 1) * qscale *
5805 ((int) (quant_matrix[j]))) >> 4;
5814 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
5815 DCTELEM *block, int n, int qscale)
5817 int i, level, qmul, qadd;
5820 assert(s->block_last_index[n]>=0);
5826 block[0] = block[0] * s->y_dc_scale;
5828 block[0] = block[0] * s->c_dc_scale;
5829 qadd = (qscale - 1) | 1;
5836 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5838 for(i=1; i<=nCoeffs; i++) {
5842 level = level * qmul - qadd;
5844 level = level * qmul + qadd;
5851 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
5852 DCTELEM *block, int n, int qscale)
5854 int i, level, qmul, qadd;
5857 assert(s->block_last_index[n]>=0);
5859 qadd = (qscale - 1) | 1;
5862 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5864 for(i=0; i<=nCoeffs; i++) {
5868 level = level * qmul - qadd;
5870 level = level * qmul + qadd;
5877 static void dct_unquantize_h261_intra_c(MpegEncContext *s,
5878 DCTELEM *block, int n, int qscale)
5883 assert(s->block_last_index[n]>=0);
5886 block[0] = block[0] * s->y_dc_scale;
5888 block[0] = block[0] * s->c_dc_scale;
5889 even = (qscale & 1)^1;
5890 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5892 for(i=1; i<=nCoeffs; i++){
5896 level = qscale * ((level << 1) - 1) + even;
5898 level = qscale * ((level << 1) + 1) - even;
5905 static void dct_unquantize_h261_inter_c(MpegEncContext *s,
5906 DCTELEM *block, int n, int qscale)
5911 assert(s->block_last_index[n]>=0);
5913 even = (qscale & 1)^1;
5915 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5917 for(i=0; i<=nCoeffs; i++){
5921 level = qscale * ((level << 1) - 1) + even;
5923 level = qscale * ((level << 1) + 1) - even;
5930 static const AVOption mpeg4_options[] =
5932 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
5933 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
5934 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
5935 bit_rate_tolerance, 4, 240000000, 8000),
5936 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
5937 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
5938 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
5939 rc_eq, "tex^qComp,option1,options2", 0),
5940 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
5941 rc_min_rate, 4, 24000000, 0),
5942 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
5943 rc_max_rate, 4, 24000000, 0),
5944 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
5945 rc_buffer_aggressivity, 4, 24000000, 0),
5946 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
5947 rc_initial_cplx, 0., 9999999., 0),
5948 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
5949 i_quant_factor, 0., 0., 0),
5950 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
5951 i_quant_factor, -999999., 999999., 0),
5952 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
5953 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
5954 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
5955 lumi_masking, 0., 999999., 0),
5956 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
5957 temporal_cplx_masking, 0., 999999., 0),
5958 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
5959 spatial_cplx_masking, 0., 999999., 0),
5960 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
5961 p_masking, 0., 999999., 0),
5962 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
5963 dark_masking, 0., 999999., 0),
5964 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
5965 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
5967 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
5969 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
5972 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
5973 me_cmp, 0, 24000000, 0),
5974 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
5975 me_sub_cmp, 0, 24000000, 0),
5978 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
5979 dia_size, 0, 24000000, 0),
5980 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
5981 last_predictor_count, 0, 24000000, 0),
5983 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
5984 pre_me, 0, 24000000, 0),
5985 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
5986 me_pre_cmp, 0, 24000000, 0),
5988 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
5989 me_range, 0, 24000000, 0),
5990 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
5991 pre_dia_size, 0, 24000000, 0),
5992 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
5993 me_subpel_quality, 0, 24000000, 0),
5994 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
5995 me_range, 0, 24000000, 0),
5996 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
5997 flags, CODEC_FLAG_PSNR, 0),
5998 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
6000 AVOPTION_SUB(avoptions_common),
6004 #ifdef CONFIG_ENCODERS
6006 AVCodec h263_encoder = {
6010 sizeof(MpegEncContext),
6016 AVCodec h263p_encoder = {
6020 sizeof(MpegEncContext),
6026 AVCodec flv_encoder = {
6030 sizeof(MpegEncContext),
6036 AVCodec rv10_encoder = {
6040 sizeof(MpegEncContext),
6046 AVCodec mpeg4_encoder = {
6050 sizeof(MpegEncContext),
6054 .options = mpeg4_options,
6055 .capabilities= CODEC_CAP_DELAY,
6058 AVCodec msmpeg4v1_encoder = {
6062 sizeof(MpegEncContext),
6066 .options = mpeg4_options,
6069 AVCodec msmpeg4v2_encoder = {
6073 sizeof(MpegEncContext),
6077 .options = mpeg4_options,
6080 AVCodec msmpeg4v3_encoder = {
6084 sizeof(MpegEncContext),
6088 .options = mpeg4_options,
6091 AVCodec wmv1_encoder = {
6095 sizeof(MpegEncContext),
6099 .options = mpeg4_options,
6104 AVCodec mjpeg_encoder = {
6108 sizeof(MpegEncContext),
6114 #endif //CONFIG_ENCODERS