2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
35 #include "libvo/fastmemcpy.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_MV*2+1]=NULL;
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_t_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_t_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_t_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 then %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= 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){
628 MPV_common_defaults(s);
634 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
635 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
637 for(i=-16; i<16; i++){
638 default_fcode_tab[i + MAX_MV]= 1;
641 s->me.mv_penalty= default_mv_penalty;
642 s->fcode_tab= default_fcode_tab;
644 #endif //CONFIG_ENCODERS
647 * init common structure for both encoder and decoder.
648 * this assumes that some variables like width/height are already set
650 int MPV_common_init(MpegEncContext *s)
652 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
654 s->mb_height = (s->height + 15) / 16;
656 if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
657 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
661 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
664 dsputil_init(&s->dsp, s->avctx);
667 s->flags= s->avctx->flags;
668 s->flags2= s->avctx->flags2;
670 s->mb_width = (s->width + 15) / 16;
671 s->mb_stride = s->mb_width + 1;
672 s->b8_stride = s->mb_width*2 + 1;
673 s->b4_stride = s->mb_width*4 + 1;
674 mb_array_size= s->mb_height * s->mb_stride;
675 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
677 /* set chroma shifts */
678 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
679 &(s->chroma_y_shift) );
681 /* set default edge pos, will be overriden in decode_header if needed */
682 s->h_edge_pos= s->mb_width*16;
683 s->v_edge_pos= s->mb_height*16;
685 s->mb_num = s->mb_width * s->mb_height;
690 s->block_wrap[3]= s->b8_stride;
692 s->block_wrap[5]= s->mb_stride;
694 y_size = s->b8_stride * (2 * s->mb_height + 1);
695 c_size = s->mb_stride * (s->mb_height + 1);
696 yc_size = y_size + 2 * c_size;
698 /* convert fourcc to upper case */
699 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
700 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
701 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
702 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
704 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
705 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
706 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
707 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
709 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
711 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
712 for(y=0; y<s->mb_height; y++){
713 for(x=0; x<s->mb_width; x++){
714 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
717 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
720 /* Allocate MV tables */
721 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
722 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
723 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
724 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
725 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
726 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
727 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
728 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
729 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
730 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
731 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
732 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
734 if(s->msmpeg4_version){
735 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
737 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
739 /* Allocate MB type table */
740 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
742 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
744 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
745 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
746 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
747 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
748 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
749 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
751 if(s->avctx->noise_reduction){
752 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
755 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
757 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
759 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
760 /* interlaced direct mode decoding tables */
765 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
766 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
768 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
769 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
770 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
772 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
775 if (s->out_format == FMT_H263) {
777 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
778 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
779 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
780 s->ac_val[2] = s->ac_val[1] + c_size;
783 CHECKED_ALLOCZ(s->coded_block_base, y_size);
784 s->coded_block= s->coded_block_base + s->b8_stride + 1;
786 /* cbp, ac_pred, pred_dir */
787 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
788 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
791 if (s->h263_pred || s->h263_plus || !s->encoding) {
793 //MN: we need these for error resilience of intra-frames
794 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
795 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
796 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
797 s->dc_val[2] = s->dc_val[1] + c_size;
798 for(i=0;i<yc_size;i++)
799 s->dc_val_base[i] = 1024;
802 /* which mb is a intra block */
803 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
804 memset(s->mbintra_table, 1, mb_array_size);
806 /* init macroblock skip table */
807 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
808 //Note the +1 is for a quicker mpeg4 slice_end detection
809 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
811 s->parse_context.state= -1;
812 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
813 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
814 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
815 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
818 s->context_initialized = 1;
820 s->thread_context[0]= s;
821 for(i=1; i<s->avctx->thread_count; i++){
822 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
823 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
826 for(i=0; i<s->avctx->thread_count; i++){
827 if(init_duplicate_context(s->thread_context[i], s) < 0)
829 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
830 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
839 /* init common structure for both encoder and decoder */
840 void MPV_common_end(MpegEncContext *s)
844 for(i=0; i<s->avctx->thread_count; i++){
845 free_duplicate_context(s->thread_context[i]);
847 for(i=1; i<s->avctx->thread_count; i++){
848 av_freep(&s->thread_context[i]);
851 av_freep(&s->parse_context.buffer);
852 s->parse_context.buffer_size=0;
854 av_freep(&s->mb_type);
855 av_freep(&s->p_mv_table_base);
856 av_freep(&s->b_forw_mv_table_base);
857 av_freep(&s->b_back_mv_table_base);
858 av_freep(&s->b_bidir_forw_mv_table_base);
859 av_freep(&s->b_bidir_back_mv_table_base);
860 av_freep(&s->b_direct_mv_table_base);
862 s->b_forw_mv_table= NULL;
863 s->b_back_mv_table= NULL;
864 s->b_bidir_forw_mv_table= NULL;
865 s->b_bidir_back_mv_table= NULL;
866 s->b_direct_mv_table= NULL;
870 av_freep(&s->b_field_mv_table_base[i][j][k]);
871 s->b_field_mv_table[i][j][k]=NULL;
873 av_freep(&s->b_field_select_table[i][j]);
874 av_freep(&s->p_field_mv_table_base[i][j]);
875 s->p_field_mv_table[i][j]=NULL;
877 av_freep(&s->p_field_select_table[i]);
880 av_freep(&s->dc_val_base);
881 av_freep(&s->ac_val_base);
882 av_freep(&s->coded_block_base);
883 av_freep(&s->mbintra_table);
884 av_freep(&s->cbp_table);
885 av_freep(&s->pred_dir_table);
887 av_freep(&s->mbskip_table);
888 av_freep(&s->prev_pict_types);
889 av_freep(&s->bitstream_buffer);
890 s->allocated_bitstream_buffer_size=0;
892 av_freep(&s->avctx->stats_out);
893 av_freep(&s->ac_stats);
894 av_freep(&s->error_status_table);
895 av_freep(&s->mb_index2xy);
896 av_freep(&s->lambda_table);
897 av_freep(&s->q_intra_matrix);
898 av_freep(&s->q_inter_matrix);
899 av_freep(&s->q_intra_matrix16);
900 av_freep(&s->q_inter_matrix16);
901 av_freep(&s->input_picture);
902 av_freep(&s->reordered_input_picture);
903 av_freep(&s->dct_offset);
906 for(i=0; i<MAX_PICTURE_COUNT; i++){
907 free_picture(s, &s->picture[i]);
910 av_freep(&s->picture);
911 s->context_initialized = 0;
914 s->current_picture_ptr= NULL;
915 s->linesize= s->uvlinesize= 0;
918 av_freep(&s->visualization_buffer[i]);
920 avcodec_default_free_buffers(s->avctx);
923 #ifdef CONFIG_ENCODERS
925 /* init video encoder */
926 int MPV_encode_init(AVCodecContext *avctx)
928 MpegEncContext *s = avctx->priv_data;
930 int chroma_h_shift, chroma_v_shift;
932 MPV_encode_defaults(s);
934 switch (avctx->codec_id) {
935 case CODEC_ID_MPEG2VIDEO:
936 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P){
937 av_log(avctx, AV_LOG_ERROR, "only YUV420 and YUV422 are supported\n");
943 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P &&
944 ((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P) || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
945 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
950 if(avctx->pix_fmt != PIX_FMT_YUV420P){
951 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
956 switch (avctx->pix_fmt) {
957 case PIX_FMT_YUVJ422P:
958 case PIX_FMT_YUV422P:
959 s->chroma_format = CHROMA_422;
961 case PIX_FMT_YUVJ420P:
962 case PIX_FMT_YUV420P:
964 s->chroma_format = CHROMA_420;
968 s->bit_rate = avctx->bit_rate;
969 s->width = avctx->width;
970 s->height = avctx->height;
971 if(avctx->gop_size > 600 && avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){
972 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
975 s->gop_size = avctx->gop_size;
977 s->flags= avctx->flags;
978 s->flags2= avctx->flags2;
979 s->max_b_frames= avctx->max_b_frames;
980 s->codec_id= avctx->codec->id;
981 s->luma_elim_threshold = avctx->luma_elim_threshold;
982 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
983 s->strict_std_compliance= avctx->strict_std_compliance;
984 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
985 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
986 s->mpeg_quant= avctx->mpeg_quant;
987 s->rtp_mode= !!avctx->rtp_payload_size;
988 s->intra_dc_precision= avctx->intra_dc_precision;
989 s->user_specified_pts = AV_NOPTS_VALUE;
991 if (s->gop_size <= 1) {
998 s->me_method = avctx->me_method;
1001 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
1003 s->adaptive_quant= ( s->avctx->lumi_masking
1004 || s->avctx->dark_masking
1005 || s->avctx->temporal_cplx_masking
1006 || s->avctx->spatial_cplx_masking
1007 || s->avctx->p_masking
1008 || s->avctx->border_masking
1009 || (s->flags&CODEC_FLAG_QP_RD))
1010 && !s->fixed_qscale;
1012 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
1013 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
1014 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
1015 s->intra_vlc_format= !!(s->flags2 & CODEC_FLAG2_INTRA_VLC);
1017 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
1018 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
1022 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
1023 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
1026 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
1027 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
1031 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
1032 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
1036 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
1037 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
1038 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
1040 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");
1043 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
1044 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
1045 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
1049 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
1050 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
1054 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
1055 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
1059 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1060 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1064 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1065 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1069 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1070 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1074 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1075 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1076 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1080 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1081 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
1085 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1086 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1090 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1091 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1095 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1096 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1100 if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){
1101 av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n");
1105 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1106 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1107 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1108 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1112 if(s->avctx->thread_count > 1)
1115 if(!avctx->time_base.den || !avctx->time_base.num){
1116 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
1120 i= (INT_MAX/2+128)>>8;
1121 if(avctx->me_threshold >= i){
1122 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
1125 if(avctx->mb_threshold >= i){
1126 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
1130 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){
1131 av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n");
1132 avctx->b_frame_strategy = 0;
1135 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
1137 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1138 avctx->time_base.den /= i;
1139 avctx->time_base.num /= i;
1143 if(s->codec_id==CODEC_ID_MJPEG){
1144 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1145 s->inter_quant_bias= 0;
1146 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1147 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1148 s->inter_quant_bias= 0;
1150 s->intra_quant_bias=0;
1151 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1154 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1155 s->intra_quant_bias= avctx->intra_quant_bias;
1156 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1157 s->inter_quant_bias= avctx->inter_quant_bias;
1159 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1161 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
1162 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
1165 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1167 switch(avctx->codec->id) {
1168 case CODEC_ID_MPEG1VIDEO:
1169 s->out_format = FMT_MPEG1;
1170 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1171 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1173 case CODEC_ID_MPEG2VIDEO:
1174 s->out_format = FMT_MPEG1;
1175 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1176 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1179 case CODEC_ID_LJPEG:
1180 case CODEC_ID_JPEGLS:
1181 case CODEC_ID_MJPEG:
1182 s->out_format = FMT_MJPEG;
1183 s->intra_only = 1; /* force intra only for jpeg */
1184 s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;
1185 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1186 s->mjpeg_vsample[0] = 2;
1187 s->mjpeg_vsample[1] = 2>>chroma_v_shift;
1188 s->mjpeg_vsample[2] = 2>>chroma_v_shift;
1189 s->mjpeg_hsample[0] = 2;
1190 s->mjpeg_hsample[1] = 2>>chroma_h_shift;
1191 s->mjpeg_hsample[2] = 2>>chroma_h_shift;
1192 if (mjpeg_init(s) < 0)
1198 s->out_format = FMT_H261;
1203 if (h263_get_picture_format(s->width, s->height) == 7) {
1204 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);
1207 s->out_format = FMT_H263;
1208 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1212 case CODEC_ID_H263P:
1213 s->out_format = FMT_H263;
1216 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1217 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1218 s->modified_quant= s->h263_aic;
1219 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1220 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1221 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1222 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1223 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1226 /* These are just to be sure */
1231 s->out_format = FMT_H263;
1232 s->h263_flv = 2; /* format = 1; 11-bit codes */
1233 s->unrestricted_mv = 1;
1234 s->rtp_mode=0; /* don't allow GOB */
1239 s->out_format = FMT_H263;
1244 s->out_format = FMT_H263;
1247 s->modified_quant=1;
1251 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1253 case CODEC_ID_MPEG4:
1254 s->out_format = FMT_H263;
1256 s->unrestricted_mv = 1;
1257 s->low_delay= s->max_b_frames ? 0 : 1;
1258 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1260 case CODEC_ID_MSMPEG4V1:
1261 s->out_format = FMT_H263;
1262 s->h263_msmpeg4 = 1;
1264 s->unrestricted_mv = 1;
1265 s->msmpeg4_version= 1;
1269 case CODEC_ID_MSMPEG4V2:
1270 s->out_format = FMT_H263;
1271 s->h263_msmpeg4 = 1;
1273 s->unrestricted_mv = 1;
1274 s->msmpeg4_version= 2;
1278 case CODEC_ID_MSMPEG4V3:
1279 s->out_format = FMT_H263;
1280 s->h263_msmpeg4 = 1;
1282 s->unrestricted_mv = 1;
1283 s->msmpeg4_version= 3;
1284 s->flipflop_rounding=1;
1289 s->out_format = FMT_H263;
1290 s->h263_msmpeg4 = 1;
1292 s->unrestricted_mv = 1;
1293 s->msmpeg4_version= 4;
1294 s->flipflop_rounding=1;
1299 s->out_format = FMT_H263;
1300 s->h263_msmpeg4 = 1;
1302 s->unrestricted_mv = 1;
1303 s->msmpeg4_version= 5;
1304 s->flipflop_rounding=1;
1312 avctx->has_b_frames= !s->low_delay;
1317 if (MPV_common_init(s) < 0)
1320 if(s->modified_quant)
1321 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1322 s->progressive_frame=
1323 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1324 s->quant_precision=5;
1326 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1327 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1329 #ifdef CONFIG_H261_ENCODER
1330 if (s->out_format == FMT_H261)
1331 ff_h261_encode_init(s);
1333 if (s->out_format == FMT_H263)
1334 h263_encode_init(s);
1335 if(s->msmpeg4_version)
1336 ff_msmpeg4_encode_init(s);
1337 if (s->out_format == FMT_MPEG1)
1338 ff_mpeg1_encode_init(s);
1342 int j= s->dsp.idct_permutation[i];
1343 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1344 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1345 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1346 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1347 s->intra_matrix[j] =
1348 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1351 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1352 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1354 if(s->avctx->intra_matrix)
1355 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1356 if(s->avctx->inter_matrix)
1357 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1360 /* precompute matrix */
1361 /* for mjpeg, we do include qscale in the matrix */
1362 if (s->out_format != FMT_MJPEG) {
1363 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1364 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1365 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1366 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1369 if(ff_rate_control_init(s) < 0)
1375 int MPV_encode_end(AVCodecContext *avctx)
1377 MpegEncContext *s = avctx->priv_data;
1379 ff_rate_control_uninit(s);
1382 if (s->out_format == FMT_MJPEG)
1385 av_freep(&avctx->extradata);
1390 #endif //CONFIG_ENCODERS
1392 void init_rl(RLTable *rl, int use_static)
1394 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1395 uint8_t index_run[MAX_RUN+1];
1396 int last, run, level, start, end, i;
1398 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1399 if(use_static && rl->max_level[0])
1402 /* compute max_level[], max_run[] and index_run[] */
1403 for(last=0;last<2;last++) {
1412 memset(max_level, 0, MAX_RUN + 1);
1413 memset(max_run, 0, MAX_LEVEL + 1);
1414 memset(index_run, rl->n, MAX_RUN + 1);
1415 for(i=start;i<end;i++) {
1416 run = rl->table_run[i];
1417 level = rl->table_level[i];
1418 if (index_run[run] == rl->n)
1420 if (level > max_level[run])
1421 max_level[run] = level;
1422 if (run > max_run[level])
1423 max_run[level] = run;
1426 rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
1428 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1429 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1431 rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
1433 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1434 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1436 rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
1438 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1439 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1443 /* draw the edges of width 'w' of an image of size width, height */
1444 //FIXME check that this is ok for mpeg4 interlaced
1445 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1447 uint8_t *ptr, *last_line;
1450 last_line = buf + (height - 1) * wrap;
1452 /* top and bottom */
1453 memcpy(buf - (i + 1) * wrap, buf, width);
1454 memcpy(last_line + (i + 1) * wrap, last_line, width);
1456 /* left and right */
1458 for(i=0;i<height;i++) {
1459 memset(ptr - w, ptr[0], w);
1460 memset(ptr + width, ptr[width-1], w);
1465 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1466 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1467 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1468 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1472 int ff_find_unused_picture(MpegEncContext *s, int shared){
1476 for(i=0; i<MAX_PICTURE_COUNT; i++){
1477 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1480 for(i=0; i<MAX_PICTURE_COUNT; i++){
1481 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1483 for(i=0; i<MAX_PICTURE_COUNT; i++){
1484 if(s->picture[i].data[0]==NULL) return i;
1492 static void update_noise_reduction(MpegEncContext *s){
1495 for(intra=0; intra<2; intra++){
1496 if(s->dct_count[intra] > (1<<16)){
1497 for(i=0; i<64; i++){
1498 s->dct_error_sum[intra][i] >>=1;
1500 s->dct_count[intra] >>= 1;
1503 for(i=0; i<64; i++){
1504 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);
1510 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1512 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1518 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1520 /* mark&release old frames */
1521 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1522 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1524 /* release forgotten pictures */
1525 /* if(mpeg124/h263) */
1527 for(i=0; i<MAX_PICTURE_COUNT; i++){
1528 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1529 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1530 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1537 /* release non reference frames */
1538 for(i=0; i<MAX_PICTURE_COUNT; i++){
1539 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1540 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1544 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1545 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1547 i= ff_find_unused_picture(s, 0);
1548 pic= (AVFrame*)&s->picture[i];
1551 pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
1552 && !s->dropable ? 3 : 0;
1554 pic->coded_picture_number= s->coded_picture_number++;
1556 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1559 s->current_picture_ptr= (Picture*)pic;
1560 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1561 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1564 s->current_picture_ptr->pict_type= s->pict_type;
1565 // if(s->flags && CODEC_FLAG_QSCALE)
1566 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1567 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1569 copy_picture(&s->current_picture, s->current_picture_ptr);
1571 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1572 if (s->pict_type != B_TYPE) {
1573 s->last_picture_ptr= s->next_picture_ptr;
1575 s->next_picture_ptr= s->current_picture_ptr;
1577 /* 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,
1578 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1579 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1580 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1581 s->pict_type, s->dropable);*/
1583 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1584 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1586 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1587 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1588 assert(s->pict_type != B_TYPE); //these should have been dropped if we don't have a reference
1592 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1594 if(s->picture_structure!=PICT_FRAME){
1597 if(s->picture_structure == PICT_BOTTOM_FIELD){
1598 s->current_picture.data[i] += s->current_picture.linesize[i];
1600 s->current_picture.linesize[i] *= 2;
1601 s->last_picture.linesize[i] *=2;
1602 s->next_picture.linesize[i] *=2;
1607 s->hurry_up= s->avctx->hurry_up;
1608 s->error_resilience= avctx->error_resilience;
1610 /* set dequantizer, we can't do it during init as it might change for mpeg4
1611 and we can't do it in the header decode as init isnt called for mpeg4 there yet */
1612 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1613 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1614 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1615 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1616 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1617 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1619 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1620 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1623 if(s->dct_error_sum){
1624 assert(s->avctx->noise_reduction && s->encoding);
1626 update_noise_reduction(s);
1630 if(s->avctx->xvmc_acceleration)
1631 return XVMC_field_start(s, avctx);
1636 /* generic function for encode/decode called after a frame has been coded/decoded */
1637 void MPV_frame_end(MpegEncContext *s)
1640 /* draw edge for correct motion prediction if outside */
1642 //just to make sure that all data is rendered.
1643 if(s->avctx->xvmc_acceleration){
1647 if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1648 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1649 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1650 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1654 s->last_pict_type = s->pict_type;
1655 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1656 if(s->pict_type!=B_TYPE){
1657 s->last_non_b_pict_type= s->pict_type;
1660 /* copy back current_picture variables */
1661 for(i=0; i<MAX_PICTURE_COUNT; i++){
1662 if(s->picture[i].data[0] == s->current_picture.data[0]){
1663 s->picture[i]= s->current_picture;
1667 assert(i<MAX_PICTURE_COUNT);
1671 /* release non-reference frames */
1672 for(i=0; i<MAX_PICTURE_COUNT; i++){
1673 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1674 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1678 // clear copies, to avoid confusion
1680 memset(&s->last_picture, 0, sizeof(Picture));
1681 memset(&s->next_picture, 0, sizeof(Picture));
1682 memset(&s->current_picture, 0, sizeof(Picture));
1684 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1688 * draws an line from (ex, ey) -> (sx, sy).
1689 * @param w width of the image
1690 * @param h height of the image
1691 * @param stride stride/linesize of the image
1692 * @param color color of the arrow
1694 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1697 sx= clip(sx, 0, w-1);
1698 sy= clip(sy, 0, h-1);
1699 ex= clip(ex, 0, w-1);
1700 ey= clip(ey, 0, h-1);
1702 buf[sy*stride + sx]+= color;
1704 if(ABS(ex - sx) > ABS(ey - sy)){
1709 buf+= sx + sy*stride;
1711 f= ((ey-sy)<<16)/ex;
1712 for(x= 0; x <= ex; x++){
1715 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1716 buf[(y+1)*stride + x]+= (color* fr )>>16;
1723 buf+= sx + sy*stride;
1725 if(ey) f= ((ex-sx)<<16)/ey;
1727 for(y= 0; y <= ey; y++){
1730 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1731 buf[y*stride + x+1]+= (color* fr )>>16;;
1737 * draws an arrow from (ex, ey) -> (sx, sy).
1738 * @param w width of the image
1739 * @param h height of the image
1740 * @param stride stride/linesize of the image
1741 * @param color color of the arrow
1743 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1746 sx= clip(sx, -100, w+100);
1747 sy= clip(sy, -100, h+100);
1748 ex= clip(ex, -100, w+100);
1749 ey= clip(ey, -100, h+100);
1754 if(dx*dx + dy*dy > 3*3){
1757 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1759 //FIXME subpixel accuracy
1760 rx= ROUNDED_DIV(rx*3<<4, length);
1761 ry= ROUNDED_DIV(ry*3<<4, length);
1763 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1764 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1766 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1770 * prints debuging info for the given picture.
1772 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1774 if(!pict || !pict->mb_type) return;
1776 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1779 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1780 switch (pict->pict_type) {
1781 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1782 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1783 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1784 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1785 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1786 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1788 for(y=0; y<s->mb_height; y++){
1789 for(x=0; x<s->mb_width; x++){
1790 if(s->avctx->debug&FF_DEBUG_SKIP){
1791 int count= s->mbskip_table[x + y*s->mb_stride];
1792 if(count>9) count=9;
1793 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1795 if(s->avctx->debug&FF_DEBUG_QP){
1796 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1798 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1799 int mb_type= pict->mb_type[x + y*s->mb_stride];
1800 //Type & MV direction
1802 av_log(s->avctx, AV_LOG_DEBUG, "P");
1803 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1804 av_log(s->avctx, AV_LOG_DEBUG, "A");
1805 else if(IS_INTRA4x4(mb_type))
1806 av_log(s->avctx, AV_LOG_DEBUG, "i");
1807 else if(IS_INTRA16x16(mb_type))
1808 av_log(s->avctx, AV_LOG_DEBUG, "I");
1809 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1810 av_log(s->avctx, AV_LOG_DEBUG, "d");
1811 else if(IS_DIRECT(mb_type))
1812 av_log(s->avctx, AV_LOG_DEBUG, "D");
1813 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1814 av_log(s->avctx, AV_LOG_DEBUG, "g");
1815 else if(IS_GMC(mb_type))
1816 av_log(s->avctx, AV_LOG_DEBUG, "G");
1817 else if(IS_SKIP(mb_type))
1818 av_log(s->avctx, AV_LOG_DEBUG, "S");
1819 else if(!USES_LIST(mb_type, 1))
1820 av_log(s->avctx, AV_LOG_DEBUG, ">");
1821 else if(!USES_LIST(mb_type, 0))
1822 av_log(s->avctx, AV_LOG_DEBUG, "<");
1824 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1825 av_log(s->avctx, AV_LOG_DEBUG, "X");
1830 av_log(s->avctx, AV_LOG_DEBUG, "+");
1831 else if(IS_16X8(mb_type))
1832 av_log(s->avctx, AV_LOG_DEBUG, "-");
1833 else if(IS_8X16(mb_type))
1834 av_log(s->avctx, AV_LOG_DEBUG, "|");
1835 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1836 av_log(s->avctx, AV_LOG_DEBUG, " ");
1838 av_log(s->avctx, AV_LOG_DEBUG, "?");
1841 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1842 av_log(s->avctx, AV_LOG_DEBUG, "=");
1844 av_log(s->avctx, AV_LOG_DEBUG, " ");
1846 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1848 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1852 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1853 const int shift= 1 + s->quarter_sample;
1857 int h_chroma_shift, v_chroma_shift;
1858 const int width = s->avctx->width;
1859 const int height= s->avctx->height;
1860 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1861 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1862 s->low_delay=0; //needed to see the vectors without trashing the buffers
1864 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1866 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1867 pict->data[i]= s->visualization_buffer[i];
1869 pict->type= FF_BUFFER_TYPE_COPY;
1872 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1874 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1875 const int mb_index= mb_x + mb_y*s->mb_stride;
1876 if((s->avctx->debug_mv) && pict->motion_val){
1878 for(type=0; type<3; type++){
1881 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1885 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1889 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1894 if(!USES_LIST(pict->mb_type[mb_index], direction))
1897 if(IS_8X8(pict->mb_type[mb_index])){
1900 int sx= mb_x*16 + 4 + 8*(i&1);
1901 int sy= mb_y*16 + 4 + 8*(i>>1);
1902 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1903 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1904 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1905 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1907 }else if(IS_16X8(pict->mb_type[mb_index])){
1911 int sy=mb_y*16 + 4 + 8*i;
1912 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1913 int mx=(pict->motion_val[direction][xy][0]>>shift);
1914 int my=(pict->motion_val[direction][xy][1]>>shift);
1916 if(IS_INTERLACED(pict->mb_type[mb_index]))
1919 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1921 }else if(IS_8X16(pict->mb_type[mb_index])){
1924 int sx=mb_x*16 + 4 + 8*i;
1926 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1927 int mx=(pict->motion_val[direction][xy][0]>>shift);
1928 int my=(pict->motion_val[direction][xy][1]>>shift);
1930 if(IS_INTERLACED(pict->mb_type[mb_index]))
1933 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1936 int sx= mb_x*16 + 8;
1937 int sy= mb_y*16 + 8;
1938 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1939 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1940 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1941 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1945 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1946 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1949 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1950 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1953 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1954 int mb_type= pict->mb_type[mb_index];
1957 #define COLOR(theta, r)\
1958 u= (int)(128 + r*cos(theta*3.141592/180));\
1959 v= (int)(128 + r*sin(theta*3.141592/180));
1963 if(IS_PCM(mb_type)){
1965 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1967 }else if(IS_INTRA4x4(mb_type)){
1969 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1971 }else if(IS_DIRECT(mb_type)){
1973 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1975 }else if(IS_GMC(mb_type)){
1977 }else if(IS_SKIP(mb_type)){
1979 }else if(!USES_LIST(mb_type, 1)){
1981 }else if(!USES_LIST(mb_type, 0)){
1984 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1988 u*= 0x0101010101010101ULL;
1989 v*= 0x0101010101010101ULL;
1991 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1992 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1996 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1997 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1998 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
2000 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
2002 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
2004 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
2005 int dm= 1 << (mv_sample_log2-2);
2007 int sx= mb_x*16 + 8*(i&1);
2008 int sy= mb_y*16 + 8*(i>>1);
2009 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
2011 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
2012 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
2014 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
2015 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
2016 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
2020 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
2024 s->mbskip_table[mb_index]=0;
2030 #ifdef CONFIG_ENCODERS
2032 static int get_sae(uint8_t *src, int ref, int stride){
2036 for(y=0; y<16; y++){
2037 for(x=0; x<16; x++){
2038 acc+= ABS(src[x+y*stride] - ref);
2045 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
2052 for(y=0; y<h; y+=16){
2053 for(x=0; x<w; x+=16){
2054 int offset= x + y*stride;
2055 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
2056 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
2057 int sae = get_sae(src + offset, mean, stride);
2059 acc+= sae + 500 < sad;
2066 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2070 const int encoding_delay= s->max_b_frames;
2075 pic_arg->display_picture_number= s->input_picture_number++;
2077 if(pts != AV_NOPTS_VALUE){
2078 if(s->user_specified_pts != AV_NOPTS_VALUE){
2080 int64_t last= s->user_specified_pts;
2083 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
2087 s->user_specified_pts= pts;
2089 if(s->user_specified_pts != AV_NOPTS_VALUE){
2090 s->user_specified_pts=
2091 pts= s->user_specified_pts + 1;
2092 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
2094 pts= pic_arg->display_picture_number;
2100 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2101 if(pic_arg->linesize[0] != s->linesize) direct=0;
2102 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2103 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2105 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2108 i= ff_find_unused_picture(s, 1);
2110 pic= (AVFrame*)&s->picture[i];
2114 pic->data[i]= pic_arg->data[i];
2115 pic->linesize[i]= pic_arg->linesize[i];
2117 alloc_picture(s, (Picture*)pic, 1);
2119 i= ff_find_unused_picture(s, 0);
2121 pic= (AVFrame*)&s->picture[i];
2124 alloc_picture(s, (Picture*)pic, 0);
2126 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0]
2127 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1]
2128 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){
2131 int h_chroma_shift, v_chroma_shift;
2132 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2135 int src_stride= pic_arg->linesize[i];
2136 int dst_stride= i ? s->uvlinesize : s->linesize;
2137 int h_shift= i ? h_chroma_shift : 0;
2138 int v_shift= i ? v_chroma_shift : 0;
2139 int w= s->width >>h_shift;
2140 int h= s->height>>v_shift;
2141 uint8_t *src= pic_arg->data[i];
2142 uint8_t *dst= pic->data[i];
2144 if(!s->avctx->rc_buffer_size)
2145 dst +=INPLACE_OFFSET;
2147 if(src_stride==dst_stride)
2148 memcpy(dst, src, src_stride*h);
2151 memcpy(dst, src, w);
2159 copy_picture_attributes(s, pic, pic_arg);
2160 pic->pts= pts; //we set this here to avoid modifiying pic_arg
2163 /* shift buffer entries */
2164 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2165 s->input_picture[i-1]= s->input_picture[i];
2167 s->input_picture[encoding_delay]= (Picture*)pic;
2172 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2177 for(plane=0; plane<3; plane++){
2178 const int stride= p->linesize[plane];
2179 const int bw= plane ? 1 : 2;
2180 for(y=0; y<s->mb_height*bw; y++){
2181 for(x=0; x<s->mb_width*bw; x++){
2182 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16;
2183 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);
2185 switch(s->avctx->frame_skip_exp){
2186 case 0: score= FFMAX(score, v); break;
2187 case 1: score+= ABS(v);break;
2188 case 2: score+= v*v;break;
2189 case 3: score64+= ABS(v*v*(int64_t)v);break;
2190 case 4: score64+= v*v*(int64_t)(v*v);break;
2196 if(score) score64= score;
2198 if(score64 < s->avctx->frame_skip_threshold)
2200 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2205 static int estimate_best_b_count(MpegEncContext *s){
2206 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id);
2207 AVCodecContext *c= avcodec_alloc_context();
2208 AVFrame input[FF_MAX_B_FRAMES+2];
2209 const int scale= s->avctx->brd_scale;
2210 int i, j, out_size, p_lambda, b_lambda, lambda2;
2211 int outbuf_size= s->width * s->height; //FIXME
2212 uint8_t *outbuf= av_malloc(outbuf_size);
2213 int64_t best_rd= INT64_MAX;
2214 int best_b_count= -1;
2216 assert(scale>=0 && scale <=3);
2219 p_lambda= s->last_lambda_for[P_TYPE]; //s->next_picture_ptr->quality;
2220 b_lambda= s->last_lambda_for[B_TYPE]; //p_lambda *ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
2221 if(!b_lambda) b_lambda= p_lambda; //FIXME we should do this somewhere else
2222 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT;
2224 c->width = s->width >> scale;
2225 c->height= s->height>> scale;
2226 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
2227 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL;
2228 c->mb_decision= s->avctx->mb_decision;
2229 c->me_cmp= s->avctx->me_cmp;
2230 c->mb_cmp= s->avctx->mb_cmp;
2231 c->me_sub_cmp= s->avctx->me_sub_cmp;
2232 c->pix_fmt = PIX_FMT_YUV420P;
2233 c->time_base= s->avctx->time_base;
2234 c->max_b_frames= s->max_b_frames;
2236 if (avcodec_open(c, codec) < 0)
2239 for(i=0; i<s->max_b_frames+2; i++){
2240 int ysize= c->width*c->height;
2241 int csize= (c->width/2)*(c->height/2);
2242 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr;
2245 pre_input= *pre_input_ptr;
2247 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i){
2248 pre_input.data[0]+=INPLACE_OFFSET;
2249 pre_input.data[1]+=INPLACE_OFFSET;
2250 pre_input.data[2]+=INPLACE_OFFSET;
2253 avcodec_get_frame_defaults(&input[i]);
2254 input[i].data[0]= av_malloc(ysize + 2*csize);
2255 input[i].data[1]= input[i].data[0] + ysize;
2256 input[i].data[2]= input[i].data[1] + csize;
2257 input[i].linesize[0]= c->width;
2258 input[i].linesize[1]=
2259 input[i].linesize[2]= c->width/2;
2261 if(!i || s->input_picture[i-1]){
2262 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0], pre_input.data[0], pre_input.linesize[0], c->width, c->height);
2263 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);
2264 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);
2268 for(j=0; j<s->max_b_frames+1; j++){
2271 if(!s->input_picture[j])
2274 c->error[0]= c->error[1]= c->error[2]= 0;
2276 input[0].pict_type= I_TYPE;
2277 input[0].quality= 1 * FF_QP2LAMBDA;
2278 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]);
2279 // rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
2281 for(i=0; i<s->max_b_frames+1; i++){
2282 int is_p= i % (j+1) == j || i==s->max_b_frames;
2284 input[i+1].pict_type= is_p ? P_TYPE : B_TYPE;
2285 input[i+1].quality= is_p ? p_lambda : b_lambda;
2286 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]);
2287 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2290 /* get the delayed frames */
2292 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
2293 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2296 rd += c->error[0] + c->error[1] + c->error[2];
2308 for(i=0; i<s->max_b_frames+2; i++){
2309 av_freep(&input[i].data[0]);
2312 return best_b_count;
2315 static void select_input_picture(MpegEncContext *s){
2318 for(i=1; i<MAX_PICTURE_COUNT; i++)
2319 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2320 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2322 /* set next picture type & ordering */
2323 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2324 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2325 s->reordered_input_picture[0]= s->input_picture[0];
2326 s->reordered_input_picture[0]->pict_type= I_TYPE;
2327 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2331 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2332 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2333 //FIXME check that te gop check above is +-1 correct
2334 //av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2336 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2338 s->input_picture[0]->data[i]= NULL;
2339 s->input_picture[0]->type= 0;
2341 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2342 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2344 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2348 ff_vbv_update(s, 0);
2354 if(s->flags&CODEC_FLAG_PASS2){
2355 for(i=0; i<s->max_b_frames+1; i++){
2356 int pict_num= s->input_picture[0]->display_picture_number + i;
2358 if(pict_num >= s->rc_context.num_entries)
2360 if(!s->input_picture[i]){
2361 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2365 s->input_picture[i]->pict_type=
2366 s->rc_context.entry[pict_num].new_pict_type;
2370 if(s->avctx->b_frame_strategy==0){
2371 b_frames= s->max_b_frames;
2372 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2373 }else if(s->avctx->b_frame_strategy==1){
2374 for(i=1; i<s->max_b_frames+1; i++){
2375 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2376 s->input_picture[i]->b_frame_score=
2377 get_intra_count(s, s->input_picture[i ]->data[0],
2378 s->input_picture[i-1]->data[0], s->linesize) + 1;
2381 for(i=0; i<s->max_b_frames+1; i++){
2382 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/s->avctx->b_sensitivity) break;
2385 b_frames= FFMAX(0, i-1);
2388 for(i=0; i<b_frames+1; i++){
2389 s->input_picture[i]->b_frame_score=0;
2391 }else if(s->avctx->b_frame_strategy==2){
2392 b_frames= estimate_best_b_count(s);
2394 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2399 //static int b_count=0;
2400 //b_count+= b_frames;
2401 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2403 for(i= b_frames - 1; i>=0; i--){
2404 int type= s->input_picture[i]->pict_type;
2405 if(type && type != B_TYPE)
2408 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2409 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2412 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2413 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2414 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2416 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2418 s->input_picture[b_frames]->pict_type= I_TYPE;
2422 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2424 && s->input_picture[b_frames]->pict_type== I_TYPE)
2427 s->reordered_input_picture[0]= s->input_picture[b_frames];
2428 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2429 s->reordered_input_picture[0]->pict_type= P_TYPE;
2430 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2431 for(i=0; i<b_frames; i++){
2432 s->reordered_input_picture[i+1]= s->input_picture[i];
2433 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2434 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2439 if(s->reordered_input_picture[0]){
2440 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2442 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2444 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED || s->avctx->rc_buffer_size){
2445 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable
2447 int i= ff_find_unused_picture(s, 0);
2448 Picture *pic= &s->picture[i];
2450 pic->reference = s->reordered_input_picture[0]->reference;
2451 alloc_picture(s, pic, 0);
2453 /* mark us unused / free shared pic */
2454 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_INTERNAL)
2455 s->avctx->release_buffer(s->avctx, (AVFrame*)s->reordered_input_picture[0]);
2457 s->reordered_input_picture[0]->data[i]= NULL;
2458 s->reordered_input_picture[0]->type= 0;
2460 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2462 s->current_picture_ptr= pic;
2464 // input is not a shared pix -> reuse buffer for current_pix
2466 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2467 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2469 s->current_picture_ptr= s->reordered_input_picture[0];
2471 s->new_picture.data[i]+= INPLACE_OFFSET;
2474 copy_picture(&s->current_picture, s->current_picture_ptr);
2476 s->picture_number= s->new_picture.display_picture_number;
2477 //printf("dpn:%d\n", s->picture_number);
2479 memset(&s->new_picture, 0, sizeof(Picture));
2483 int MPV_encode_picture(AVCodecContext *avctx,
2484 unsigned char *buf, int buf_size, void *data)
2486 MpegEncContext *s = avctx->priv_data;
2487 AVFrame *pic_arg = data;
2488 int i, stuffing_count;
2490 for(i=0; i<avctx->thread_count; i++){
2491 int start_y= s->thread_context[i]->start_mb_y;
2492 int end_y= s->thread_context[i]-> end_mb_y;
2493 int h= s->mb_height;
2494 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
2495 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
2497 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2500 s->picture_in_gop_number++;
2502 if(load_input_picture(s, pic_arg) < 0)
2505 select_input_picture(s);
2508 if(s->new_picture.data[0]){
2509 s->pict_type= s->new_picture.pict_type;
2511 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2512 MPV_frame_start(s, avctx);
2514 if (encode_picture(s, s->picture_number) < 0)
2517 avctx->real_pict_num = s->picture_number;
2518 avctx->header_bits = s->header_bits;
2519 avctx->mv_bits = s->mv_bits;
2520 avctx->misc_bits = s->misc_bits;
2521 avctx->i_tex_bits = s->i_tex_bits;
2522 avctx->p_tex_bits = s->p_tex_bits;
2523 avctx->i_count = s->i_count;
2524 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2525 avctx->skip_count = s->skip_count;
2529 if (s->out_format == FMT_MJPEG)
2530 mjpeg_picture_trailer(s);
2532 if(avctx->rc_buffer_size){
2533 RateControlContext *rcc= &s->rc_context;
2534 int max_size= rcc->buffer_index/3;
2536 if(put_bits_count(&s->pb) > max_size && s->qscale < s->avctx->qmax){
2537 s->next_lambda= s->lambda*(s->qscale+1) / s->qscale;
2538 s->mb_skipped = 0; //done in MPV_frame_start()
2539 if(s->pict_type==P_TYPE){ //done in encode_picture() so we must undo it
2540 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
2541 s->no_rounding ^= 1;
2543 // av_log(NULL, AV_LOG_ERROR, "R:%d ", s->next_lambda);
2544 for(i=0; i<avctx->thread_count; i++){
2545 PutBitContext *pb= &s->thread_context[i]->pb;
2546 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
2551 assert(s->avctx->rc_max_rate);
2554 if(s->flags&CODEC_FLAG_PASS1)
2555 ff_write_pass1_stats(s);
2558 s->current_picture_ptr->error[i]= s->current_picture.error[i];
2559 avctx->error[i] += s->current_picture_ptr->error[i];
2562 if(s->flags&CODEC_FLAG_PASS1)
2563 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2564 flush_put_bits(&s->pb);
2565 s->frame_bits = put_bits_count(&s->pb);
2567 stuffing_count= ff_vbv_update(s, s->frame_bits);
2569 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2570 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2574 switch(s->codec_id){
2575 case CODEC_ID_MPEG1VIDEO:
2576 case CODEC_ID_MPEG2VIDEO:
2577 while(stuffing_count--){
2578 put_bits(&s->pb, 8, 0);
2581 case CODEC_ID_MPEG4:
2582 put_bits(&s->pb, 16, 0);
2583 put_bits(&s->pb, 16, 0x1C3);
2584 stuffing_count -= 4;
2585 while(stuffing_count--){
2586 put_bits(&s->pb, 8, 0xFF);
2590 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2592 flush_put_bits(&s->pb);
2593 s->frame_bits = put_bits_count(&s->pb);
2596 /* update mpeg1/2 vbv_delay for CBR */
2597 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2598 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2601 assert(s->repeat_first_field==0);
2603 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2604 assert(vbv_delay < 0xFFFF);
2606 s->vbv_delay_ptr[0] &= 0xF8;
2607 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2608 s->vbv_delay_ptr[1] = vbv_delay>>5;
2609 s->vbv_delay_ptr[2] &= 0x07;
2610 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2612 s->total_bits += s->frame_bits;
2613 avctx->frame_bits = s->frame_bits;
2615 assert((pbBufPtr(&s->pb) == s->pb.buf));
2618 assert((s->frame_bits&7)==0);
2620 return s->frame_bits/8;
2623 #endif //CONFIG_ENCODERS
2625 static inline void gmc1_motion(MpegEncContext *s,
2626 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2627 uint8_t **ref_picture)
2630 int offset, src_x, src_y, linesize, uvlinesize;
2631 int motion_x, motion_y;
2634 motion_x= s->sprite_offset[0][0];
2635 motion_y= s->sprite_offset[0][1];
2636 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2637 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2638 motion_x<<=(3-s->sprite_warping_accuracy);
2639 motion_y<<=(3-s->sprite_warping_accuracy);
2640 src_x = clip(src_x, -16, s->width);
2641 if (src_x == s->width)
2643 src_y = clip(src_y, -16, s->height);
2644 if (src_y == s->height)
2647 linesize = s->linesize;
2648 uvlinesize = s->uvlinesize;
2650 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2652 if(s->flags&CODEC_FLAG_EMU_EDGE){
2653 if( (unsigned)src_x >= s->h_edge_pos - 17
2654 || (unsigned)src_y >= s->v_edge_pos - 17){
2655 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2656 ptr= s->edge_emu_buffer;
2660 if((motion_x|motion_y)&7){
2661 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2662 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2666 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2667 if (s->no_rounding){
2668 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2670 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2674 if(s->flags&CODEC_FLAG_GRAY) return;
2676 motion_x= s->sprite_offset[1][0];
2677 motion_y= s->sprite_offset[1][1];
2678 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2679 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2680 motion_x<<=(3-s->sprite_warping_accuracy);
2681 motion_y<<=(3-s->sprite_warping_accuracy);
2682 src_x = clip(src_x, -8, s->width>>1);
2683 if (src_x == s->width>>1)
2685 src_y = clip(src_y, -8, s->height>>1);
2686 if (src_y == s->height>>1)
2689 offset = (src_y * uvlinesize) + src_x;
2690 ptr = ref_picture[1] + offset;
2691 if(s->flags&CODEC_FLAG_EMU_EDGE){
2692 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2693 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2694 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);
2695 ptr= s->edge_emu_buffer;
2699 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2701 ptr = ref_picture[2] + offset;
2703 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);
2704 ptr= s->edge_emu_buffer;
2706 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2711 static inline void gmc_motion(MpegEncContext *s,
2712 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2713 uint8_t **ref_picture)
2716 int linesize, uvlinesize;
2717 const int a= s->sprite_warping_accuracy;
2720 linesize = s->linesize;
2721 uvlinesize = s->uvlinesize;
2723 ptr = ref_picture[0];
2725 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2726 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2728 s->dsp.gmc(dest_y, ptr, linesize, 16,
2731 s->sprite_delta[0][0], s->sprite_delta[0][1],
2732 s->sprite_delta[1][0], s->sprite_delta[1][1],
2733 a+1, (1<<(2*a+1)) - s->no_rounding,
2734 s->h_edge_pos, s->v_edge_pos);
2735 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2736 ox + s->sprite_delta[0][0]*8,
2737 oy + s->sprite_delta[1][0]*8,
2738 s->sprite_delta[0][0], s->sprite_delta[0][1],
2739 s->sprite_delta[1][0], s->sprite_delta[1][1],
2740 a+1, (1<<(2*a+1)) - s->no_rounding,
2741 s->h_edge_pos, s->v_edge_pos);
2743 if(s->flags&CODEC_FLAG_GRAY) return;
2745 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2746 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2748 ptr = ref_picture[1];
2749 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2752 s->sprite_delta[0][0], s->sprite_delta[0][1],
2753 s->sprite_delta[1][0], s->sprite_delta[1][1],
2754 a+1, (1<<(2*a+1)) - s->no_rounding,
2755 s->h_edge_pos>>1, s->v_edge_pos>>1);
2757 ptr = ref_picture[2];
2758 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2761 s->sprite_delta[0][0], s->sprite_delta[0][1],
2762 s->sprite_delta[1][0], s->sprite_delta[1][1],
2763 a+1, (1<<(2*a+1)) - s->no_rounding,
2764 s->h_edge_pos>>1, s->v_edge_pos>>1);
2768 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2769 * @param buf destination buffer
2770 * @param src source buffer
2771 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2772 * @param block_w width of block
2773 * @param block_h height of block
2774 * @param src_x x coordinate of the top left sample of the block in the source buffer
2775 * @param src_y y coordinate of the top left sample of the block in the source buffer
2776 * @param w width of the source buffer
2777 * @param h height of the source buffer
2779 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2780 int src_x, int src_y, int w, int h){
2782 int start_y, start_x, end_y, end_x;
2785 src+= (h-1-src_y)*linesize;
2787 }else if(src_y<=-block_h){
2788 src+= (1-block_h-src_y)*linesize;
2794 }else if(src_x<=-block_w){
2795 src+= (1-block_w-src_x);
2799 start_y= FFMAX(0, -src_y);
2800 start_x= FFMAX(0, -src_x);
2801 end_y= FFMIN(block_h, h-src_y);
2802 end_x= FFMIN(block_w, w-src_x);
2804 // copy existing part
2805 for(y=start_y; y<end_y; y++){
2806 for(x=start_x; x<end_x; x++){
2807 buf[x + y*linesize]= src[x + y*linesize];
2812 for(y=0; y<start_y; y++){
2813 for(x=start_x; x<end_x; x++){
2814 buf[x + y*linesize]= buf[x + start_y*linesize];
2819 for(y=end_y; y<block_h; y++){
2820 for(x=start_x; x<end_x; x++){
2821 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2825 for(y=0; y<block_h; y++){
2827 for(x=0; x<start_x; x++){
2828 buf[x + y*linesize]= buf[start_x + y*linesize];
2832 for(x=end_x; x<block_w; x++){
2833 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2838 static inline int hpel_motion(MpegEncContext *s,
2839 uint8_t *dest, uint8_t *src,
2840 int field_based, int field_select,
2841 int src_x, int src_y,
2842 int width, int height, int stride,
2843 int h_edge_pos, int v_edge_pos,
2844 int w, int h, op_pixels_func *pix_op,
2845 int motion_x, int motion_y)
2850 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2851 src_x += motion_x >> 1;
2852 src_y += motion_y >> 1;
2854 /* WARNING: do no forget half pels */
2855 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2858 src_y = clip(src_y, -16, height);
2859 if (src_y == height)
2861 src += src_y * stride + src_x;
2863 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2864 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2865 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2866 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2867 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2868 src= s->edge_emu_buffer;
2874 pix_op[dxy](dest, src, stride, h);
2878 static inline int hpel_motion_lowres(MpegEncContext *s,
2879 uint8_t *dest, uint8_t *src,
2880 int field_based, int field_select,
2881 int src_x, int src_y,
2882 int width, int height, int stride,
2883 int h_edge_pos, int v_edge_pos,
2884 int w, int h, h264_chroma_mc_func *pix_op,
2885 int motion_x, int motion_y)
2887 const int lowres= s->avctx->lowres;
2888 const int s_mask= (2<<lowres)-1;
2892 if(s->quarter_sample){
2897 sx= motion_x & s_mask;
2898 sy= motion_y & s_mask;
2899 src_x += motion_x >> (lowres+1);
2900 src_y += motion_y >> (lowres+1);
2902 src += src_y * stride + src_x;
2904 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2905 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2906 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2907 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2908 src= s->edge_emu_buffer;
2916 pix_op[lowres](dest, src, stride, h, sx, sy);
2920 /* apply one mpeg motion vector to the three components */
2921 static always_inline void mpeg_motion(MpegEncContext *s,
2922 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2923 int field_based, int bottom_field, int field_select,
2924 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2925 int motion_x, int motion_y, int h)
2927 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2928 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2931 if(s->quarter_sample)
2938 v_edge_pos = s->v_edge_pos >> field_based;
2939 linesize = s->current_picture.linesize[0] << field_based;
2940 uvlinesize = s->current_picture.linesize[1] << field_based;
2942 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2943 src_x = s->mb_x* 16 + (motion_x >> 1);
2944 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2946 if (s->out_format == FMT_H263) {
2947 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2948 mx = (motion_x>>1)|(motion_x&1);
2950 uvdxy = ((my & 1) << 1) | (mx & 1);
2951 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2952 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2954 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2958 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2962 uvsrc_x = s->mb_x*8 + mx;
2963 uvsrc_y = s->mb_y*8 + my;
2965 if(s->chroma_y_shift){
2968 uvdxy = ((my & 1) << 1) | (mx & 1);
2969 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2970 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2972 if(s->chroma_x_shift){
2975 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2976 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2987 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2988 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2989 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2991 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2992 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2993 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2994 s->codec_id == CODEC_ID_MPEG1VIDEO){
2995 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2998 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2999 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3000 ptr_y = s->edge_emu_buffer;
3001 if(!(s->flags&CODEC_FLAG_GRAY)){
3002 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3003 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3004 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3005 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3006 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3012 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3013 dest_y += s->linesize;
3014 dest_cb+= s->uvlinesize;
3015 dest_cr+= s->uvlinesize;
3019 ptr_y += s->linesize;
3020 ptr_cb+= s->uvlinesize;
3021 ptr_cr+= s->uvlinesize;
3024 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
3026 if(!(s->flags&CODEC_FLAG_GRAY)){
3027 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
3028 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
3030 #if defined(CONFIG_H261_ENCODER) || defined(CONFIG_H261_DECODER)
3031 if(s->out_format == FMT_H261){
3032 ff_h261_loop_filter(s);
3037 /* apply one mpeg motion vector to the three components */
3038 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
3039 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3040 int field_based, int bottom_field, int field_select,
3041 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
3042 int motion_x, int motion_y, int h)
3044 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3045 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
3046 const int lowres= s->avctx->lowres;
3047 const int block_s= 8>>lowres;
3048 const int s_mask= (2<<lowres)-1;
3049 const int h_edge_pos = s->h_edge_pos >> lowres;
3050 const int v_edge_pos = s->v_edge_pos >> lowres;
3051 linesize = s->current_picture.linesize[0] << field_based;
3052 uvlinesize = s->current_picture.linesize[1] << field_based;
3054 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
3060 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
3063 sx= motion_x & s_mask;
3064 sy= motion_y & s_mask;
3065 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
3066 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
3068 if (s->out_format == FMT_H263) {
3069 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
3070 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
3073 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
3076 uvsx = (2*mx) & s_mask;
3077 uvsy = (2*my) & s_mask;
3078 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
3079 uvsrc_y = s->mb_y*block_s + (my >> lowres);
3085 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
3086 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
3089 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3090 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3091 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3093 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
3094 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
3095 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3096 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
3097 ptr_y = s->edge_emu_buffer;
3098 if(!(s->flags&CODEC_FLAG_GRAY)){
3099 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3100 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3101 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3102 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3103 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3109 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3110 dest_y += s->linesize;
3111 dest_cb+= s->uvlinesize;
3112 dest_cr+= s->uvlinesize;
3116 ptr_y += s->linesize;
3117 ptr_cb+= s->uvlinesize;
3118 ptr_cr+= s->uvlinesize;
3123 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
3125 if(!(s->flags&CODEC_FLAG_GRAY)){
3126 uvsx <<= 2 - lowres;
3127 uvsy <<= 2 - lowres;
3128 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3129 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3131 //FIXME h261 lowres loop filter
3134 //FIXME move to dsputil, avg variant, 16x16 version
3135 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
3137 uint8_t * const top = src[1];
3138 uint8_t * const left = src[2];
3139 uint8_t * const mid = src[0];
3140 uint8_t * const right = src[3];
3141 uint8_t * const bottom= src[4];
3142 #define OBMC_FILTER(x, t, l, m, r, b)\
3143 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
3144 #define OBMC_FILTER4(x, t, l, m, r, b)\
3145 OBMC_FILTER(x , t, l, m, r, b);\
3146 OBMC_FILTER(x+1 , t, l, m, r, b);\
3147 OBMC_FILTER(x +stride, t, l, m, r, b);\
3148 OBMC_FILTER(x+1+stride, t, l, m, r, b);
3151 OBMC_FILTER (x , 2, 2, 4, 0, 0);
3152 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
3153 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
3154 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
3155 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
3156 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
3158 OBMC_FILTER (x , 1, 2, 5, 0, 0);
3159 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
3160 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
3161 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
3163 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
3164 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
3165 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
3166 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
3168 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
3169 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
3170 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
3171 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
3173 OBMC_FILTER (x , 0, 2, 5, 0, 1);
3174 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
3175 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
3176 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
3177 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
3178 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
3180 OBMC_FILTER (x , 0, 2, 4, 0, 2);
3181 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
3182 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
3183 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
3186 /* obmc for 1 8x8 luma block */
3187 static inline void obmc_motion(MpegEncContext *s,
3188 uint8_t *dest, uint8_t *src,
3189 int src_x, int src_y,
3190 op_pixels_func *pix_op,
3191 int16_t mv[5][2]/* mid top left right bottom*/)
3197 assert(s->quarter_sample==0);
3200 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
3203 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3204 hpel_motion(s, ptr[i], src, 0, 0,
3206 s->width, s->height, s->linesize,
3207 s->h_edge_pos, s->v_edge_pos,
3209 mv[i][0], mv[i][1]);
3213 put_obmc(dest, ptr, s->linesize);
3216 static inline void qpel_motion(MpegEncContext *s,
3217 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3218 int field_based, int bottom_field, int field_select,
3219 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3220 qpel_mc_func (*qpix_op)[16],
3221 int motion_x, int motion_y, int h)
3223 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3224 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3226 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3227 src_x = s->mb_x * 16 + (motion_x >> 2);
3228 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3230 v_edge_pos = s->v_edge_pos >> field_based;
3231 linesize = s->linesize << field_based;
3232 uvlinesize = s->uvlinesize << field_based;
3237 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3238 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3239 mx= (motion_x>>1) + rtab[motion_x&7];
3240 my= (motion_y>>1) + rtab[motion_y&7];
3241 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3242 mx= (motion_x>>1)|(motion_x&1);
3243 my= (motion_y>>1)|(motion_y&1);
3251 uvdxy= (mx&1) | ((my&1)<<1);
3255 uvsrc_x = s->mb_x * 8 + mx;
3256 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3258 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3259 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3260 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3262 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3263 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3264 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3265 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3266 ptr_y= s->edge_emu_buffer;
3267 if(!(s->flags&CODEC_FLAG_GRAY)){
3268 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3269 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3270 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3271 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3272 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3279 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3282 dest_y += s->linesize;
3283 dest_cb+= s->uvlinesize;
3284 dest_cr+= s->uvlinesize;
3288 ptr_y += s->linesize;
3289 ptr_cb += s->uvlinesize;
3290 ptr_cr += s->uvlinesize;
3292 //damn interlaced mode
3293 //FIXME boundary mirroring is not exactly correct here
3294 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3295 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3297 if(!(s->flags&CODEC_FLAG_GRAY)){
3298 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3299 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3303 inline int ff_h263_round_chroma(int x){
3305 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3308 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3313 * h263 chorma 4mv motion compensation.
3315 static inline void chroma_4mv_motion(MpegEncContext *s,
3316 uint8_t *dest_cb, uint8_t *dest_cr,
3317 uint8_t **ref_picture,
3318 op_pixels_func *pix_op,
3320 int dxy, emu=0, src_x, src_y, offset;
3323 /* In case of 8X8, we construct a single chroma motion vector
3324 with a special rounding */
3325 mx= ff_h263_round_chroma(mx);
3326 my= ff_h263_round_chroma(my);
3328 dxy = ((my & 1) << 1) | (mx & 1);
3332 src_x = s->mb_x * 8 + mx;
3333 src_y = s->mb_y * 8 + my;
3334 src_x = clip(src_x, -8, s->width/2);
3335 if (src_x == s->width/2)
3337 src_y = clip(src_y, -8, s->height/2);
3338 if (src_y == s->height/2)
3341 offset = (src_y * (s->uvlinesize)) + src_x;
3342 ptr = ref_picture[1] + offset;
3343 if(s->flags&CODEC_FLAG_EMU_EDGE){
3344 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3345 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3346 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);
3347 ptr= s->edge_emu_buffer;
3351 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3353 ptr = ref_picture[2] + offset;
3355 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);
3356 ptr= s->edge_emu_buffer;
3358 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3361 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3362 uint8_t *dest_cb, uint8_t *dest_cr,
3363 uint8_t **ref_picture,
3364 h264_chroma_mc_func *pix_op,
3366 const int lowres= s->avctx->lowres;
3367 const int block_s= 8>>lowres;
3368 const int s_mask= (2<<lowres)-1;
3369 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3370 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3371 int emu=0, src_x, src_y, offset, sx, sy;
3374 if(s->quarter_sample){
3379 /* In case of 8X8, we construct a single chroma motion vector
3380 with a special rounding */
3381 mx= ff_h263_round_chroma(mx);
3382 my= ff_h263_round_chroma(my);
3386 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3387 src_y = s->mb_y*block_s + (my >> (lowres+1));
3389 offset = src_y * s->uvlinesize + src_x;
3390 ptr = ref_picture[1] + offset;
3391 if(s->flags&CODEC_FLAG_EMU_EDGE){
3392 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3393 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3394 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3395 ptr= s->edge_emu_buffer;
3401 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3403 ptr = ref_picture[2] + offset;
3405 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3406 ptr= s->edge_emu_buffer;
3408 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3411 static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir){
3412 /* fetch pixels for estimated mv 4 macroblocks ahead
3413 * optimized for 64byte cache lines */
3414 const int shift = s->quarter_sample ? 2 : 1;
3415 const int mx= (s->mv[dir][0][0]>>shift) + 16*s->mb_x + 8;
3416 const int my= (s->mv[dir][0][1]>>shift) + 16*s->mb_y;
3417 int off= mx + (my + (s->mb_x&3)*4)*s->linesize + 64;
3418 s->dsp.prefetch(pix[0]+off, s->linesize, 4);
3419 off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
3420 s->dsp.prefetch(pix[1]+off, pix[2]-pix[1], 2);
3424 * motion compensation of a single macroblock
3426 * @param dest_y luma destination pointer
3427 * @param dest_cb chroma cb/u destination pointer
3428 * @param dest_cr chroma cr/v destination pointer
3429 * @param dir direction (0->forward, 1->backward)
3430 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3431 * @param pic_op halfpel motion compensation function (average or put normally)
3432 * @param pic_op qpel motion compensation function (average or put normally)
3433 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3435 static inline void MPV_motion(MpegEncContext *s,
3436 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3437 int dir, uint8_t **ref_picture,
3438 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3440 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3442 uint8_t *ptr, *dest;
3447 prefetch_motion(s, ref_picture, dir);
3449 if(s->obmc && s->pict_type != B_TYPE){
3450 int16_t mv_cache[4][4][2];
3451 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3452 const int mot_stride= s->b8_stride;
3453 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3455 assert(!s->mb_skipped);
3457 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3458 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3459 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3461 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3462 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3464 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3467 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3468 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3469 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3471 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3472 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3475 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3476 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3477 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3479 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3480 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3486 const int x= (i&1)+1;
3487 const int y= (i>>1)+1;
3489 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3490 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3491 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3492 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3493 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3495 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3497 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3504 if(!(s->flags&CODEC_FLAG_GRAY))
3505 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3510 switch(s->mv_type) {
3513 if(s->real_sprite_warping_points==1){
3514 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3517 gmc_motion(s, dest_y, dest_cb, dest_cr,
3520 }else if(s->quarter_sample){
3521 qpel_motion(s, dest_y, dest_cb, dest_cr,
3523 ref_picture, pix_op, qpix_op,
3524 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3526 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3527 ref_picture, pix_op,
3528 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3531 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3533 ref_picture, pix_op,
3534 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3540 if(s->quarter_sample){
3542 motion_x = s->mv[dir][i][0];
3543 motion_y = s->mv[dir][i][1];
3545 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3546 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3547 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3549 /* WARNING: do no forget half pels */
3550 src_x = clip(src_x, -16, s->width);
3551 if (src_x == s->width)
3553 src_y = clip(src_y, -16, s->height);
3554 if (src_y == s->height)
3557 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3558 if(s->flags&CODEC_FLAG_EMU_EDGE){
3559 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3560 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3561 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);
3562 ptr= s->edge_emu_buffer;
3565 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3566 qpix_op[1][dxy](dest, ptr, s->linesize);
3568 mx += s->mv[dir][i][0]/2;
3569 my += s->mv[dir][i][1]/2;
3573 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3574 ref_picture[0], 0, 0,
3575 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3576 s->width, s->height, s->linesize,
3577 s->h_edge_pos, s->v_edge_pos,
3579 s->mv[dir][i][0], s->mv[dir][i][1]);
3581 mx += s->mv[dir][i][0];
3582 my += s->mv[dir][i][1];
3586 if(!(s->flags&CODEC_FLAG_GRAY))
3587 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3590 if (s->picture_structure == PICT_FRAME) {
3591 if(s->quarter_sample){
3593 qpel_motion(s, dest_y, dest_cb, dest_cr,
3594 1, i, s->field_select[dir][i],
3595 ref_picture, pix_op, qpix_op,
3596 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3600 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3601 1, 0, s->field_select[dir][0],
3602 ref_picture, pix_op,
3603 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3605 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3606 1, 1, s->field_select[dir][1],
3607 ref_picture, pix_op,
3608 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3611 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3612 ref_picture= s->current_picture_ptr->data;
3615 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3616 0, 0, s->field_select[dir][0],
3617 ref_picture, pix_op,
3618 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3623 uint8_t ** ref2picture;
3625 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3626 ref2picture= ref_picture;
3628 ref2picture= s->current_picture_ptr->data;
3631 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3632 0, 0, s->field_select[dir][i],
3633 ref2picture, pix_op,
3634 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3636 dest_y += 16*s->linesize;
3637 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3638 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3642 if(s->picture_structure == PICT_FRAME){
3646 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3648 ref_picture, pix_op,
3649 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3651 pix_op = s->dsp.avg_pixels_tab;
3655 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3656 0, 0, s->picture_structure != i+1,
3657 ref_picture, pix_op,
3658 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3660 // after put we make avg of the same block
3661 pix_op=s->dsp.avg_pixels_tab;
3663 //opposite parity is always in the same frame if this is second field
3664 if(!s->first_field){
3665 ref_picture = s->current_picture_ptr->data;
3675 * motion compensation of a single macroblock
3677 * @param dest_y luma destination pointer
3678 * @param dest_cb chroma cb/u destination pointer
3679 * @param dest_cr chroma cr/v destination pointer
3680 * @param dir direction (0->forward, 1->backward)
3681 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3682 * @param pic_op halfpel motion compensation function (average or put normally)
3683 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3685 static inline void MPV_motion_lowres(MpegEncContext *s,
3686 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3687 int dir, uint8_t **ref_picture,
3688 h264_chroma_mc_func *pix_op)
3692 const int lowres= s->avctx->lowres;
3693 const int block_s= 8>>lowres;
3698 switch(s->mv_type) {
3700 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3702 ref_picture, pix_op,
3703 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3709 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3710 ref_picture[0], 0, 0,
3711 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3712 s->width, s->height, s->linesize,
3713 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3714 block_s, block_s, pix_op,
3715 s->mv[dir][i][0], s->mv[dir][i][1]);
3717 mx += s->mv[dir][i][0];
3718 my += s->mv[dir][i][1];
3721 if(!(s->flags&CODEC_FLAG_GRAY))
3722 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3725 if (s->picture_structure == PICT_FRAME) {
3727 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3728 1, 0, s->field_select[dir][0],
3729 ref_picture, pix_op,
3730 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3732 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3733 1, 1, s->field_select[dir][1],
3734 ref_picture, pix_op,
3735 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3737 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3738 ref_picture= s->current_picture_ptr->data;
3741 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3742 0, 0, s->field_select[dir][0],
3743 ref_picture, pix_op,
3744 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3749 uint8_t ** ref2picture;
3751 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3752 ref2picture= ref_picture;
3754 ref2picture= s->current_picture_ptr->data;
3757 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3758 0, 0, s->field_select[dir][i],
3759 ref2picture, pix_op,
3760 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3762 dest_y += 2*block_s*s->linesize;
3763 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3764 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3768 if(s->picture_structure == PICT_FRAME){
3772 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3774 ref_picture, pix_op,
3775 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3777 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3781 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3782 0, 0, s->picture_structure != i+1,
3783 ref_picture, pix_op,
3784 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3786 // after put we make avg of the same block
3787 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3789 //opposite parity is always in the same frame if this is second field
3790 if(!s->first_field){
3791 ref_picture = s->current_picture_ptr->data;
3800 /* put block[] to dest[] */
3801 static inline void put_dct(MpegEncContext *s,
3802 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3804 s->dct_unquantize_intra(s, block, i, qscale);
3805 s->dsp.idct_put (dest, line_size, block);
3808 /* add block[] to dest[] */
3809 static inline void add_dct(MpegEncContext *s,
3810 DCTELEM *block, int i, uint8_t *dest, int line_size)
3812 if (s->block_last_index[i] >= 0) {
3813 s->dsp.idct_add (dest, line_size, block);
3817 static inline void add_dequant_dct(MpegEncContext *s,
3818 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3820 if (s->block_last_index[i] >= 0) {
3821 s->dct_unquantize_inter(s, block, i, qscale);
3823 s->dsp.idct_add (dest, line_size, block);
3828 * cleans dc, ac, coded_block for the current non intra MB
3830 void ff_clean_intra_table_entries(MpegEncContext *s)
3832 int wrap = s->b8_stride;
3833 int xy = s->block_index[0];
3836 s->dc_val[0][xy + 1 ] =
3837 s->dc_val[0][xy + wrap] =
3838 s->dc_val[0][xy + 1 + wrap] = 1024;
3840 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3841 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3842 if (s->msmpeg4_version>=3) {
3843 s->coded_block[xy ] =
3844 s->coded_block[xy + 1 ] =
3845 s->coded_block[xy + wrap] =
3846 s->coded_block[xy + 1 + wrap] = 0;
3849 wrap = s->mb_stride;
3850 xy = s->mb_x + s->mb_y * wrap;
3852 s->dc_val[2][xy] = 1024;
3854 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3855 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3857 s->mbintra_table[xy]= 0;
3860 /* generic function called after a macroblock has been parsed by the
3861 decoder or after it has been encoded by the encoder.
3863 Important variables used:
3864 s->mb_intra : true if intra macroblock
3865 s->mv_dir : motion vector direction
3866 s->mv_type : motion vector type
3867 s->mv : motion vector
3868 s->interlaced_dct : true if interlaced dct used (mpeg2)
3870 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3873 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3875 if(s->avctx->xvmc_acceleration){
3876 XVMC_decode_mb(s);//xvmc uses pblocks
3884 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3885 /* save DCT coefficients */
3887 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3890 *dct++ = block[i][s->dsp.idct_permutation[j]];
3893 s->current_picture.qscale_table[mb_xy]= s->qscale;
3895 /* update DC predictors for P macroblocks */
3897 if (s->h263_pred || s->h263_aic) {
3898 if(s->mbintra_table[mb_xy])
3899 ff_clean_intra_table_entries(s);
3903 s->last_dc[2] = 128 << s->intra_dc_precision;
3906 else if (s->h263_pred || s->h263_aic)
3907 s->mbintra_table[mb_xy]=1;
3909 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3910 uint8_t *dest_y, *dest_cb, *dest_cr;
3911 int dct_linesize, dct_offset;
3912 op_pixels_func (*op_pix)[4];
3913 qpel_mc_func (*op_qpix)[16];
3914 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3915 const int uvlinesize= s->current_picture.linesize[1];
3916 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3917 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3919 /* avoid copy if macroblock skipped in last frame too */
3920 /* skip only during decoding as we might trash the buffers during encoding a bit */
3922 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3923 const int age= s->current_picture.age;
3927 if (s->mb_skipped) {
3929 assert(s->pict_type!=I_TYPE);
3931 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3932 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3934 /* if previous was skipped too, then nothing to do ! */
3935 if (*mbskip_ptr >= age && s->current_picture.reference){
3938 } else if(!s->current_picture.reference){
3939 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3940 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3942 *mbskip_ptr = 0; /* not skipped */
3946 dct_linesize = linesize << s->interlaced_dct;
3947 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3951 dest_cb= s->dest[1];
3952 dest_cr= s->dest[2];
3954 dest_y = s->b_scratchpad;
3955 dest_cb= s->b_scratchpad+16*linesize;
3956 dest_cr= s->b_scratchpad+32*linesize;
3960 /* motion handling */
3961 /* decoding or more than one mb_type (MC was already done otherwise) */
3964 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3966 if (s->mv_dir & MV_DIR_FORWARD) {
3967 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3968 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3970 if (s->mv_dir & MV_DIR_BACKWARD) {
3971 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3974 op_qpix= s->me.qpel_put;
3975 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3976 op_pix = s->dsp.put_pixels_tab;
3978 op_pix = s->dsp.put_no_rnd_pixels_tab;
3980 if (s->mv_dir & MV_DIR_FORWARD) {
3981 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3982 op_pix = s->dsp.avg_pixels_tab;
3983 op_qpix= s->me.qpel_avg;
3985 if (s->mv_dir & MV_DIR_BACKWARD) {
3986 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3991 /* skip dequant / idct if we are really late ;) */
3992 if(s->hurry_up>1) goto skip_idct;
3993 if(s->avctx->skip_idct){
3994 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
3995 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
3996 || s->avctx->skip_idct >= AVDISCARD_ALL)
4000 /* add dct residue */
4001 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
4002 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
4003 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4004 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4005 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4006 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4008 if(!(s->flags&CODEC_FLAG_GRAY)){
4009 if (s->chroma_y_shift){
4010 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4011 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4015 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4016 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4017 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4018 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4021 } else if(s->codec_id != CODEC_ID_WMV2){
4022 add_dct(s, block[0], 0, dest_y , dct_linesize);
4023 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
4024 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
4025 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
4027 if(!(s->flags&CODEC_FLAG_GRAY)){
4028 if(s->chroma_y_shift){//Chroma420
4029 add_dct(s, block[4], 4, dest_cb, uvlinesize);
4030 add_dct(s, block[5], 5, dest_cr, uvlinesize);
4033 dct_linesize = uvlinesize << s->interlaced_dct;
4034 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4036 add_dct(s, block[4], 4, dest_cb, dct_linesize);
4037 add_dct(s, block[5], 5, dest_cr, dct_linesize);
4038 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
4039 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
4040 if(!s->chroma_x_shift){//Chroma444
4041 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
4042 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
4043 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
4044 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
4050 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
4053 /* dct only in intra block */
4054 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
4055 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4056 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4057 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4058 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4060 if(!(s->flags&CODEC_FLAG_GRAY)){
4061 if(s->chroma_y_shift){
4062 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4063 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4067 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4068 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4069 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4070 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4074 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
4075 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
4076 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
4077 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
4079 if(!(s->flags&CODEC_FLAG_GRAY)){
4080 if(s->chroma_y_shift){
4081 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
4082 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
4085 dct_linesize = uvlinesize << s->interlaced_dct;
4086 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4088 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
4089 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
4090 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
4091 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
4092 if(!s->chroma_x_shift){//Chroma444
4093 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
4094 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
4095 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
4096 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
4104 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
4105 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
4106 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
4111 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
4112 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
4113 else MPV_decode_mb_internal(s, block, 0);
4116 #ifdef CONFIG_ENCODERS
4118 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
4120 static const char tab[64]=
4132 DCTELEM *block= s->block[n];
4133 const int last_index= s->block_last_index[n];
4138 threshold= -threshold;
4142 /* are all which we could set to zero are allready zero? */
4143 if(last_index<=skip_dc - 1) return;
4145 for(i=0; i<=last_index; i++){
4146 const int j = s->intra_scantable.permutated[i];
4147 const int level = ABS(block[j]);
4149 if(skip_dc && i==0) continue;
4158 if(score >= threshold) return;
4159 for(i=skip_dc; i<=last_index; i++){
4160 const int j = s->intra_scantable.permutated[i];
4163 if(block[0]) s->block_last_index[n]= 0;
4164 else s->block_last_index[n]= -1;
4167 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
4170 const int maxlevel= s->max_qcoeff;
4171 const int minlevel= s->min_qcoeff;
4175 i=1; //skip clipping of intra dc
4179 for(;i<=last_index; i++){
4180 const int j= s->intra_scantable.permutated[i];
4181 int level = block[j];
4183 if (level>maxlevel){
4186 }else if(level<minlevel){
4194 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
4195 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
4198 #endif //CONFIG_ENCODERS
4202 * @param h is the normal height, this will be reduced automatically if needed for the last row
4204 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
4205 if (s->avctx->draw_horiz_band) {
4209 if(s->picture_structure != PICT_FRAME){
4212 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
4215 h= FFMIN(h, s->avctx->height - y);
4217 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
4218 src= (AVFrame*)s->current_picture_ptr;
4219 else if(s->last_picture_ptr)
4220 src= (AVFrame*)s->last_picture_ptr;
4224 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
4230 offset[0]= y * s->linesize;;
4232 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
4238 s->avctx->draw_horiz_band(s->avctx, src, offset,
4239 y, s->picture_structure, h);
4243 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4244 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
4245 const int uvlinesize= s->current_picture.linesize[1];
4246 const int mb_size= 4 - s->avctx->lowres;
4248 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4249 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4250 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4251 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4252 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4253 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;
4254 //block_index is not used by mpeg2, so it is not affected by chroma_format
4256 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4257 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4258 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4260 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4262 s->dest[0] += s->mb_y * linesize << mb_size;
4263 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4264 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4268 #ifdef CONFIG_ENCODERS
4270 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4280 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4281 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4282 int v= ptr[x2 + y2*stride];
4288 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4293 static always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count)
4295 int16_t weight[8][64];
4296 DCTELEM orig[8][64];
4297 const int mb_x= s->mb_x;
4298 const int mb_y= s->mb_y;
4301 int dct_offset = s->linesize*8; //default for progressive frames
4302 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4305 for(i=0; i<mb_block_count; i++) skip_dct[i]=0;
4307 if(s->adaptive_quant){
4308 const int last_qp= s->qscale;
4309 const int mb_xy= mb_x + mb_y*s->mb_stride;
4311 s->lambda= s->lambda_table[mb_xy];
4314 if(!(s->flags&CODEC_FLAG_QP_RD)){
4315 s->dquant= s->qscale - last_qp;
4317 if(s->out_format==FMT_H263){
4318 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4320 if(s->codec_id==CODEC_ID_MPEG4){
4322 if(s->pict_type == B_TYPE){
4324 s->dquant= (s->dquant/2)*2;
4325 if(s->mv_dir&MV_DIRECT)
4328 if(s->mv_type==MV_TYPE_8X8)
4334 ff_set_qscale(s, last_qp + s->dquant);
4335 }else if(s->flags&CODEC_FLAG_QP_RD)
4336 ff_set_qscale(s, s->qscale + s->dquant);
4338 wrap_y = s->linesize;
4339 wrap_c = s->uvlinesize;
4340 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4341 ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4342 ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4344 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4345 uint8_t *ebuf= s->edge_emu_buffer + 32;
4346 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4348 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);
4349 ptr_cb= ebuf+18*wrap_y;
4350 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);
4351 ptr_cr= ebuf+18*wrap_y+8;
4355 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4356 int progressive_score, interlaced_score;
4358 s->interlaced_dct=0;
4359 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4360 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4362 if(progressive_score > 0){
4363 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4364 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4365 if(progressive_score > interlaced_score){
4366 s->interlaced_dct=1;
4370 if (s->chroma_format == CHROMA_422)
4376 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4377 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4378 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4379 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4381 if(s->flags&CODEC_FLAG_GRAY){
4385 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4386 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4387 if(!s->chroma_y_shift){ /* 422 */
4388 s->dsp.get_pixels(s->block[6], ptr_cb + (dct_offset>>1), wrap_c);
4389 s->dsp.get_pixels(s->block[7], ptr_cr + (dct_offset>>1), wrap_c);
4393 op_pixels_func (*op_pix)[4];
4394 qpel_mc_func (*op_qpix)[16];
4395 uint8_t *dest_y, *dest_cb, *dest_cr;
4397 dest_y = s->dest[0];
4398 dest_cb = s->dest[1];
4399 dest_cr = s->dest[2];
4401 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4402 op_pix = s->dsp.put_pixels_tab;
4403 op_qpix= s->dsp.put_qpel_pixels_tab;
4405 op_pix = s->dsp.put_no_rnd_pixels_tab;
4406 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4409 if (s->mv_dir & MV_DIR_FORWARD) {
4410 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4411 op_pix = s->dsp.avg_pixels_tab;
4412 op_qpix= s->dsp.avg_qpel_pixels_tab;
4414 if (s->mv_dir & MV_DIR_BACKWARD) {
4415 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4418 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4419 int progressive_score, interlaced_score;
4421 s->interlaced_dct=0;
4422 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4423 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4425 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4427 if(progressive_score>0){
4428 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4429 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4431 if(progressive_score > interlaced_score){
4432 s->interlaced_dct=1;
4436 if (s->chroma_format == CHROMA_422)
4442 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4443 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4444 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4445 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4447 if(s->flags&CODEC_FLAG_GRAY){
4451 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4452 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4453 if(!s->chroma_y_shift){ /* 422 */
4454 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset>>1), dest_cb + (dct_offset>>1), wrap_c);
4455 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset>>1), dest_cr + (dct_offset>>1), wrap_c);
4458 /* pre quantization */
4459 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4461 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4462 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4463 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4464 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;
4465 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4466 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4467 if(!s->chroma_y_shift){ /* 422 */
4468 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;
4469 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;
4474 if(s->avctx->quantizer_noise_shaping){
4475 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4476 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4477 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4478 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4479 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4480 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4481 if(!s->chroma_y_shift){ /* 422 */
4482 if(!skip_dct[6]) get_vissual_weight(weight[6], ptr_cb + (dct_offset>>1), wrap_c);
4483 if(!skip_dct[7]) get_vissual_weight(weight[7], ptr_cr + (dct_offset>>1), wrap_c);
4485 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*mb_block_count);
4488 /* DCT & quantize */
4489 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4491 for(i=0;i<mb_block_count;i++) {
4494 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4495 // FIXME we could decide to change to quantizer instead of clipping
4496 // JS: I don't think that would be a good idea it could lower quality instead
4497 // of improve it. Just INTRADC clipping deserves changes in quantizer
4498 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4500 s->block_last_index[i]= -1;
4502 if(s->avctx->quantizer_noise_shaping){
4503 for(i=0;i<mb_block_count;i++) {
4505 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4510 if(s->luma_elim_threshold && !s->mb_intra)
4512 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4513 if(s->chroma_elim_threshold && !s->mb_intra)
4514 for(i=4; i<mb_block_count; i++)
4515 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4517 if(s->flags & CODEC_FLAG_CBP_RD){
4518 for(i=0;i<mb_block_count;i++) {
4519 if(s->block_last_index[i] == -1)
4520 s->coded_score[i]= INT_MAX/256;
4525 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4526 s->block_last_index[4]=
4527 s->block_last_index[5]= 0;
4529 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4532 //non c quantize code returns incorrect block_last_index FIXME
4533 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4534 for(i=0; i<mb_block_count; i++){
4536 if(s->block_last_index[i]>0){
4537 for(j=63; j>0; j--){
4538 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4540 s->block_last_index[i]= j;
4545 /* huffman encode */
4546 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4547 case CODEC_ID_MPEG1VIDEO:
4548 case CODEC_ID_MPEG2VIDEO:
4549 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4550 case CODEC_ID_MPEG4:
4551 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4552 case CODEC_ID_MSMPEG4V2:
4553 case CODEC_ID_MSMPEG4V3:
4555 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4557 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4558 #ifdef CONFIG_H261_ENCODER
4560 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4563 case CODEC_ID_H263P:
4567 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4568 case CODEC_ID_MJPEG:
4569 mjpeg_encode_mb(s, s->block); break;
4575 static always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4577 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
4578 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
4581 #endif //CONFIG_ENCODERS
4583 void ff_mpeg_flush(AVCodecContext *avctx){
4585 MpegEncContext *s = avctx->priv_data;
4587 if(s==NULL || s->picture==NULL)
4590 for(i=0; i<MAX_PICTURE_COUNT; i++){
4591 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4592 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4593 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4595 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4597 s->mb_x= s->mb_y= 0;
4599 s->parse_context.state= -1;
4600 s->parse_context.frame_start_found= 0;
4601 s->parse_context.overread= 0;
4602 s->parse_context.overread_index= 0;
4603 s->parse_context.index= 0;
4604 s->parse_context.last_index= 0;
4605 s->bitstream_buffer_size=0;
4608 #ifdef CONFIG_ENCODERS
4609 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4611 const uint16_t *srcw= (uint16_t*)src;
4612 int words= length>>4;
4613 int bits= length&15;
4616 if(length==0) return;
4619 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4620 }else if(put_bits_count(pb)&7){
4621 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4623 for(i=0; put_bits_count(pb)&31; i++)
4624 put_bits(pb, 8, src[i]);
4626 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4627 skip_put_bytes(pb, 2*words-i);
4630 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4633 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4636 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4639 d->mb_skip_run= s->mb_skip_run;
4641 d->last_dc[i]= s->last_dc[i];
4644 d->mv_bits= s->mv_bits;
4645 d->i_tex_bits= s->i_tex_bits;
4646 d->p_tex_bits= s->p_tex_bits;
4647 d->i_count= s->i_count;
4648 d->f_count= s->f_count;
4649 d->b_count= s->b_count;
4650 d->skip_count= s->skip_count;
4651 d->misc_bits= s->misc_bits;
4655 d->qscale= s->qscale;
4656 d->dquant= s->dquant;
4659 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4662 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4663 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4666 d->mb_skip_run= s->mb_skip_run;
4668 d->last_dc[i]= s->last_dc[i];
4671 d->mv_bits= s->mv_bits;
4672 d->i_tex_bits= s->i_tex_bits;
4673 d->p_tex_bits= s->p_tex_bits;
4674 d->i_count= s->i_count;
4675 d->f_count= s->f_count;
4676 d->b_count= s->b_count;
4677 d->skip_count= s->skip_count;
4678 d->misc_bits= s->misc_bits;
4680 d->mb_intra= s->mb_intra;
4681 d->mb_skipped= s->mb_skipped;
4682 d->mv_type= s->mv_type;
4683 d->mv_dir= s->mv_dir;
4685 if(s->data_partitioning){
4687 d->tex_pb= s->tex_pb;
4691 d->block_last_index[i]= s->block_last_index[i];
4692 d->interlaced_dct= s->interlaced_dct;
4693 d->qscale= s->qscale;
4696 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4697 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4698 int *dmin, int *next_block, int motion_x, int motion_y)
4701 uint8_t *dest_backup[3];
4703 copy_context_before_encode(s, backup, type);
4705 s->block= s->blocks[*next_block];
4706 s->pb= pb[*next_block];
4707 if(s->data_partitioning){
4708 s->pb2 = pb2 [*next_block];
4709 s->tex_pb= tex_pb[*next_block];
4713 memcpy(dest_backup, s->dest, sizeof(s->dest));
4714 s->dest[0] = s->rd_scratchpad;
4715 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4716 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4717 assert(s->linesize >= 32); //FIXME
4720 encode_mb(s, motion_x, motion_y);
4722 score= put_bits_count(&s->pb);
4723 if(s->data_partitioning){
4724 score+= put_bits_count(&s->pb2);
4725 score+= put_bits_count(&s->tex_pb);
4728 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4729 MPV_decode_mb(s, s->block);
4731 score *= s->lambda2;
4732 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4736 memcpy(s->dest, dest_backup, sizeof(s->dest));
4743 copy_context_after_encode(best, s, type);
4747 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4748 uint32_t *sq = squareTbl + 256;
4753 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4754 else if(w==8 && h==8)
4755 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4759 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4768 static int sse_mb(MpegEncContext *s){
4772 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4773 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4776 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4777 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)
4778 +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)
4779 +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);
4781 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)
4782 +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)
4783 +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);
4786 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)
4787 +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)
4788 +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);
4791 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4792 MpegEncContext *s= arg;
4796 s->me.dia_size= s->avctx->pre_dia_size;
4797 s->first_slice_line=1;
4798 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4799 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4800 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4802 s->first_slice_line=0;
4810 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4811 MpegEncContext *s= arg;
4813 s->me.dia_size= s->avctx->dia_size;
4814 s->first_slice_line=1;
4815 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4816 s->mb_x=0; //for block init below
4817 ff_init_block_index(s);
4818 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4819 s->block_index[0]+=2;
4820 s->block_index[1]+=2;
4821 s->block_index[2]+=2;
4822 s->block_index[3]+=2;
4824 /* compute motion vector & mb_type and store in context */
4825 if(s->pict_type==B_TYPE)
4826 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4828 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4830 s->first_slice_line=0;
4835 static int mb_var_thread(AVCodecContext *c, void *arg){
4836 MpegEncContext *s= arg;
4839 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4840 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4843 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4845 int sum = s->dsp.pix_sum(pix, s->linesize);
4847 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4849 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4850 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4851 s->me.mb_var_sum_temp += varc;
4857 static void write_slice_end(MpegEncContext *s){
4858 if(s->codec_id==CODEC_ID_MPEG4){
4859 if(s->partitioned_frame){
4860 ff_mpeg4_merge_partitions(s);
4863 ff_mpeg4_stuffing(&s->pb);
4864 }else if(s->out_format == FMT_MJPEG){
4865 ff_mjpeg_stuffing(&s->pb);
4868 align_put_bits(&s->pb);
4869 flush_put_bits(&s->pb);
4871 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4872 s->misc_bits+= get_bits_diff(s);
4875 static int encode_thread(AVCodecContext *c, void *arg){
4876 MpegEncContext *s= arg;
4877 int mb_x, mb_y, pdif = 0;
4879 MpegEncContext best_s, backup_s;
4880 uint8_t bit_buf[2][MAX_MB_BYTES];
4881 uint8_t bit_buf2[2][MAX_MB_BYTES];
4882 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4883 PutBitContext pb[2], pb2[2], tex_pb[2];
4884 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4887 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4888 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4889 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4892 s->last_bits= put_bits_count(&s->pb);
4903 /* init last dc values */
4904 /* note: quant matrix value (8) is implied here */
4905 s->last_dc[i] = 128 << s->intra_dc_precision;
4907 s->current_picture.error[i] = 0;
4910 memset(s->last_mv, 0, sizeof(s->last_mv));
4914 switch(s->codec_id){
4916 case CODEC_ID_H263P:
4918 s->gob_index = ff_h263_get_gob_height(s);
4920 case CODEC_ID_MPEG4:
4921 if(s->partitioned_frame)
4922 ff_mpeg4_init_partitions(s);
4928 s->first_slice_line = 1;
4929 s->ptr_lastgob = s->pb.buf;
4930 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4931 // printf("row %d at %X\n", s->mb_y, (int)s);
4935 ff_set_qscale(s, s->qscale);
4936 ff_init_block_index(s);
4938 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4939 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4940 int mb_type= s->mb_type[xy];
4945 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4946 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4949 if(s->data_partitioning){
4950 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4951 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4952 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4958 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4959 ff_update_block_index(s);
4961 #ifdef CONFIG_H261_ENCODER
4962 if(s->codec_id == CODEC_ID_H261){
4963 ff_h261_reorder_mb_index(s);
4964 xy= s->mb_y*s->mb_stride + s->mb_x;
4965 mb_type= s->mb_type[xy];
4969 /* write gob / video packet header */
4971 int current_packet_size, is_gob_start;
4973 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4975 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4977 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4979 switch(s->codec_id){
4981 case CODEC_ID_H263P:
4982 if(!s->h263_slice_structured)
4983 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4985 case CODEC_ID_MPEG2VIDEO:
4986 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4987 case CODEC_ID_MPEG1VIDEO:
4988 if(s->mb_skip_run) is_gob_start=0;
4993 if(s->start_mb_y != mb_y || mb_x!=0){
4996 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4997 ff_mpeg4_init_partitions(s);
5001 assert((put_bits_count(&s->pb)&7) == 0);
5002 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
5004 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
5005 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
5006 int d= 100 / s->avctx->error_rate;
5008 current_packet_size=0;
5009 #ifndef ALT_BITSTREAM_WRITER
5010 s->pb.buf_ptr= s->ptr_lastgob;
5012 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
5016 if (s->avctx->rtp_callback){
5017 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
5018 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
5021 switch(s->codec_id){
5022 case CODEC_ID_MPEG4:
5023 ff_mpeg4_encode_video_packet_header(s);
5024 ff_mpeg4_clean_buffers(s);
5026 case CODEC_ID_MPEG1VIDEO:
5027 case CODEC_ID_MPEG2VIDEO:
5028 ff_mpeg1_encode_slice_header(s);
5029 ff_mpeg1_clean_buffers(s);
5032 case CODEC_ID_H263P:
5033 h263_encode_gob_header(s, mb_y);
5037 if(s->flags&CODEC_FLAG_PASS1){
5038 int bits= put_bits_count(&s->pb);
5039 s->misc_bits+= bits - s->last_bits;
5043 s->ptr_lastgob += current_packet_size;
5044 s->first_slice_line=1;
5045 s->resync_mb_x=mb_x;
5046 s->resync_mb_y=mb_y;
5050 if( (s->resync_mb_x == s->mb_x)
5051 && s->resync_mb_y+1 == s->mb_y){
5052 s->first_slice_line=0;
5056 s->dquant=0; //only for QP_RD
5058 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
5060 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
5062 copy_context_before_encode(&backup_s, s, -1);
5064 best_s.data_partitioning= s->data_partitioning;
5065 best_s.partitioned_frame= s->partitioned_frame;
5066 if(s->data_partitioning){
5067 backup_s.pb2= s->pb2;
5068 backup_s.tex_pb= s->tex_pb;
5071 if(mb_type&CANDIDATE_MB_TYPE_INTER){
5072 s->mv_dir = MV_DIR_FORWARD;
5073 s->mv_type = MV_TYPE_16X16;
5075 s->mv[0][0][0] = s->p_mv_table[xy][0];
5076 s->mv[0][0][1] = s->p_mv_table[xy][1];
5077 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
5078 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5080 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
5081 s->mv_dir = MV_DIR_FORWARD;
5082 s->mv_type = MV_TYPE_FIELD;
5085 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5086 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5087 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5089 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
5090 &dmin, &next_block, 0, 0);
5092 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
5093 s->mv_dir = MV_DIR_FORWARD;
5094 s->mv_type = MV_TYPE_16X16;
5098 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
5099 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5101 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
5102 s->mv_dir = MV_DIR_FORWARD;
5103 s->mv_type = MV_TYPE_8X8;
5106 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5107 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5109 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
5110 &dmin, &next_block, 0, 0);
5112 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
5113 s->mv_dir = MV_DIR_FORWARD;
5114 s->mv_type = MV_TYPE_16X16;
5116 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5117 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5118 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, 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_BACKWARD){
5122 s->mv_dir = MV_DIR_BACKWARD;
5123 s->mv_type = MV_TYPE_16X16;
5125 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5126 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5127 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
5128 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
5130 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
5131 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5132 s->mv_type = MV_TYPE_16X16;
5134 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5135 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5136 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5137 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5138 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
5139 &dmin, &next_block, 0, 0);
5141 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
5142 int mx= s->b_direct_mv_table[xy][0];
5143 int my= s->b_direct_mv_table[xy][1];
5145 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5147 ff_mpeg4_set_direct_mv(s, mx, my);
5148 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
5149 &dmin, &next_block, mx, my);
5151 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
5152 s->mv_dir = MV_DIR_FORWARD;
5153 s->mv_type = MV_TYPE_FIELD;
5156 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5157 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5158 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5160 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
5161 &dmin, &next_block, 0, 0);
5163 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
5164 s->mv_dir = MV_DIR_BACKWARD;
5165 s->mv_type = MV_TYPE_FIELD;
5168 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5169 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5170 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5172 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
5173 &dmin, &next_block, 0, 0);
5175 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
5176 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5177 s->mv_type = MV_TYPE_FIELD;
5179 for(dir=0; dir<2; dir++){
5181 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5182 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5183 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5186 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
5187 &dmin, &next_block, 0, 0);
5189 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
5191 s->mv_type = MV_TYPE_16X16;
5195 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
5196 &dmin, &next_block, 0, 0);
5197 if(s->h263_pred || s->h263_aic){
5199 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
5201 ff_clean_intra_table_entries(s); //old mode?
5205 if(s->flags & CODEC_FLAG_QP_RD){
5206 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
5207 const int last_qp= backup_s.qscale;
5208 int dquant, dir, qp, dc[6];
5210 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
5212 assert(backup_s.dquant == 0);
5215 s->mv_dir= best_s.mv_dir;
5216 s->mv_type = MV_TYPE_16X16;
5217 s->mb_intra= best_s.mb_intra;
5218 s->mv[0][0][0] = best_s.mv[0][0][0];
5219 s->mv[0][0][1] = best_s.mv[0][0][1];
5220 s->mv[1][0][0] = best_s.mv[1][0][0];
5221 s->mv[1][0][1] = best_s.mv[1][0][1];
5223 dir= s->pict_type == B_TYPE ? 2 : 1;
5224 if(last_qp + dir > s->avctx->qmax) dir= -dir;
5225 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
5226 qp= last_qp + dquant;
5227 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
5229 backup_s.dquant= dquant;
5230 if(s->mb_intra && s->dc_val[0]){
5232 dc[i]= s->dc_val[0][ s->block_index[i] ];
5233 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
5237 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
5238 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
5239 if(best_s.qscale != qp){
5240 if(s->mb_intra && s->dc_val[0]){
5242 s->dc_val[0][ s->block_index[i] ]= dc[i];
5243 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
5246 if(dir > 0 && dquant==dir){
5254 s->current_picture.qscale_table[xy]= qp;
5258 copy_context_after_encode(s, &best_s, -1);
5260 pb_bits_count= put_bits_count(&s->pb);
5261 flush_put_bits(&s->pb);
5262 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
5265 if(s->data_partitioning){
5266 pb2_bits_count= put_bits_count(&s->pb2);
5267 flush_put_bits(&s->pb2);
5268 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5269 s->pb2= backup_s.pb2;
5271 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5272 flush_put_bits(&s->tex_pb);
5273 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5274 s->tex_pb= backup_s.tex_pb;
5276 s->last_bits= put_bits_count(&s->pb);
5278 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5279 ff_h263_update_motion_val(s);
5281 if(next_block==0){ //FIXME 16 vs linesize16
5282 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5283 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5284 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5287 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5288 MPV_decode_mb(s, s->block);
5290 int motion_x, motion_y;
5291 s->mv_type=MV_TYPE_16X16;
5292 // only one MB-Type possible
5295 case CANDIDATE_MB_TYPE_INTRA:
5298 motion_x= s->mv[0][0][0] = 0;
5299 motion_y= s->mv[0][0][1] = 0;
5301 case CANDIDATE_MB_TYPE_INTER:
5302 s->mv_dir = MV_DIR_FORWARD;
5304 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5305 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5307 case CANDIDATE_MB_TYPE_INTER_I:
5308 s->mv_dir = MV_DIR_FORWARD;
5309 s->mv_type = MV_TYPE_FIELD;
5312 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5313 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5314 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5316 motion_x = motion_y = 0;
5318 case CANDIDATE_MB_TYPE_INTER4V:
5319 s->mv_dir = MV_DIR_FORWARD;
5320 s->mv_type = MV_TYPE_8X8;
5323 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5324 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5326 motion_x= motion_y= 0;
5328 case CANDIDATE_MB_TYPE_DIRECT:
5329 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5331 motion_x=s->b_direct_mv_table[xy][0];
5332 motion_y=s->b_direct_mv_table[xy][1];
5333 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5335 case CANDIDATE_MB_TYPE_BIDIR:
5336 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5340 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5341 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5342 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5343 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5345 case CANDIDATE_MB_TYPE_BACKWARD:
5346 s->mv_dir = MV_DIR_BACKWARD;
5348 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5349 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5351 case CANDIDATE_MB_TYPE_FORWARD:
5352 s->mv_dir = MV_DIR_FORWARD;
5354 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5355 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5356 // printf(" %d %d ", motion_x, motion_y);
5358 case CANDIDATE_MB_TYPE_FORWARD_I:
5359 s->mv_dir = MV_DIR_FORWARD;
5360 s->mv_type = MV_TYPE_FIELD;
5363 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5364 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5365 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5367 motion_x=motion_y=0;
5369 case CANDIDATE_MB_TYPE_BACKWARD_I:
5370 s->mv_dir = MV_DIR_BACKWARD;
5371 s->mv_type = MV_TYPE_FIELD;
5374 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5375 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5376 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5378 motion_x=motion_y=0;
5380 case CANDIDATE_MB_TYPE_BIDIR_I:
5381 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5382 s->mv_type = MV_TYPE_FIELD;
5384 for(dir=0; dir<2; dir++){
5386 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5387 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5388 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5391 motion_x=motion_y=0;
5394 motion_x=motion_y=0; //gcc warning fix
5395 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5398 encode_mb(s, motion_x, motion_y);
5400 // RAL: Update last macroblock type
5401 s->last_mv_dir = s->mv_dir;
5403 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5404 ff_h263_update_motion_val(s);
5406 MPV_decode_mb(s, s->block);
5409 /* clean the MV table in IPS frames for direct mode in B frames */
5410 if(s->mb_intra /* && I,P,S_TYPE */){
5411 s->p_mv_table[xy][0]=0;
5412 s->p_mv_table[xy][1]=0;
5415 if(s->flags&CODEC_FLAG_PSNR){
5419 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5420 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5422 s->current_picture.error[0] += sse(
5423 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5424 s->dest[0], w, h, s->linesize);
5425 s->current_picture.error[1] += sse(
5426 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5427 s->dest[1], w>>1, h>>1, s->uvlinesize);
5428 s->current_picture.error[2] += sse(
5429 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5430 s->dest[2], w>>1, h>>1, s->uvlinesize);
5433 if(s->out_format == FMT_H263)
5434 ff_h263_loop_filter(s);
5436 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5440 //not beautiful here but we must write it before flushing so it has to be here
5441 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5442 msmpeg4_encode_ext_header(s);
5446 /* Send the last GOB if RTP */
5447 if (s->avctx->rtp_callback) {
5448 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5449 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5450 /* Call the RTP callback to send the last GOB */
5452 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5458 #define MERGE(field) dst->field += src->field; src->field=0
5459 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5460 MERGE(me.scene_change_score);
5461 MERGE(me.mc_mb_var_sum_temp);
5462 MERGE(me.mb_var_sum_temp);
5465 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5468 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5469 MERGE(dct_count[1]);
5479 MERGE(padding_bug_score);
5480 MERGE(current_picture.error[0]);
5481 MERGE(current_picture.error[1]);
5482 MERGE(current_picture.error[2]);
5484 if(dst->avctx->noise_reduction){
5485 for(i=0; i<64; i++){
5486 MERGE(dct_error_sum[0][i]);
5487 MERGE(dct_error_sum[1][i]);
5491 assert(put_bits_count(&src->pb) % 8 ==0);
5492 assert(put_bits_count(&dst->pb) % 8 ==0);
5493 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5494 flush_put_bits(&dst->pb);
5497 static int estimate_qp(MpegEncContext *s, int dry_run){
5498 if (s->next_lambda){
5499 s->current_picture_ptr->quality=
5500 s->current_picture.quality = s->next_lambda;
5501 if(!dry_run) s->next_lambda= 0;
5502 } else if (!s->fixed_qscale) {
5503 s->current_picture_ptr->quality=
5504 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
5505 if (s->current_picture.quality < 0)
5509 if(s->adaptive_quant){
5510 switch(s->codec_id){
5511 case CODEC_ID_MPEG4:
5512 ff_clean_mpeg4_qscales(s);
5515 case CODEC_ID_H263P:
5517 ff_clean_h263_qscales(s);
5521 s->lambda= s->lambda_table[0];
5524 s->lambda= s->current_picture.quality;
5525 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5530 static int encode_picture(MpegEncContext *s, int picture_number)
5535 s->picture_number = picture_number;
5537 /* Reset the average MB variance */
5538 s->me.mb_var_sum_temp =
5539 s->me.mc_mb_var_sum_temp = 0;
5541 /* we need to initialize some time vars before we can encode b-frames */
5542 // RAL: Condition added for MPEG1VIDEO
5543 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5544 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5546 s->me.scene_change_score=0;
5548 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5550 if(s->pict_type==I_TYPE){
5551 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5552 else s->no_rounding=0;
5553 }else if(s->pict_type!=B_TYPE){
5554 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5555 s->no_rounding ^= 1;
5558 if(s->flags & CODEC_FLAG_PASS2){
5559 if (estimate_qp(s,1) < 0)
5561 ff_get_2pass_fcode(s);
5562 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
5563 if(s->pict_type==B_TYPE)
5564 s->lambda= s->last_lambda_for[s->pict_type];
5566 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
5570 s->mb_intra=0; //for the rate distortion & bit compare functions
5571 for(i=1; i<s->avctx->thread_count; i++){
5572 ff_update_duplicate_context(s->thread_context[i], s);
5577 /* Estimate motion for every MB */
5578 if(s->pict_type != I_TYPE){
5579 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5580 s->lambda2= (s->lambda2* s->avctx->me_penalty_compensation + 128)>>8;
5581 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5582 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5583 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5587 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5588 }else /* if(s->pict_type == I_TYPE) */{
5590 for(i=0; i<s->mb_stride*s->mb_height; i++)
5591 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5593 if(!s->fixed_qscale){
5594 /* finding spatial complexity for I-frame rate control */
5595 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5598 for(i=1; i<s->avctx->thread_count; i++){
5599 merge_context_after_me(s, s->thread_context[i]);
5601 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5602 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5605 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5606 s->pict_type= I_TYPE;
5607 for(i=0; i<s->mb_stride*s->mb_height; i++)
5608 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5609 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5613 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5614 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5616 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5618 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5619 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5620 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5623 ff_fix_long_p_mvs(s);
5624 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5625 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5629 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5630 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5635 if(s->pict_type==B_TYPE){
5638 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5639 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5640 s->f_code = FFMAX(a, b);
5642 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5643 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5644 s->b_code = FFMAX(a, b);
5646 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5647 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5648 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5649 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5650 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5652 for(dir=0; dir<2; dir++){
5655 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5656 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5657 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5658 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5666 if (estimate_qp(s, 0) < 0)
5669 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5670 s->qscale= 3; //reduce clipping problems
5672 if (s->out_format == FMT_MJPEG) {
5673 /* for mjpeg, we do include qscale in the matrix */
5674 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5676 int j= s->dsp.idct_permutation[i];
5678 s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5680 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5681 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5685 //FIXME var duplication
5686 s->current_picture_ptr->key_frame=
5687 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5688 s->current_picture_ptr->pict_type=
5689 s->current_picture.pict_type= s->pict_type;
5691 if(s->current_picture.key_frame)
5692 s->picture_in_gop_number=0;
5694 s->last_bits= put_bits_count(&s->pb);
5695 switch(s->out_format) {
5697 mjpeg_picture_header(s);
5699 #ifdef CONFIG_H261_ENCODER
5701 ff_h261_encode_picture_header(s, picture_number);
5705 if (s->codec_id == CODEC_ID_WMV2)
5706 ff_wmv2_encode_picture_header(s, picture_number);
5707 else if (s->h263_msmpeg4)
5708 msmpeg4_encode_picture_header(s, picture_number);
5709 else if (s->h263_pred)
5710 mpeg4_encode_picture_header(s, picture_number);
5711 #ifdef CONFIG_RV10_ENCODER
5712 else if (s->codec_id == CODEC_ID_RV10)
5713 rv10_encode_picture_header(s, picture_number);
5715 #ifdef CONFIG_RV20_ENCODER
5716 else if (s->codec_id == CODEC_ID_RV20)
5717 rv20_encode_picture_header(s, picture_number);
5719 else if (s->codec_id == CODEC_ID_FLV1)
5720 ff_flv_encode_picture_header(s, picture_number);
5722 h263_encode_picture_header(s, picture_number);
5725 mpeg1_encode_picture_header(s, picture_number);
5732 bits= put_bits_count(&s->pb);
5733 s->header_bits= bits - s->last_bits;
5735 for(i=1; i<s->avctx->thread_count; i++){
5736 update_duplicate_context_after_me(s->thread_context[i], s);
5738 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5739 for(i=1; i<s->avctx->thread_count; i++){
5740 merge_context_after_encode(s, s->thread_context[i]);
5746 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5747 const int intra= s->mb_intra;
5750 s->dct_count[intra]++;
5752 for(i=0; i<64; i++){
5753 int level= block[i];
5757 s->dct_error_sum[intra][i] += level;
5758 level -= s->dct_offset[intra][i];
5759 if(level<0) level=0;
5761 s->dct_error_sum[intra][i] -= level;
5762 level += s->dct_offset[intra][i];
5763 if(level>0) level=0;
5770 static int dct_quantize_trellis_c(MpegEncContext *s,
5771 DCTELEM *block, int n,
5772 int qscale, int *overflow){
5774 const uint8_t *scantable= s->intra_scantable.scantable;
5775 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5777 unsigned int threshold1, threshold2;
5789 int coeff_count[64];
5790 int qmul, qadd, start_i, last_non_zero, i, dc;
5791 const int esc_length= s->ac_esc_length;
5793 uint8_t * last_length;
5794 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5796 s->dsp.fdct (block);
5798 if(s->dct_error_sum)
5799 s->denoise_dct(s, block);
5801 qadd= ((qscale-1)|1)*8;
5812 /* For AIC we skip quant/dequant of INTRADC */
5817 /* note: block[0] is assumed to be positive */
5818 block[0] = (block[0] + (q >> 1)) / q;
5821 qmat = s->q_intra_matrix[qscale];
5822 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5823 bias= 1<<(QMAT_SHIFT-1);
5824 length = s->intra_ac_vlc_length;
5825 last_length= s->intra_ac_vlc_last_length;
5829 qmat = s->q_inter_matrix[qscale];
5830 length = s->inter_ac_vlc_length;
5831 last_length= s->inter_ac_vlc_last_length;
5835 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5836 threshold2= (threshold1<<1);
5838 for(i=63; i>=start_i; i--) {
5839 const int j = scantable[i];
5840 int level = block[j] * qmat[j];
5842 if(((unsigned)(level+threshold1))>threshold2){
5848 for(i=start_i; i<=last_non_zero; i++) {
5849 const int j = scantable[i];
5850 int level = block[j] * qmat[j];
5852 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5853 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5854 if(((unsigned)(level+threshold1))>threshold2){
5856 level= (bias + level)>>QMAT_SHIFT;
5858 coeff[1][i]= level-1;
5859 // coeff[2][k]= level-2;
5861 level= (bias - level)>>QMAT_SHIFT;
5862 coeff[0][i]= -level;
5863 coeff[1][i]= -level+1;
5864 // coeff[2][k]= -level+2;
5866 coeff_count[i]= FFMIN(level, 2);
5867 assert(coeff_count[i]);
5870 coeff[0][i]= (level>>31)|1;
5875 *overflow= s->max_qcoeff < max; //overflow might have happened
5877 if(last_non_zero < start_i){
5878 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5879 return last_non_zero;
5882 score_tab[start_i]= 0;
5883 survivor[0]= start_i;
5886 for(i=start_i; i<=last_non_zero; i++){
5888 const int dct_coeff= ABS(block[ scantable[i] ]);
5889 const int zero_distoration= dct_coeff*dct_coeff;
5890 int best_score=256*256*256*120;
5891 for(level_index=0; level_index < coeff_count[i]; level_index++){
5893 int level= coeff[level_index][i];
5894 const int alevel= ABS(level);
5899 if(s->out_format == FMT_H263){
5900 unquant_coeff= alevel*qmul + qadd;
5902 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5904 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5905 unquant_coeff = (unquant_coeff - 1) | 1;
5907 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5908 unquant_coeff = (unquant_coeff - 1) | 1;
5913 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5915 if((level&(~127)) == 0){
5916 for(j=survivor_count-1; j>=0; j--){
5917 int run= i - survivor[j];
5918 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5919 score += score_tab[i-run];
5921 if(score < best_score){
5924 level_tab[i+1]= level-64;
5928 if(s->out_format == FMT_H263){
5929 for(j=survivor_count-1; j>=0; j--){
5930 int run= i - survivor[j];
5931 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5932 score += score_tab[i-run];
5933 if(score < last_score){
5936 last_level= level-64;
5942 distoration += esc_length*lambda;
5943 for(j=survivor_count-1; j>=0; j--){
5944 int run= i - survivor[j];
5945 int score= distoration + score_tab[i-run];
5947 if(score < best_score){
5950 level_tab[i+1]= level-64;
5954 if(s->out_format == FMT_H263){
5955 for(j=survivor_count-1; j>=0; j--){
5956 int run= i - survivor[j];
5957 int score= distoration + score_tab[i-run];
5958 if(score < last_score){
5961 last_level= level-64;
5969 score_tab[i+1]= best_score;
5971 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5972 if(last_non_zero <= 27){
5973 for(; survivor_count; survivor_count--){
5974 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5978 for(; survivor_count; survivor_count--){
5979 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5984 survivor[ survivor_count++ ]= i+1;
5987 if(s->out_format != FMT_H263){
5988 last_score= 256*256*256*120;
5989 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5990 int score= score_tab[i];
5991 if(i) score += lambda*2; //FIXME exacter?
5993 if(score < last_score){
5996 last_level= level_tab[i];
5997 last_run= run_tab[i];
6002 s->coded_score[n] = last_score;
6005 last_non_zero= last_i - 1;
6006 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
6008 if(last_non_zero < start_i)
6009 return last_non_zero;
6011 if(last_non_zero == 0 && start_i == 0){
6013 int best_score= dc * dc;
6015 for(i=0; i<coeff_count[0]; i++){
6016 int level= coeff[i][0];
6017 int alevel= ABS(level);
6018 int unquant_coeff, score, distortion;
6020 if(s->out_format == FMT_H263){
6021 unquant_coeff= (alevel*qmul + qadd)>>3;
6023 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
6024 unquant_coeff = (unquant_coeff - 1) | 1;
6026 unquant_coeff = (unquant_coeff + 4) >> 3;
6027 unquant_coeff<<= 3 + 3;
6029 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
6031 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
6032 else score= distortion + esc_length*lambda;
6034 if(score < best_score){
6036 best_level= level - 64;
6039 block[0]= best_level;
6040 s->coded_score[n] = best_score - dc*dc;
6041 if(best_level == 0) return -1;
6042 else return last_non_zero;
6048 block[ perm_scantable[last_non_zero] ]= last_level;
6051 for(; i>start_i; i -= run_tab[i] + 1){
6052 block[ perm_scantable[i-1] ]= level_tab[i];
6055 return last_non_zero;
6058 //#define REFINE_STATS 1
6059 static int16_t basis[64][64];
6061 static void build_basis(uint8_t *perm){
6068 double s= 0.25*(1<<BASIS_SHIFT);
6070 int perm_index= perm[index];
6071 if(i==0) s*= sqrt(0.5);
6072 if(j==0) s*= sqrt(0.5);
6073 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)));
6080 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
6081 DCTELEM *block, int16_t *weight, DCTELEM *orig,
6084 DECLARE_ALIGNED_16(DCTELEM, d1[64]);
6086 const uint8_t *scantable= s->intra_scantable.scantable;
6087 const uint8_t *perm_scantable= s->intra_scantable.permutated;
6088 // unsigned int threshold1, threshold2;
6093 int qmul, qadd, start_i, last_non_zero, i, dc;
6095 uint8_t * last_length;
6097 int rle_index, run, q, sum;
6100 static int after_last=0;
6101 static int to_zero=0;
6102 static int from_zero=0;
6105 static int messed_sign=0;
6108 if(basis[0][0] == 0)
6109 build_basis(s->dsp.idct_permutation);
6120 /* For AIC we skip quant/dequant of INTRADC */
6124 q <<= RECON_SHIFT-3;
6125 /* note: block[0] is assumed to be positive */
6127 // block[0] = (block[0] + (q >> 1)) / q;
6129 qmat = s->q_intra_matrix[qscale];
6130 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
6131 // bias= 1<<(QMAT_SHIFT-1);
6132 length = s->intra_ac_vlc_length;
6133 last_length= s->intra_ac_vlc_last_length;
6137 qmat = s->q_inter_matrix[qscale];
6138 length = s->inter_ac_vlc_length;
6139 last_length= s->inter_ac_vlc_last_length;
6141 last_non_zero = s->block_last_index[n];
6146 dc += (1<<(RECON_SHIFT-1));
6147 for(i=0; i<64; i++){
6148 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
6151 STOP_TIMER("memset rem[]")}
6154 for(i=0; i<64; i++){
6159 w= ABS(weight[i]) + qns*one;
6160 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
6163 // w=weight[i] = (63*qns + (w/2)) / w;
6169 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
6175 for(i=start_i; i<=last_non_zero; i++){
6176 int j= perm_scantable[i];
6177 const int level= block[j];
6181 if(level<0) coeff= qmul*level - qadd;
6182 else coeff= qmul*level + qadd;
6183 run_tab[rle_index++]=run;
6186 s->dsp.add_8x8basis(rem, basis[j], coeff);
6192 if(last_non_zero>0){
6193 STOP_TIMER("init rem[]")
6200 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
6203 int run2, best_unquant_change=0, analyze_gradient;
6207 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
6209 if(analyze_gradient){
6213 for(i=0; i<64; i++){
6216 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
6219 STOP_TIMER("rem*w*w")}
6229 const int level= block[0];
6230 int change, old_coeff;
6232 assert(s->mb_intra);
6236 for(change=-1; change<=1; change+=2){
6237 int new_level= level + change;
6238 int score, new_coeff;
6240 new_coeff= q*new_level;
6241 if(new_coeff >= 2048 || new_coeff < 0)
6244 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
6245 if(score<best_score){
6248 best_change= change;
6249 best_unquant_change= new_coeff - old_coeff;
6256 run2= run_tab[rle_index++];
6260 for(i=start_i; i<64; i++){
6261 int j= perm_scantable[i];
6262 const int level= block[j];
6263 int change, old_coeff;
6265 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
6269 if(level<0) old_coeff= qmul*level - qadd;
6270 else old_coeff= qmul*level + qadd;
6271 run2= run_tab[rle_index++]; //FIXME ! maybe after last
6275 assert(run2>=0 || i >= last_non_zero );
6278 for(change=-1; change<=1; change+=2){
6279 int new_level= level + change;
6280 int score, new_coeff, unquant_change;
6283 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
6287 if(new_level<0) new_coeff= qmul*new_level - qadd;
6288 else new_coeff= qmul*new_level + qadd;
6289 if(new_coeff >= 2048 || new_coeff <= -2048)
6291 //FIXME check for overflow
6294 if(level < 63 && level > -63){
6295 if(i < last_non_zero)
6296 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6297 - length[UNI_AC_ENC_INDEX(run, level+64)];
6299 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6300 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6303 assert(ABS(new_level)==1);
6305 if(analyze_gradient){
6306 int g= d1[ scantable[i] ];
6307 if(g && (g^new_level) >= 0)
6311 if(i < last_non_zero){
6312 int next_i= i + run2 + 1;
6313 int next_level= block[ perm_scantable[next_i] ] + 64;
6315 if(next_level&(~127))
6318 if(next_i < last_non_zero)
6319 score += length[UNI_AC_ENC_INDEX(run, 65)]
6320 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6321 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6323 score += length[UNI_AC_ENC_INDEX(run, 65)]
6324 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6325 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6327 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6329 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6330 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6336 assert(ABS(level)==1);
6338 if(i < last_non_zero){
6339 int next_i= i + run2 + 1;
6340 int next_level= block[ perm_scantable[next_i] ] + 64;
6342 if(next_level&(~127))
6345 if(next_i < last_non_zero)
6346 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6347 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6348 - length[UNI_AC_ENC_INDEX(run, 65)];
6350 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6351 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6352 - length[UNI_AC_ENC_INDEX(run, 65)];
6354 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6356 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6357 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6364 unquant_change= new_coeff - old_coeff;
6365 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6367 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6368 if(score<best_score){
6371 best_change= change;
6372 best_unquant_change= unquant_change;
6376 prev_level= level + 64;
6377 if(prev_level&(~127))
6386 STOP_TIMER("iterative step")}
6390 int j= perm_scantable[ best_coeff ];
6392 block[j] += best_change;
6394 if(best_coeff > last_non_zero){
6395 last_non_zero= best_coeff;
6403 if(block[j] - best_change){
6404 if(ABS(block[j]) > ABS(block[j] - best_change)){
6416 for(; last_non_zero>=start_i; last_non_zero--){
6417 if(block[perm_scantable[last_non_zero]])
6423 if(256*256*256*64 % count == 0){
6424 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);
6429 for(i=start_i; i<=last_non_zero; i++){
6430 int j= perm_scantable[i];
6431 const int level= block[j];
6434 run_tab[rle_index++]=run;
6441 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6447 if(last_non_zero>0){
6448 STOP_TIMER("iterative search")
6453 return last_non_zero;
6456 static int dct_quantize_c(MpegEncContext *s,
6457 DCTELEM *block, int n,
6458 int qscale, int *overflow)
6460 int i, j, level, last_non_zero, q, start_i;
6462 const uint8_t *scantable= s->intra_scantable.scantable;
6465 unsigned int threshold1, threshold2;
6467 s->dsp.fdct (block);
6469 if(s->dct_error_sum)
6470 s->denoise_dct(s, block);
6480 /* For AIC we skip quant/dequant of INTRADC */
6483 /* note: block[0] is assumed to be positive */
6484 block[0] = (block[0] + (q >> 1)) / q;
6487 qmat = s->q_intra_matrix[qscale];
6488 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6492 qmat = s->q_inter_matrix[qscale];
6493 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6495 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6496 threshold2= (threshold1<<1);
6497 for(i=63;i>=start_i;i--) {
6499 level = block[j] * qmat[j];
6501 if(((unsigned)(level+threshold1))>threshold2){
6508 for(i=start_i; i<=last_non_zero; i++) {
6510 level = block[j] * qmat[j];
6512 // if( bias+level >= (1<<QMAT_SHIFT)
6513 // || bias-level >= (1<<QMAT_SHIFT)){
6514 if(((unsigned)(level+threshold1))>threshold2){
6516 level= (bias + level)>>QMAT_SHIFT;
6519 level= (bias - level)>>QMAT_SHIFT;
6527 *overflow= s->max_qcoeff < max; //overflow might have happened
6529 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6530 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6531 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6533 return last_non_zero;
6536 #endif //CONFIG_ENCODERS
6538 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6539 DCTELEM *block, int n, int qscale)
6541 int i, level, nCoeffs;
6542 const uint16_t *quant_matrix;
6544 nCoeffs= s->block_last_index[n];
6547 block[0] = block[0] * s->y_dc_scale;
6549 block[0] = block[0] * s->c_dc_scale;
6550 /* XXX: only mpeg1 */
6551 quant_matrix = s->intra_matrix;
6552 for(i=1;i<=nCoeffs;i++) {
6553 int j= s->intra_scantable.permutated[i];
6558 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6559 level = (level - 1) | 1;
6562 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6563 level = (level - 1) | 1;
6570 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6571 DCTELEM *block, int n, int qscale)
6573 int i, level, nCoeffs;
6574 const uint16_t *quant_matrix;
6576 nCoeffs= s->block_last_index[n];
6578 quant_matrix = s->inter_matrix;
6579 for(i=0; i<=nCoeffs; i++) {
6580 int j= s->intra_scantable.permutated[i];
6585 level = (((level << 1) + 1) * qscale *
6586 ((int) (quant_matrix[j]))) >> 4;
6587 level = (level - 1) | 1;
6590 level = (((level << 1) + 1) * qscale *
6591 ((int) (quant_matrix[j]))) >> 4;
6592 level = (level - 1) | 1;
6599 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6600 DCTELEM *block, int n, int qscale)
6602 int i, level, nCoeffs;
6603 const uint16_t *quant_matrix;
6605 if(s->alternate_scan) nCoeffs= 63;
6606 else nCoeffs= s->block_last_index[n];
6609 block[0] = block[0] * s->y_dc_scale;
6611 block[0] = block[0] * s->c_dc_scale;
6612 quant_matrix = s->intra_matrix;
6613 for(i=1;i<=nCoeffs;i++) {
6614 int j= s->intra_scantable.permutated[i];
6619 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6622 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6629 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
6630 DCTELEM *block, int n, int qscale)
6632 int i, level, nCoeffs;
6633 const uint16_t *quant_matrix;
6636 if(s->alternate_scan) nCoeffs= 63;
6637 else nCoeffs= s->block_last_index[n];
6640 block[0] = block[0] * s->y_dc_scale;
6642 block[0] = block[0] * s->c_dc_scale;
6643 quant_matrix = s->intra_matrix;
6644 for(i=1;i<=nCoeffs;i++) {
6645 int j= s->intra_scantable.permutated[i];
6650 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6653 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6662 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6663 DCTELEM *block, int n, int qscale)
6665 int i, level, nCoeffs;
6666 const uint16_t *quant_matrix;
6669 if(s->alternate_scan) nCoeffs= 63;
6670 else nCoeffs= s->block_last_index[n];
6672 quant_matrix = s->inter_matrix;
6673 for(i=0; i<=nCoeffs; i++) {
6674 int j= s->intra_scantable.permutated[i];
6679 level = (((level << 1) + 1) * qscale *
6680 ((int) (quant_matrix[j]))) >> 4;
6683 level = (((level << 1) + 1) * qscale *
6684 ((int) (quant_matrix[j]))) >> 4;
6693 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6694 DCTELEM *block, int n, int qscale)
6696 int i, level, qmul, qadd;
6699 assert(s->block_last_index[n]>=0);
6705 block[0] = block[0] * s->y_dc_scale;
6707 block[0] = block[0] * s->c_dc_scale;
6708 qadd = (qscale - 1) | 1;
6715 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6717 for(i=1; i<=nCoeffs; i++) {
6721 level = level * qmul - qadd;
6723 level = level * qmul + qadd;
6730 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6731 DCTELEM *block, int n, int qscale)
6733 int i, level, qmul, qadd;
6736 assert(s->block_last_index[n]>=0);
6738 qadd = (qscale - 1) | 1;
6741 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6743 for(i=0; i<=nCoeffs; i++) {
6747 level = level * qmul - qadd;
6749 level = level * qmul + qadd;
6756 #ifdef CONFIG_ENCODERS
6757 AVCodec h263_encoder = {
6761 sizeof(MpegEncContext),
6765 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6768 AVCodec h263p_encoder = {
6772 sizeof(MpegEncContext),
6776 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6779 AVCodec flv_encoder = {
6783 sizeof(MpegEncContext),
6787 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6790 AVCodec rv10_encoder = {
6794 sizeof(MpegEncContext),
6798 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6801 AVCodec rv20_encoder = {
6805 sizeof(MpegEncContext),
6809 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6812 AVCodec mpeg4_encoder = {
6816 sizeof(MpegEncContext),
6820 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6821 .capabilities= CODEC_CAP_DELAY,
6824 AVCodec msmpeg4v1_encoder = {
6828 sizeof(MpegEncContext),
6832 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6835 AVCodec msmpeg4v2_encoder = {
6839 sizeof(MpegEncContext),
6843 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6846 AVCodec msmpeg4v3_encoder = {
6850 sizeof(MpegEncContext),
6854 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6857 AVCodec wmv1_encoder = {
6861 sizeof(MpegEncContext),
6865 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6868 AVCodec mjpeg_encoder = {
6872 sizeof(MpegEncContext),
6876 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, -1},
6879 #endif //CONFIG_ENCODERS