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 file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "mpegvideo.h"
41 #ifdef CONFIG_ENCODERS
42 static int 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_intra_bitexact(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
57 DCTELEM *block, int n, int qscale);
58 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
59 #ifdef CONFIG_ENCODERS
60 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
61 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
62 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
63 static int sse_mb(MpegEncContext *s);
64 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
65 #endif //CONFIG_ENCODERS
68 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
69 extern void XVMC_field_end(MpegEncContext *s);
70 extern void XVMC_decode_mb(MpegEncContext *s);
73 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
76 /* enable all paranoid tests for rounding, overflows, etc... */
82 /* for jpeg fast DCT */
85 static const uint16_t aanscales[64] = {
86 /* precomputed values scaled up by 14 bits */
87 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
88 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
89 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
90 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
91 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
92 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
93 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
94 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
97 static const uint8_t h263_chroma_roundtab[16] = {
98 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
99 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
102 static const uint8_t ff_default_chroma_qscale_table[32]={
103 // 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
104 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
107 #ifdef CONFIG_ENCODERS
108 static uint8_t default_mv_penalty[MAX_FCODE+1][MAX_MV*2+1];
109 static uint8_t default_fcode_tab[MAX_MV*2+1];
111 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
113 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
114 const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
119 for(qscale=qmin; qscale<=qmax; qscale++){
121 if (dsp->fdct == ff_jpeg_fdct_islow
122 #ifdef FAAN_POSTSCALE
123 || dsp->fdct == ff_faandct
127 const int j= dsp->idct_permutation[i];
128 /* 16 <= qscale * quant_matrix[i] <= 7905 */
129 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
130 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
131 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
133 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) /
134 (qscale * quant_matrix[j]));
136 } else if (dsp->fdct == fdct_ifast
137 #ifndef FAAN_POSTSCALE
138 || dsp->fdct == ff_faandct
142 const int j= dsp->idct_permutation[i];
143 /* 16 <= qscale * quant_matrix[i] <= 7905 */
144 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
145 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
146 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
148 qmat[qscale][i] = (int)((UINT64_C(1) << (QMAT_SHIFT + 14)) /
149 (aanscales[i] * qscale * quant_matrix[j]));
153 const int j= dsp->idct_permutation[i];
154 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
155 So 16 <= qscale * quant_matrix[i] <= 7905
156 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
157 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
159 qmat[qscale][i] = (int)((UINT64_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
160 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
161 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
163 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
164 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
168 for(i=intra; i<64; i++){
170 if (dsp->fdct == fdct_ifast
171 #ifndef FAAN_POSTSCALE
172 || dsp->fdct == ff_faandct
175 max= (8191LL*aanscales[i]) >> 14;
177 while(((max * qmat[qscale][i]) >> shift) > INT_MAX){
183 av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger than %d, overflows possible\n", QMAT_SHIFT - shift);
187 static inline void update_qscale(MpegEncContext *s){
188 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
189 s->qscale= av_clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
191 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
193 #endif //CONFIG_ENCODERS
195 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
199 st->scantable= src_scantable;
203 j = src_scantable[i];
204 st->permutated[i] = permutation[j];
213 j = st->permutated[i];
215 st->raster_end[i]= end;
219 #ifdef CONFIG_ENCODERS
220 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix){
226 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
231 #endif //CONFIG_ENCODERS
233 const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
241 uint32_t tmp= *state << 8;
242 *state= tmp + *(p++);
243 if(tmp == 0x100 || p==end)
248 if (p[-1] > 1 ) p+= 3;
249 else if(p[-2] ) p+= 2;
250 else if(p[-3]|(p[-1]-1)) p++;
258 *state= be2me_32(unaligned32(p));
263 /* init common dct for both encoder and decoder */
264 int DCT_common_init(MpegEncContext *s)
266 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
267 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
268 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
269 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
270 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
271 if(s->flags & CODEC_FLAG_BITEXACT)
272 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
273 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
275 #ifdef CONFIG_ENCODERS
276 s->dct_quantize= dct_quantize_c;
277 s->denoise_dct= denoise_dct_c;
278 #endif //CONFIG_ENCODERS
281 MPV_common_init_mmx(s);
284 MPV_common_init_axp(s);
287 MPV_common_init_mlib(s);
290 MPV_common_init_mmi(s);
293 MPV_common_init_armv4l(s);
296 MPV_common_init_ppc(s);
299 #ifdef CONFIG_ENCODERS
300 s->fast_dct_quantize= s->dct_quantize;
302 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
303 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
306 #endif //CONFIG_ENCODERS
308 /* load & permutate scantables
309 note: only wmv uses different ones
311 if(s->alternate_scan){
312 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
313 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
315 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
316 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
318 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
319 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
324 static void copy_picture(Picture *dst, Picture *src){
326 dst->type= FF_BUFFER_TYPE_COPY;
329 #ifdef CONFIG_ENCODERS
330 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
333 dst->pict_type = src->pict_type;
334 dst->quality = src->quality;
335 dst->coded_picture_number = src->coded_picture_number;
336 dst->display_picture_number = src->display_picture_number;
337 // dst->reference = src->reference;
339 dst->interlaced_frame = src->interlaced_frame;
340 dst->top_field_first = src->top_field_first;
342 if(s->avctx->me_threshold){
343 if(!src->motion_val[0])
344 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
346 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
347 if(!src->ref_index[0])
348 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
349 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
350 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
351 src->motion_subsample_log2, dst->motion_subsample_log2);
353 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
356 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
357 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
359 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
360 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
362 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
363 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
371 * allocates a Picture
372 * The pixels are allocated/set by calling get_buffer() if shared=0
374 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
375 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
376 const int mb_array_size= s->mb_stride*s->mb_height;
377 const int b8_array_size= s->b8_stride*s->mb_height*2;
378 const int b4_array_size= s->b4_stride*s->mb_height*4;
382 assert(pic->data[0]);
383 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
384 pic->type= FF_BUFFER_TYPE_SHARED;
388 assert(!pic->data[0]);
390 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
392 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
393 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
397 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
398 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
402 if(pic->linesize[1] != pic->linesize[2]){
403 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
407 s->linesize = pic->linesize[0];
408 s->uvlinesize= pic->linesize[1];
411 if(pic->qscale_table==NULL){
413 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
414 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
415 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
418 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
419 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
420 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
421 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
422 if(s->out_format == FMT_H264){
424 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t))
425 pic->motion_val[i]= pic->motion_val_base[i]+4;
426 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
428 pic->motion_subsample_log2= 2;
429 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
431 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
432 pic->motion_val[i]= pic->motion_val_base[i]+4;
433 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
435 pic->motion_subsample_log2= 3;
437 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
438 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
440 pic->qstride= s->mb_stride;
441 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
444 //it might be nicer if the application would keep track of these but it would require a API change
445 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
446 s->prev_pict_types[0]= s->pict_type;
447 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
448 pic->age= INT_MAX; // skipped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
451 fail: //for the CHECKED_ALLOCZ macro
456 * deallocates a picture
458 static void free_picture(MpegEncContext *s, Picture *pic){
461 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
462 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
465 av_freep(&pic->mb_var);
466 av_freep(&pic->mc_mb_var);
467 av_freep(&pic->mb_mean);
468 av_freep(&pic->mbskip_table);
469 av_freep(&pic->qscale_table);
470 av_freep(&pic->mb_type_base);
471 av_freep(&pic->dct_coeff);
472 av_freep(&pic->pan_scan);
475 av_freep(&pic->motion_val_base[i]);
476 av_freep(&pic->ref_index[i]);
479 if(pic->type == FF_BUFFER_TYPE_SHARED){
488 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
491 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
492 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*21*2); //(width + edge + align)*interlaced*MBsize*tolerance
493 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
495 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
496 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
497 s->rd_scratchpad= s->me.scratchpad;
498 s->b_scratchpad= s->me.scratchpad;
499 s->obmc_scratchpad= s->me.scratchpad + 16;
501 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
502 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
503 if(s->avctx->noise_reduction){
504 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
507 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
508 s->block= s->blocks[0];
511 s->pblocks[i] = (short *)(&s->block[i]);
515 return -1; //free() through MPV_common_end()
518 static void free_duplicate_context(MpegEncContext *s){
521 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
522 av_freep(&s->me.scratchpad);
525 s->obmc_scratchpad= NULL;
527 av_freep(&s->dct_error_sum);
528 av_freep(&s->me.map);
529 av_freep(&s->me.score_map);
530 av_freep(&s->blocks);
534 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
535 #define COPY(a) bak->a= src->a
536 COPY(allocated_edge_emu_buffer);
537 COPY(edge_emu_buffer);
541 COPY(obmc_scratchpad);
548 COPY(me.map_generation);
556 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
559 //FIXME copy only needed parts
561 backup_duplicate_context(&bak, dst);
562 memcpy(dst, src, sizeof(MpegEncContext));
563 backup_duplicate_context(dst, &bak);
565 dst->pblocks[i] = (short *)(&dst->block[i]);
567 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
570 #ifdef CONFIG_ENCODERS
571 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
572 #define COPY(a) dst->a= src->a
574 COPY(current_picture);
580 COPY(picture_in_gop_number);
581 COPY(gop_picture_number);
582 COPY(frame_pred_frame_dct); //FIXME don't set in encode_header
583 COPY(progressive_frame); //FIXME don't set in encode_header
584 COPY(partitioned_frame); //FIXME don't set in encode_header
590 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
591 * the changed fields will not depend upon the prior state of the MpegEncContext.
593 static void MPV_common_defaults(MpegEncContext *s){
595 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
596 s->chroma_qscale_table= ff_default_chroma_qscale_table;
597 s->progressive_frame= 1;
598 s->progressive_sequence= 1;
599 s->picture_structure= PICT_FRAME;
601 s->coded_picture_number = 0;
602 s->picture_number = 0;
603 s->input_picture_number = 0;
605 s->picture_in_gop_number = 0;
612 * sets the given MpegEncContext to defaults for decoding.
613 * the changed fields will not depend upon the prior state of the MpegEncContext.
615 void MPV_decode_defaults(MpegEncContext *s){
616 MPV_common_defaults(s);
620 * sets the given MpegEncContext to defaults for encoding.
621 * the changed fields will not depend upon the prior state of the MpegEncContext.
624 #ifdef CONFIG_ENCODERS
625 static void MPV_encode_defaults(MpegEncContext *s){
627 MPV_common_defaults(s);
629 for(i=-16; i<16; i++){
630 default_fcode_tab[i + MAX_MV]= 1;
632 s->me.mv_penalty= default_mv_penalty;
633 s->fcode_tab= default_fcode_tab;
635 #endif //CONFIG_ENCODERS
638 * init common structure for both encoder and decoder.
639 * this assumes that some variables like width/height are already set
641 int MPV_common_init(MpegEncContext *s)
643 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
645 s->mb_height = (s->height + 15) / 16;
647 if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
648 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
652 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
655 dsputil_init(&s->dsp, s->avctx);
658 s->flags= s->avctx->flags;
659 s->flags2= s->avctx->flags2;
661 s->mb_width = (s->width + 15) / 16;
662 s->mb_stride = s->mb_width + 1;
663 s->b8_stride = s->mb_width*2 + 1;
664 s->b4_stride = s->mb_width*4 + 1;
665 mb_array_size= s->mb_height * s->mb_stride;
666 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
668 /* set chroma shifts */
669 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
670 &(s->chroma_y_shift) );
672 /* set default edge pos, will be overriden in decode_header if needed */
673 s->h_edge_pos= s->mb_width*16;
674 s->v_edge_pos= s->mb_height*16;
676 s->mb_num = s->mb_width * s->mb_height;
681 s->block_wrap[3]= s->b8_stride;
683 s->block_wrap[5]= s->mb_stride;
685 y_size = s->b8_stride * (2 * s->mb_height + 1);
686 c_size = s->mb_stride * (s->mb_height + 1);
687 yc_size = y_size + 2 * c_size;
689 /* convert fourcc to upper case */
690 s->codec_tag= toupper( s->avctx->codec_tag &0xFF)
691 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
692 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
693 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
695 s->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
696 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
697 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
698 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
700 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
702 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
703 for(y=0; y<s->mb_height; y++){
704 for(x=0; x<s->mb_width; x++){
705 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
708 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
711 /* Allocate MV tables */
712 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
713 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
714 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
715 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
716 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
717 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
718 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
719 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
720 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
721 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
722 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
723 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
725 if(s->msmpeg4_version){
726 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
728 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
730 /* Allocate MB type table */
731 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
733 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
735 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
736 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
737 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
738 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
739 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
740 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
742 if(s->avctx->noise_reduction){
743 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
746 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
748 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
750 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
751 /* interlaced direct mode decoding tables */
756 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
757 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
759 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
760 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
761 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
763 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
766 if (s->out_format == FMT_H263) {
768 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
769 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
770 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
771 s->ac_val[2] = s->ac_val[1] + c_size;
774 CHECKED_ALLOCZ(s->coded_block_base, y_size);
775 s->coded_block= s->coded_block_base + s->b8_stride + 1;
777 /* cbp, ac_pred, pred_dir */
778 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
779 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
782 if (s->h263_pred || s->h263_plus || !s->encoding) {
784 //MN: we need these for error resilience of intra-frames
785 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
786 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
787 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
788 s->dc_val[2] = s->dc_val[1] + c_size;
789 for(i=0;i<yc_size;i++)
790 s->dc_val_base[i] = 1024;
793 /* which mb is a intra block */
794 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
795 memset(s->mbintra_table, 1, mb_array_size);
797 /* init macroblock skip table */
798 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
799 //Note the +1 is for a quicker mpeg4 slice_end detection
800 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
802 s->parse_context.state= -1;
803 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
804 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
805 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
806 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
809 s->context_initialized = 1;
811 s->thread_context[0]= s;
812 for(i=1; i<s->avctx->thread_count; i++){
813 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
814 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
817 for(i=0; i<s->avctx->thread_count; i++){
818 if(init_duplicate_context(s->thread_context[i], s) < 0)
820 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
821 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
830 /* init common structure for both encoder and decoder */
831 void MPV_common_end(MpegEncContext *s)
835 for(i=0; i<s->avctx->thread_count; i++){
836 free_duplicate_context(s->thread_context[i]);
838 for(i=1; i<s->avctx->thread_count; i++){
839 av_freep(&s->thread_context[i]);
842 av_freep(&s->parse_context.buffer);
843 s->parse_context.buffer_size=0;
845 av_freep(&s->mb_type);
846 av_freep(&s->p_mv_table_base);
847 av_freep(&s->b_forw_mv_table_base);
848 av_freep(&s->b_back_mv_table_base);
849 av_freep(&s->b_bidir_forw_mv_table_base);
850 av_freep(&s->b_bidir_back_mv_table_base);
851 av_freep(&s->b_direct_mv_table_base);
853 s->b_forw_mv_table= NULL;
854 s->b_back_mv_table= NULL;
855 s->b_bidir_forw_mv_table= NULL;
856 s->b_bidir_back_mv_table= NULL;
857 s->b_direct_mv_table= NULL;
861 av_freep(&s->b_field_mv_table_base[i][j][k]);
862 s->b_field_mv_table[i][j][k]=NULL;
864 av_freep(&s->b_field_select_table[i][j]);
865 av_freep(&s->p_field_mv_table_base[i][j]);
866 s->p_field_mv_table[i][j]=NULL;
868 av_freep(&s->p_field_select_table[i]);
871 av_freep(&s->dc_val_base);
872 av_freep(&s->ac_val_base);
873 av_freep(&s->coded_block_base);
874 av_freep(&s->mbintra_table);
875 av_freep(&s->cbp_table);
876 av_freep(&s->pred_dir_table);
878 av_freep(&s->mbskip_table);
879 av_freep(&s->prev_pict_types);
880 av_freep(&s->bitstream_buffer);
881 s->allocated_bitstream_buffer_size=0;
883 av_freep(&s->avctx->stats_out);
884 av_freep(&s->ac_stats);
885 av_freep(&s->error_status_table);
886 av_freep(&s->mb_index2xy);
887 av_freep(&s->lambda_table);
888 av_freep(&s->q_intra_matrix);
889 av_freep(&s->q_inter_matrix);
890 av_freep(&s->q_intra_matrix16);
891 av_freep(&s->q_inter_matrix16);
892 av_freep(&s->input_picture);
893 av_freep(&s->reordered_input_picture);
894 av_freep(&s->dct_offset);
897 for(i=0; i<MAX_PICTURE_COUNT; i++){
898 free_picture(s, &s->picture[i]);
901 av_freep(&s->picture);
902 s->context_initialized = 0;
905 s->current_picture_ptr= NULL;
906 s->linesize= s->uvlinesize= 0;
909 av_freep(&s->visualization_buffer[i]);
911 avcodec_default_free_buffers(s->avctx);
914 #ifdef CONFIG_ENCODERS
916 /* init video encoder */
917 int MPV_encode_init(AVCodecContext *avctx)
919 MpegEncContext *s = avctx->priv_data;
921 int chroma_h_shift, chroma_v_shift;
923 MPV_encode_defaults(s);
925 switch (avctx->codec_id) {
926 case CODEC_ID_MPEG2VIDEO:
927 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P){
928 av_log(avctx, AV_LOG_ERROR, "only YUV420 and YUV422 are supported\n");
934 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P &&
935 ((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P) || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
936 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
941 if(avctx->pix_fmt != PIX_FMT_YUV420P){
942 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
947 switch (avctx->pix_fmt) {
948 case PIX_FMT_YUVJ422P:
949 case PIX_FMT_YUV422P:
950 s->chroma_format = CHROMA_422;
952 case PIX_FMT_YUVJ420P:
953 case PIX_FMT_YUV420P:
955 s->chroma_format = CHROMA_420;
959 s->bit_rate = avctx->bit_rate;
960 s->width = avctx->width;
961 s->height = avctx->height;
962 if(avctx->gop_size > 600 && avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){
963 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
966 s->gop_size = avctx->gop_size;
968 s->flags= avctx->flags;
969 s->flags2= avctx->flags2;
970 s->max_b_frames= avctx->max_b_frames;
971 s->codec_id= avctx->codec->id;
972 s->luma_elim_threshold = avctx->luma_elim_threshold;
973 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
974 s->strict_std_compliance= avctx->strict_std_compliance;
975 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
976 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
977 s->mpeg_quant= avctx->mpeg_quant;
978 s->rtp_mode= !!avctx->rtp_payload_size;
979 s->intra_dc_precision= avctx->intra_dc_precision;
980 s->user_specified_pts = AV_NOPTS_VALUE;
982 if (s->gop_size <= 1) {
989 s->me_method = avctx->me_method;
992 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
994 s->adaptive_quant= ( s->avctx->lumi_masking
995 || s->avctx->dark_masking
996 || s->avctx->temporal_cplx_masking
997 || s->avctx->spatial_cplx_masking
998 || s->avctx->p_masking
999 || s->avctx->border_masking
1000 || (s->flags&CODEC_FLAG_QP_RD))
1001 && !s->fixed_qscale;
1003 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
1004 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
1005 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
1006 s->intra_vlc_format= !!(s->flags2 & CODEC_FLAG2_INTRA_VLC);
1007 s->q_scale_type= !!(s->flags2 & CODEC_FLAG2_NON_LINEAR_QUANT);
1009 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
1010 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
1014 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
1015 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
1018 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
1019 av_log(avctx, AV_LOG_ERROR, "bitrate below min bitrate\n");
1023 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
1024 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
1028 if(avctx->rc_buffer_size && avctx->bit_rate*av_q2d(avctx->time_base) > avctx->rc_buffer_size){
1029 av_log(avctx, AV_LOG_ERROR, "VBV buffer too small for bitrate\n");
1033 if(avctx->bit_rate*av_q2d(avctx->time_base) > avctx->bit_rate_tolerance){
1034 av_log(avctx, AV_LOG_ERROR, "bitrate tolerance too small for bitrate\n");
1038 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
1039 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
1040 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
1042 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");
1045 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
1046 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
1047 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
1051 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
1052 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
1056 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
1057 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
1061 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1062 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1066 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1067 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1071 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1072 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1076 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1077 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1078 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1082 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1083 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
1087 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1088 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1092 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1093 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1097 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1098 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet, set threshold to 1000000000\n");
1102 if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){
1103 av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n");
1107 if(s->flags & CODEC_FLAG_LOW_DELAY){
1108 if (s->codec_id != CODEC_ID_MPEG2VIDEO && s->codec_id != CODEC_ID_MPEG1VIDEO){
1109 av_log(avctx, AV_LOG_ERROR, "low delay forcing is only available for mpeg1/2\n");
1112 if (s->max_b_frames != 0){
1113 av_log(avctx, AV_LOG_ERROR, "b frames cannot be used with low delay\n");
1118 if(s->q_scale_type == 1){
1119 if(s->codec_id != CODEC_ID_MPEG2VIDEO){
1120 av_log(avctx, AV_LOG_ERROR, "non linear quant is only available for mpeg2\n");
1123 if(avctx->qmax > 12){
1124 av_log(avctx, AV_LOG_ERROR, "non linear quant only supports qmax <= 12 currently\n");
1129 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1130 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1131 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1132 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1136 if(s->avctx->thread_count > 1)
1139 if(!avctx->time_base.den || !avctx->time_base.num){
1140 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
1144 i= (INT_MAX/2+128)>>8;
1145 if(avctx->me_threshold >= i){
1146 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
1149 if(avctx->mb_threshold >= i){
1150 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
1154 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){
1155 av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n");
1156 avctx->b_frame_strategy = 0;
1159 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
1161 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1162 avctx->time_base.den /= i;
1163 avctx->time_base.num /= i;
1167 if(s->codec_id==CODEC_ID_MJPEG){
1168 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1169 s->inter_quant_bias= 0;
1170 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1171 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1172 s->inter_quant_bias= 0;
1174 s->intra_quant_bias=0;
1175 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1178 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1179 s->intra_quant_bias= avctx->intra_quant_bias;
1180 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1181 s->inter_quant_bias= avctx->inter_quant_bias;
1183 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1185 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
1186 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
1189 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1191 switch(avctx->codec->id) {
1192 case CODEC_ID_MPEG1VIDEO:
1193 s->out_format = FMT_MPEG1;
1194 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);
1195 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1197 case CODEC_ID_MPEG2VIDEO:
1198 s->out_format = FMT_MPEG1;
1199 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);
1200 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1203 case CODEC_ID_LJPEG:
1204 case CODEC_ID_MJPEG:
1205 s->out_format = FMT_MJPEG;
1206 s->intra_only = 1; /* force intra only for jpeg */
1207 s->mjpeg_vsample[0] = 2;
1208 s->mjpeg_vsample[1] = 2>>chroma_v_shift;
1209 s->mjpeg_vsample[2] = 2>>chroma_v_shift;
1210 s->mjpeg_hsample[0] = 2;
1211 s->mjpeg_hsample[1] = 2>>chroma_h_shift;
1212 s->mjpeg_hsample[2] = 2>>chroma_h_shift;
1213 if (!(ENABLE_MJPEG_ENCODER || ENABLE_LJPEG_ENCODER)
1214 || ff_mjpeg_encode_init(s) < 0)
1220 if (!ENABLE_H261_ENCODER) return -1;
1221 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
1222 av_log(avctx, AV_LOG_ERROR, "The specified picture size of %dx%d is not valid for the H.261 codec.\nValid sizes are 176x144, 352x288\n", s->width, s->height);
1225 s->out_format = FMT_H261;
1230 if (h263_get_picture_format(s->width, s->height) == 7) {
1231 av_log(avctx, AV_LOG_INFO, "The specified picture size of %dx%d is not valid for the H.263 codec.\nValid sizes are 128x96, 176x144, 352x288, 704x576, and 1408x1152. Try H.263+.\n", s->width, s->height);
1234 s->out_format = FMT_H263;
1235 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1239 case CODEC_ID_H263P:
1240 s->out_format = FMT_H263;
1243 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1244 s->h263_aic= (avctx->flags & CODEC_FLAG_AC_PRED) ? 1:0;
1245 s->modified_quant= s->h263_aic;
1246 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1247 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1248 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1249 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1250 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1253 /* These are just to be sure */
1258 s->out_format = FMT_H263;
1259 s->h263_flv = 2; /* format = 1; 11-bit codes */
1260 s->unrestricted_mv = 1;
1261 s->rtp_mode=0; /* don't allow GOB */
1266 s->out_format = FMT_H263;
1271 s->out_format = FMT_H263;
1274 s->modified_quant=1;
1278 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1280 case CODEC_ID_MPEG4:
1281 s->out_format = FMT_H263;
1283 s->unrestricted_mv = 1;
1284 s->low_delay= s->max_b_frames ? 0 : 1;
1285 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1287 case CODEC_ID_MSMPEG4V1:
1288 s->out_format = FMT_H263;
1289 s->h263_msmpeg4 = 1;
1291 s->unrestricted_mv = 1;
1292 s->msmpeg4_version= 1;
1296 case CODEC_ID_MSMPEG4V2:
1297 s->out_format = FMT_H263;
1298 s->h263_msmpeg4 = 1;
1300 s->unrestricted_mv = 1;
1301 s->msmpeg4_version= 2;
1305 case CODEC_ID_MSMPEG4V3:
1306 s->out_format = FMT_H263;
1307 s->h263_msmpeg4 = 1;
1309 s->unrestricted_mv = 1;
1310 s->msmpeg4_version= 3;
1311 s->flipflop_rounding=1;
1316 s->out_format = FMT_H263;
1317 s->h263_msmpeg4 = 1;
1319 s->unrestricted_mv = 1;
1320 s->msmpeg4_version= 4;
1321 s->flipflop_rounding=1;
1326 s->out_format = FMT_H263;
1327 s->h263_msmpeg4 = 1;
1329 s->unrestricted_mv = 1;
1330 s->msmpeg4_version= 5;
1331 s->flipflop_rounding=1;
1339 avctx->has_b_frames= !s->low_delay;
1344 if (MPV_common_init(s) < 0)
1347 if(s->modified_quant)
1348 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1349 s->progressive_frame=
1350 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN));
1351 s->quant_precision=5;
1353 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1354 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1356 if (ENABLE_H261_ENCODER && s->out_format == FMT_H261)
1357 ff_h261_encode_init(s);
1358 if (s->out_format == FMT_H263)
1359 h263_encode_init(s);
1360 if (ENABLE_MSMPEG4_ENCODER && s->msmpeg4_version)
1361 ff_msmpeg4_encode_init(s);
1362 if (s->out_format == FMT_MPEG1)
1363 ff_mpeg1_encode_init(s);
1367 int j= s->dsp.idct_permutation[i];
1368 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1369 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1370 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1371 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1372 s->intra_matrix[j] =
1373 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1376 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1377 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1379 if(s->avctx->intra_matrix)
1380 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1381 if(s->avctx->inter_matrix)
1382 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1385 /* precompute matrix */
1386 /* for mjpeg, we do include qscale in the matrix */
1387 if (s->out_format != FMT_MJPEG) {
1388 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1389 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1390 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1391 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1394 if(ff_rate_control_init(s) < 0)
1400 int MPV_encode_end(AVCodecContext *avctx)
1402 MpegEncContext *s = avctx->priv_data;
1404 ff_rate_control_uninit(s);
1407 if ((ENABLE_MJPEG_ENCODER || ENABLE_LJPEG_ENCODER) && s->out_format == FMT_MJPEG)
1408 ff_mjpeg_encode_close(s);
1410 av_freep(&avctx->extradata);
1415 #endif //CONFIG_ENCODERS
1417 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
1419 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1420 uint8_t index_run[MAX_RUN+1];
1421 int last, run, level, start, end, i;
1423 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1424 if(static_store && rl->max_level[0])
1427 /* compute max_level[], max_run[] and index_run[] */
1428 for(last=0;last<2;last++) {
1437 memset(max_level, 0, MAX_RUN + 1);
1438 memset(max_run, 0, MAX_LEVEL + 1);
1439 memset(index_run, rl->n, MAX_RUN + 1);
1440 for(i=start;i<end;i++) {
1441 run = rl->table_run[i];
1442 level = rl->table_level[i];
1443 if (index_run[run] == rl->n)
1445 if (level > max_level[run])
1446 max_level[run] = level;
1447 if (run > max_run[level])
1448 max_run[level] = run;
1451 rl->max_level[last] = static_store[last];
1453 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1454 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1456 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1458 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1459 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1461 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1463 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1464 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1468 /* draw the edges of width 'w' of an image of size width, height */
1469 //FIXME check that this is ok for mpeg4 interlaced
1470 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1472 uint8_t *ptr, *last_line;
1475 last_line = buf + (height - 1) * wrap;
1477 /* top and bottom */
1478 memcpy(buf - (i + 1) * wrap, buf, width);
1479 memcpy(last_line + (i + 1) * wrap, last_line, width);
1481 /* left and right */
1483 for(i=0;i<height;i++) {
1484 memset(ptr - w, ptr[0], w);
1485 memset(ptr + width, ptr[width-1], w);
1490 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1491 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1492 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1493 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1497 int ff_find_unused_picture(MpegEncContext *s, int shared){
1501 for(i=0; i<MAX_PICTURE_COUNT; i++){
1502 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1505 for(i=0; i<MAX_PICTURE_COUNT; i++){
1506 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1508 for(i=0; i<MAX_PICTURE_COUNT; i++){
1509 if(s->picture[i].data[0]==NULL) return i;
1517 static void update_noise_reduction(MpegEncContext *s){
1520 for(intra=0; intra<2; intra++){
1521 if(s->dct_count[intra] > (1<<16)){
1522 for(i=0; i<64; i++){
1523 s->dct_error_sum[intra][i] >>=1;
1525 s->dct_count[intra] >>= 1;
1528 for(i=0; i<64; i++){
1529 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);
1535 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1537 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1543 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1545 /* mark&release old frames */
1546 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1547 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1548 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1550 /* release forgotten pictures */
1551 /* if(mpeg124/h263) */
1553 for(i=0; i<MAX_PICTURE_COUNT; i++){
1554 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1555 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1556 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1564 /* release non reference frames */
1565 for(i=0; i<MAX_PICTURE_COUNT; i++){
1566 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1567 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1571 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1572 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1574 i= ff_find_unused_picture(s, 0);
1575 pic= (AVFrame*)&s->picture[i];
1578 pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
1579 && !s->dropable ? 3 : 0;
1581 pic->coded_picture_number= s->coded_picture_number++;
1583 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1586 s->current_picture_ptr= (Picture*)pic;
1587 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1588 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1591 s->current_picture_ptr->pict_type= s->pict_type;
1592 // if(s->flags && CODEC_FLAG_QSCALE)
1593 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1594 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1596 copy_picture(&s->current_picture, s->current_picture_ptr);
1598 if (s->pict_type != B_TYPE) {
1599 s->last_picture_ptr= s->next_picture_ptr;
1601 s->next_picture_ptr= s->current_picture_ptr;
1603 /* 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,
1604 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1605 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1606 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1607 s->pict_type, s->dropable);*/
1609 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1610 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1612 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && !s->dropable){
1613 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1614 assert(s->pict_type != B_TYPE); //these should have been dropped if we don't have a reference
1618 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1620 if(s->picture_structure!=PICT_FRAME){
1623 if(s->picture_structure == PICT_BOTTOM_FIELD){
1624 s->current_picture.data[i] += s->current_picture.linesize[i];
1626 s->current_picture.linesize[i] *= 2;
1627 s->last_picture.linesize[i] *=2;
1628 s->next_picture.linesize[i] *=2;
1632 s->hurry_up= s->avctx->hurry_up;
1633 s->error_resilience= avctx->error_resilience;
1635 /* set dequantizer, we can't do it during init as it might change for mpeg4
1636 and we can't do it in the header decode as init isnt called for mpeg4 there yet */
1637 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1638 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1639 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1640 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1641 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1642 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1644 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1645 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1648 if(s->dct_error_sum){
1649 assert(s->avctx->noise_reduction && s->encoding);
1651 update_noise_reduction(s);
1655 if(s->avctx->xvmc_acceleration)
1656 return XVMC_field_start(s, avctx);
1661 /* generic function for encode/decode called after a frame has been coded/decoded */
1662 void MPV_frame_end(MpegEncContext *s)
1665 /* draw edge for correct motion prediction if outside */
1667 //just to make sure that all data is rendered.
1668 if(s->avctx->xvmc_acceleration){
1672 if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1673 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1674 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1675 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1679 s->last_pict_type = s->pict_type;
1680 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1681 if(s->pict_type!=B_TYPE){
1682 s->last_non_b_pict_type= s->pict_type;
1685 /* copy back current_picture variables */
1686 for(i=0; i<MAX_PICTURE_COUNT; i++){
1687 if(s->picture[i].data[0] == s->current_picture.data[0]){
1688 s->picture[i]= s->current_picture;
1692 assert(i<MAX_PICTURE_COUNT);
1696 /* release non-reference frames */
1697 for(i=0; i<MAX_PICTURE_COUNT; i++){
1698 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1699 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1703 // clear copies, to avoid confusion
1705 memset(&s->last_picture, 0, sizeof(Picture));
1706 memset(&s->next_picture, 0, sizeof(Picture));
1707 memset(&s->current_picture, 0, sizeof(Picture));
1709 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1713 * draws an line from (ex, ey) -> (sx, sy).
1714 * @param w width of the image
1715 * @param h height of the image
1716 * @param stride stride/linesize of the image
1717 * @param color color of the arrow
1719 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1722 sx= av_clip(sx, 0, w-1);
1723 sy= av_clip(sy, 0, h-1);
1724 ex= av_clip(ex, 0, w-1);
1725 ey= av_clip(ey, 0, h-1);
1727 buf[sy*stride + sx]+= color;
1729 if(FFABS(ex - sx) > FFABS(ey - sy)){
1731 FFSWAP(int, sx, ex);
1732 FFSWAP(int, sy, ey);
1734 buf+= sx + sy*stride;
1736 f= ((ey-sy)<<16)/ex;
1737 for(x= 0; x <= ex; x++){
1740 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1741 buf[(y+1)*stride + x]+= (color* fr )>>16;
1745 FFSWAP(int, sx, ex);
1746 FFSWAP(int, sy, ey);
1748 buf+= sx + sy*stride;
1750 if(ey) f= ((ex-sx)<<16)/ey;
1752 for(y= 0; y <= ey; y++){
1755 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1756 buf[y*stride + x+1]+= (color* fr )>>16;;
1762 * draws an arrow from (ex, ey) -> (sx, sy).
1763 * @param w width of the image
1764 * @param h height of the image
1765 * @param stride stride/linesize of the image
1766 * @param color color of the arrow
1768 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1771 sx= av_clip(sx, -100, w+100);
1772 sy= av_clip(sy, -100, h+100);
1773 ex= av_clip(ex, -100, w+100);
1774 ey= av_clip(ey, -100, h+100);
1779 if(dx*dx + dy*dy > 3*3){
1782 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1784 //FIXME subpixel accuracy
1785 rx= ROUNDED_DIV(rx*3<<4, length);
1786 ry= ROUNDED_DIV(ry*3<<4, length);
1788 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1789 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1791 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1795 * prints debuging info for the given picture.
1797 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1799 if(!pict || !pict->mb_type) return;
1801 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1804 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1805 switch (pict->pict_type) {
1806 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1807 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1808 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1809 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1810 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1811 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1813 for(y=0; y<s->mb_height; y++){
1814 for(x=0; x<s->mb_width; x++){
1815 if(s->avctx->debug&FF_DEBUG_SKIP){
1816 int count= s->mbskip_table[x + y*s->mb_stride];
1817 if(count>9) count=9;
1818 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1820 if(s->avctx->debug&FF_DEBUG_QP){
1821 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1823 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1824 int mb_type= pict->mb_type[x + y*s->mb_stride];
1825 //Type & MV direction
1827 av_log(s->avctx, AV_LOG_DEBUG, "P");
1828 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1829 av_log(s->avctx, AV_LOG_DEBUG, "A");
1830 else if(IS_INTRA4x4(mb_type))
1831 av_log(s->avctx, AV_LOG_DEBUG, "i");
1832 else if(IS_INTRA16x16(mb_type))
1833 av_log(s->avctx, AV_LOG_DEBUG, "I");
1834 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1835 av_log(s->avctx, AV_LOG_DEBUG, "d");
1836 else if(IS_DIRECT(mb_type))
1837 av_log(s->avctx, AV_LOG_DEBUG, "D");
1838 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1839 av_log(s->avctx, AV_LOG_DEBUG, "g");
1840 else if(IS_GMC(mb_type))
1841 av_log(s->avctx, AV_LOG_DEBUG, "G");
1842 else if(IS_SKIP(mb_type))
1843 av_log(s->avctx, AV_LOG_DEBUG, "S");
1844 else if(!USES_LIST(mb_type, 1))
1845 av_log(s->avctx, AV_LOG_DEBUG, ">");
1846 else if(!USES_LIST(mb_type, 0))
1847 av_log(s->avctx, AV_LOG_DEBUG, "<");
1849 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1850 av_log(s->avctx, AV_LOG_DEBUG, "X");
1855 av_log(s->avctx, AV_LOG_DEBUG, "+");
1856 else if(IS_16X8(mb_type))
1857 av_log(s->avctx, AV_LOG_DEBUG, "-");
1858 else if(IS_8X16(mb_type))
1859 av_log(s->avctx, AV_LOG_DEBUG, "|");
1860 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1861 av_log(s->avctx, AV_LOG_DEBUG, " ");
1863 av_log(s->avctx, AV_LOG_DEBUG, "?");
1866 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1867 av_log(s->avctx, AV_LOG_DEBUG, "=");
1869 av_log(s->avctx, AV_LOG_DEBUG, " ");
1871 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1873 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1877 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1878 const int shift= 1 + s->quarter_sample;
1882 int h_chroma_shift, v_chroma_shift;
1883 const int width = s->avctx->width;
1884 const int height= s->avctx->height;
1885 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1886 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1887 s->low_delay=0; //needed to see the vectors without trashing the buffers
1889 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1891 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1892 pict->data[i]= s->visualization_buffer[i];
1894 pict->type= FF_BUFFER_TYPE_COPY;
1897 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1899 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1900 const int mb_index= mb_x + mb_y*s->mb_stride;
1901 if((s->avctx->debug_mv) && pict->motion_val){
1903 for(type=0; type<3; type++){
1906 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1910 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1914 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1919 if(!USES_LIST(pict->mb_type[mb_index], direction))
1922 if(IS_8X8(pict->mb_type[mb_index])){
1925 int sx= mb_x*16 + 4 + 8*(i&1);
1926 int sy= mb_y*16 + 4 + 8*(i>>1);
1927 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1928 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1929 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1930 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1932 }else if(IS_16X8(pict->mb_type[mb_index])){
1936 int sy=mb_y*16 + 4 + 8*i;
1937 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1938 int mx=(pict->motion_val[direction][xy][0]>>shift);
1939 int my=(pict->motion_val[direction][xy][1]>>shift);
1941 if(IS_INTERLACED(pict->mb_type[mb_index]))
1944 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1946 }else if(IS_8X16(pict->mb_type[mb_index])){
1949 int sx=mb_x*16 + 4 + 8*i;
1951 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1952 int mx=(pict->motion_val[direction][xy][0]>>shift);
1953 int my=(pict->motion_val[direction][xy][1]>>shift);
1955 if(IS_INTERLACED(pict->mb_type[mb_index]))
1958 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1961 int sx= mb_x*16 + 8;
1962 int sy= mb_y*16 + 8;
1963 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1964 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1965 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1966 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1970 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1971 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1974 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1975 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1978 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1979 int mb_type= pict->mb_type[mb_index];
1982 #define COLOR(theta, r)\
1983 u= (int)(128 + r*cos(theta*3.141592/180));\
1984 v= (int)(128 + r*sin(theta*3.141592/180));
1988 if(IS_PCM(mb_type)){
1990 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1992 }else if(IS_INTRA4x4(mb_type)){
1994 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1996 }else if(IS_DIRECT(mb_type)){
1998 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
2000 }else if(IS_GMC(mb_type)){
2002 }else if(IS_SKIP(mb_type)){
2004 }else if(!USES_LIST(mb_type, 1)){
2006 }else if(!USES_LIST(mb_type, 0)){
2009 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
2013 u*= 0x0101010101010101ULL;
2014 v*= 0x0101010101010101ULL;
2016 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
2017 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
2021 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
2022 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
2023 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
2025 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
2027 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
2029 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
2030 int dm= 1 << (mv_sample_log2-2);
2032 int sx= mb_x*16 + 8*(i&1);
2033 int sy= mb_y*16 + 8*(i>>1);
2034 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
2036 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
2037 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
2039 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
2040 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
2041 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
2045 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
2049 s->mbskip_table[mb_index]=0;
2055 #ifdef CONFIG_ENCODERS
2057 static int get_sae(uint8_t *src, int ref, int stride){
2061 for(y=0; y<16; y++){
2062 for(x=0; x<16; x++){
2063 acc+= FFABS(src[x+y*stride] - ref);
2070 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
2077 for(y=0; y<h; y+=16){
2078 for(x=0; x<w; x+=16){
2079 int offset= x + y*stride;
2080 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
2081 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
2082 int sae = get_sae(src + offset, mean, stride);
2084 acc+= sae + 500 < sad;
2091 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2095 const int encoding_delay= s->max_b_frames;
2100 pic_arg->display_picture_number= s->input_picture_number++;
2102 if(pts != AV_NOPTS_VALUE){
2103 if(s->user_specified_pts != AV_NOPTS_VALUE){
2105 int64_t last= s->user_specified_pts;
2108 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
2112 s->user_specified_pts= pts;
2114 if(s->user_specified_pts != AV_NOPTS_VALUE){
2115 s->user_specified_pts=
2116 pts= s->user_specified_pts + 1;
2117 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
2119 pts= pic_arg->display_picture_number;
2125 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2126 if(pic_arg->linesize[0] != s->linesize) direct=0;
2127 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2128 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2130 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2133 i= ff_find_unused_picture(s, 1);
2135 pic= (AVFrame*)&s->picture[i];
2139 pic->data[i]= pic_arg->data[i];
2140 pic->linesize[i]= pic_arg->linesize[i];
2142 alloc_picture(s, (Picture*)pic, 1);
2144 i= ff_find_unused_picture(s, 0);
2146 pic= (AVFrame*)&s->picture[i];
2149 alloc_picture(s, (Picture*)pic, 0);
2151 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0]
2152 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1]
2153 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){
2156 int h_chroma_shift, v_chroma_shift;
2157 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2160 int src_stride= pic_arg->linesize[i];
2161 int dst_stride= i ? s->uvlinesize : s->linesize;
2162 int h_shift= i ? h_chroma_shift : 0;
2163 int v_shift= i ? v_chroma_shift : 0;
2164 int w= s->width >>h_shift;
2165 int h= s->height>>v_shift;
2166 uint8_t *src= pic_arg->data[i];
2167 uint8_t *dst= pic->data[i];
2169 if(!s->avctx->rc_buffer_size)
2170 dst +=INPLACE_OFFSET;
2172 if(src_stride==dst_stride)
2173 memcpy(dst, src, src_stride*h);
2176 memcpy(dst, src, w);
2184 copy_picture_attributes(s, pic, pic_arg);
2185 pic->pts= pts; //we set this here to avoid modifiying pic_arg
2188 /* shift buffer entries */
2189 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2190 s->input_picture[i-1]= s->input_picture[i];
2192 s->input_picture[encoding_delay]= (Picture*)pic;
2197 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2202 for(plane=0; plane<3; plane++){
2203 const int stride= p->linesize[plane];
2204 const int bw= plane ? 1 : 2;
2205 for(y=0; y<s->mb_height*bw; y++){
2206 for(x=0; x<s->mb_width*bw; x++){
2207 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16;
2208 int v= s->dsp.frame_skip_cmp[1](s, p->data[plane] + 8*(x + y*stride)+off, ref->data[plane] + 8*(x + y*stride), stride, 8);
2210 switch(s->avctx->frame_skip_exp){
2211 case 0: score= FFMAX(score, v); break;
2212 case 1: score+= FFABS(v);break;
2213 case 2: score+= v*v;break;
2214 case 3: score64+= FFABS(v*v*(int64_t)v);break;
2215 case 4: score64+= v*v*(int64_t)(v*v);break;
2221 if(score) score64= score;
2223 if(score64 < s->avctx->frame_skip_threshold)
2225 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2230 static int estimate_best_b_count(MpegEncContext *s){
2231 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id);
2232 AVCodecContext *c= avcodec_alloc_context();
2233 AVFrame input[FF_MAX_B_FRAMES+2];
2234 const int scale= s->avctx->brd_scale;
2235 int i, j, out_size, p_lambda, b_lambda, lambda2;
2236 int outbuf_size= s->width * s->height; //FIXME
2237 uint8_t *outbuf= av_malloc(outbuf_size);
2238 int64_t best_rd= INT64_MAX;
2239 int best_b_count= -1;
2241 assert(scale>=0 && scale <=3);
2244 p_lambda= s->last_lambda_for[P_TYPE]; //s->next_picture_ptr->quality;
2245 b_lambda= s->last_lambda_for[B_TYPE]; //p_lambda *FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
2246 if(!b_lambda) b_lambda= p_lambda; //FIXME we should do this somewhere else
2247 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT;
2249 c->width = s->width >> scale;
2250 c->height= s->height>> scale;
2251 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
2252 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL;
2253 c->mb_decision= s->avctx->mb_decision;
2254 c->me_cmp= s->avctx->me_cmp;
2255 c->mb_cmp= s->avctx->mb_cmp;
2256 c->me_sub_cmp= s->avctx->me_sub_cmp;
2257 c->pix_fmt = PIX_FMT_YUV420P;
2258 c->time_base= s->avctx->time_base;
2259 c->max_b_frames= s->max_b_frames;
2261 if (avcodec_open(c, codec) < 0)
2264 for(i=0; i<s->max_b_frames+2; i++){
2265 int ysize= c->width*c->height;
2266 int csize= (c->width/2)*(c->height/2);
2267 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr;
2269 avcodec_get_frame_defaults(&input[i]);
2270 input[i].data[0]= av_malloc(ysize + 2*csize);
2271 input[i].data[1]= input[i].data[0] + ysize;
2272 input[i].data[2]= input[i].data[1] + csize;
2273 input[i].linesize[0]= c->width;
2274 input[i].linesize[1]=
2275 input[i].linesize[2]= c->width/2;
2277 if(pre_input_ptr && (!i || s->input_picture[i-1])) {
2278 pre_input= *pre_input_ptr;
2280 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i) {
2281 pre_input.data[0]+=INPLACE_OFFSET;
2282 pre_input.data[1]+=INPLACE_OFFSET;
2283 pre_input.data[2]+=INPLACE_OFFSET;
2286 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0], pre_input.data[0], pre_input.linesize[0], c->width, c->height);
2287 s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1], pre_input.data[1], pre_input.linesize[1], c->width>>1, c->height>>1);
2288 s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2], pre_input.data[2], pre_input.linesize[2], c->width>>1, c->height>>1);
2292 for(j=0; j<s->max_b_frames+1; j++){
2295 if(!s->input_picture[j])
2298 c->error[0]= c->error[1]= c->error[2]= 0;
2300 input[0].pict_type= I_TYPE;
2301 input[0].quality= 1 * FF_QP2LAMBDA;
2302 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]);
2303 // rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
2305 for(i=0; i<s->max_b_frames+1; i++){
2306 int is_p= i % (j+1) == j || i==s->max_b_frames;
2308 input[i+1].pict_type= is_p ? P_TYPE : B_TYPE;
2309 input[i+1].quality= is_p ? p_lambda : b_lambda;
2310 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]);
2311 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2314 /* get the delayed frames */
2316 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
2317 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2320 rd += c->error[0] + c->error[1] + c->error[2];
2332 for(i=0; i<s->max_b_frames+2; i++){
2333 av_freep(&input[i].data[0]);
2336 return best_b_count;
2339 static void select_input_picture(MpegEncContext *s){
2342 for(i=1; i<MAX_PICTURE_COUNT; i++)
2343 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2344 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2346 /* set next picture type & ordering */
2347 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2348 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2349 s->reordered_input_picture[0]= s->input_picture[0];
2350 s->reordered_input_picture[0]->pict_type= I_TYPE;
2351 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2355 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2356 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2357 //FIXME check that te gop check above is +-1 correct
2358 //av_log(NULL, AV_LOG_DEBUG, "skip %p %"PRId64"\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2360 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2362 s->input_picture[0]->data[i]= NULL;
2363 s->input_picture[0]->type= 0;
2365 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2366 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2368 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2372 ff_vbv_update(s, 0);
2378 if(s->flags&CODEC_FLAG_PASS2){
2379 for(i=0; i<s->max_b_frames+1; i++){
2380 int pict_num= s->input_picture[0]->display_picture_number + i;
2382 if(pict_num >= s->rc_context.num_entries)
2384 if(!s->input_picture[i]){
2385 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2389 s->input_picture[i]->pict_type=
2390 s->rc_context.entry[pict_num].new_pict_type;
2394 if(s->avctx->b_frame_strategy==0){
2395 b_frames= s->max_b_frames;
2396 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2397 }else if(s->avctx->b_frame_strategy==1){
2398 for(i=1; i<s->max_b_frames+1; i++){
2399 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2400 s->input_picture[i]->b_frame_score=
2401 get_intra_count(s, s->input_picture[i ]->data[0],
2402 s->input_picture[i-1]->data[0], s->linesize) + 1;
2405 for(i=0; i<s->max_b_frames+1; i++){
2406 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/s->avctx->b_sensitivity) break;
2409 b_frames= FFMAX(0, i-1);
2412 for(i=0; i<b_frames+1; i++){
2413 s->input_picture[i]->b_frame_score=0;
2415 }else if(s->avctx->b_frame_strategy==2){
2416 b_frames= estimate_best_b_count(s);
2418 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2423 //static int b_count=0;
2424 //b_count+= b_frames;
2425 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2427 for(i= b_frames - 1; i>=0; i--){
2428 int type= s->input_picture[i]->pict_type;
2429 if(type && type != B_TYPE)
2432 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2433 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2436 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2437 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2438 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2440 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2442 s->input_picture[b_frames]->pict_type= I_TYPE;
2446 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2448 && s->input_picture[b_frames]->pict_type== I_TYPE)
2451 s->reordered_input_picture[0]= s->input_picture[b_frames];
2452 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2453 s->reordered_input_picture[0]->pict_type= P_TYPE;
2454 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2455 for(i=0; i<b_frames; i++){
2456 s->reordered_input_picture[i+1]= s->input_picture[i];
2457 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2458 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2463 if(s->reordered_input_picture[0]){
2464 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2466 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2468 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED || s->avctx->rc_buffer_size){
2469 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable
2471 int i= ff_find_unused_picture(s, 0);
2472 Picture *pic= &s->picture[i];
2474 pic->reference = s->reordered_input_picture[0]->reference;
2475 alloc_picture(s, pic, 0);
2477 /* mark us unused / free shared pic */
2478 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_INTERNAL)
2479 s->avctx->release_buffer(s->avctx, (AVFrame*)s->reordered_input_picture[0]);
2481 s->reordered_input_picture[0]->data[i]= NULL;
2482 s->reordered_input_picture[0]->type= 0;
2484 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2486 s->current_picture_ptr= pic;
2488 // input is not a shared pix -> reuse buffer for current_pix
2490 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2491 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2493 s->current_picture_ptr= s->reordered_input_picture[0];
2495 s->new_picture.data[i]+= INPLACE_OFFSET;
2498 copy_picture(&s->current_picture, s->current_picture_ptr);
2500 s->picture_number= s->new_picture.display_picture_number;
2501 //printf("dpn:%d\n", s->picture_number);
2503 memset(&s->new_picture, 0, sizeof(Picture));
2507 int MPV_encode_picture(AVCodecContext *avctx,
2508 unsigned char *buf, int buf_size, void *data)
2510 MpegEncContext *s = avctx->priv_data;
2511 AVFrame *pic_arg = data;
2512 int i, stuffing_count;
2514 for(i=0; i<avctx->thread_count; i++){
2515 int start_y= s->thread_context[i]->start_mb_y;
2516 int end_y= s->thread_context[i]-> end_mb_y;
2517 int h= s->mb_height;
2518 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
2519 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
2521 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2524 s->picture_in_gop_number++;
2526 if(load_input_picture(s, pic_arg) < 0)
2529 select_input_picture(s);
2532 if(s->new_picture.data[0]){
2533 s->pict_type= s->new_picture.pict_type;
2535 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2536 MPV_frame_start(s, avctx);
2538 if (encode_picture(s, s->picture_number) < 0)
2541 avctx->real_pict_num = s->picture_number;
2542 avctx->header_bits = s->header_bits;
2543 avctx->mv_bits = s->mv_bits;
2544 avctx->misc_bits = s->misc_bits;
2545 avctx->i_tex_bits = s->i_tex_bits;
2546 avctx->p_tex_bits = s->p_tex_bits;
2547 avctx->i_count = s->i_count;
2548 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2549 avctx->skip_count = s->skip_count;
2553 if (ENABLE_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
2554 ff_mjpeg_encode_picture_trailer(s);
2556 if(avctx->rc_buffer_size){
2557 RateControlContext *rcc= &s->rc_context;
2558 int max_size= rcc->buffer_index/3;
2560 if(put_bits_count(&s->pb) > max_size && s->lambda < s->avctx->lmax){
2561 s->next_lambda= FFMAX(s->lambda+1, s->lambda*(s->qscale+1) / s->qscale);
2562 if(s->adaptive_quant){
2564 for(i=0; i<s->mb_height*s->mb_stride; i++)
2565 s->lambda_table[i]= FFMAX(s->lambda_table[i]+1, s->lambda_table[i]*(s->qscale+1) / s->qscale);
2567 s->mb_skipped = 0; //done in MPV_frame_start()
2568 if(s->pict_type==P_TYPE){ //done in encode_picture() so we must undo it
2569 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
2570 s->no_rounding ^= 1;
2572 if(s->pict_type!=B_TYPE){
2573 s->time_base= s->last_time_base;
2574 s->last_non_b_time= s->time - s->pp_time;
2576 // av_log(NULL, AV_LOG_ERROR, "R:%d ", s->next_lambda);
2577 for(i=0; i<avctx->thread_count; i++){
2578 PutBitContext *pb= &s->thread_context[i]->pb;
2579 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
2584 assert(s->avctx->rc_max_rate);
2587 if(s->flags&CODEC_FLAG_PASS1)
2588 ff_write_pass1_stats(s);
2591 s->current_picture_ptr->error[i]= s->current_picture.error[i];
2592 avctx->error[i] += s->current_picture_ptr->error[i];
2595 if(s->flags&CODEC_FLAG_PASS1)
2596 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2597 flush_put_bits(&s->pb);
2598 s->frame_bits = put_bits_count(&s->pb);
2600 stuffing_count= ff_vbv_update(s, s->frame_bits);
2602 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2603 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2607 switch(s->codec_id){
2608 case CODEC_ID_MPEG1VIDEO:
2609 case CODEC_ID_MPEG2VIDEO:
2610 while(stuffing_count--){
2611 put_bits(&s->pb, 8, 0);
2614 case CODEC_ID_MPEG4:
2615 put_bits(&s->pb, 16, 0);
2616 put_bits(&s->pb, 16, 0x1C3);
2617 stuffing_count -= 4;
2618 while(stuffing_count--){
2619 put_bits(&s->pb, 8, 0xFF);
2623 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2625 flush_put_bits(&s->pb);
2626 s->frame_bits = put_bits_count(&s->pb);
2629 /* update mpeg1/2 vbv_delay for CBR */
2630 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2631 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2634 assert(s->repeat_first_field==0);
2636 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2637 assert(vbv_delay < 0xFFFF);
2639 s->vbv_delay_ptr[0] &= 0xF8;
2640 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2641 s->vbv_delay_ptr[1] = vbv_delay>>5;
2642 s->vbv_delay_ptr[2] &= 0x07;
2643 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2645 s->total_bits += s->frame_bits;
2646 avctx->frame_bits = s->frame_bits;
2648 assert((pbBufPtr(&s->pb) == s->pb.buf));
2651 assert((s->frame_bits&7)==0);
2653 return s->frame_bits/8;
2656 #endif //CONFIG_ENCODERS
2658 static inline void gmc1_motion(MpegEncContext *s,
2659 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2660 uint8_t **ref_picture)
2663 int offset, src_x, src_y, linesize, uvlinesize;
2664 int motion_x, motion_y;
2667 motion_x= s->sprite_offset[0][0];
2668 motion_y= s->sprite_offset[0][1];
2669 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2670 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2671 motion_x<<=(3-s->sprite_warping_accuracy);
2672 motion_y<<=(3-s->sprite_warping_accuracy);
2673 src_x = av_clip(src_x, -16, s->width);
2674 if (src_x == s->width)
2676 src_y = av_clip(src_y, -16, s->height);
2677 if (src_y == s->height)
2680 linesize = s->linesize;
2681 uvlinesize = s->uvlinesize;
2683 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2685 if(s->flags&CODEC_FLAG_EMU_EDGE){
2686 if( (unsigned)src_x >= s->h_edge_pos - 17
2687 || (unsigned)src_y >= s->v_edge_pos - 17){
2688 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2689 ptr= s->edge_emu_buffer;
2693 if((motion_x|motion_y)&7){
2694 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2695 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2699 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2700 if (s->no_rounding){
2701 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2703 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2707 if(s->flags&CODEC_FLAG_GRAY) return;
2709 motion_x= s->sprite_offset[1][0];
2710 motion_y= s->sprite_offset[1][1];
2711 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2712 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2713 motion_x<<=(3-s->sprite_warping_accuracy);
2714 motion_y<<=(3-s->sprite_warping_accuracy);
2715 src_x = av_clip(src_x, -8, s->width>>1);
2716 if (src_x == s->width>>1)
2718 src_y = av_clip(src_y, -8, s->height>>1);
2719 if (src_y == s->height>>1)
2722 offset = (src_y * uvlinesize) + src_x;
2723 ptr = ref_picture[1] + offset;
2724 if(s->flags&CODEC_FLAG_EMU_EDGE){
2725 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2726 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2727 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);
2728 ptr= s->edge_emu_buffer;
2732 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2734 ptr = ref_picture[2] + offset;
2736 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);
2737 ptr= s->edge_emu_buffer;
2739 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2744 static inline void gmc_motion(MpegEncContext *s,
2745 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2746 uint8_t **ref_picture)
2749 int linesize, uvlinesize;
2750 const int a= s->sprite_warping_accuracy;
2753 linesize = s->linesize;
2754 uvlinesize = s->uvlinesize;
2756 ptr = ref_picture[0];
2758 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2759 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2761 s->dsp.gmc(dest_y, ptr, linesize, 16,
2764 s->sprite_delta[0][0], s->sprite_delta[0][1],
2765 s->sprite_delta[1][0], s->sprite_delta[1][1],
2766 a+1, (1<<(2*a+1)) - s->no_rounding,
2767 s->h_edge_pos, s->v_edge_pos);
2768 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2769 ox + s->sprite_delta[0][0]*8,
2770 oy + s->sprite_delta[1][0]*8,
2771 s->sprite_delta[0][0], s->sprite_delta[0][1],
2772 s->sprite_delta[1][0], s->sprite_delta[1][1],
2773 a+1, (1<<(2*a+1)) - s->no_rounding,
2774 s->h_edge_pos, s->v_edge_pos);
2776 if(s->flags&CODEC_FLAG_GRAY) return;
2778 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2779 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2781 ptr = ref_picture[1];
2782 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2785 s->sprite_delta[0][0], s->sprite_delta[0][1],
2786 s->sprite_delta[1][0], s->sprite_delta[1][1],
2787 a+1, (1<<(2*a+1)) - s->no_rounding,
2788 s->h_edge_pos>>1, s->v_edge_pos>>1);
2790 ptr = ref_picture[2];
2791 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2794 s->sprite_delta[0][0], s->sprite_delta[0][1],
2795 s->sprite_delta[1][0], s->sprite_delta[1][1],
2796 a+1, (1<<(2*a+1)) - s->no_rounding,
2797 s->h_edge_pos>>1, s->v_edge_pos>>1);
2801 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2802 * @param buf destination buffer
2803 * @param src source buffer
2804 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2805 * @param block_w width of block
2806 * @param block_h height of block
2807 * @param src_x x coordinate of the top left sample of the block in the source buffer
2808 * @param src_y y coordinate of the top left sample of the block in the source buffer
2809 * @param w width of the source buffer
2810 * @param h height of the source buffer
2812 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2813 int src_x, int src_y, int w, int h){
2815 int start_y, start_x, end_y, end_x;
2818 src+= (h-1-src_y)*linesize;
2820 }else if(src_y<=-block_h){
2821 src+= (1-block_h-src_y)*linesize;
2827 }else if(src_x<=-block_w){
2828 src+= (1-block_w-src_x);
2832 start_y= FFMAX(0, -src_y);
2833 start_x= FFMAX(0, -src_x);
2834 end_y= FFMIN(block_h, h-src_y);
2835 end_x= FFMIN(block_w, w-src_x);
2837 // copy existing part
2838 for(y=start_y; y<end_y; y++){
2839 for(x=start_x; x<end_x; x++){
2840 buf[x + y*linesize]= src[x + y*linesize];
2845 for(y=0; y<start_y; y++){
2846 for(x=start_x; x<end_x; x++){
2847 buf[x + y*linesize]= buf[x + start_y*linesize];
2852 for(y=end_y; y<block_h; y++){
2853 for(x=start_x; x<end_x; x++){
2854 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2858 for(y=0; y<block_h; y++){
2860 for(x=0; x<start_x; x++){
2861 buf[x + y*linesize]= buf[start_x + y*linesize];
2865 for(x=end_x; x<block_w; x++){
2866 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2871 static inline int hpel_motion(MpegEncContext *s,
2872 uint8_t *dest, uint8_t *src,
2873 int field_based, int field_select,
2874 int src_x, int src_y,
2875 int width, int height, int stride,
2876 int h_edge_pos, int v_edge_pos,
2877 int w, int h, op_pixels_func *pix_op,
2878 int motion_x, int motion_y)
2883 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2884 src_x += motion_x >> 1;
2885 src_y += motion_y >> 1;
2887 /* WARNING: do no forget half pels */
2888 src_x = av_clip(src_x, -16, width); //FIXME unneeded for emu?
2891 src_y = av_clip(src_y, -16, height);
2892 if (src_y == height)
2894 src += src_y * stride + src_x;
2896 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2897 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2898 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2899 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2900 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2901 src= s->edge_emu_buffer;
2907 pix_op[dxy](dest, src, stride, h);
2911 static inline int hpel_motion_lowres(MpegEncContext *s,
2912 uint8_t *dest, uint8_t *src,
2913 int field_based, int field_select,
2914 int src_x, int src_y,
2915 int width, int height, int stride,
2916 int h_edge_pos, int v_edge_pos,
2917 int w, int h, h264_chroma_mc_func *pix_op,
2918 int motion_x, int motion_y)
2920 const int lowres= s->avctx->lowres;
2921 const int s_mask= (2<<lowres)-1;
2925 if(s->quarter_sample){
2930 sx= motion_x & s_mask;
2931 sy= motion_y & s_mask;
2932 src_x += motion_x >> (lowres+1);
2933 src_y += motion_y >> (lowres+1);
2935 src += src_y * stride + src_x;
2937 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2938 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2939 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2940 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2941 src= s->edge_emu_buffer;
2949 pix_op[lowres](dest, src, stride, h, sx, sy);
2953 /* apply one mpeg motion vector to the three components */
2954 static av_always_inline void mpeg_motion(MpegEncContext *s,
2955 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2956 int field_based, int bottom_field, int field_select,
2957 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2958 int motion_x, int motion_y, int h)
2960 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2961 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2964 if(s->quarter_sample)
2971 v_edge_pos = s->v_edge_pos >> field_based;
2972 linesize = s->current_picture.linesize[0] << field_based;
2973 uvlinesize = s->current_picture.linesize[1] << field_based;
2975 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2976 src_x = s->mb_x* 16 + (motion_x >> 1);
2977 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2979 if (s->out_format == FMT_H263) {
2980 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2981 mx = (motion_x>>1)|(motion_x&1);
2983 uvdxy = ((my & 1) << 1) | (mx & 1);
2984 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2985 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2987 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2991 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2995 uvsrc_x = s->mb_x*8 + mx;
2996 uvsrc_y = s->mb_y*8 + my;
2998 if(s->chroma_y_shift){
3001 uvdxy = ((my & 1) << 1) | (mx & 1);
3002 uvsrc_x = s->mb_x* 8 + (mx >> 1);
3003 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
3005 if(s->chroma_x_shift){
3008 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
3009 uvsrc_x = s->mb_x* 8 + (mx >> 1);
3020 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3021 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3022 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3024 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
3025 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
3026 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
3027 s->codec_id == CODEC_ID_MPEG1VIDEO){
3028 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
3031 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3032 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3033 ptr_y = s->edge_emu_buffer;
3034 if(!(s->flags&CODEC_FLAG_GRAY)){
3035 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3036 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3037 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3038 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3039 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3045 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3046 dest_y += s->linesize;
3047 dest_cb+= s->uvlinesize;
3048 dest_cr+= s->uvlinesize;
3052 ptr_y += s->linesize;
3053 ptr_cb+= s->uvlinesize;
3054 ptr_cr+= s->uvlinesize;
3057 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
3059 if(!(s->flags&CODEC_FLAG_GRAY)){
3060 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
3061 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
3063 if((ENABLE_H261_ENCODER || ENABLE_H261_DECODER) && s->out_format == FMT_H261){
3064 ff_h261_loop_filter(s);
3068 /* apply one mpeg motion vector to the three components */
3069 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
3070 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3071 int field_based, int bottom_field, int field_select,
3072 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
3073 int motion_x, int motion_y, int h)
3075 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3076 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
3077 const int lowres= s->avctx->lowres;
3078 const int block_s= 8>>lowres;
3079 const int s_mask= (2<<lowres)-1;
3080 const int h_edge_pos = s->h_edge_pos >> lowres;
3081 const int v_edge_pos = s->v_edge_pos >> lowres;
3082 linesize = s->current_picture.linesize[0] << field_based;
3083 uvlinesize = s->current_picture.linesize[1] << field_based;
3085 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
3091 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
3094 sx= motion_x & s_mask;
3095 sy= motion_y & s_mask;
3096 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
3097 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
3099 if (s->out_format == FMT_H263) {
3100 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
3101 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
3104 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
3107 uvsx = (2*mx) & s_mask;
3108 uvsy = (2*my) & s_mask;
3109 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
3110 uvsrc_y = s->mb_y*block_s + (my >> lowres);
3116 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
3117 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
3120 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3121 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3122 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3124 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
3125 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
3126 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3127 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
3128 ptr_y = s->edge_emu_buffer;
3129 if(!(s->flags&CODEC_FLAG_GRAY)){
3130 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3131 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3132 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3133 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3134 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3140 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3141 dest_y += s->linesize;
3142 dest_cb+= s->uvlinesize;
3143 dest_cr+= s->uvlinesize;
3147 ptr_y += s->linesize;
3148 ptr_cb+= s->uvlinesize;
3149 ptr_cr+= s->uvlinesize;
3154 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
3156 if(!(s->flags&CODEC_FLAG_GRAY)){
3157 uvsx <<= 2 - lowres;
3158 uvsy <<= 2 - lowres;
3159 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3160 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3162 //FIXME h261 lowres loop filter
3165 //FIXME move to dsputil, avg variant, 16x16 version
3166 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
3168 uint8_t * const top = src[1];
3169 uint8_t * const left = src[2];
3170 uint8_t * const mid = src[0];
3171 uint8_t * const right = src[3];
3172 uint8_t * const bottom= src[4];
3173 #define OBMC_FILTER(x, t, l, m, r, b)\
3174 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
3175 #define OBMC_FILTER4(x, t, l, m, r, b)\
3176 OBMC_FILTER(x , t, l, m, r, b);\
3177 OBMC_FILTER(x+1 , t, l, m, r, b);\
3178 OBMC_FILTER(x +stride, t, l, m, r, b);\
3179 OBMC_FILTER(x+1+stride, t, l, m, r, b);
3182 OBMC_FILTER (x , 2, 2, 4, 0, 0);
3183 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
3184 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
3185 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
3186 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
3187 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
3189 OBMC_FILTER (x , 1, 2, 5, 0, 0);
3190 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
3191 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
3192 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
3194 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
3195 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
3196 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
3197 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
3199 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
3200 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
3201 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
3202 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
3204 OBMC_FILTER (x , 0, 2, 5, 0, 1);
3205 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
3206 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
3207 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
3208 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
3209 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
3211 OBMC_FILTER (x , 0, 2, 4, 0, 2);
3212 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
3213 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
3214 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
3217 /* obmc for 1 8x8 luma block */
3218 static inline void obmc_motion(MpegEncContext *s,
3219 uint8_t *dest, uint8_t *src,
3220 int src_x, int src_y,
3221 op_pixels_func *pix_op,
3222 int16_t mv[5][2]/* mid top left right bottom*/)
3228 assert(s->quarter_sample==0);
3231 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
3234 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3235 hpel_motion(s, ptr[i], src, 0, 0,
3237 s->width, s->height, s->linesize,
3238 s->h_edge_pos, s->v_edge_pos,
3240 mv[i][0], mv[i][1]);
3244 put_obmc(dest, ptr, s->linesize);
3247 static inline void qpel_motion(MpegEncContext *s,
3248 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3249 int field_based, int bottom_field, int field_select,
3250 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3251 qpel_mc_func (*qpix_op)[16],
3252 int motion_x, int motion_y, int h)
3254 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3255 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3257 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3258 src_x = s->mb_x * 16 + (motion_x >> 2);
3259 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3261 v_edge_pos = s->v_edge_pos >> field_based;
3262 linesize = s->linesize << field_based;
3263 uvlinesize = s->uvlinesize << field_based;
3268 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3269 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3270 mx= (motion_x>>1) + rtab[motion_x&7];
3271 my= (motion_y>>1) + rtab[motion_y&7];
3272 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3273 mx= (motion_x>>1)|(motion_x&1);
3274 my= (motion_y>>1)|(motion_y&1);
3282 uvdxy= (mx&1) | ((my&1)<<1);
3286 uvsrc_x = s->mb_x * 8 + mx;
3287 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3289 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3290 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3291 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3293 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3294 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3295 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3296 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3297 ptr_y= s->edge_emu_buffer;
3298 if(!(s->flags&CODEC_FLAG_GRAY)){
3299 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3300 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3301 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3302 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3303 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3310 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3313 dest_y += s->linesize;
3314 dest_cb+= s->uvlinesize;
3315 dest_cr+= s->uvlinesize;
3319 ptr_y += s->linesize;
3320 ptr_cb += s->uvlinesize;
3321 ptr_cr += s->uvlinesize;
3323 //damn interlaced mode
3324 //FIXME boundary mirroring is not exactly correct here
3325 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3326 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3328 if(!(s->flags&CODEC_FLAG_GRAY)){
3329 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3330 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3334 inline int ff_h263_round_chroma(int x){
3336 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3339 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3344 * h263 chorma 4mv motion compensation.
3346 static inline void chroma_4mv_motion(MpegEncContext *s,
3347 uint8_t *dest_cb, uint8_t *dest_cr,
3348 uint8_t **ref_picture,
3349 op_pixels_func *pix_op,
3351 int dxy, emu=0, src_x, src_y, offset;
3354 /* In case of 8X8, we construct a single chroma motion vector
3355 with a special rounding */
3356 mx= ff_h263_round_chroma(mx);
3357 my= ff_h263_round_chroma(my);
3359 dxy = ((my & 1) << 1) | (mx & 1);
3363 src_x = s->mb_x * 8 + mx;
3364 src_y = s->mb_y * 8 + my;
3365 src_x = av_clip(src_x, -8, s->width/2);
3366 if (src_x == s->width/2)
3368 src_y = av_clip(src_y, -8, s->height/2);
3369 if (src_y == s->height/2)
3372 offset = (src_y * (s->uvlinesize)) + src_x;
3373 ptr = ref_picture[1] + offset;
3374 if(s->flags&CODEC_FLAG_EMU_EDGE){
3375 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3376 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3377 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);
3378 ptr= s->edge_emu_buffer;
3382 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3384 ptr = ref_picture[2] + offset;
3386 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);
3387 ptr= s->edge_emu_buffer;
3389 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3392 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3393 uint8_t *dest_cb, uint8_t *dest_cr,
3394 uint8_t **ref_picture,
3395 h264_chroma_mc_func *pix_op,
3397 const int lowres= s->avctx->lowres;
3398 const int block_s= 8>>lowres;
3399 const int s_mask= (2<<lowres)-1;
3400 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3401 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3402 int emu=0, src_x, src_y, offset, sx, sy;
3405 if(s->quarter_sample){
3410 /* In case of 8X8, we construct a single chroma motion vector
3411 with a special rounding */
3412 mx= ff_h263_round_chroma(mx);
3413 my= ff_h263_round_chroma(my);
3417 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3418 src_y = s->mb_y*block_s + (my >> (lowres+1));
3420 offset = src_y * s->uvlinesize + src_x;
3421 ptr = ref_picture[1] + offset;
3422 if(s->flags&CODEC_FLAG_EMU_EDGE){
3423 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3424 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3425 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3426 ptr= s->edge_emu_buffer;
3432 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3434 ptr = ref_picture[2] + offset;
3436 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3437 ptr= s->edge_emu_buffer;
3439 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3442 static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir){
3443 /* fetch pixels for estimated mv 4 macroblocks ahead
3444 * optimized for 64byte cache lines */
3445 const int shift = s->quarter_sample ? 2 : 1;
3446 const int mx= (s->mv[dir][0][0]>>shift) + 16*s->mb_x + 8;
3447 const int my= (s->mv[dir][0][1]>>shift) + 16*s->mb_y;
3448 int off= mx + (my + (s->mb_x&3)*4)*s->linesize + 64;
3449 s->dsp.prefetch(pix[0]+off, s->linesize, 4);
3450 off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
3451 s->dsp.prefetch(pix[1]+off, pix[2]-pix[1], 2);
3455 * motion compensation of a single macroblock
3457 * @param dest_y luma destination pointer
3458 * @param dest_cb chroma cb/u destination pointer
3459 * @param dest_cr chroma cr/v destination pointer
3460 * @param dir direction (0->forward, 1->backward)
3461 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3462 * @param pic_op halfpel motion compensation function (average or put normally)
3463 * @param pic_op qpel motion compensation function (average or put normally)
3464 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3466 static inline void MPV_motion(MpegEncContext *s,
3467 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3468 int dir, uint8_t **ref_picture,
3469 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3471 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3473 uint8_t *ptr, *dest;
3478 prefetch_motion(s, ref_picture, dir);
3480 if(s->obmc && s->pict_type != B_TYPE){
3481 int16_t mv_cache[4][4][2];
3482 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3483 const int mot_stride= s->b8_stride;
3484 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3486 assert(!s->mb_skipped);
3488 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3489 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3490 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3492 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3493 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3495 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3498 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3499 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3500 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3502 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3503 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3506 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3507 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3508 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3510 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3511 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3517 const int x= (i&1)+1;
3518 const int y= (i>>1)+1;
3520 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3521 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3522 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3523 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3524 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3526 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3528 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3535 if(!(s->flags&CODEC_FLAG_GRAY))
3536 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3541 switch(s->mv_type) {
3544 if(s->real_sprite_warping_points==1){
3545 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3548 gmc_motion(s, dest_y, dest_cb, dest_cr,
3551 }else if(s->quarter_sample){
3552 qpel_motion(s, dest_y, dest_cb, dest_cr,
3554 ref_picture, pix_op, qpix_op,
3555 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3556 }else if(ENABLE_WMV2 && s->mspel){
3557 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3558 ref_picture, pix_op,
3559 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3562 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3564 ref_picture, pix_op,
3565 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3571 if(s->quarter_sample){
3573 motion_x = s->mv[dir][i][0];
3574 motion_y = s->mv[dir][i][1];
3576 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3577 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3578 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3580 /* WARNING: do no forget half pels */
3581 src_x = av_clip(src_x, -16, s->width);
3582 if (src_x == s->width)
3584 src_y = av_clip(src_y, -16, s->height);
3585 if (src_y == s->height)
3588 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3589 if(s->flags&CODEC_FLAG_EMU_EDGE){
3590 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3591 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3592 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);
3593 ptr= s->edge_emu_buffer;
3596 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3597 qpix_op[1][dxy](dest, ptr, s->linesize);
3599 mx += s->mv[dir][i][0]/2;
3600 my += s->mv[dir][i][1]/2;
3604 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3605 ref_picture[0], 0, 0,
3606 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3607 s->width, s->height, s->linesize,
3608 s->h_edge_pos, s->v_edge_pos,
3610 s->mv[dir][i][0], s->mv[dir][i][1]);
3612 mx += s->mv[dir][i][0];
3613 my += s->mv[dir][i][1];
3617 if(!(s->flags&CODEC_FLAG_GRAY))
3618 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3621 if (s->picture_structure == PICT_FRAME) {
3622 if(s->quarter_sample){
3624 qpel_motion(s, dest_y, dest_cb, dest_cr,
3625 1, i, s->field_select[dir][i],
3626 ref_picture, pix_op, qpix_op,
3627 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3631 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3632 1, 0, s->field_select[dir][0],
3633 ref_picture, pix_op,
3634 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3636 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3637 1, 1, s->field_select[dir][1],
3638 ref_picture, pix_op,
3639 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3642 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3643 ref_picture= s->current_picture_ptr->data;
3646 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3647 0, 0, s->field_select[dir][0],
3648 ref_picture, pix_op,
3649 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3654 uint8_t ** ref2picture;
3656 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3657 ref2picture= ref_picture;
3659 ref2picture= s->current_picture_ptr->data;
3662 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3663 0, 0, s->field_select[dir][i],
3664 ref2picture, pix_op,
3665 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3667 dest_y += 16*s->linesize;
3668 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3669 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3673 if(s->picture_structure == PICT_FRAME){
3677 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3679 ref_picture, pix_op,
3680 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3682 pix_op = s->dsp.avg_pixels_tab;
3686 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3687 0, 0, s->picture_structure != i+1,
3688 ref_picture, pix_op,
3689 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3691 // after put we make avg of the same block
3692 pix_op=s->dsp.avg_pixels_tab;
3694 //opposite parity is always in the same frame if this is second field
3695 if(!s->first_field){
3696 ref_picture = s->current_picture_ptr->data;
3706 * motion compensation of a single macroblock
3708 * @param dest_y luma destination pointer
3709 * @param dest_cb chroma cb/u destination pointer
3710 * @param dest_cr chroma cr/v destination pointer
3711 * @param dir direction (0->forward, 1->backward)
3712 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3713 * @param pic_op halfpel motion compensation function (average or put normally)
3714 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3716 static inline void MPV_motion_lowres(MpegEncContext *s,
3717 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3718 int dir, uint8_t **ref_picture,
3719 h264_chroma_mc_func *pix_op)
3723 const int lowres= s->avctx->lowres;
3724 const int block_s= 8>>lowres;
3729 switch(s->mv_type) {
3731 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3733 ref_picture, pix_op,
3734 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3740 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3741 ref_picture[0], 0, 0,
3742 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3743 s->width, s->height, s->linesize,
3744 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3745 block_s, block_s, pix_op,
3746 s->mv[dir][i][0], s->mv[dir][i][1]);
3748 mx += s->mv[dir][i][0];
3749 my += s->mv[dir][i][1];
3752 if(!(s->flags&CODEC_FLAG_GRAY))
3753 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3756 if (s->picture_structure == PICT_FRAME) {
3758 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3759 1, 0, s->field_select[dir][0],
3760 ref_picture, pix_op,
3761 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3763 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3764 1, 1, s->field_select[dir][1],
3765 ref_picture, pix_op,
3766 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3768 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3769 ref_picture= s->current_picture_ptr->data;
3772 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3773 0, 0, s->field_select[dir][0],
3774 ref_picture, pix_op,
3775 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3780 uint8_t ** ref2picture;
3782 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3783 ref2picture= ref_picture;
3785 ref2picture= s->current_picture_ptr->data;
3788 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3789 0, 0, s->field_select[dir][i],
3790 ref2picture, pix_op,
3791 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3793 dest_y += 2*block_s*s->linesize;
3794 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3795 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3799 if(s->picture_structure == PICT_FRAME){
3803 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3805 ref_picture, pix_op,
3806 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3808 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3812 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3813 0, 0, s->picture_structure != i+1,
3814 ref_picture, pix_op,
3815 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3817 // after put we make avg of the same block
3818 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3820 //opposite parity is always in the same frame if this is second field
3821 if(!s->first_field){
3822 ref_picture = s->current_picture_ptr->data;
3831 /* put block[] to dest[] */
3832 static inline void put_dct(MpegEncContext *s,
3833 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3835 s->dct_unquantize_intra(s, block, i, qscale);
3836 s->dsp.idct_put (dest, line_size, block);
3839 /* add block[] to dest[] */
3840 static inline void add_dct(MpegEncContext *s,
3841 DCTELEM *block, int i, uint8_t *dest, int line_size)
3843 if (s->block_last_index[i] >= 0) {
3844 s->dsp.idct_add (dest, line_size, block);
3848 static inline void add_dequant_dct(MpegEncContext *s,
3849 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3851 if (s->block_last_index[i] >= 0) {
3852 s->dct_unquantize_inter(s, block, i, qscale);
3854 s->dsp.idct_add (dest, line_size, block);
3859 * cleans dc, ac, coded_block for the current non intra MB
3861 void ff_clean_intra_table_entries(MpegEncContext *s)
3863 int wrap = s->b8_stride;
3864 int xy = s->block_index[0];
3867 s->dc_val[0][xy + 1 ] =
3868 s->dc_val[0][xy + wrap] =
3869 s->dc_val[0][xy + 1 + wrap] = 1024;
3871 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3872 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3873 if (s->msmpeg4_version>=3) {
3874 s->coded_block[xy ] =
3875 s->coded_block[xy + 1 ] =
3876 s->coded_block[xy + wrap] =
3877 s->coded_block[xy + 1 + wrap] = 0;
3880 wrap = s->mb_stride;
3881 xy = s->mb_x + s->mb_y * wrap;
3883 s->dc_val[2][xy] = 1024;
3885 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3886 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3888 s->mbintra_table[xy]= 0;
3891 /* generic function called after a macroblock has been parsed by the
3892 decoder or after it has been encoded by the encoder.
3894 Important variables used:
3895 s->mb_intra : true if intra macroblock
3896 s->mv_dir : motion vector direction
3897 s->mv_type : motion vector type
3898 s->mv : motion vector
3899 s->interlaced_dct : true if interlaced dct used (mpeg2)
3901 static av_always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3904 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3906 if(s->avctx->xvmc_acceleration){
3907 XVMC_decode_mb(s);//xvmc uses pblocks
3915 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3916 /* save DCT coefficients */
3918 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3921 *dct++ = block[i][s->dsp.idct_permutation[j]];
3924 s->current_picture.qscale_table[mb_xy]= s->qscale;
3926 /* update DC predictors for P macroblocks */
3928 if (s->h263_pred || s->h263_aic) {
3929 if(s->mbintra_table[mb_xy])
3930 ff_clean_intra_table_entries(s);
3934 s->last_dc[2] = 128 << s->intra_dc_precision;
3937 else if (s->h263_pred || s->h263_aic)
3938 s->mbintra_table[mb_xy]=1;
3940 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
3941 uint8_t *dest_y, *dest_cb, *dest_cr;
3942 int dct_linesize, dct_offset;
3943 op_pixels_func (*op_pix)[4];
3944 qpel_mc_func (*op_qpix)[16];
3945 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3946 const int uvlinesize= s->current_picture.linesize[1];
3947 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3948 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3950 /* avoid copy if macroblock skipped in last frame too */
3951 /* skip only during decoding as we might trash the buffers during encoding a bit */
3953 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3954 const int age= s->current_picture.age;
3958 if (s->mb_skipped) {
3960 assert(s->pict_type!=I_TYPE);
3962 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3963 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3965 /* if previous was skipped too, then nothing to do ! */
3966 if (*mbskip_ptr >= age && s->current_picture.reference){
3969 } else if(!s->current_picture.reference){
3970 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3971 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3973 *mbskip_ptr = 0; /* not skipped */
3977 dct_linesize = linesize << s->interlaced_dct;
3978 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3982 dest_cb= s->dest[1];
3983 dest_cr= s->dest[2];
3985 dest_y = s->b_scratchpad;
3986 dest_cb= s->b_scratchpad+16*linesize;
3987 dest_cr= s->b_scratchpad+32*linesize;
3991 /* motion handling */
3992 /* decoding or more than one mb_type (MC was already done otherwise) */
3995 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3997 if (s->mv_dir & MV_DIR_FORWARD) {
3998 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3999 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
4001 if (s->mv_dir & MV_DIR_BACKWARD) {
4002 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
4005 op_qpix= s->me.qpel_put;
4006 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4007 op_pix = s->dsp.put_pixels_tab;
4009 op_pix = s->dsp.put_no_rnd_pixels_tab;
4011 if (s->mv_dir & MV_DIR_FORWARD) {
4012 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4013 op_pix = s->dsp.avg_pixels_tab;
4014 op_qpix= s->me.qpel_avg;
4016 if (s->mv_dir & MV_DIR_BACKWARD) {
4017 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4022 /* skip dequant / idct if we are really late ;) */
4023 if(s->hurry_up>1) goto skip_idct;
4024 if(s->avctx->skip_idct){
4025 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
4026 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
4027 || s->avctx->skip_idct >= AVDISCARD_ALL)
4031 /* add dct residue */
4032 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
4033 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
4034 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4035 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4036 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4037 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4039 if(!(s->flags&CODEC_FLAG_GRAY)){
4040 if (s->chroma_y_shift){
4041 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4042 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4046 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4047 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4048 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4049 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4052 } else if(s->codec_id != CODEC_ID_WMV2){
4053 add_dct(s, block[0], 0, dest_y , dct_linesize);
4054 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
4055 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
4056 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
4058 if(!(s->flags&CODEC_FLAG_GRAY)){
4059 if(s->chroma_y_shift){//Chroma420
4060 add_dct(s, block[4], 4, dest_cb, uvlinesize);
4061 add_dct(s, block[5], 5, dest_cr, uvlinesize);
4064 dct_linesize = uvlinesize << s->interlaced_dct;
4065 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4067 add_dct(s, block[4], 4, dest_cb, dct_linesize);
4068 add_dct(s, block[5], 5, dest_cr, dct_linesize);
4069 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
4070 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
4071 if(!s->chroma_x_shift){//Chroma444
4072 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
4073 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
4074 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
4075 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
4080 else if (ENABLE_WMV2) {
4081 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
4084 /* dct only in intra block */
4085 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
4086 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4087 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4088 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4089 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4091 if(!(s->flags&CODEC_FLAG_GRAY)){
4092 if(s->chroma_y_shift){
4093 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4094 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4098 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4099 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4100 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4101 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4105 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
4106 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
4107 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
4108 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
4110 if(!(s->flags&CODEC_FLAG_GRAY)){
4111 if(s->chroma_y_shift){
4112 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
4113 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
4116 dct_linesize = uvlinesize << s->interlaced_dct;
4117 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4119 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
4120 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
4121 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
4122 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
4123 if(!s->chroma_x_shift){//Chroma444
4124 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
4125 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
4126 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
4127 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
4135 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
4136 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
4137 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
4142 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
4143 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
4144 else MPV_decode_mb_internal(s, block, 0);
4147 #ifdef CONFIG_ENCODERS
4149 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
4151 static const char tab[64]=
4163 DCTELEM *block= s->block[n];
4164 const int last_index= s->block_last_index[n];
4169 threshold= -threshold;
4173 /* are all which we could set to zero are allready zero? */
4174 if(last_index<=skip_dc - 1) return;
4176 for(i=0; i<=last_index; i++){
4177 const int j = s->intra_scantable.permutated[i];
4178 const int level = FFABS(block[j]);
4180 if(skip_dc && i==0) continue;
4189 if(score >= threshold) return;
4190 for(i=skip_dc; i<=last_index; i++){
4191 const int j = s->intra_scantable.permutated[i];
4194 if(block[0]) s->block_last_index[n]= 0;
4195 else s->block_last_index[n]= -1;
4198 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
4201 const int maxlevel= s->max_qcoeff;
4202 const int minlevel= s->min_qcoeff;
4206 i=1; //skip clipping of intra dc
4210 for(;i<=last_index; i++){
4211 const int j= s->intra_scantable.permutated[i];
4212 int level = block[j];
4214 if (level>maxlevel){
4217 }else if(level<minlevel){
4225 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
4226 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
4229 #endif //CONFIG_ENCODERS
4233 * @param h is the normal height, this will be reduced automatically if needed for the last row
4235 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
4236 if (s->avctx->draw_horiz_band) {
4240 if(s->picture_structure != PICT_FRAME){
4243 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
4246 h= FFMIN(h, s->avctx->height - y);
4248 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
4249 src= (AVFrame*)s->current_picture_ptr;
4250 else if(s->last_picture_ptr)
4251 src= (AVFrame*)s->last_picture_ptr;
4255 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
4261 offset[0]= y * s->linesize;;
4263 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
4269 s->avctx->draw_horiz_band(s->avctx, src, offset,
4270 y, s->picture_structure, h);
4274 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4275 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
4276 const int uvlinesize= s->current_picture.linesize[1];
4277 const int mb_size= 4 - s->avctx->lowres;
4279 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4280 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4281 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4282 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4283 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4284 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;
4285 //block_index is not used by mpeg2, so it is not affected by chroma_format
4287 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4288 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4289 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4291 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4293 s->dest[0] += s->mb_y * linesize << mb_size;
4294 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4295 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4299 #ifdef CONFIG_ENCODERS
4301 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4311 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4312 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4313 int v= ptr[x2 + y2*stride];
4319 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4324 static av_always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count)
4326 int16_t weight[8][64];
4327 DCTELEM orig[8][64];
4328 const int mb_x= s->mb_x;
4329 const int mb_y= s->mb_y;
4332 int dct_offset = s->linesize*8; //default for progressive frames
4333 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4336 for(i=0; i<mb_block_count; i++) skip_dct[i]=s->skipdct;
4338 if(s->adaptive_quant){
4339 const int last_qp= s->qscale;
4340 const int mb_xy= mb_x + mb_y*s->mb_stride;
4342 s->lambda= s->lambda_table[mb_xy];
4345 if(!(s->flags&CODEC_FLAG_QP_RD)){
4346 s->qscale= s->current_picture_ptr->qscale_table[mb_xy];
4347 s->dquant= s->qscale - last_qp;
4349 if(s->out_format==FMT_H263){
4350 s->dquant= av_clip(s->dquant, -2, 2);
4352 if(s->codec_id==CODEC_ID_MPEG4){
4354 if(s->pict_type == B_TYPE){
4355 if(s->dquant&1 || s->mv_dir&MV_DIRECT)
4358 if(s->mv_type==MV_TYPE_8X8)
4364 ff_set_qscale(s, last_qp + s->dquant);
4365 }else if(s->flags&CODEC_FLAG_QP_RD)
4366 ff_set_qscale(s, s->qscale + s->dquant);
4368 wrap_y = s->linesize;
4369 wrap_c = s->uvlinesize;
4370 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4371 ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4372 ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4374 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4375 uint8_t *ebuf= s->edge_emu_buffer + 32;
4376 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4378 ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
4379 ptr_cb= ebuf+18*wrap_y;
4380 ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
4381 ptr_cr= ebuf+18*wrap_y+8;
4385 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4386 int progressive_score, interlaced_score;
4388 s->interlaced_dct=0;
4389 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4390 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4392 if(progressive_score > 0){
4393 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4394 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4395 if(progressive_score > interlaced_score){
4396 s->interlaced_dct=1;
4400 if (s->chroma_format == CHROMA_422)
4406 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4407 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4408 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4409 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4411 if(s->flags&CODEC_FLAG_GRAY){
4415 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4416 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4417 if(!s->chroma_y_shift){ /* 422 */
4418 s->dsp.get_pixels(s->block[6], ptr_cb + (dct_offset>>1), wrap_c);
4419 s->dsp.get_pixels(s->block[7], ptr_cr + (dct_offset>>1), wrap_c);
4423 op_pixels_func (*op_pix)[4];
4424 qpel_mc_func (*op_qpix)[16];
4425 uint8_t *dest_y, *dest_cb, *dest_cr;
4427 dest_y = s->dest[0];
4428 dest_cb = s->dest[1];
4429 dest_cr = s->dest[2];
4431 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4432 op_pix = s->dsp.put_pixels_tab;
4433 op_qpix= s->dsp.put_qpel_pixels_tab;
4435 op_pix = s->dsp.put_no_rnd_pixels_tab;
4436 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4439 if (s->mv_dir & MV_DIR_FORWARD) {
4440 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4441 op_pix = s->dsp.avg_pixels_tab;
4442 op_qpix= s->dsp.avg_qpel_pixels_tab;
4444 if (s->mv_dir & MV_DIR_BACKWARD) {
4445 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4448 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4449 int progressive_score, interlaced_score;
4451 s->interlaced_dct=0;
4452 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4453 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4455 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4457 if(progressive_score>0){
4458 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4459 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4461 if(progressive_score > interlaced_score){
4462 s->interlaced_dct=1;
4466 if (s->chroma_format == CHROMA_422)
4472 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4473 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4474 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4475 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4477 if(s->flags&CODEC_FLAG_GRAY){
4481 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4482 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4483 if(!s->chroma_y_shift){ /* 422 */
4484 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset>>1), dest_cb + (dct_offset>>1), wrap_c);
4485 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset>>1), dest_cr + (dct_offset>>1), wrap_c);
4488 /* pre quantization */
4489 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4491 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4492 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4493 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4494 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;
4495 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4496 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4497 if(!s->chroma_y_shift){ /* 422 */
4498 if(s->dsp.sad[1](NULL, ptr_cb +(dct_offset>>1), dest_cb +(dct_offset>>1), wrap_c, 8) < 20*s->qscale) skip_dct[6]= 1;
4499 if(s->dsp.sad[1](NULL, ptr_cr +(dct_offset>>1), dest_cr +(dct_offset>>1), wrap_c, 8) < 20*s->qscale) skip_dct[7]= 1;
4504 if(s->avctx->quantizer_noise_shaping){
4505 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4506 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4507 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4508 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4509 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4510 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4511 if(!s->chroma_y_shift){ /* 422 */
4512 if(!skip_dct[6]) get_vissual_weight(weight[6], ptr_cb + (dct_offset>>1), wrap_c);
4513 if(!skip_dct[7]) get_vissual_weight(weight[7], ptr_cr + (dct_offset>>1), wrap_c);
4515 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*mb_block_count);
4518 /* DCT & quantize */
4519 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4521 for(i=0;i<mb_block_count;i++) {
4524 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4525 // FIXME we could decide to change to quantizer instead of clipping
4526 // JS: I don't think that would be a good idea it could lower quality instead
4527 // of improve it. Just INTRADC clipping deserves changes in quantizer
4528 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4530 s->block_last_index[i]= -1;
4532 if(s->avctx->quantizer_noise_shaping){
4533 for(i=0;i<mb_block_count;i++) {
4535 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4540 if(s->luma_elim_threshold && !s->mb_intra)
4542 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4543 if(s->chroma_elim_threshold && !s->mb_intra)
4544 for(i=4; i<mb_block_count; i++)
4545 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4547 if(s->flags & CODEC_FLAG_CBP_RD){
4548 for(i=0;i<mb_block_count;i++) {
4549 if(s->block_last_index[i] == -1)
4550 s->coded_score[i]= INT_MAX/256;
4555 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4556 s->block_last_index[4]=
4557 s->block_last_index[5]= 0;
4559 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4562 //non c quantize code returns incorrect block_last_index FIXME
4563 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4564 for(i=0; i<mb_block_count; i++){
4566 if(s->block_last_index[i]>0){
4567 for(j=63; j>0; j--){
4568 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4570 s->block_last_index[i]= j;
4575 /* huffman encode */
4576 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4577 case CODEC_ID_MPEG1VIDEO:
4578 case CODEC_ID_MPEG2VIDEO:
4579 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4580 case CODEC_ID_MPEG4:
4581 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4582 case CODEC_ID_MSMPEG4V2:
4583 case CODEC_ID_MSMPEG4V3:
4585 if (ENABLE_MSMPEG4_ENCODER)
4586 msmpeg4_encode_mb(s, s->block, motion_x, motion_y);
4589 if (ENABLE_WMV2_ENCODER)
4590 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y);
4593 if (ENABLE_H261_ENCODER)
4594 ff_h261_encode_mb(s, s->block, motion_x, motion_y);
4597 case CODEC_ID_H263P:
4601 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4602 case CODEC_ID_MJPEG:
4603 if (ENABLE_MJPEG_ENCODER)
4604 ff_mjpeg_encode_mb(s, s->block);
4611 static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4613 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
4614 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
4617 #endif //CONFIG_ENCODERS
4619 void ff_mpeg_flush(AVCodecContext *avctx){
4621 MpegEncContext *s = avctx->priv_data;
4623 if(s==NULL || s->picture==NULL)
4626 for(i=0; i<MAX_PICTURE_COUNT; i++){
4627 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4628 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4629 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4631 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4633 s->mb_x= s->mb_y= 0;
4635 s->parse_context.state= -1;
4636 s->parse_context.frame_start_found= 0;
4637 s->parse_context.overread= 0;
4638 s->parse_context.overread_index= 0;
4639 s->parse_context.index= 0;
4640 s->parse_context.last_index= 0;
4641 s->bitstream_buffer_size=0;
4645 #ifdef CONFIG_ENCODERS
4646 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4648 const uint16_t *srcw= (uint16_t*)src;
4649 int words= length>>4;
4650 int bits= length&15;
4653 if(length==0) return;
4656 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4657 }else if(put_bits_count(pb)&7){
4658 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4660 for(i=0; put_bits_count(pb)&31; i++)
4661 put_bits(pb, 8, src[i]);
4663 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4664 skip_put_bytes(pb, 2*words-i);
4667 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4670 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4673 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4676 d->mb_skip_run= s->mb_skip_run;
4678 d->last_dc[i]= s->last_dc[i];
4681 d->mv_bits= s->mv_bits;
4682 d->i_tex_bits= s->i_tex_bits;
4683 d->p_tex_bits= s->p_tex_bits;
4684 d->i_count= s->i_count;
4685 d->f_count= s->f_count;
4686 d->b_count= s->b_count;
4687 d->skip_count= s->skip_count;
4688 d->misc_bits= s->misc_bits;
4692 d->qscale= s->qscale;
4693 d->dquant= s->dquant;
4696 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4699 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4700 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4703 d->mb_skip_run= s->mb_skip_run;
4705 d->last_dc[i]= s->last_dc[i];
4708 d->mv_bits= s->mv_bits;
4709 d->i_tex_bits= s->i_tex_bits;
4710 d->p_tex_bits= s->p_tex_bits;
4711 d->i_count= s->i_count;
4712 d->f_count= s->f_count;
4713 d->b_count= s->b_count;
4714 d->skip_count= s->skip_count;
4715 d->misc_bits= s->misc_bits;
4717 d->mb_intra= s->mb_intra;
4718 d->mb_skipped= s->mb_skipped;
4719 d->mv_type= s->mv_type;
4720 d->mv_dir= s->mv_dir;
4722 if(s->data_partitioning){
4724 d->tex_pb= s->tex_pb;
4728 d->block_last_index[i]= s->block_last_index[i];
4729 d->interlaced_dct= s->interlaced_dct;
4730 d->qscale= s->qscale;
4733 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4734 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4735 int *dmin, int *next_block, int motion_x, int motion_y)
4738 uint8_t *dest_backup[3];
4740 copy_context_before_encode(s, backup, type);
4742 s->block= s->blocks[*next_block];
4743 s->pb= pb[*next_block];
4744 if(s->data_partitioning){
4745 s->pb2 = pb2 [*next_block];
4746 s->tex_pb= tex_pb[*next_block];
4750 memcpy(dest_backup, s->dest, sizeof(s->dest));
4751 s->dest[0] = s->rd_scratchpad;
4752 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4753 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4754 assert(s->linesize >= 32); //FIXME
4757 encode_mb(s, motion_x, motion_y);
4759 score= put_bits_count(&s->pb);
4760 if(s->data_partitioning){
4761 score+= put_bits_count(&s->pb2);
4762 score+= put_bits_count(&s->tex_pb);
4765 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4766 MPV_decode_mb(s, s->block);
4768 score *= s->lambda2;
4769 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4773 memcpy(s->dest, dest_backup, sizeof(s->dest));
4780 copy_context_after_encode(best, s, type);
4784 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4785 uint32_t *sq = ff_squareTbl + 256;
4790 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4791 else if(w==8 && h==8)
4792 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4796 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4805 static int sse_mb(MpegEncContext *s){
4809 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4810 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4813 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4814 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)
4815 +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)
4816 +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);
4818 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)
4819 +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)
4820 +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);
4823 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)
4824 +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)
4825 +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);
4828 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4829 MpegEncContext *s= arg;
4833 s->me.dia_size= s->avctx->pre_dia_size;
4834 s->first_slice_line=1;
4835 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4836 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4837 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4839 s->first_slice_line=0;
4847 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4848 MpegEncContext *s= arg;
4850 ff_check_alignment();
4852 s->me.dia_size= s->avctx->dia_size;
4853 s->first_slice_line=1;
4854 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4855 s->mb_x=0; //for block init below
4856 ff_init_block_index(s);
4857 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4858 s->block_index[0]+=2;
4859 s->block_index[1]+=2;
4860 s->block_index[2]+=2;
4861 s->block_index[3]+=2;
4863 /* compute motion vector & mb_type and store in context */
4864 if(s->pict_type==B_TYPE)
4865 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4867 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4869 s->first_slice_line=0;
4874 static int mb_var_thread(AVCodecContext *c, void *arg){
4875 MpegEncContext *s= arg;
4878 ff_check_alignment();
4880 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4881 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4884 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4886 int sum = s->dsp.pix_sum(pix, s->linesize);
4888 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4890 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4891 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4892 s->me.mb_var_sum_temp += varc;
4898 static void write_slice_end(MpegEncContext *s){
4899 if(s->codec_id==CODEC_ID_MPEG4){
4900 if(s->partitioned_frame){
4901 ff_mpeg4_merge_partitions(s);
4904 ff_mpeg4_stuffing(&s->pb);
4905 }else if(ENABLE_MJPEG_ENCODER && s->out_format == FMT_MJPEG){
4906 ff_mjpeg_encode_stuffing(&s->pb);
4909 align_put_bits(&s->pb);
4910 flush_put_bits(&s->pb);
4912 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4913 s->misc_bits+= get_bits_diff(s);
4916 static int encode_thread(AVCodecContext *c, void *arg){
4917 MpegEncContext *s= arg;
4918 int mb_x, mb_y, pdif = 0;
4920 MpegEncContext best_s, backup_s;
4921 uint8_t bit_buf[2][MAX_MB_BYTES];
4922 uint8_t bit_buf2[2][MAX_MB_BYTES];
4923 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4924 PutBitContext pb[2], pb2[2], tex_pb[2];
4925 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4927 ff_check_alignment();
4930 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4931 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4932 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4935 s->last_bits= put_bits_count(&s->pb);
4946 /* init last dc values */
4947 /* note: quant matrix value (8) is implied here */
4948 s->last_dc[i] = 128 << s->intra_dc_precision;
4950 s->current_picture.error[i] = 0;
4953 memset(s->last_mv, 0, sizeof(s->last_mv));
4957 switch(s->codec_id){
4959 case CODEC_ID_H263P:
4961 s->gob_index = ff_h263_get_gob_height(s);
4963 case CODEC_ID_MPEG4:
4964 if(s->partitioned_frame)
4965 ff_mpeg4_init_partitions(s);
4971 s->first_slice_line = 1;
4972 s->ptr_lastgob = s->pb.buf;
4973 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4974 // printf("row %d at %X\n", s->mb_y, (int)s);
4978 ff_set_qscale(s, s->qscale);
4979 ff_init_block_index(s);
4981 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4982 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4983 int mb_type= s->mb_type[xy];
4988 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4989 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4992 if(s->data_partitioning){
4993 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4994 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4995 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
5001 s->mb_y = mb_y; // moved into loop, can get changed by H.261
5002 ff_update_block_index(s);
5004 if(ENABLE_H261_ENCODER && s->codec_id == CODEC_ID_H261){
5005 ff_h261_reorder_mb_index(s);
5006 xy= s->mb_y*s->mb_stride + s->mb_x;
5007 mb_type= s->mb_type[xy];
5010 /* write gob / video packet header */
5012 int current_packet_size, is_gob_start;
5014 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
5016 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
5018 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
5020 switch(s->codec_id){
5022 case CODEC_ID_H263P:
5023 if(!s->h263_slice_structured)
5024 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
5026 case CODEC_ID_MPEG2VIDEO:
5027 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
5028 case CODEC_ID_MPEG1VIDEO:
5029 if(s->mb_skip_run) is_gob_start=0;
5034 if(s->start_mb_y != mb_y || mb_x!=0){
5037 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
5038 ff_mpeg4_init_partitions(s);
5042 assert((put_bits_count(&s->pb)&7) == 0);
5043 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
5045 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
5046 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
5047 int d= 100 / s->avctx->error_rate;
5049 current_packet_size=0;
5050 #ifndef ALT_BITSTREAM_WRITER
5051 s->pb.buf_ptr= s->ptr_lastgob;
5053 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
5057 if (s->avctx->rtp_callback){
5058 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
5059 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
5062 switch(s->codec_id){
5063 case CODEC_ID_MPEG4:
5064 ff_mpeg4_encode_video_packet_header(s);
5065 ff_mpeg4_clean_buffers(s);
5067 case CODEC_ID_MPEG1VIDEO:
5068 case CODEC_ID_MPEG2VIDEO:
5069 ff_mpeg1_encode_slice_header(s);
5070 ff_mpeg1_clean_buffers(s);
5073 case CODEC_ID_H263P:
5074 h263_encode_gob_header(s, mb_y);
5078 if(s->flags&CODEC_FLAG_PASS1){
5079 int bits= put_bits_count(&s->pb);
5080 s->misc_bits+= bits - s->last_bits;
5084 s->ptr_lastgob += current_packet_size;
5085 s->first_slice_line=1;
5086 s->resync_mb_x=mb_x;
5087 s->resync_mb_y=mb_y;
5091 if( (s->resync_mb_x == s->mb_x)
5092 && s->resync_mb_y+1 == s->mb_y){
5093 s->first_slice_line=0;
5097 s->dquant=0; //only for QP_RD
5099 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
5101 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
5103 copy_context_before_encode(&backup_s, s, -1);
5105 best_s.data_partitioning= s->data_partitioning;
5106 best_s.partitioned_frame= s->partitioned_frame;
5107 if(s->data_partitioning){
5108 backup_s.pb2= s->pb2;
5109 backup_s.tex_pb= s->tex_pb;
5112 if(mb_type&CANDIDATE_MB_TYPE_INTER){
5113 s->mv_dir = MV_DIR_FORWARD;
5114 s->mv_type = MV_TYPE_16X16;
5116 s->mv[0][0][0] = s->p_mv_table[xy][0];
5117 s->mv[0][0][1] = s->p_mv_table[xy][1];
5118 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
5119 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5121 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
5122 s->mv_dir = MV_DIR_FORWARD;
5123 s->mv_type = MV_TYPE_FIELD;
5126 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5127 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5128 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5130 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
5131 &dmin, &next_block, 0, 0);
5133 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
5134 s->mv_dir = MV_DIR_FORWARD;
5135 s->mv_type = MV_TYPE_16X16;
5139 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
5140 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5142 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
5143 s->mv_dir = MV_DIR_FORWARD;
5144 s->mv_type = MV_TYPE_8X8;
5147 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5148 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5150 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
5151 &dmin, &next_block, 0, 0);
5153 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
5154 s->mv_dir = MV_DIR_FORWARD;
5155 s->mv_type = MV_TYPE_16X16;
5157 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5158 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5159 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
5160 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5162 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
5163 s->mv_dir = MV_DIR_BACKWARD;
5164 s->mv_type = MV_TYPE_16X16;
5166 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5167 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5168 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
5169 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
5171 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
5172 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5173 s->mv_type = MV_TYPE_16X16;
5175 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5176 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5177 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5178 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5179 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
5180 &dmin, &next_block, 0, 0);
5182 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
5183 s->mv_dir = MV_DIR_FORWARD;
5184 s->mv_type = MV_TYPE_FIELD;
5187 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5188 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5189 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5191 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
5192 &dmin, &next_block, 0, 0);
5194 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
5195 s->mv_dir = MV_DIR_BACKWARD;
5196 s->mv_type = MV_TYPE_FIELD;
5199 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5200 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5201 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5203 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
5204 &dmin, &next_block, 0, 0);
5206 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
5207 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5208 s->mv_type = MV_TYPE_FIELD;
5210 for(dir=0; dir<2; dir++){
5212 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5213 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5214 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5217 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
5218 &dmin, &next_block, 0, 0);
5220 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
5222 s->mv_type = MV_TYPE_16X16;
5226 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
5227 &dmin, &next_block, 0, 0);
5228 if(s->h263_pred || s->h263_aic){
5230 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
5232 ff_clean_intra_table_entries(s); //old mode?
5236 if((s->flags & CODEC_FLAG_QP_RD) && dmin < INT_MAX){
5237 if(best_s.mv_type==MV_TYPE_16X16){ //FIXME move 4mv after QPRD
5238 const int last_qp= backup_s.qscale;
5241 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
5242 static const int dquant_tab[4]={-1,1,-2,2};
5244 assert(backup_s.dquant == 0);
5247 s->mv_dir= best_s.mv_dir;
5248 s->mv_type = MV_TYPE_16X16;
5249 s->mb_intra= best_s.mb_intra;
5250 s->mv[0][0][0] = best_s.mv[0][0][0];
5251 s->mv[0][0][1] = best_s.mv[0][0][1];
5252 s->mv[1][0][0] = best_s.mv[1][0][0];
5253 s->mv[1][0][1] = best_s.mv[1][0][1];
5255 qpi = s->pict_type == B_TYPE ? 2 : 0;
5256 for(; qpi<4; qpi++){
5257 int dquant= dquant_tab[qpi];
5258 qp= last_qp + dquant;
5259 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
5261 backup_s.dquant= dquant;
5262 if(s->mb_intra && s->dc_val[0]){
5264 dc[i]= s->dc_val[0][ s->block_index[i] ];
5265 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
5269 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
5270 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
5271 if(best_s.qscale != qp){
5272 if(s->mb_intra && s->dc_val[0]){
5274 s->dc_val[0][ s->block_index[i] ]= dc[i];
5275 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
5282 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
5283 int mx= s->b_direct_mv_table[xy][0];
5284 int my= s->b_direct_mv_table[xy][1];
5286 backup_s.dquant = 0;
5287 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5289 ff_mpeg4_set_direct_mv(s, mx, my);
5290 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
5291 &dmin, &next_block, mx, my);
5293 if(mb_type&CANDIDATE_MB_TYPE_DIRECT0){
5294 backup_s.dquant = 0;
5295 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5297 ff_mpeg4_set_direct_mv(s, 0, 0);
5298 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
5299 &dmin, &next_block, 0, 0);
5301 if(!best_s.mb_intra && s->flags2&CODEC_FLAG2_SKIP_RD){
5304 coded |= s->block_last_index[i];
5307 memcpy(s->mv, best_s.mv, sizeof(s->mv));
5308 if(best_s.mv_dir & MV_DIRECT){
5309 mx=my=0; //FIXME find the one we actually used
5310 ff_mpeg4_set_direct_mv(s, mx, my);
5311 }else if(best_s.mv_dir&MV_DIR_BACKWARD){
5319 s->mv_dir= best_s.mv_dir;
5320 s->mv_type = best_s.mv_type;
5322 /* s->mv[0][0][0] = best_s.mv[0][0][0];
5323 s->mv[0][0][1] = best_s.mv[0][0][1];
5324 s->mv[1][0][0] = best_s.mv[1][0][0];
5325 s->mv[1][0][1] = best_s.mv[1][0][1];*/
5328 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
5329 &dmin, &next_block, mx, my);
5334 s->current_picture.qscale_table[xy]= best_s.qscale;
5336 copy_context_after_encode(s, &best_s, -1);
5338 pb_bits_count= put_bits_count(&s->pb);
5339 flush_put_bits(&s->pb);
5340 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
5343 if(s->data_partitioning){
5344 pb2_bits_count= put_bits_count(&s->pb2);
5345 flush_put_bits(&s->pb2);
5346 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5347 s->pb2= backup_s.pb2;
5349 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5350 flush_put_bits(&s->tex_pb);
5351 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5352 s->tex_pb= backup_s.tex_pb;
5354 s->last_bits= put_bits_count(&s->pb);
5356 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5357 ff_h263_update_motion_val(s);
5359 if(next_block==0){ //FIXME 16 vs linesize16
5360 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5361 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5362 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5365 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5366 MPV_decode_mb(s, s->block);
5368 int motion_x = 0, motion_y = 0;
5369 s->mv_type=MV_TYPE_16X16;
5370 // only one MB-Type possible
5373 case CANDIDATE_MB_TYPE_INTRA:
5376 motion_x= s->mv[0][0][0] = 0;
5377 motion_y= s->mv[0][0][1] = 0;
5379 case CANDIDATE_MB_TYPE_INTER:
5380 s->mv_dir = MV_DIR_FORWARD;
5382 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5383 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5385 case CANDIDATE_MB_TYPE_INTER_I:
5386 s->mv_dir = MV_DIR_FORWARD;
5387 s->mv_type = MV_TYPE_FIELD;
5390 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5391 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5392 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5395 case CANDIDATE_MB_TYPE_INTER4V:
5396 s->mv_dir = MV_DIR_FORWARD;
5397 s->mv_type = MV_TYPE_8X8;
5400 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5401 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5404 case CANDIDATE_MB_TYPE_DIRECT:
5405 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5407 motion_x=s->b_direct_mv_table[xy][0];
5408 motion_y=s->b_direct_mv_table[xy][1];
5409 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5411 case CANDIDATE_MB_TYPE_DIRECT0:
5412 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5414 ff_mpeg4_set_direct_mv(s, 0, 0);
5416 case CANDIDATE_MB_TYPE_BIDIR:
5417 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5419 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5420 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5421 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5422 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5424 case CANDIDATE_MB_TYPE_BACKWARD:
5425 s->mv_dir = MV_DIR_BACKWARD;
5427 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5428 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5430 case CANDIDATE_MB_TYPE_FORWARD:
5431 s->mv_dir = MV_DIR_FORWARD;
5433 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5434 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5435 // printf(" %d %d ", motion_x, motion_y);
5437 case CANDIDATE_MB_TYPE_FORWARD_I:
5438 s->mv_dir = MV_DIR_FORWARD;
5439 s->mv_type = MV_TYPE_FIELD;
5442 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5443 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5444 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5447 case CANDIDATE_MB_TYPE_BACKWARD_I:
5448 s->mv_dir = MV_DIR_BACKWARD;
5449 s->mv_type = MV_TYPE_FIELD;
5452 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5453 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5454 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5457 case CANDIDATE_MB_TYPE_BIDIR_I:
5458 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5459 s->mv_type = MV_TYPE_FIELD;
5461 for(dir=0; dir<2; dir++){
5463 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5464 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5465 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5470 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5473 encode_mb(s, motion_x, motion_y);
5475 // RAL: Update last macroblock type
5476 s->last_mv_dir = s->mv_dir;
5478 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5479 ff_h263_update_motion_val(s);
5481 MPV_decode_mb(s, s->block);
5484 /* clean the MV table in IPS frames for direct mode in B frames */
5485 if(s->mb_intra /* && I,P,S_TYPE */){
5486 s->p_mv_table[xy][0]=0;
5487 s->p_mv_table[xy][1]=0;
5490 if(s->flags&CODEC_FLAG_PSNR){
5494 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5495 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5497 s->current_picture.error[0] += sse(
5498 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5499 s->dest[0], w, h, s->linesize);
5500 s->current_picture.error[1] += sse(
5501 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5502 s->dest[1], w>>1, h>>1, s->uvlinesize);
5503 s->current_picture.error[2] += sse(
5504 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5505 s->dest[2], w>>1, h>>1, s->uvlinesize);
5508 if(s->out_format == FMT_H263)
5509 ff_h263_loop_filter(s);
5511 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5515 //not beautiful here but we must write it before flushing so it has to be here
5516 if (ENABLE_MSMPEG4_ENCODER && s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5517 msmpeg4_encode_ext_header(s);
5521 /* Send the last GOB if RTP */
5522 if (s->avctx->rtp_callback) {
5523 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5524 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5525 /* Call the RTP callback to send the last GOB */
5527 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5533 #define MERGE(field) dst->field += src->field; src->field=0
5534 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5535 MERGE(me.scene_change_score);
5536 MERGE(me.mc_mb_var_sum_temp);
5537 MERGE(me.mb_var_sum_temp);
5540 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5543 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5544 MERGE(dct_count[1]);
5554 MERGE(padding_bug_score);
5555 MERGE(current_picture.error[0]);
5556 MERGE(current_picture.error[1]);
5557 MERGE(current_picture.error[2]);
5559 if(dst->avctx->noise_reduction){
5560 for(i=0; i<64; i++){
5561 MERGE(dct_error_sum[0][i]);
5562 MERGE(dct_error_sum[1][i]);
5566 assert(put_bits_count(&src->pb) % 8 ==0);
5567 assert(put_bits_count(&dst->pb) % 8 ==0);
5568 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5569 flush_put_bits(&dst->pb);
5572 static int estimate_qp(MpegEncContext *s, int dry_run){
5573 if (s->next_lambda){
5574 s->current_picture_ptr->quality=
5575 s->current_picture.quality = s->next_lambda;
5576 if(!dry_run) s->next_lambda= 0;
5577 } else if (!s->fixed_qscale) {
5578 s->current_picture_ptr->quality=
5579 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
5580 if (s->current_picture.quality < 0)
5584 if(s->adaptive_quant){
5585 switch(s->codec_id){
5586 case CODEC_ID_MPEG4:
5587 ff_clean_mpeg4_qscales(s);
5590 case CODEC_ID_H263P:
5592 ff_clean_h263_qscales(s);
5596 s->lambda= s->lambda_table[0];
5599 s->lambda= s->current_picture.quality;
5600 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5605 static int encode_picture(MpegEncContext *s, int picture_number)
5610 s->picture_number = picture_number;
5612 /* Reset the average MB variance */
5613 s->me.mb_var_sum_temp =
5614 s->me.mc_mb_var_sum_temp = 0;
5616 /* we need to initialize some time vars before we can encode b-frames */
5617 // RAL: Condition added for MPEG1VIDEO
5618 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5619 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5621 s->me.scene_change_score=0;
5623 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5625 if(s->pict_type==I_TYPE){
5626 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5627 else s->no_rounding=0;
5628 }else if(s->pict_type!=B_TYPE){
5629 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5630 s->no_rounding ^= 1;
5633 if(s->flags & CODEC_FLAG_PASS2){
5634 if (estimate_qp(s,1) < 0)
5636 ff_get_2pass_fcode(s);
5637 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
5638 if(s->pict_type==B_TYPE)
5639 s->lambda= s->last_lambda_for[s->pict_type];
5641 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
5645 s->mb_intra=0; //for the rate distortion & bit compare functions
5646 for(i=1; i<s->avctx->thread_count; i++){
5647 ff_update_duplicate_context(s->thread_context[i], s);
5652 /* Estimate motion for every MB */
5653 if(s->pict_type != I_TYPE){
5654 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5655 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
5656 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5657 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5658 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5662 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5663 }else /* if(s->pict_type == I_TYPE) */{
5665 for(i=0; i<s->mb_stride*s->mb_height; i++)
5666 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5668 if(!s->fixed_qscale){
5669 /* finding spatial complexity for I-frame rate control */
5670 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5673 for(i=1; i<s->avctx->thread_count; i++){
5674 merge_context_after_me(s, s->thread_context[i]);
5676 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5677 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5680 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5681 s->pict_type= I_TYPE;
5682 for(i=0; i<s->mb_stride*s->mb_height; i++)
5683 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5684 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5688 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5689 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5691 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5693 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5694 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5695 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5698 ff_fix_long_p_mvs(s);
5699 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5700 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5704 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5705 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5710 if(s->pict_type==B_TYPE){
5713 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5714 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5715 s->f_code = FFMAX(a, b);
5717 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5718 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5719 s->b_code = FFMAX(a, b);
5721 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5722 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5723 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5724 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5725 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5727 for(dir=0; dir<2; dir++){
5730 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5731 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5732 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5733 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5741 if (estimate_qp(s, 0) < 0)
5744 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5745 s->qscale= 3; //reduce clipping problems
5747 if (s->out_format == FMT_MJPEG) {
5748 /* for mjpeg, we do include qscale in the matrix */
5749 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5751 int j= s->dsp.idct_permutation[i];
5753 s->intra_matrix[j] = av_clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5755 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5756 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5760 //FIXME var duplication
5761 s->current_picture_ptr->key_frame=
5762 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5763 s->current_picture_ptr->pict_type=
5764 s->current_picture.pict_type= s->pict_type;
5766 if(s->current_picture.key_frame)
5767 s->picture_in_gop_number=0;
5769 s->last_bits= put_bits_count(&s->pb);
5770 switch(s->out_format) {
5772 if (ENABLE_MJPEG_ENCODER)
5773 ff_mjpeg_encode_picture_header(s);
5776 if (ENABLE_H261_ENCODER)
5777 ff_h261_encode_picture_header(s, picture_number);
5780 if (ENABLE_WMV2_ENCODER && s->codec_id == CODEC_ID_WMV2)
5781 ff_wmv2_encode_picture_header(s, picture_number);
5782 else if (ENABLE_MSMPEG4_ENCODER && s->h263_msmpeg4)
5783 msmpeg4_encode_picture_header(s, picture_number);
5784 else if (s->h263_pred)
5785 mpeg4_encode_picture_header(s, picture_number);
5786 else if (ENABLE_RV10_ENCODER && s->codec_id == CODEC_ID_RV10)
5787 rv10_encode_picture_header(s, picture_number);
5788 else if (ENABLE_RV20_ENCODER && s->codec_id == CODEC_ID_RV20)
5789 rv20_encode_picture_header(s, picture_number);
5790 else if (s->codec_id == CODEC_ID_FLV1)
5791 ff_flv_encode_picture_header(s, picture_number);
5793 h263_encode_picture_header(s, picture_number);
5796 mpeg1_encode_picture_header(s, picture_number);
5803 bits= put_bits_count(&s->pb);
5804 s->header_bits= bits - s->last_bits;
5806 for(i=1; i<s->avctx->thread_count; i++){
5807 update_duplicate_context_after_me(s->thread_context[i], s);
5809 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5810 for(i=1; i<s->avctx->thread_count; i++){
5811 merge_context_after_encode(s, s->thread_context[i]);
5817 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5818 const int intra= s->mb_intra;
5821 s->dct_count[intra]++;
5823 for(i=0; i<64; i++){
5824 int level= block[i];
5828 s->dct_error_sum[intra][i] += level;
5829 level -= s->dct_offset[intra][i];
5830 if(level<0) level=0;
5832 s->dct_error_sum[intra][i] -= level;
5833 level += s->dct_offset[intra][i];
5834 if(level>0) level=0;
5841 static int dct_quantize_trellis_c(MpegEncContext *s,
5842 DCTELEM *block, int n,
5843 int qscale, int *overflow){
5845 const uint8_t *scantable= s->intra_scantable.scantable;
5846 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5848 unsigned int threshold1, threshold2;
5860 int coeff_count[64];
5861 int qmul, qadd, start_i, last_non_zero, i, dc;
5862 const int esc_length= s->ac_esc_length;
5864 uint8_t * last_length;
5865 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5867 s->dsp.fdct (block);
5869 if(s->dct_error_sum)
5870 s->denoise_dct(s, block);
5872 qadd= ((qscale-1)|1)*8;
5883 /* For AIC we skip quant/dequant of INTRADC */
5888 /* note: block[0] is assumed to be positive */
5889 block[0] = (block[0] + (q >> 1)) / q;
5892 qmat = s->q_intra_matrix[qscale];
5893 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5894 bias= 1<<(QMAT_SHIFT-1);
5895 length = s->intra_ac_vlc_length;
5896 last_length= s->intra_ac_vlc_last_length;
5900 qmat = s->q_inter_matrix[qscale];
5901 length = s->inter_ac_vlc_length;
5902 last_length= s->inter_ac_vlc_last_length;
5906 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5907 threshold2= (threshold1<<1);
5909 for(i=63; i>=start_i; i--) {
5910 const int j = scantable[i];
5911 int level = block[j] * qmat[j];
5913 if(((unsigned)(level+threshold1))>threshold2){
5919 for(i=start_i; i<=last_non_zero; i++) {
5920 const int j = scantable[i];
5921 int level = block[j] * qmat[j];
5923 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5924 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5925 if(((unsigned)(level+threshold1))>threshold2){
5927 level= (bias + level)>>QMAT_SHIFT;
5929 coeff[1][i]= level-1;
5930 // coeff[2][k]= level-2;
5932 level= (bias - level)>>QMAT_SHIFT;
5933 coeff[0][i]= -level;
5934 coeff[1][i]= -level+1;
5935 // coeff[2][k]= -level+2;
5937 coeff_count[i]= FFMIN(level, 2);
5938 assert(coeff_count[i]);
5941 coeff[0][i]= (level>>31)|1;
5946 *overflow= s->max_qcoeff < max; //overflow might have happened
5948 if(last_non_zero < start_i){
5949 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5950 return last_non_zero;
5953 score_tab[start_i]= 0;
5954 survivor[0]= start_i;
5957 for(i=start_i; i<=last_non_zero; i++){
5959 const int dct_coeff= FFABS(block[ scantable[i] ]);
5960 const int zero_distoration= dct_coeff*dct_coeff;
5961 int best_score=256*256*256*120;
5962 for(level_index=0; level_index < coeff_count[i]; level_index++){
5964 int level= coeff[level_index][i];
5965 const int alevel= FFABS(level);
5970 if(s->out_format == FMT_H263){
5971 unquant_coeff= alevel*qmul + qadd;
5973 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5975 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5976 unquant_coeff = (unquant_coeff - 1) | 1;
5978 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5979 unquant_coeff = (unquant_coeff - 1) | 1;
5984 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5986 if((level&(~127)) == 0){
5987 for(j=survivor_count-1; j>=0; j--){
5988 int run= i - survivor[j];
5989 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5990 score += score_tab[i-run];
5992 if(score < best_score){
5995 level_tab[i+1]= level-64;
5999 if(s->out_format == FMT_H263){
6000 for(j=survivor_count-1; j>=0; j--){
6001 int run= i - survivor[j];
6002 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
6003 score += score_tab[i-run];
6004 if(score < last_score){
6007 last_level= level-64;
6013 distoration += esc_length*lambda;
6014 for(j=survivor_count-1; j>=0; j--){
6015 int run= i - survivor[j];
6016 int score= distoration + score_tab[i-run];
6018 if(score < best_score){
6021 level_tab[i+1]= level-64;
6025 if(s->out_format == FMT_H263){
6026 for(j=survivor_count-1; j>=0; j--){
6027 int run= i - survivor[j];
6028 int score= distoration + score_tab[i-run];
6029 if(score < last_score){
6032 last_level= level-64;
6040 score_tab[i+1]= best_score;
6042 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
6043 if(last_non_zero <= 27){
6044 for(; survivor_count; survivor_count--){
6045 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
6049 for(; survivor_count; survivor_count--){
6050 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
6055 survivor[ survivor_count++ ]= i+1;
6058 if(s->out_format != FMT_H263){
6059 last_score= 256*256*256*120;
6060 for(i= survivor[0]; i<=last_non_zero + 1; i++){
6061 int score= score_tab[i];
6062 if(i) score += lambda*2; //FIXME exacter?
6064 if(score < last_score){
6067 last_level= level_tab[i];
6068 last_run= run_tab[i];
6073 s->coded_score[n] = last_score;
6075 dc= FFABS(block[0]);
6076 last_non_zero= last_i - 1;
6077 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
6079 if(last_non_zero < start_i)
6080 return last_non_zero;
6082 if(last_non_zero == 0 && start_i == 0){
6084 int best_score= dc * dc;
6086 for(i=0; i<coeff_count[0]; i++){
6087 int level= coeff[i][0];
6088 int alevel= FFABS(level);
6089 int unquant_coeff, score, distortion;
6091 if(s->out_format == FMT_H263){
6092 unquant_coeff= (alevel*qmul + qadd)>>3;
6094 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
6095 unquant_coeff = (unquant_coeff - 1) | 1;
6097 unquant_coeff = (unquant_coeff + 4) >> 3;
6098 unquant_coeff<<= 3 + 3;
6100 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
6102 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
6103 else score= distortion + esc_length*lambda;
6105 if(score < best_score){
6107 best_level= level - 64;
6110 block[0]= best_level;
6111 s->coded_score[n] = best_score - dc*dc;
6112 if(best_level == 0) return -1;
6113 else return last_non_zero;
6119 block[ perm_scantable[last_non_zero] ]= last_level;
6122 for(; i>start_i; i -= run_tab[i] + 1){
6123 block[ perm_scantable[i-1] ]= level_tab[i];
6126 return last_non_zero;
6129 //#define REFINE_STATS 1
6130 static int16_t basis[64][64];
6132 static void build_basis(uint8_t *perm){
6139 double s= 0.25*(1<<BASIS_SHIFT);
6141 int perm_index= perm[index];
6142 if(i==0) s*= sqrt(0.5);
6143 if(j==0) s*= sqrt(0.5);
6144 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)));
6151 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
6152 DCTELEM *block, int16_t *weight, DCTELEM *orig,
6155 DECLARE_ALIGNED_16(DCTELEM, d1[64]);
6157 const uint8_t *scantable= s->intra_scantable.scantable;
6158 const uint8_t *perm_scantable= s->intra_scantable.permutated;
6159 // unsigned int threshold1, threshold2;
6164 int qmul, qadd, start_i, last_non_zero, i, dc;
6166 uint8_t * last_length;
6168 int rle_index, run, q = 1, sum; //q is only used when s->mb_intra is true
6171 static int after_last=0;
6172 static int to_zero=0;
6173 static int from_zero=0;
6176 static int messed_sign=0;
6179 if(basis[0][0] == 0)
6180 build_basis(s->dsp.idct_permutation);
6191 /* For AIC we skip quant/dequant of INTRADC */
6195 q <<= RECON_SHIFT-3;
6196 /* note: block[0] is assumed to be positive */
6198 // block[0] = (block[0] + (q >> 1)) / q;
6200 qmat = s->q_intra_matrix[qscale];
6201 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
6202 // bias= 1<<(QMAT_SHIFT-1);
6203 length = s->intra_ac_vlc_length;
6204 last_length= s->intra_ac_vlc_last_length;
6208 qmat = s->q_inter_matrix[qscale];
6209 length = s->inter_ac_vlc_length;
6210 last_length= s->inter_ac_vlc_last_length;
6212 last_non_zero = s->block_last_index[n];
6217 dc += (1<<(RECON_SHIFT-1));
6218 for(i=0; i<64; i++){
6219 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
6222 STOP_TIMER("memset rem[]")}
6225 for(i=0; i<64; i++){
6230 w= FFABS(weight[i]) + qns*one;
6231 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
6234 // w=weight[i] = (63*qns + (w/2)) / w;
6240 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
6246 for(i=start_i; i<=last_non_zero; i++){
6247 int j= perm_scantable[i];
6248 const int level= block[j];
6252 if(level<0) coeff= qmul*level - qadd;
6253 else coeff= qmul*level + qadd;
6254 run_tab[rle_index++]=run;
6257 s->dsp.add_8x8basis(rem, basis[j], coeff);
6263 if(last_non_zero>0){
6264 STOP_TIMER("init rem[]")
6271 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
6274 int run2, best_unquant_change=0, analyze_gradient;
6278 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
6280 if(analyze_gradient){
6284 for(i=0; i<64; i++){
6287 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
6290 STOP_TIMER("rem*w*w")}
6300 const int level= block[0];
6301 int change, old_coeff;
6303 assert(s->mb_intra);
6307 for(change=-1; change<=1; change+=2){
6308 int new_level= level + change;
6309 int score, new_coeff;
6311 new_coeff= q*new_level;
6312 if(new_coeff >= 2048 || new_coeff < 0)
6315 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
6316 if(score<best_score){
6319 best_change= change;
6320 best_unquant_change= new_coeff - old_coeff;
6327 run2= run_tab[rle_index++];
6331 for(i=start_i; i<64; i++){
6332 int j= perm_scantable[i];
6333 const int level= block[j];
6334 int change, old_coeff;
6336 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
6340 if(level<0) old_coeff= qmul*level - qadd;
6341 else old_coeff= qmul*level + qadd;
6342 run2= run_tab[rle_index++]; //FIXME ! maybe after last
6346 assert(run2>=0 || i >= last_non_zero );
6349 for(change=-1; change<=1; change+=2){
6350 int new_level= level + change;
6351 int score, new_coeff, unquant_change;
6354 if(s->avctx->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
6358 if(new_level<0) new_coeff= qmul*new_level - qadd;
6359 else new_coeff= qmul*new_level + qadd;
6360 if(new_coeff >= 2048 || new_coeff <= -2048)
6362 //FIXME check for overflow
6365 if(level < 63 && level > -63){
6366 if(i < last_non_zero)
6367 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6368 - length[UNI_AC_ENC_INDEX(run, level+64)];
6370 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6371 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6374 assert(FFABS(new_level)==1);
6376 if(analyze_gradient){
6377 int g= d1[ scantable[i] ];
6378 if(g && (g^new_level) >= 0)
6382 if(i < last_non_zero){
6383 int next_i= i + run2 + 1;
6384 int next_level= block[ perm_scantable[next_i] ] + 64;
6386 if(next_level&(~127))
6389 if(next_i < last_non_zero)
6390 score += length[UNI_AC_ENC_INDEX(run, 65)]
6391 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6392 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6394 score += length[UNI_AC_ENC_INDEX(run, 65)]
6395 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6396 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6398 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6400 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6401 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6407 assert(FFABS(level)==1);
6409 if(i < last_non_zero){
6410 int next_i= i + run2 + 1;
6411 int next_level= block[ perm_scantable[next_i] ] + 64;
6413 if(next_level&(~127))
6416 if(next_i < last_non_zero)
6417 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6418 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6419 - length[UNI_AC_ENC_INDEX(run, 65)];
6421 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6422 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6423 - length[UNI_AC_ENC_INDEX(run, 65)];
6425 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6427 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6428 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6435 unquant_change= new_coeff - old_coeff;
6436 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6438 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6439 if(score<best_score){
6442 best_change= change;
6443 best_unquant_change= unquant_change;
6447 prev_level= level + 64;
6448 if(prev_level&(~127))
6457 STOP_TIMER("iterative step")}
6461 int j= perm_scantable[ best_coeff ];
6463 block[j] += best_change;
6465 if(best_coeff > last_non_zero){
6466 last_non_zero= best_coeff;
6474 if(block[j] - best_change){
6475 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
6487 for(; last_non_zero>=start_i; last_non_zero--){
6488 if(block[perm_scantable[last_non_zero]])
6494 if(256*256*256*64 % count == 0){
6495 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);
6500 for(i=start_i; i<=last_non_zero; i++){
6501 int j= perm_scantable[i];
6502 const int level= block[j];
6505 run_tab[rle_index++]=run;
6512 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6518 if(last_non_zero>0){
6519 STOP_TIMER("iterative search")
6524 return last_non_zero;
6527 static int dct_quantize_c(MpegEncContext *s,
6528 DCTELEM *block, int n,
6529 int qscale, int *overflow)
6531 int i, j, level, last_non_zero, q, start_i;
6533 const uint8_t *scantable= s->intra_scantable.scantable;
6536 unsigned int threshold1, threshold2;
6538 s->dsp.fdct (block);
6540 if(s->dct_error_sum)
6541 s->denoise_dct(s, block);
6551 /* For AIC we skip quant/dequant of INTRADC */
6554 /* note: block[0] is assumed to be positive */
6555 block[0] = (block[0] + (q >> 1)) / q;
6558 qmat = s->q_intra_matrix[qscale];
6559 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6563 qmat = s->q_inter_matrix[qscale];
6564 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6566 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6567 threshold2= (threshold1<<1);
6568 for(i=63;i>=start_i;i--) {
6570 level = block[j] * qmat[j];
6572 if(((unsigned)(level+threshold1))>threshold2){
6579 for(i=start_i; i<=last_non_zero; i++) {
6581 level = block[j] * qmat[j];
6583 // if( bias+level >= (1<<QMAT_SHIFT)
6584 // || bias-level >= (1<<QMAT_SHIFT)){
6585 if(((unsigned)(level+threshold1))>threshold2){
6587 level= (bias + level)>>QMAT_SHIFT;
6590 level= (bias - level)>>QMAT_SHIFT;
6598 *overflow= s->max_qcoeff < max; //overflow might have happened
6600 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6601 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6602 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6604 return last_non_zero;
6607 #endif //CONFIG_ENCODERS
6609 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6610 DCTELEM *block, int n, int qscale)
6612 int i, level, nCoeffs;
6613 const uint16_t *quant_matrix;
6615 nCoeffs= s->block_last_index[n];
6618 block[0] = block[0] * s->y_dc_scale;
6620 block[0] = block[0] * s->c_dc_scale;
6621 /* XXX: only mpeg1 */
6622 quant_matrix = s->intra_matrix;
6623 for(i=1;i<=nCoeffs;i++) {
6624 int j= s->intra_scantable.permutated[i];
6629 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6630 level = (level - 1) | 1;
6633 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6634 level = (level - 1) | 1;
6641 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6642 DCTELEM *block, int n, int qscale)
6644 int i, level, nCoeffs;
6645 const uint16_t *quant_matrix;
6647 nCoeffs= s->block_last_index[n];
6649 quant_matrix = s->inter_matrix;
6650 for(i=0; i<=nCoeffs; i++) {
6651 int j= s->intra_scantable.permutated[i];
6656 level = (((level << 1) + 1) * qscale *
6657 ((int) (quant_matrix[j]))) >> 4;
6658 level = (level - 1) | 1;
6661 level = (((level << 1) + 1) * qscale *
6662 ((int) (quant_matrix[j]))) >> 4;
6663 level = (level - 1) | 1;
6670 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6671 DCTELEM *block, int n, int qscale)
6673 int i, level, nCoeffs;
6674 const uint16_t *quant_matrix;
6676 if(s->alternate_scan) nCoeffs= 63;
6677 else nCoeffs= s->block_last_index[n];
6680 block[0] = block[0] * s->y_dc_scale;
6682 block[0] = block[0] * s->c_dc_scale;
6683 quant_matrix = s->intra_matrix;
6684 for(i=1;i<=nCoeffs;i++) {
6685 int j= s->intra_scantable.permutated[i];
6690 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6693 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6700 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
6701 DCTELEM *block, int n, int qscale)
6703 int i, level, nCoeffs;
6704 const uint16_t *quant_matrix;
6707 if(s->alternate_scan) nCoeffs= 63;
6708 else nCoeffs= s->block_last_index[n];
6711 block[0] = block[0] * s->y_dc_scale;
6713 block[0] = block[0] * s->c_dc_scale;
6714 quant_matrix = s->intra_matrix;
6715 for(i=1;i<=nCoeffs;i++) {
6716 int j= s->intra_scantable.permutated[i];
6721 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6724 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6733 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6734 DCTELEM *block, int n, int qscale)
6736 int i, level, nCoeffs;
6737 const uint16_t *quant_matrix;
6740 if(s->alternate_scan) nCoeffs= 63;
6741 else nCoeffs= s->block_last_index[n];
6743 quant_matrix = s->inter_matrix;
6744 for(i=0; i<=nCoeffs; i++) {
6745 int j= s->intra_scantable.permutated[i];
6750 level = (((level << 1) + 1) * qscale *
6751 ((int) (quant_matrix[j]))) >> 4;
6754 level = (((level << 1) + 1) * qscale *
6755 ((int) (quant_matrix[j]))) >> 4;
6764 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6765 DCTELEM *block, int n, int qscale)
6767 int i, level, qmul, qadd;
6770 assert(s->block_last_index[n]>=0);
6776 block[0] = block[0] * s->y_dc_scale;
6778 block[0] = block[0] * s->c_dc_scale;
6779 qadd = (qscale - 1) | 1;
6786 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6788 for(i=1; i<=nCoeffs; i++) {
6792 level = level * qmul - qadd;
6794 level = level * qmul + qadd;
6801 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6802 DCTELEM *block, int n, int qscale)
6804 int i, level, qmul, qadd;
6807 assert(s->block_last_index[n]>=0);
6809 qadd = (qscale - 1) | 1;
6812 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6814 for(i=0; i<=nCoeffs; i++) {
6818 level = level * qmul - qadd;
6820 level = level * qmul + qadd;
6827 #ifdef CONFIG_ENCODERS
6828 AVCodec h263_encoder = {
6832 sizeof(MpegEncContext),
6836 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6839 AVCodec h263p_encoder = {
6843 sizeof(MpegEncContext),
6847 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6850 AVCodec flv_encoder = {
6854 sizeof(MpegEncContext),
6858 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6861 AVCodec rv10_encoder = {
6865 sizeof(MpegEncContext),
6869 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6872 AVCodec rv20_encoder = {
6876 sizeof(MpegEncContext),
6880 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6883 AVCodec mpeg4_encoder = {
6887 sizeof(MpegEncContext),
6891 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6892 .capabilities= CODEC_CAP_DELAY,
6895 AVCodec msmpeg4v1_encoder = {
6899 sizeof(MpegEncContext),
6903 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6906 AVCodec msmpeg4v2_encoder = {
6910 sizeof(MpegEncContext),
6914 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6917 AVCodec msmpeg4v3_encoder = {
6921 sizeof(MpegEncContext),
6925 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6928 AVCodec wmv1_encoder = {
6932 sizeof(MpegEncContext),
6936 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6939 #endif //CONFIG_ENCODERS