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 "fastmemcpy.h"
41 #ifdef CONFIG_ENCODERS
42 static void encode_picture(MpegEncContext *s, int picture_number);
43 #endif //CONFIG_ENCODERS
44 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_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, int16_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 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
332 dst->pict_type = src->pict_type;
333 dst->quality = src->quality;
334 dst->coded_picture_number = src->coded_picture_number;
335 dst->display_picture_number = src->display_picture_number;
336 // dst->reference = src->reference;
338 dst->interlaced_frame = src->interlaced_frame;
339 dst->top_field_first = src->top_field_first;
341 if(s->avctx->me_threshold){
342 if(!src->motion_val[0])
343 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
345 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
346 if(!src->ref_index[0])
347 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
348 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
349 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
350 src->motion_subsample_log2, dst->motion_subsample_log2);
352 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
355 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
356 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
358 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
359 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
361 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
362 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
369 * allocates a Picture
370 * The pixels are allocated/set by calling get_buffer() if shared=0
372 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
373 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
374 const int mb_array_size= s->mb_stride*s->mb_height;
375 const int b8_array_size= s->b8_stride*s->mb_height*2;
376 const int b4_array_size= s->b4_stride*s->mb_height*4;
380 assert(pic->data[0]);
381 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
382 pic->type= FF_BUFFER_TYPE_SHARED;
386 assert(!pic->data[0]);
388 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
390 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
391 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
395 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
396 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
400 if(pic->linesize[1] != pic->linesize[2]){
401 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
405 s->linesize = pic->linesize[0];
406 s->uvlinesize= pic->linesize[1];
409 if(pic->qscale_table==NULL){
411 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
412 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
413 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
416 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
417 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
418 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
419 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
420 if(s->out_format == FMT_H264){
422 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t))
423 pic->motion_val[i]= pic->motion_val_base[i]+4;
424 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
426 pic->motion_subsample_log2= 2;
427 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
429 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
430 pic->motion_val[i]= pic->motion_val_base[i]+4;
431 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
433 pic->motion_subsample_log2= 3;
435 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
436 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
438 pic->qstride= s->mb_stride;
439 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
442 //it might be nicer if the application would keep track of these but it would require a API change
443 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
444 s->prev_pict_types[0]= s->pict_type;
445 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
446 pic->age= INT_MAX; // skipped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
449 fail: //for the CHECKED_ALLOCZ macro
454 * deallocates a picture
456 static void free_picture(MpegEncContext *s, Picture *pic){
459 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
460 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
463 av_freep(&pic->mb_var);
464 av_freep(&pic->mc_mb_var);
465 av_freep(&pic->mb_mean);
466 av_freep(&pic->mbskip_table);
467 av_freep(&pic->qscale_table);
468 av_freep(&pic->mb_type_base);
469 av_freep(&pic->dct_coeff);
470 av_freep(&pic->pan_scan);
473 av_freep(&pic->motion_val_base[i]);
474 av_freep(&pic->ref_index[i]);
477 if(pic->type == FF_BUFFER_TYPE_SHARED){
486 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
489 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
490 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*21*2); //(width + edge + align)*interlaced*MBsize*tolerance
491 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
493 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
494 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
495 s->rd_scratchpad= s->me.scratchpad;
496 s->b_scratchpad= s->me.scratchpad;
497 s->obmc_scratchpad= s->me.scratchpad + 16;
499 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
500 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
501 if(s->avctx->noise_reduction){
502 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
505 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
506 s->block= s->blocks[0];
509 s->pblocks[i] = (short *)(&s->block[i]);
513 return -1; //free() through MPV_common_end()
516 static void free_duplicate_context(MpegEncContext *s){
519 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
520 av_freep(&s->me.scratchpad);
523 s->obmc_scratchpad= NULL;
525 av_freep(&s->dct_error_sum);
526 av_freep(&s->me.map);
527 av_freep(&s->me.score_map);
528 av_freep(&s->blocks);
532 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
533 #define COPY(a) bak->a= src->a
534 COPY(allocated_edge_emu_buffer);
535 COPY(edge_emu_buffer);
539 COPY(obmc_scratchpad);
546 COPY(me.map_generation);
554 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
557 //FIXME copy only needed parts
559 backup_duplicate_context(&bak, dst);
560 memcpy(dst, src, sizeof(MpegEncContext));
561 backup_duplicate_context(dst, &bak);
563 dst->pblocks[i] = (short *)(&dst->block[i]);
565 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
568 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
569 #define COPY(a) dst->a= src->a
571 COPY(current_picture);
577 COPY(picture_in_gop_number);
578 COPY(gop_picture_number);
579 COPY(frame_pred_frame_dct); //FIXME don't set in encode_header
580 COPY(progressive_frame); //FIXME don't set in encode_header
581 COPY(partitioned_frame); //FIXME don't set in encode_header
586 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
587 * the changed fields will not depend upon the prior state of the MpegEncContext.
589 static void MPV_common_defaults(MpegEncContext *s){
591 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
592 s->chroma_qscale_table= ff_default_chroma_qscale_table;
593 s->progressive_frame= 1;
594 s->progressive_sequence= 1;
595 s->picture_structure= PICT_FRAME;
597 s->coded_picture_number = 0;
598 s->picture_number = 0;
599 s->input_picture_number = 0;
601 s->picture_in_gop_number = 0;
608 * sets the given MpegEncContext to defaults for decoding.
609 * the changed fields will not depend upon the prior state of the MpegEncContext.
611 void MPV_decode_defaults(MpegEncContext *s){
612 MPV_common_defaults(s);
616 * sets the given MpegEncContext to defaults for encoding.
617 * the changed fields will not depend upon the prior state of the MpegEncContext.
620 #ifdef CONFIG_ENCODERS
621 static void MPV_encode_defaults(MpegEncContext *s){
624 MPV_common_defaults(s);
630 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
631 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
633 for(i=-16; i<16; i++){
634 default_fcode_tab[i + MAX_MV]= 1;
637 s->me.mv_penalty= default_mv_penalty;
638 s->fcode_tab= default_fcode_tab;
640 #endif //CONFIG_ENCODERS
643 * init common structure for both encoder and decoder.
644 * this assumes that some variables like width/height are already set
646 int MPV_common_init(MpegEncContext *s)
648 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
650 s->mb_height = (s->height + 15) / 16;
652 if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
653 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
657 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
660 dsputil_init(&s->dsp, s->avctx);
663 s->flags= s->avctx->flags;
664 s->flags2= s->avctx->flags2;
666 s->mb_width = (s->width + 15) / 16;
667 s->mb_stride = s->mb_width + 1;
668 s->b8_stride = s->mb_width*2 + 1;
669 s->b4_stride = s->mb_width*4 + 1;
670 mb_array_size= s->mb_height * s->mb_stride;
671 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
673 /* set chroma shifts */
674 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
675 &(s->chroma_y_shift) );
677 /* set default edge pos, will be overriden in decode_header if needed */
678 s->h_edge_pos= s->mb_width*16;
679 s->v_edge_pos= s->mb_height*16;
681 s->mb_num = s->mb_width * s->mb_height;
686 s->block_wrap[3]= s->b8_stride;
688 s->block_wrap[5]= s->mb_stride;
690 y_size = s->b8_stride * (2 * s->mb_height + 1);
691 c_size = s->mb_stride * (s->mb_height + 1);
692 yc_size = y_size + 2 * c_size;
694 /* convert fourcc to upper case */
695 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
696 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
697 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
698 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
700 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
701 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
702 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
703 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
705 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
707 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
708 for(y=0; y<s->mb_height; y++){
709 for(x=0; x<s->mb_width; x++){
710 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
713 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
716 /* Allocate MV tables */
717 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
718 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
719 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
720 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
721 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
722 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
723 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
724 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
725 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
726 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
727 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
728 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
730 if(s->msmpeg4_version){
731 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
733 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
735 /* Allocate MB type table */
736 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
738 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
740 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
741 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
742 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
743 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
744 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
745 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
747 if(s->avctx->noise_reduction){
748 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
751 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
753 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
755 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
756 /* interlaced direct mode decoding tables */
761 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
762 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
764 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
765 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
766 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
768 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
771 if (s->out_format == FMT_H263) {
773 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
774 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
775 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
776 s->ac_val[2] = s->ac_val[1] + c_size;
779 CHECKED_ALLOCZ(s->coded_block_base, y_size);
780 s->coded_block= s->coded_block_base + s->b8_stride + 1;
782 /* cbp, ac_pred, pred_dir */
783 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
784 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
787 if (s->h263_pred || s->h263_plus || !s->encoding) {
789 //MN: we need these for error resilience of intra-frames
790 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
791 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
792 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
793 s->dc_val[2] = s->dc_val[1] + c_size;
794 for(i=0;i<yc_size;i++)
795 s->dc_val_base[i] = 1024;
798 /* which mb is a intra block */
799 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
800 memset(s->mbintra_table, 1, mb_array_size);
802 /* init macroblock skip table */
803 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
804 //Note the +1 is for a quicker mpeg4 slice_end detection
805 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
807 s->parse_context.state= -1;
808 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
809 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
810 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
811 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
814 s->context_initialized = 1;
816 s->thread_context[0]= s;
817 for(i=1; i<s->avctx->thread_count; i++){
818 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
819 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
822 for(i=0; i<s->avctx->thread_count; i++){
823 if(init_duplicate_context(s->thread_context[i], s) < 0)
825 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
826 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
835 /* init common structure for both encoder and decoder */
836 void MPV_common_end(MpegEncContext *s)
840 for(i=0; i<s->avctx->thread_count; i++){
841 free_duplicate_context(s->thread_context[i]);
843 for(i=1; i<s->avctx->thread_count; i++){
844 av_freep(&s->thread_context[i]);
847 av_freep(&s->parse_context.buffer);
848 s->parse_context.buffer_size=0;
850 av_freep(&s->mb_type);
851 av_freep(&s->p_mv_table_base);
852 av_freep(&s->b_forw_mv_table_base);
853 av_freep(&s->b_back_mv_table_base);
854 av_freep(&s->b_bidir_forw_mv_table_base);
855 av_freep(&s->b_bidir_back_mv_table_base);
856 av_freep(&s->b_direct_mv_table_base);
858 s->b_forw_mv_table= NULL;
859 s->b_back_mv_table= NULL;
860 s->b_bidir_forw_mv_table= NULL;
861 s->b_bidir_back_mv_table= NULL;
862 s->b_direct_mv_table= NULL;
866 av_freep(&s->b_field_mv_table_base[i][j][k]);
867 s->b_field_mv_table[i][j][k]=NULL;
869 av_freep(&s->b_field_select_table[i][j]);
870 av_freep(&s->p_field_mv_table_base[i][j]);
871 s->p_field_mv_table[i][j]=NULL;
873 av_freep(&s->p_field_select_table[i]);
876 av_freep(&s->dc_val_base);
877 av_freep(&s->ac_val_base);
878 av_freep(&s->coded_block_base);
879 av_freep(&s->mbintra_table);
880 av_freep(&s->cbp_table);
881 av_freep(&s->pred_dir_table);
883 av_freep(&s->mbskip_table);
884 av_freep(&s->prev_pict_types);
885 av_freep(&s->bitstream_buffer);
886 s->allocated_bitstream_buffer_size=0;
888 av_freep(&s->avctx->stats_out);
889 av_freep(&s->ac_stats);
890 av_freep(&s->error_status_table);
891 av_freep(&s->mb_index2xy);
892 av_freep(&s->lambda_table);
893 av_freep(&s->q_intra_matrix);
894 av_freep(&s->q_inter_matrix);
895 av_freep(&s->q_intra_matrix16);
896 av_freep(&s->q_inter_matrix16);
897 av_freep(&s->input_picture);
898 av_freep(&s->reordered_input_picture);
899 av_freep(&s->dct_offset);
902 for(i=0; i<MAX_PICTURE_COUNT; i++){
903 free_picture(s, &s->picture[i]);
906 av_freep(&s->picture);
907 s->context_initialized = 0;
910 s->current_picture_ptr= NULL;
911 s->linesize= s->uvlinesize= 0;
914 av_freep(&s->visualization_buffer[i]);
916 avcodec_default_free_buffers(s->avctx);
919 #ifdef CONFIG_ENCODERS
921 /* init video encoder */
922 int MPV_encode_init(AVCodecContext *avctx)
924 MpegEncContext *s = avctx->priv_data;
926 int chroma_h_shift, chroma_v_shift;
928 MPV_encode_defaults(s);
930 switch (avctx->codec_id) {
931 case CODEC_ID_MPEG2VIDEO:
932 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P){
933 av_log(avctx, AV_LOG_ERROR, "only YUV420 and YUV422 are supported\n");
939 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && (avctx->pix_fmt != PIX_FMT_YUV420P || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
940 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
945 if(avctx->pix_fmt != PIX_FMT_YUV420P){
946 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
951 switch (avctx->pix_fmt) {
952 case PIX_FMT_YUVJ422P:
953 case PIX_FMT_YUV422P:
954 s->chroma_format = CHROMA_422;
956 case PIX_FMT_YUVJ420P:
957 case PIX_FMT_YUV420P:
959 s->chroma_format = CHROMA_420;
963 s->bit_rate = avctx->bit_rate;
964 s->width = avctx->width;
965 s->height = avctx->height;
966 if(avctx->gop_size > 600 && avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){
967 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
970 s->gop_size = avctx->gop_size;
972 s->flags= avctx->flags;
973 s->flags2= avctx->flags2;
974 s->max_b_frames= avctx->max_b_frames;
975 s->codec_id= avctx->codec->id;
976 s->luma_elim_threshold = avctx->luma_elim_threshold;
977 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
978 s->strict_std_compliance= avctx->strict_std_compliance;
979 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
980 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
981 s->mpeg_quant= avctx->mpeg_quant;
982 s->rtp_mode= !!avctx->rtp_payload_size;
983 s->intra_dc_precision= avctx->intra_dc_precision;
984 s->user_specified_pts = AV_NOPTS_VALUE;
986 if (s->gop_size <= 1) {
993 s->me_method = avctx->me_method;
996 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
998 s->adaptive_quant= ( s->avctx->lumi_masking
999 || s->avctx->dark_masking
1000 || s->avctx->temporal_cplx_masking
1001 || s->avctx->spatial_cplx_masking
1002 || s->avctx->p_masking
1003 || s->avctx->border_masking
1004 || (s->flags&CODEC_FLAG_QP_RD))
1005 && !s->fixed_qscale;
1007 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
1008 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
1009 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
1010 s->intra_vlc_format= !!(s->flags2 & CODEC_FLAG2_INTRA_VLC);
1012 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
1013 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
1017 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
1018 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
1021 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
1022 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
1026 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
1027 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
1031 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
1032 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
1033 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
1035 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");
1038 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
1039 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
1040 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
1044 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
1045 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
1049 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
1050 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
1054 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1055 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1059 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1060 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1064 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1065 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1069 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1070 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1071 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1075 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1076 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
1080 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1081 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1085 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1086 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1090 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1091 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1095 if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){
1096 av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n");
1100 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1101 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1102 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1103 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1107 if(s->avctx->thread_count > 1)
1110 if(!avctx->time_base.den || !avctx->time_base.num){
1111 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
1115 i= (INT_MAX/2+128)>>8;
1116 if(avctx->me_threshold >= i){
1117 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
1120 if(avctx->mb_threshold >= i){
1121 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
1125 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){
1126 av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n");
1127 avctx->b_frame_strategy = 0;
1130 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
1132 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1133 avctx->time_base.den /= i;
1134 avctx->time_base.num /= i;
1138 if(s->codec_id==CODEC_ID_MJPEG){
1139 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1140 s->inter_quant_bias= 0;
1141 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1142 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1143 s->inter_quant_bias= 0;
1145 s->intra_quant_bias=0;
1146 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1149 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1150 s->intra_quant_bias= avctx->intra_quant_bias;
1151 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1152 s->inter_quant_bias= avctx->inter_quant_bias;
1154 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1156 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
1157 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
1160 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1162 switch(avctx->codec->id) {
1163 case CODEC_ID_MPEG1VIDEO:
1164 s->out_format = FMT_MPEG1;
1165 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1166 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1168 case CODEC_ID_MPEG2VIDEO:
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);
1174 case CODEC_ID_LJPEG:
1175 case CODEC_ID_JPEGLS:
1176 case CODEC_ID_MJPEG:
1177 s->out_format = FMT_MJPEG;
1178 s->intra_only = 1; /* force intra only for jpeg */
1179 s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;
1180 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1181 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1182 s->mjpeg_vsample[1] = 1;
1183 s->mjpeg_vsample[2] = 1;
1184 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1185 s->mjpeg_hsample[1] = 1;
1186 s->mjpeg_hsample[2] = 1;
1187 if (mjpeg_init(s) < 0)
1193 s->out_format = FMT_H261;
1198 if (h263_get_picture_format(s->width, s->height) == 7) {
1199 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);
1202 s->out_format = FMT_H263;
1203 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1207 case CODEC_ID_H263P:
1208 s->out_format = FMT_H263;
1211 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1212 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1213 s->modified_quant= s->h263_aic;
1214 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1215 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1216 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1217 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1218 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1221 /* These are just to be sure */
1226 s->out_format = FMT_H263;
1227 s->h263_flv = 2; /* format = 1; 11-bit codes */
1228 s->unrestricted_mv = 1;
1229 s->rtp_mode=0; /* don't allow GOB */
1234 s->out_format = FMT_H263;
1239 s->out_format = FMT_H263;
1242 s->modified_quant=1;
1246 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1248 case CODEC_ID_MPEG4:
1249 s->out_format = FMT_H263;
1251 s->unrestricted_mv = 1;
1252 s->low_delay= s->max_b_frames ? 0 : 1;
1253 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1255 case CODEC_ID_MSMPEG4V1:
1256 s->out_format = FMT_H263;
1257 s->h263_msmpeg4 = 1;
1259 s->unrestricted_mv = 1;
1260 s->msmpeg4_version= 1;
1264 case CODEC_ID_MSMPEG4V2:
1265 s->out_format = FMT_H263;
1266 s->h263_msmpeg4 = 1;
1268 s->unrestricted_mv = 1;
1269 s->msmpeg4_version= 2;
1273 case CODEC_ID_MSMPEG4V3:
1274 s->out_format = FMT_H263;
1275 s->h263_msmpeg4 = 1;
1277 s->unrestricted_mv = 1;
1278 s->msmpeg4_version= 3;
1279 s->flipflop_rounding=1;
1284 s->out_format = FMT_H263;
1285 s->h263_msmpeg4 = 1;
1287 s->unrestricted_mv = 1;
1288 s->msmpeg4_version= 4;
1289 s->flipflop_rounding=1;
1294 s->out_format = FMT_H263;
1295 s->h263_msmpeg4 = 1;
1297 s->unrestricted_mv = 1;
1298 s->msmpeg4_version= 5;
1299 s->flipflop_rounding=1;
1307 avctx->has_b_frames= !s->low_delay;
1312 if (MPV_common_init(s) < 0)
1315 if(s->modified_quant)
1316 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1317 s->progressive_frame=
1318 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1319 s->quant_precision=5;
1321 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1322 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1324 #ifdef CONFIG_H261_ENCODER
1325 if (s->out_format == FMT_H261)
1326 ff_h261_encode_init(s);
1328 if (s->out_format == FMT_H263)
1329 h263_encode_init(s);
1330 if(s->msmpeg4_version)
1331 ff_msmpeg4_encode_init(s);
1332 if (s->out_format == FMT_MPEG1)
1333 ff_mpeg1_encode_init(s);
1337 int j= s->dsp.idct_permutation[i];
1338 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1339 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1340 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1341 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1342 s->intra_matrix[j] =
1343 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1346 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1347 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1349 if(s->avctx->intra_matrix)
1350 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1351 if(s->avctx->inter_matrix)
1352 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1355 /* precompute matrix */
1356 /* for mjpeg, we do include qscale in the matrix */
1357 if (s->out_format != FMT_MJPEG) {
1358 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1359 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1360 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1361 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1364 if(ff_rate_control_init(s) < 0)
1370 int MPV_encode_end(AVCodecContext *avctx)
1372 MpegEncContext *s = avctx->priv_data;
1378 ff_rate_control_uninit(s);
1381 if (s->out_format == FMT_MJPEG)
1384 av_freep(&avctx->extradata);
1389 #endif //CONFIG_ENCODERS
1391 void init_rl(RLTable *rl, int use_static)
1393 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1394 uint8_t index_run[MAX_RUN+1];
1395 int last, run, level, start, end, i;
1397 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1398 if(use_static && rl->max_level[0])
1401 /* compute max_level[], max_run[] and index_run[] */
1402 for(last=0;last<2;last++) {
1411 memset(max_level, 0, MAX_RUN + 1);
1412 memset(max_run, 0, MAX_LEVEL + 1);
1413 memset(index_run, rl->n, MAX_RUN + 1);
1414 for(i=start;i<end;i++) {
1415 run = rl->table_run[i];
1416 level = rl->table_level[i];
1417 if (index_run[run] == rl->n)
1419 if (level > max_level[run])
1420 max_level[run] = level;
1421 if (run > max_run[level])
1422 max_run[level] = run;
1425 rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
1427 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1428 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1430 rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
1432 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1433 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1435 rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
1437 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1438 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1442 /* draw the edges of width 'w' of an image of size width, height */
1443 //FIXME check that this is ok for mpeg4 interlaced
1444 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1446 uint8_t *ptr, *last_line;
1449 last_line = buf + (height - 1) * wrap;
1451 /* top and bottom */
1452 memcpy(buf - (i + 1) * wrap, buf, width);
1453 memcpy(last_line + (i + 1) * wrap, last_line, width);
1455 /* left and right */
1457 for(i=0;i<height;i++) {
1458 memset(ptr - w, ptr[0], w);
1459 memset(ptr + width, ptr[width-1], w);
1464 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1465 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1466 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1467 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1471 int ff_find_unused_picture(MpegEncContext *s, int shared){
1475 for(i=0; i<MAX_PICTURE_COUNT; i++){
1476 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1479 for(i=0; i<MAX_PICTURE_COUNT; i++){
1480 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1482 for(i=0; i<MAX_PICTURE_COUNT; i++){
1483 if(s->picture[i].data[0]==NULL) return i;
1491 static void update_noise_reduction(MpegEncContext *s){
1494 for(intra=0; intra<2; intra++){
1495 if(s->dct_count[intra] > (1<<16)){
1496 for(i=0; i<64; i++){
1497 s->dct_error_sum[intra][i] >>=1;
1499 s->dct_count[intra] >>= 1;
1502 for(i=0; i<64; i++){
1503 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);
1509 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1511 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1517 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1519 /* mark&release old frames */
1520 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1521 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1523 /* release forgotten pictures */
1524 /* if(mpeg124/h263) */
1526 for(i=0; i<MAX_PICTURE_COUNT; i++){
1527 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1528 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1529 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1536 /* release non reference frames */
1537 for(i=0; i<MAX_PICTURE_COUNT; i++){
1538 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1539 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1543 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1544 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1546 i= ff_find_unused_picture(s, 0);
1547 pic= (AVFrame*)&s->picture[i];
1550 pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
1551 && !s->dropable ? 3 : 0;
1553 pic->coded_picture_number= s->coded_picture_number++;
1555 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1558 s->current_picture_ptr= (Picture*)pic;
1559 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1560 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1563 s->current_picture_ptr->pict_type= s->pict_type;
1564 // if(s->flags && CODEC_FLAG_QSCALE)
1565 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1566 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1568 copy_picture(&s->current_picture, s->current_picture_ptr);
1570 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1571 if (s->pict_type != B_TYPE) {
1572 s->last_picture_ptr= s->next_picture_ptr;
1574 s->next_picture_ptr= s->current_picture_ptr;
1576 /* 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,
1577 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1578 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1579 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1580 s->pict_type, s->dropable);*/
1582 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1583 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1585 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1586 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1587 assert(s->pict_type != B_TYPE); //these should have been dropped if we don't have a reference
1591 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1593 if(s->picture_structure!=PICT_FRAME){
1596 if(s->picture_structure == PICT_BOTTOM_FIELD){
1597 s->current_picture.data[i] += s->current_picture.linesize[i];
1599 s->current_picture.linesize[i] *= 2;
1600 s->last_picture.linesize[i] *=2;
1601 s->next_picture.linesize[i] *=2;
1606 s->hurry_up= s->avctx->hurry_up;
1607 s->error_resilience= avctx->error_resilience;
1609 /* set dequantizer, we can't do it during init as it might change for mpeg4
1610 and we can't do it in the header decode as init isnt called for mpeg4 there yet */
1611 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1612 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1613 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1614 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1615 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1616 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1618 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1619 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1622 if(s->dct_error_sum){
1623 assert(s->avctx->noise_reduction && s->encoding);
1625 update_noise_reduction(s);
1629 if(s->avctx->xvmc_acceleration)
1630 return XVMC_field_start(s, avctx);
1635 /* generic function for encode/decode called after a frame has been coded/decoded */
1636 void MPV_frame_end(MpegEncContext *s)
1639 /* draw edge for correct motion prediction if outside */
1641 //just to make sure that all data is rendered.
1642 if(s->avctx->xvmc_acceleration){
1646 if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1647 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1648 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1649 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1653 s->last_pict_type = s->pict_type;
1654 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1655 if(s->pict_type!=B_TYPE){
1656 s->last_non_b_pict_type= s->pict_type;
1659 /* copy back current_picture variables */
1660 for(i=0; i<MAX_PICTURE_COUNT; i++){
1661 if(s->picture[i].data[0] == s->current_picture.data[0]){
1662 s->picture[i]= s->current_picture;
1666 assert(i<MAX_PICTURE_COUNT);
1670 /* release non-reference frames */
1671 for(i=0; i<MAX_PICTURE_COUNT; i++){
1672 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1673 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1677 // clear copies, to avoid confusion
1679 memset(&s->last_picture, 0, sizeof(Picture));
1680 memset(&s->next_picture, 0, sizeof(Picture));
1681 memset(&s->current_picture, 0, sizeof(Picture));
1683 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1687 * draws an line from (ex, ey) -> (sx, sy).
1688 * @param w width of the image
1689 * @param h height of the image
1690 * @param stride stride/linesize of the image
1691 * @param color color of the arrow
1693 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1696 sx= clip(sx, 0, w-1);
1697 sy= clip(sy, 0, h-1);
1698 ex= clip(ex, 0, w-1);
1699 ey= clip(ey, 0, h-1);
1701 buf[sy*stride + sx]+= color;
1703 if(ABS(ex - sx) > ABS(ey - sy)){
1708 buf+= sx + sy*stride;
1710 f= ((ey-sy)<<16)/ex;
1711 for(x= 0; x <= ex; x++){
1714 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1715 buf[(y+1)*stride + x]+= (color* fr )>>16;
1722 buf+= sx + sy*stride;
1724 if(ey) f= ((ex-sx)<<16)/ey;
1726 for(y= 0; y <= ey; y++){
1729 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1730 buf[y*stride + x+1]+= (color* fr )>>16;;
1736 * draws an arrow from (ex, ey) -> (sx, sy).
1737 * @param w width of the image
1738 * @param h height of the image
1739 * @param stride stride/linesize of the image
1740 * @param color color of the arrow
1742 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1745 sx= clip(sx, -100, w+100);
1746 sy= clip(sy, -100, h+100);
1747 ex= clip(ex, -100, w+100);
1748 ey= clip(ey, -100, h+100);
1753 if(dx*dx + dy*dy > 3*3){
1756 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1758 //FIXME subpixel accuracy
1759 rx= ROUNDED_DIV(rx*3<<4, length);
1760 ry= ROUNDED_DIV(ry*3<<4, length);
1762 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1763 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1765 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1769 * prints debuging info for the given picture.
1771 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1773 if(!pict || !pict->mb_type) return;
1775 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1778 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1779 switch (pict->pict_type) {
1780 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1781 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1782 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1783 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1784 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1785 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1787 for(y=0; y<s->mb_height; y++){
1788 for(x=0; x<s->mb_width; x++){
1789 if(s->avctx->debug&FF_DEBUG_SKIP){
1790 int count= s->mbskip_table[x + y*s->mb_stride];
1791 if(count>9) count=9;
1792 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1794 if(s->avctx->debug&FF_DEBUG_QP){
1795 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1797 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1798 int mb_type= pict->mb_type[x + y*s->mb_stride];
1799 //Type & MV direction
1801 av_log(s->avctx, AV_LOG_DEBUG, "P");
1802 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1803 av_log(s->avctx, AV_LOG_DEBUG, "A");
1804 else if(IS_INTRA4x4(mb_type))
1805 av_log(s->avctx, AV_LOG_DEBUG, "i");
1806 else if(IS_INTRA16x16(mb_type))
1807 av_log(s->avctx, AV_LOG_DEBUG, "I");
1808 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1809 av_log(s->avctx, AV_LOG_DEBUG, "d");
1810 else if(IS_DIRECT(mb_type))
1811 av_log(s->avctx, AV_LOG_DEBUG, "D");
1812 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1813 av_log(s->avctx, AV_LOG_DEBUG, "g");
1814 else if(IS_GMC(mb_type))
1815 av_log(s->avctx, AV_LOG_DEBUG, "G");
1816 else if(IS_SKIP(mb_type))
1817 av_log(s->avctx, AV_LOG_DEBUG, "S");
1818 else if(!USES_LIST(mb_type, 1))
1819 av_log(s->avctx, AV_LOG_DEBUG, ">");
1820 else if(!USES_LIST(mb_type, 0))
1821 av_log(s->avctx, AV_LOG_DEBUG, "<");
1823 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1824 av_log(s->avctx, AV_LOG_DEBUG, "X");
1829 av_log(s->avctx, AV_LOG_DEBUG, "+");
1830 else if(IS_16X8(mb_type))
1831 av_log(s->avctx, AV_LOG_DEBUG, "-");
1832 else if(IS_8X16(mb_type))
1833 av_log(s->avctx, AV_LOG_DEBUG, "|");
1834 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1835 av_log(s->avctx, AV_LOG_DEBUG, " ");
1837 av_log(s->avctx, AV_LOG_DEBUG, "?");
1840 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1841 av_log(s->avctx, AV_LOG_DEBUG, "=");
1843 av_log(s->avctx, AV_LOG_DEBUG, " ");
1845 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1847 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1851 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1852 const int shift= 1 + s->quarter_sample;
1856 int h_chroma_shift, v_chroma_shift;
1857 const int width = s->avctx->width;
1858 const int height= s->avctx->height;
1859 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1860 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1861 s->low_delay=0; //needed to see the vectors without trashing the buffers
1863 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1865 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1866 pict->data[i]= s->visualization_buffer[i];
1868 pict->type= FF_BUFFER_TYPE_COPY;
1871 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1873 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1874 const int mb_index= mb_x + mb_y*s->mb_stride;
1875 if((s->avctx->debug_mv) && pict->motion_val){
1877 for(type=0; type<3; type++){
1880 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1884 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1888 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1893 if(!USES_LIST(pict->mb_type[mb_index], direction))
1896 if(IS_8X8(pict->mb_type[mb_index])){
1899 int sx= mb_x*16 + 4 + 8*(i&1);
1900 int sy= mb_y*16 + 4 + 8*(i>>1);
1901 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1902 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1903 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1904 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1906 }else if(IS_16X8(pict->mb_type[mb_index])){
1910 int sy=mb_y*16 + 4 + 8*i;
1911 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1912 int mx=(pict->motion_val[direction][xy][0]>>shift);
1913 int my=(pict->motion_val[direction][xy][1]>>shift);
1915 if(IS_INTERLACED(pict->mb_type[mb_index]))
1918 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1920 }else if(IS_8X16(pict->mb_type[mb_index])){
1923 int sx=mb_x*16 + 4 + 8*i;
1925 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1926 int mx=(pict->motion_val[direction][xy][0]>>shift);
1927 int my=(pict->motion_val[direction][xy][1]>>shift);
1929 if(IS_INTERLACED(pict->mb_type[mb_index]))
1932 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1935 int sx= mb_x*16 + 8;
1936 int sy= mb_y*16 + 8;
1937 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1938 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1939 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1940 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1944 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1945 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1948 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1949 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1952 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1953 int mb_type= pict->mb_type[mb_index];
1956 #define COLOR(theta, r)\
1957 u= (int)(128 + r*cos(theta*3.141592/180));\
1958 v= (int)(128 + r*sin(theta*3.141592/180));
1962 if(IS_PCM(mb_type)){
1964 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1966 }else if(IS_INTRA4x4(mb_type)){
1968 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1970 }else if(IS_DIRECT(mb_type)){
1972 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1974 }else if(IS_GMC(mb_type)){
1976 }else if(IS_SKIP(mb_type)){
1978 }else if(!USES_LIST(mb_type, 1)){
1980 }else if(!USES_LIST(mb_type, 0)){
1983 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1987 u*= 0x0101010101010101ULL;
1988 v*= 0x0101010101010101ULL;
1990 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1991 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1995 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1996 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1997 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1999 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
2001 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
2003 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
2004 int dm= 1 << (mv_sample_log2-2);
2006 int sx= mb_x*16 + 8*(i&1);
2007 int sy= mb_y*16 + 8*(i>>1);
2008 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
2010 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
2011 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
2013 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
2014 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
2015 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
2019 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
2023 s->mbskip_table[mb_index]=0;
2029 #ifdef CONFIG_ENCODERS
2031 static int get_sae(uint8_t *src, int ref, int stride){
2035 for(y=0; y<16; y++){
2036 for(x=0; x<16; x++){
2037 acc+= ABS(src[x+y*stride] - ref);
2044 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
2051 for(y=0; y<h; y+=16){
2052 for(x=0; x<w; x+=16){
2053 int offset= x + y*stride;
2054 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
2055 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
2056 int sae = get_sae(src + offset, mean, stride);
2058 acc+= sae + 500 < sad;
2065 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2069 const int encoding_delay= s->max_b_frames;
2074 pic_arg->display_picture_number= s->input_picture_number++;
2076 if(pts != AV_NOPTS_VALUE){
2077 if(s->user_specified_pts != AV_NOPTS_VALUE){
2079 int64_t last= s->user_specified_pts;
2082 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
2086 s->user_specified_pts= pts;
2088 if(s->user_specified_pts != AV_NOPTS_VALUE){
2089 s->user_specified_pts=
2090 pts= s->user_specified_pts + 1;
2091 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
2093 pts= pic_arg->display_picture_number;
2099 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2100 if(pic_arg->linesize[0] != s->linesize) direct=0;
2101 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2102 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2104 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2107 i= ff_find_unused_picture(s, 1);
2109 pic= (AVFrame*)&s->picture[i];
2113 pic->data[i]= pic_arg->data[i];
2114 pic->linesize[i]= pic_arg->linesize[i];
2116 alloc_picture(s, (Picture*)pic, 1);
2118 i= ff_find_unused_picture(s, 0);
2120 pic= (AVFrame*)&s->picture[i];
2123 alloc_picture(s, (Picture*)pic, 0);
2125 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0]
2126 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1]
2127 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){
2130 int h_chroma_shift, v_chroma_shift;
2131 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2134 int src_stride= pic_arg->linesize[i];
2135 int dst_stride= i ? s->uvlinesize : s->linesize;
2136 int h_shift= i ? h_chroma_shift : 0;
2137 int v_shift= i ? v_chroma_shift : 0;
2138 int w= s->width >>h_shift;
2139 int h= s->height>>v_shift;
2140 uint8_t *src= pic_arg->data[i];
2141 uint8_t *dst= pic->data[i] + INPLACE_OFFSET;
2143 if(src_stride==dst_stride)
2144 memcpy(dst, src, src_stride*h);
2147 memcpy(dst, src, w);
2155 copy_picture_attributes(s, pic, pic_arg);
2156 pic->pts= pts; //we set this here to avoid modifiying pic_arg
2159 /* shift buffer entries */
2160 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2161 s->input_picture[i-1]= s->input_picture[i];
2163 s->input_picture[encoding_delay]= (Picture*)pic;
2168 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2173 for(plane=0; plane<3; plane++){
2174 const int stride= p->linesize[plane];
2175 const int bw= plane ? 1 : 2;
2176 for(y=0; y<s->mb_height*bw; y++){
2177 for(x=0; x<s->mb_width*bw; x++){
2178 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16;
2179 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);
2181 switch(s->avctx->frame_skip_exp){
2182 case 0: score= FFMAX(score, v); break;
2183 case 1: score+= ABS(v);break;
2184 case 2: score+= v*v;break;
2185 case 3: score64+= ABS(v*v*(int64_t)v);break;
2186 case 4: score64+= v*v*(int64_t)(v*v);break;
2192 if(score) score64= score;
2194 if(score64 < s->avctx->frame_skip_threshold)
2196 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2201 static int estimate_best_b_count(MpegEncContext *s){
2202 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id);
2203 AVCodecContext *c= avcodec_alloc_context();
2204 AVFrame input[FF_MAX_B_FRAMES+2];
2205 const int scale= s->avctx->brd_scale;
2206 int i, j, out_size, p_lambda, b_lambda, lambda2;
2207 int outbuf_size= s->width * s->height; //FIXME
2208 uint8_t *outbuf= av_malloc(outbuf_size);
2209 int64_t best_rd= INT64_MAX;
2210 int best_b_count= -1;
2212 assert(scale>=0 && scale <=3);
2215 p_lambda= s->last_lambda_for[P_TYPE]; //s->next_picture_ptr->quality;
2216 b_lambda= s->last_lambda_for[B_TYPE]; //p_lambda *ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
2217 if(!b_lambda) b_lambda= p_lambda; //FIXME we should do this somewhere else
2218 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT;
2220 c->width = s->width >> scale;
2221 c->height= s->height>> scale;
2222 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
2223 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL;
2224 c->mb_decision= s->avctx->mb_decision;
2225 c->me_cmp= s->avctx->me_cmp;
2226 c->mb_cmp= s->avctx->mb_cmp;
2227 c->me_sub_cmp= s->avctx->me_sub_cmp;
2228 c->pix_fmt = PIX_FMT_YUV420P;
2229 c->time_base= s->avctx->time_base;
2230 c->max_b_frames= s->max_b_frames;
2232 if (avcodec_open(c, codec) < 0)
2235 for(i=0; i<s->max_b_frames+2; i++){
2236 int ysize= c->width*c->height;
2237 int csize= (c->width/2)*(c->height/2);
2238 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr;
2241 pre_input= *pre_input_ptr;
2243 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i){
2244 pre_input.data[0]+=INPLACE_OFFSET;
2245 pre_input.data[1]+=INPLACE_OFFSET;
2246 pre_input.data[2]+=INPLACE_OFFSET;
2249 avcodec_get_frame_defaults(&input[i]);
2250 input[i].data[0]= av_malloc(ysize + 2*csize);
2251 input[i].data[1]= input[i].data[0] + ysize;
2252 input[i].data[2]= input[i].data[1] + csize;
2253 input[i].linesize[0]= c->width;
2254 input[i].linesize[1]=
2255 input[i].linesize[2]= c->width/2;
2257 if(!i || s->input_picture[i-1]){
2258 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0], pre_input.data[0], pre_input.linesize[0], c->width, c->height);
2259 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);
2260 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);
2264 for(j=0; j<s->max_b_frames+1; j++){
2267 if(!s->input_picture[j])
2270 c->error[0]= c->error[1]= c->error[2]= 0;
2272 input[0].pict_type= I_TYPE;
2273 input[0].quality= 1 * FF_QP2LAMBDA;
2274 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]);
2275 // rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
2277 for(i=0; i<s->max_b_frames+1; i++){
2278 int is_p= i % (j+1) == j || i==s->max_b_frames;
2280 input[i+1].pict_type= is_p ? P_TYPE : B_TYPE;
2281 input[i+1].quality= is_p ? p_lambda : b_lambda;
2282 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]);
2283 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2286 /* get the delayed frames */
2288 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
2289 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2292 rd += c->error[0] + c->error[1] + c->error[2];
2304 for(i=0; i<s->max_b_frames+2; i++){
2305 av_freep(&input[i].data[0]);
2308 return best_b_count;
2311 static void select_input_picture(MpegEncContext *s){
2314 for(i=1; i<MAX_PICTURE_COUNT; i++)
2315 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2316 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2318 /* set next picture type & ordering */
2319 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2320 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2321 s->reordered_input_picture[0]= s->input_picture[0];
2322 s->reordered_input_picture[0]->pict_type= I_TYPE;
2323 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2327 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2328 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2329 //FIXME check that te gop check above is +-1 correct
2330 //av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2332 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2334 s->input_picture[0]->data[i]= NULL;
2335 s->input_picture[0]->type= 0;
2337 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2338 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2340 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2344 ff_vbv_update(s, 0);
2350 if(s->flags&CODEC_FLAG_PASS2){
2351 for(i=0; i<s->max_b_frames+1; i++){
2352 int pict_num= s->input_picture[0]->display_picture_number + i;
2354 if(pict_num >= s->rc_context.num_entries)
2356 if(!s->input_picture[i]){
2357 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2361 s->input_picture[i]->pict_type=
2362 s->rc_context.entry[pict_num].new_pict_type;
2366 if(s->avctx->b_frame_strategy==0){
2367 b_frames= s->max_b_frames;
2368 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2369 }else if(s->avctx->b_frame_strategy==1){
2370 for(i=1; i<s->max_b_frames+1; i++){
2371 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2372 s->input_picture[i]->b_frame_score=
2373 get_intra_count(s, s->input_picture[i ]->data[0],
2374 s->input_picture[i-1]->data[0], s->linesize) + 1;
2377 for(i=0; i<s->max_b_frames+1; i++){
2378 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2381 b_frames= FFMAX(0, i-1);
2384 for(i=0; i<b_frames+1; i++){
2385 s->input_picture[i]->b_frame_score=0;
2387 }else if(s->avctx->b_frame_strategy==2){
2388 b_frames= estimate_best_b_count(s);
2390 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2395 //static int b_count=0;
2396 //b_count+= b_frames;
2397 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2399 for(i= b_frames - 1; i>=0; i--){
2400 int type= s->input_picture[i]->pict_type;
2401 if(type && type != B_TYPE)
2404 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2405 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2408 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2409 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2410 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2412 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2414 s->input_picture[b_frames]->pict_type= I_TYPE;
2418 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2420 && s->input_picture[b_frames]->pict_type== I_TYPE)
2423 s->reordered_input_picture[0]= s->input_picture[b_frames];
2424 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2425 s->reordered_input_picture[0]->pict_type= P_TYPE;
2426 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2427 for(i=0; i<b_frames; i++){
2428 s->reordered_input_picture[i+1]= s->input_picture[i];
2429 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2430 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2435 if(s->reordered_input_picture[0]){
2436 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2438 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2440 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2441 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable
2443 int i= ff_find_unused_picture(s, 0);
2444 Picture *pic= &s->picture[i];
2446 /* mark us unused / free shared pic */
2448 s->reordered_input_picture[0]->data[i]= NULL;
2449 s->reordered_input_picture[0]->type= 0;
2451 pic->reference = s->reordered_input_picture[0]->reference;
2453 alloc_picture(s, pic, 0);
2455 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2457 s->current_picture_ptr= pic;
2459 // input is not a shared pix -> reuse buffer for current_pix
2461 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2462 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2464 s->current_picture_ptr= s->reordered_input_picture[0];
2466 s->new_picture.data[i]+= INPLACE_OFFSET;
2469 copy_picture(&s->current_picture, s->current_picture_ptr);
2471 s->picture_number= s->new_picture.display_picture_number;
2472 //printf("dpn:%d\n", s->picture_number);
2474 memset(&s->new_picture, 0, sizeof(Picture));
2478 int MPV_encode_picture(AVCodecContext *avctx,
2479 unsigned char *buf, int buf_size, void *data)
2481 MpegEncContext *s = avctx->priv_data;
2482 AVFrame *pic_arg = data;
2483 int i, stuffing_count;
2485 for(i=0; i<avctx->thread_count; i++){
2486 int start_y= s->thread_context[i]->start_mb_y;
2487 int end_y= s->thread_context[i]-> end_mb_y;
2488 int h= s->mb_height;
2489 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
2490 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
2492 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2495 s->picture_in_gop_number++;
2497 if(load_input_picture(s, pic_arg) < 0)
2500 select_input_picture(s);
2503 if(s->new_picture.data[0]){
2504 s->pict_type= s->new_picture.pict_type;
2506 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2507 MPV_frame_start(s, avctx);
2509 encode_picture(s, s->picture_number);
2511 avctx->real_pict_num = s->picture_number;
2512 avctx->header_bits = s->header_bits;
2513 avctx->mv_bits = s->mv_bits;
2514 avctx->misc_bits = s->misc_bits;
2515 avctx->i_tex_bits = s->i_tex_bits;
2516 avctx->p_tex_bits = s->p_tex_bits;
2517 avctx->i_count = s->i_count;
2518 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2519 avctx->skip_count = s->skip_count;
2523 if (s->out_format == FMT_MJPEG)
2524 mjpeg_picture_trailer(s);
2526 if(s->flags&CODEC_FLAG_PASS1)
2527 ff_write_pass1_stats(s);
2530 s->current_picture_ptr->error[i]= s->current_picture.error[i];
2531 avctx->error[i] += s->current_picture_ptr->error[i];
2534 if(s->flags&CODEC_FLAG_PASS1)
2535 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2536 flush_put_bits(&s->pb);
2537 s->frame_bits = put_bits_count(&s->pb);
2539 stuffing_count= ff_vbv_update(s, s->frame_bits);
2541 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2542 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2546 switch(s->codec_id){
2547 case CODEC_ID_MPEG1VIDEO:
2548 case CODEC_ID_MPEG2VIDEO:
2549 while(stuffing_count--){
2550 put_bits(&s->pb, 8, 0);
2553 case CODEC_ID_MPEG4:
2554 put_bits(&s->pb, 16, 0);
2555 put_bits(&s->pb, 16, 0x1C3);
2556 stuffing_count -= 4;
2557 while(stuffing_count--){
2558 put_bits(&s->pb, 8, 0xFF);
2562 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2564 flush_put_bits(&s->pb);
2565 s->frame_bits = put_bits_count(&s->pb);
2568 /* update mpeg1/2 vbv_delay for CBR */
2569 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2570 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2573 assert(s->repeat_first_field==0);
2575 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2576 assert(vbv_delay < 0xFFFF);
2578 s->vbv_delay_ptr[0] &= 0xF8;
2579 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2580 s->vbv_delay_ptr[1] = vbv_delay>>5;
2581 s->vbv_delay_ptr[2] &= 0x07;
2582 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2584 s->total_bits += s->frame_bits;
2585 avctx->frame_bits = s->frame_bits;
2587 assert((pbBufPtr(&s->pb) == s->pb.buf));
2590 assert((s->frame_bits&7)==0);
2592 return s->frame_bits/8;
2595 #endif //CONFIG_ENCODERS
2597 static inline void gmc1_motion(MpegEncContext *s,
2598 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2599 uint8_t **ref_picture)
2602 int offset, src_x, src_y, linesize, uvlinesize;
2603 int motion_x, motion_y;
2606 motion_x= s->sprite_offset[0][0];
2607 motion_y= s->sprite_offset[0][1];
2608 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2609 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2610 motion_x<<=(3-s->sprite_warping_accuracy);
2611 motion_y<<=(3-s->sprite_warping_accuracy);
2612 src_x = clip(src_x, -16, s->width);
2613 if (src_x == s->width)
2615 src_y = clip(src_y, -16, s->height);
2616 if (src_y == s->height)
2619 linesize = s->linesize;
2620 uvlinesize = s->uvlinesize;
2622 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2624 if(s->flags&CODEC_FLAG_EMU_EDGE){
2625 if( (unsigned)src_x >= s->h_edge_pos - 17
2626 || (unsigned)src_y >= s->v_edge_pos - 17){
2627 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2628 ptr= s->edge_emu_buffer;
2632 if((motion_x|motion_y)&7){
2633 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2634 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2638 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2639 if (s->no_rounding){
2640 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2642 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2646 if(s->flags&CODEC_FLAG_GRAY) return;
2648 motion_x= s->sprite_offset[1][0];
2649 motion_y= s->sprite_offset[1][1];
2650 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2651 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2652 motion_x<<=(3-s->sprite_warping_accuracy);
2653 motion_y<<=(3-s->sprite_warping_accuracy);
2654 src_x = clip(src_x, -8, s->width>>1);
2655 if (src_x == s->width>>1)
2657 src_y = clip(src_y, -8, s->height>>1);
2658 if (src_y == s->height>>1)
2661 offset = (src_y * uvlinesize) + src_x;
2662 ptr = ref_picture[1] + offset;
2663 if(s->flags&CODEC_FLAG_EMU_EDGE){
2664 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2665 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2666 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);
2667 ptr= s->edge_emu_buffer;
2671 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2673 ptr = ref_picture[2] + offset;
2675 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);
2676 ptr= s->edge_emu_buffer;
2678 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2683 static inline void gmc_motion(MpegEncContext *s,
2684 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2685 uint8_t **ref_picture)
2688 int linesize, uvlinesize;
2689 const int a= s->sprite_warping_accuracy;
2692 linesize = s->linesize;
2693 uvlinesize = s->uvlinesize;
2695 ptr = ref_picture[0];
2697 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2698 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2700 s->dsp.gmc(dest_y, ptr, linesize, 16,
2703 s->sprite_delta[0][0], s->sprite_delta[0][1],
2704 s->sprite_delta[1][0], s->sprite_delta[1][1],
2705 a+1, (1<<(2*a+1)) - s->no_rounding,
2706 s->h_edge_pos, s->v_edge_pos);
2707 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2708 ox + s->sprite_delta[0][0]*8,
2709 oy + s->sprite_delta[1][0]*8,
2710 s->sprite_delta[0][0], s->sprite_delta[0][1],
2711 s->sprite_delta[1][0], s->sprite_delta[1][1],
2712 a+1, (1<<(2*a+1)) - s->no_rounding,
2713 s->h_edge_pos, s->v_edge_pos);
2715 if(s->flags&CODEC_FLAG_GRAY) return;
2717 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2718 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2720 ptr = ref_picture[1];
2721 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2724 s->sprite_delta[0][0], s->sprite_delta[0][1],
2725 s->sprite_delta[1][0], s->sprite_delta[1][1],
2726 a+1, (1<<(2*a+1)) - s->no_rounding,
2727 s->h_edge_pos>>1, s->v_edge_pos>>1);
2729 ptr = ref_picture[2];
2730 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2733 s->sprite_delta[0][0], s->sprite_delta[0][1],
2734 s->sprite_delta[1][0], s->sprite_delta[1][1],
2735 a+1, (1<<(2*a+1)) - s->no_rounding,
2736 s->h_edge_pos>>1, s->v_edge_pos>>1);
2740 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2741 * @param buf destination buffer
2742 * @param src source buffer
2743 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2744 * @param block_w width of block
2745 * @param block_h height of block
2746 * @param src_x x coordinate of the top left sample of the block in the source buffer
2747 * @param src_y y coordinate of the top left sample of the block in the source buffer
2748 * @param w width of the source buffer
2749 * @param h height of the source buffer
2751 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2752 int src_x, int src_y, int w, int h){
2754 int start_y, start_x, end_y, end_x;
2757 src+= (h-1-src_y)*linesize;
2759 }else if(src_y<=-block_h){
2760 src+= (1-block_h-src_y)*linesize;
2766 }else if(src_x<=-block_w){
2767 src+= (1-block_w-src_x);
2771 start_y= FFMAX(0, -src_y);
2772 start_x= FFMAX(0, -src_x);
2773 end_y= FFMIN(block_h, h-src_y);
2774 end_x= FFMIN(block_w, w-src_x);
2776 // copy existing part
2777 for(y=start_y; y<end_y; y++){
2778 for(x=start_x; x<end_x; x++){
2779 buf[x + y*linesize]= src[x + y*linesize];
2784 for(y=0; y<start_y; y++){
2785 for(x=start_x; x<end_x; x++){
2786 buf[x + y*linesize]= buf[x + start_y*linesize];
2791 for(y=end_y; y<block_h; y++){
2792 for(x=start_x; x<end_x; x++){
2793 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2797 for(y=0; y<block_h; y++){
2799 for(x=0; x<start_x; x++){
2800 buf[x + y*linesize]= buf[start_x + y*linesize];
2804 for(x=end_x; x<block_w; x++){
2805 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2810 static inline int hpel_motion(MpegEncContext *s,
2811 uint8_t *dest, uint8_t *src,
2812 int field_based, int field_select,
2813 int src_x, int src_y,
2814 int width, int height, int stride,
2815 int h_edge_pos, int v_edge_pos,
2816 int w, int h, op_pixels_func *pix_op,
2817 int motion_x, int motion_y)
2822 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2823 src_x += motion_x >> 1;
2824 src_y += motion_y >> 1;
2826 /* WARNING: do no forget half pels */
2827 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2830 src_y = clip(src_y, -16, height);
2831 if (src_y == height)
2833 src += src_y * stride + src_x;
2835 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2836 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2837 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2838 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2839 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2840 src= s->edge_emu_buffer;
2846 pix_op[dxy](dest, src, stride, h);
2850 static inline int hpel_motion_lowres(MpegEncContext *s,
2851 uint8_t *dest, uint8_t *src,
2852 int field_based, int field_select,
2853 int src_x, int src_y,
2854 int width, int height, int stride,
2855 int h_edge_pos, int v_edge_pos,
2856 int w, int h, h264_chroma_mc_func *pix_op,
2857 int motion_x, int motion_y)
2859 const int lowres= s->avctx->lowres;
2860 const int s_mask= (2<<lowres)-1;
2864 if(s->quarter_sample){
2869 sx= motion_x & s_mask;
2870 sy= motion_y & s_mask;
2871 src_x += motion_x >> (lowres+1);
2872 src_y += motion_y >> (lowres+1);
2874 src += src_y * stride + src_x;
2876 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2877 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2878 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2879 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2880 src= s->edge_emu_buffer;
2888 pix_op[lowres](dest, src, stride, h, sx, sy);
2892 /* apply one mpeg motion vector to the three components */
2893 static always_inline void mpeg_motion(MpegEncContext *s,
2894 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2895 int field_based, int bottom_field, int field_select,
2896 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2897 int motion_x, int motion_y, int h)
2899 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2900 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2903 if(s->quarter_sample)
2910 v_edge_pos = s->v_edge_pos >> field_based;
2911 linesize = s->current_picture.linesize[0] << field_based;
2912 uvlinesize = s->current_picture.linesize[1] << field_based;
2914 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2915 src_x = s->mb_x* 16 + (motion_x >> 1);
2916 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2918 if (s->out_format == FMT_H263) {
2919 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2920 mx = (motion_x>>1)|(motion_x&1);
2922 uvdxy = ((my & 1) << 1) | (mx & 1);
2923 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2924 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2926 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2930 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2934 uvsrc_x = s->mb_x*8 + mx;
2935 uvsrc_y = s->mb_y*8 + my;
2937 if(s->chroma_y_shift){
2940 uvdxy = ((my & 1) << 1) | (mx & 1);
2941 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2942 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2944 if(s->chroma_x_shift){
2947 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2948 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2959 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2960 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2961 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2963 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2964 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2965 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2966 s->codec_id == CODEC_ID_MPEG1VIDEO){
2967 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2970 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2971 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2972 ptr_y = s->edge_emu_buffer;
2973 if(!(s->flags&CODEC_FLAG_GRAY)){
2974 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2975 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2976 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2977 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2978 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2984 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2985 dest_y += s->linesize;
2986 dest_cb+= s->uvlinesize;
2987 dest_cr+= s->uvlinesize;
2991 ptr_y += s->linesize;
2992 ptr_cb+= s->uvlinesize;
2993 ptr_cr+= s->uvlinesize;
2996 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2998 if(!(s->flags&CODEC_FLAG_GRAY)){
2999 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
3000 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
3002 #if defined(CONFIG_H261_ENCODER) || defined(CONFIG_H261_DECODER)
3003 if(s->out_format == FMT_H261){
3004 ff_h261_loop_filter(s);
3009 /* apply one mpeg motion vector to the three components */
3010 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
3011 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3012 int field_based, int bottom_field, int field_select,
3013 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
3014 int motion_x, int motion_y, int h)
3016 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3017 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
3018 const int lowres= s->avctx->lowres;
3019 const int block_s= 8>>lowres;
3020 const int s_mask= (2<<lowres)-1;
3021 const int h_edge_pos = s->h_edge_pos >> lowres;
3022 const int v_edge_pos = s->v_edge_pos >> lowres;
3023 linesize = s->current_picture.linesize[0] << field_based;
3024 uvlinesize = s->current_picture.linesize[1] << field_based;
3026 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
3032 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
3035 sx= motion_x & s_mask;
3036 sy= motion_y & s_mask;
3037 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
3038 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
3040 if (s->out_format == FMT_H263) {
3041 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
3042 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
3045 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
3048 uvsx = (2*mx) & s_mask;
3049 uvsy = (2*my) & s_mask;
3050 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
3051 uvsrc_y = s->mb_y*block_s + (my >> lowres);
3057 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
3058 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
3061 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3062 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3063 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3065 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
3066 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
3067 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3068 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
3069 ptr_y = s->edge_emu_buffer;
3070 if(!(s->flags&CODEC_FLAG_GRAY)){
3071 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3072 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3073 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3074 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3075 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3081 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3082 dest_y += s->linesize;
3083 dest_cb+= s->uvlinesize;
3084 dest_cr+= s->uvlinesize;
3088 ptr_y += s->linesize;
3089 ptr_cb+= s->uvlinesize;
3090 ptr_cr+= s->uvlinesize;
3095 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
3097 if(!(s->flags&CODEC_FLAG_GRAY)){
3098 uvsx <<= 2 - lowres;
3099 uvsy <<= 2 - lowres;
3100 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3101 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3103 //FIXME h261 lowres loop filter
3106 //FIXME move to dsputil, avg variant, 16x16 version
3107 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
3109 uint8_t * const top = src[1];
3110 uint8_t * const left = src[2];
3111 uint8_t * const mid = src[0];
3112 uint8_t * const right = src[3];
3113 uint8_t * const bottom= src[4];
3114 #define OBMC_FILTER(x, t, l, m, r, b)\
3115 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
3116 #define OBMC_FILTER4(x, t, l, m, r, b)\
3117 OBMC_FILTER(x , t, l, m, r, b);\
3118 OBMC_FILTER(x+1 , t, l, m, r, b);\
3119 OBMC_FILTER(x +stride, t, l, m, r, b);\
3120 OBMC_FILTER(x+1+stride, t, l, m, r, b);
3123 OBMC_FILTER (x , 2, 2, 4, 0, 0);
3124 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
3125 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
3126 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
3127 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
3128 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
3130 OBMC_FILTER (x , 1, 2, 5, 0, 0);
3131 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
3132 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
3133 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
3135 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
3136 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
3137 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
3138 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
3140 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
3141 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
3142 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
3143 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
3145 OBMC_FILTER (x , 0, 2, 5, 0, 1);
3146 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
3147 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
3148 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
3149 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
3150 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
3152 OBMC_FILTER (x , 0, 2, 4, 0, 2);
3153 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
3154 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
3155 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
3158 /* obmc for 1 8x8 luma block */
3159 static inline void obmc_motion(MpegEncContext *s,
3160 uint8_t *dest, uint8_t *src,
3161 int src_x, int src_y,
3162 op_pixels_func *pix_op,
3163 int16_t mv[5][2]/* mid top left right bottom*/)
3169 assert(s->quarter_sample==0);
3172 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
3175 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3176 hpel_motion(s, ptr[i], src, 0, 0,
3178 s->width, s->height, s->linesize,
3179 s->h_edge_pos, s->v_edge_pos,
3181 mv[i][0], mv[i][1]);
3185 put_obmc(dest, ptr, s->linesize);
3188 static inline void qpel_motion(MpegEncContext *s,
3189 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3190 int field_based, int bottom_field, int field_select,
3191 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3192 qpel_mc_func (*qpix_op)[16],
3193 int motion_x, int motion_y, int h)
3195 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3196 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3198 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3199 src_x = s->mb_x * 16 + (motion_x >> 2);
3200 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3202 v_edge_pos = s->v_edge_pos >> field_based;
3203 linesize = s->linesize << field_based;
3204 uvlinesize = s->uvlinesize << field_based;
3209 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3210 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3211 mx= (motion_x>>1) + rtab[motion_x&7];
3212 my= (motion_y>>1) + rtab[motion_y&7];
3213 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3214 mx= (motion_x>>1)|(motion_x&1);
3215 my= (motion_y>>1)|(motion_y&1);
3223 uvdxy= (mx&1) | ((my&1)<<1);
3227 uvsrc_x = s->mb_x * 8 + mx;
3228 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3230 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3231 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3232 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3234 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3235 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3236 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3237 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3238 ptr_y= s->edge_emu_buffer;
3239 if(!(s->flags&CODEC_FLAG_GRAY)){
3240 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3241 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3242 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3243 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3244 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3251 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3254 dest_y += s->linesize;
3255 dest_cb+= s->uvlinesize;
3256 dest_cr+= s->uvlinesize;
3260 ptr_y += s->linesize;
3261 ptr_cb += s->uvlinesize;
3262 ptr_cr += s->uvlinesize;
3264 //damn interlaced mode
3265 //FIXME boundary mirroring is not exactly correct here
3266 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3267 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3269 if(!(s->flags&CODEC_FLAG_GRAY)){
3270 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3271 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3275 inline int ff_h263_round_chroma(int x){
3277 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3280 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3285 * h263 chorma 4mv motion compensation.
3287 static inline void chroma_4mv_motion(MpegEncContext *s,
3288 uint8_t *dest_cb, uint8_t *dest_cr,
3289 uint8_t **ref_picture,
3290 op_pixels_func *pix_op,
3292 int dxy, emu=0, src_x, src_y, offset;
3295 /* In case of 8X8, we construct a single chroma motion vector
3296 with a special rounding */
3297 mx= ff_h263_round_chroma(mx);
3298 my= ff_h263_round_chroma(my);
3300 dxy = ((my & 1) << 1) | (mx & 1);
3304 src_x = s->mb_x * 8 + mx;
3305 src_y = s->mb_y * 8 + my;
3306 src_x = clip(src_x, -8, s->width/2);
3307 if (src_x == s->width/2)
3309 src_y = clip(src_y, -8, s->height/2);
3310 if (src_y == s->height/2)
3313 offset = (src_y * (s->uvlinesize)) + src_x;
3314 ptr = ref_picture[1] + offset;
3315 if(s->flags&CODEC_FLAG_EMU_EDGE){
3316 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3317 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3318 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);
3319 ptr= s->edge_emu_buffer;
3323 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3325 ptr = ref_picture[2] + offset;
3327 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);
3328 ptr= s->edge_emu_buffer;
3330 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3333 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3334 uint8_t *dest_cb, uint8_t *dest_cr,
3335 uint8_t **ref_picture,
3336 h264_chroma_mc_func *pix_op,
3338 const int lowres= s->avctx->lowres;
3339 const int block_s= 8>>lowres;
3340 const int s_mask= (2<<lowres)-1;
3341 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3342 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3343 int emu=0, src_x, src_y, offset, sx, sy;
3346 if(s->quarter_sample){
3351 /* In case of 8X8, we construct a single chroma motion vector
3352 with a special rounding */
3353 mx= ff_h263_round_chroma(mx);
3354 my= ff_h263_round_chroma(my);
3358 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3359 src_y = s->mb_y*block_s + (my >> (lowres+1));
3361 offset = src_y * s->uvlinesize + src_x;
3362 ptr = ref_picture[1] + offset;
3363 if(s->flags&CODEC_FLAG_EMU_EDGE){
3364 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3365 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3366 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3367 ptr= s->edge_emu_buffer;
3373 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3375 ptr = ref_picture[2] + offset;
3377 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3378 ptr= s->edge_emu_buffer;
3380 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3383 static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir){
3384 /* fetch pixels for estimated mv 4 macroblocks ahead
3385 * optimized for 64byte cache lines */
3386 const int shift = s->quarter_sample ? 2 : 1;
3387 const int mx= (s->mv[dir][0][0]>>shift) + 16*s->mb_x + 8;
3388 const int my= (s->mv[dir][0][1]>>shift) + 16*s->mb_y;
3389 int off= mx + (my + (s->mb_x&3)*4)*s->linesize + 64;
3390 s->dsp.prefetch(pix[0]+off, s->linesize, 4);
3391 off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
3392 s->dsp.prefetch(pix[1]+off, pix[2]-pix[1], 2);
3396 * motion compensation of a single macroblock
3398 * @param dest_y luma destination pointer
3399 * @param dest_cb chroma cb/u destination pointer
3400 * @param dest_cr chroma cr/v destination pointer
3401 * @param dir direction (0->forward, 1->backward)
3402 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3403 * @param pic_op halfpel motion compensation function (average or put normally)
3404 * @param pic_op qpel motion compensation function (average or put normally)
3405 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3407 static inline void MPV_motion(MpegEncContext *s,
3408 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3409 int dir, uint8_t **ref_picture,
3410 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3412 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3414 uint8_t *ptr, *dest;
3419 prefetch_motion(s, ref_picture, dir);
3421 if(s->obmc && s->pict_type != B_TYPE){
3422 int16_t mv_cache[4][4][2];
3423 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3424 const int mot_stride= s->b8_stride;
3425 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3427 assert(!s->mb_skipped);
3429 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3430 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3431 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3433 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3434 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3436 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3439 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3440 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3441 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3443 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3444 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3447 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3448 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3449 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3451 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3452 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3458 const int x= (i&1)+1;
3459 const int y= (i>>1)+1;
3461 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3462 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3463 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3464 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3465 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3467 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3469 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3476 if(!(s->flags&CODEC_FLAG_GRAY))
3477 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3482 switch(s->mv_type) {
3485 if(s->real_sprite_warping_points==1){
3486 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3489 gmc_motion(s, dest_y, dest_cb, dest_cr,
3492 }else if(s->quarter_sample){
3493 qpel_motion(s, dest_y, dest_cb, dest_cr,
3495 ref_picture, pix_op, qpix_op,
3496 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3498 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3499 ref_picture, pix_op,
3500 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3503 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3505 ref_picture, pix_op,
3506 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3512 if(s->quarter_sample){
3514 motion_x = s->mv[dir][i][0];
3515 motion_y = s->mv[dir][i][1];
3517 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3518 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3519 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3521 /* WARNING: do no forget half pels */
3522 src_x = clip(src_x, -16, s->width);
3523 if (src_x == s->width)
3525 src_y = clip(src_y, -16, s->height);
3526 if (src_y == s->height)
3529 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3530 if(s->flags&CODEC_FLAG_EMU_EDGE){
3531 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3532 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3533 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);
3534 ptr= s->edge_emu_buffer;
3537 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3538 qpix_op[1][dxy](dest, ptr, s->linesize);
3540 mx += s->mv[dir][i][0]/2;
3541 my += s->mv[dir][i][1]/2;
3545 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3546 ref_picture[0], 0, 0,
3547 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3548 s->width, s->height, s->linesize,
3549 s->h_edge_pos, s->v_edge_pos,
3551 s->mv[dir][i][0], s->mv[dir][i][1]);
3553 mx += s->mv[dir][i][0];
3554 my += s->mv[dir][i][1];
3558 if(!(s->flags&CODEC_FLAG_GRAY))
3559 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3562 if (s->picture_structure == PICT_FRAME) {
3563 if(s->quarter_sample){
3565 qpel_motion(s, dest_y, dest_cb, dest_cr,
3566 1, i, s->field_select[dir][i],
3567 ref_picture, pix_op, qpix_op,
3568 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3572 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3573 1, 0, s->field_select[dir][0],
3574 ref_picture, pix_op,
3575 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3577 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3578 1, 1, s->field_select[dir][1],
3579 ref_picture, pix_op,
3580 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3583 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3584 ref_picture= s->current_picture_ptr->data;
3587 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3588 0, 0, s->field_select[dir][0],
3589 ref_picture, pix_op,
3590 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3595 uint8_t ** ref2picture;
3597 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3598 ref2picture= ref_picture;
3600 ref2picture= s->current_picture_ptr->data;
3603 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3604 0, 0, s->field_select[dir][i],
3605 ref2picture, pix_op,
3606 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3608 dest_y += 16*s->linesize;
3609 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3610 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3614 if(s->picture_structure == PICT_FRAME){
3618 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3620 ref_picture, pix_op,
3621 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3623 pix_op = s->dsp.avg_pixels_tab;
3627 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3628 0, 0, s->picture_structure != i+1,
3629 ref_picture, pix_op,
3630 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3632 // after put we make avg of the same block
3633 pix_op=s->dsp.avg_pixels_tab;
3635 //opposite parity is always in the same frame if this is second field
3636 if(!s->first_field){
3637 ref_picture = s->current_picture_ptr->data;
3647 * motion compensation of a single macroblock
3649 * @param dest_y luma destination pointer
3650 * @param dest_cb chroma cb/u destination pointer
3651 * @param dest_cr chroma cr/v destination pointer
3652 * @param dir direction (0->forward, 1->backward)
3653 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3654 * @param pic_op halfpel motion compensation function (average or put normally)
3655 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3657 static inline void MPV_motion_lowres(MpegEncContext *s,
3658 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3659 int dir, uint8_t **ref_picture,
3660 h264_chroma_mc_func *pix_op)
3664 const int lowres= s->avctx->lowres;
3665 const int block_s= 8>>lowres;
3670 switch(s->mv_type) {
3672 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3674 ref_picture, pix_op,
3675 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3681 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3682 ref_picture[0], 0, 0,
3683 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3684 s->width, s->height, s->linesize,
3685 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3686 block_s, block_s, pix_op,
3687 s->mv[dir][i][0], s->mv[dir][i][1]);
3689 mx += s->mv[dir][i][0];
3690 my += s->mv[dir][i][1];
3693 if(!(s->flags&CODEC_FLAG_GRAY))
3694 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3697 if (s->picture_structure == PICT_FRAME) {
3699 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3700 1, 0, s->field_select[dir][0],
3701 ref_picture, pix_op,
3702 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3704 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3705 1, 1, s->field_select[dir][1],
3706 ref_picture, pix_op,
3707 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3709 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3710 ref_picture= s->current_picture_ptr->data;
3713 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3714 0, 0, s->field_select[dir][0],
3715 ref_picture, pix_op,
3716 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3721 uint8_t ** ref2picture;
3723 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3724 ref2picture= ref_picture;
3726 ref2picture= s->current_picture_ptr->data;
3729 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3730 0, 0, s->field_select[dir][i],
3731 ref2picture, pix_op,
3732 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3734 dest_y += 2*block_s*s->linesize;
3735 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3736 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3740 if(s->picture_structure == PICT_FRAME){
3744 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3746 ref_picture, pix_op,
3747 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3749 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3753 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3754 0, 0, s->picture_structure != i+1,
3755 ref_picture, pix_op,
3756 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3758 // after put we make avg of the same block
3759 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3761 //opposite parity is always in the same frame if this is second field
3762 if(!s->first_field){
3763 ref_picture = s->current_picture_ptr->data;
3772 /* put block[] to dest[] */
3773 static inline void put_dct(MpegEncContext *s,
3774 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3776 s->dct_unquantize_intra(s, block, i, qscale);
3777 s->dsp.idct_put (dest, line_size, block);
3780 /* add block[] to dest[] */
3781 static inline void add_dct(MpegEncContext *s,
3782 DCTELEM *block, int i, uint8_t *dest, int line_size)
3784 if (s->block_last_index[i] >= 0) {
3785 s->dsp.idct_add (dest, line_size, block);
3789 static inline void add_dequant_dct(MpegEncContext *s,
3790 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3792 if (s->block_last_index[i] >= 0) {
3793 s->dct_unquantize_inter(s, block, i, qscale);
3795 s->dsp.idct_add (dest, line_size, block);
3800 * cleans dc, ac, coded_block for the current non intra MB
3802 void ff_clean_intra_table_entries(MpegEncContext *s)
3804 int wrap = s->b8_stride;
3805 int xy = s->block_index[0];
3808 s->dc_val[0][xy + 1 ] =
3809 s->dc_val[0][xy + wrap] =
3810 s->dc_val[0][xy + 1 + wrap] = 1024;
3812 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3813 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3814 if (s->msmpeg4_version>=3) {
3815 s->coded_block[xy ] =
3816 s->coded_block[xy + 1 ] =
3817 s->coded_block[xy + wrap] =
3818 s->coded_block[xy + 1 + wrap] = 0;
3821 wrap = s->mb_stride;
3822 xy = s->mb_x + s->mb_y * wrap;
3824 s->dc_val[2][xy] = 1024;
3826 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3827 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3829 s->mbintra_table[xy]= 0;
3832 /* generic function called after a macroblock has been parsed by the
3833 decoder or after it has been encoded by the encoder.
3835 Important variables used:
3836 s->mb_intra : true if intra macroblock
3837 s->mv_dir : motion vector direction
3838 s->mv_type : motion vector type
3839 s->mv : motion vector
3840 s->interlaced_dct : true if interlaced dct used (mpeg2)
3842 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3845 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3847 if(s->avctx->xvmc_acceleration){
3848 XVMC_decode_mb(s);//xvmc uses pblocks
3856 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3857 /* save DCT coefficients */
3859 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3862 *dct++ = block[i][s->dsp.idct_permutation[j]];
3865 s->current_picture.qscale_table[mb_xy]= s->qscale;
3867 /* update DC predictors for P macroblocks */
3869 if (s->h263_pred || s->h263_aic) {
3870 if(s->mbintra_table[mb_xy])
3871 ff_clean_intra_table_entries(s);
3875 s->last_dc[2] = 128 << s->intra_dc_precision;
3878 else if (s->h263_pred || s->h263_aic)
3879 s->mbintra_table[mb_xy]=1;
3881 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3882 uint8_t *dest_y, *dest_cb, *dest_cr;
3883 int dct_linesize, dct_offset;
3884 op_pixels_func (*op_pix)[4];
3885 qpel_mc_func (*op_qpix)[16];
3886 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3887 const int uvlinesize= s->current_picture.linesize[1];
3888 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3889 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3891 /* avoid copy if macroblock skipped in last frame too */
3892 /* skip only during decoding as we might trash the buffers during encoding a bit */
3894 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3895 const int age= s->current_picture.age;
3899 if (s->mb_skipped) {
3901 assert(s->pict_type!=I_TYPE);
3903 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3904 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3906 /* if previous was skipped too, then nothing to do ! */
3907 if (*mbskip_ptr >= age && s->current_picture.reference){
3910 } else if(!s->current_picture.reference){
3911 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3912 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3914 *mbskip_ptr = 0; /* not skipped */
3918 dct_linesize = linesize << s->interlaced_dct;
3919 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3923 dest_cb= s->dest[1];
3924 dest_cr= s->dest[2];
3926 dest_y = s->b_scratchpad;
3927 dest_cb= s->b_scratchpad+16*linesize;
3928 dest_cr= s->b_scratchpad+32*linesize;
3932 /* motion handling */
3933 /* decoding or more than one mb_type (MC was already done otherwise) */
3936 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3938 if (s->mv_dir & MV_DIR_FORWARD) {
3939 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3940 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3942 if (s->mv_dir & MV_DIR_BACKWARD) {
3943 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3946 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3947 op_pix = s->dsp.put_pixels_tab;
3948 op_qpix= s->dsp.put_qpel_pixels_tab;
3950 op_pix = s->dsp.put_no_rnd_pixels_tab;
3951 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3953 if (s->mv_dir & MV_DIR_FORWARD) {
3954 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3955 op_pix = s->dsp.avg_pixels_tab;
3956 op_qpix= s->dsp.avg_qpel_pixels_tab;
3958 if (s->mv_dir & MV_DIR_BACKWARD) {
3959 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3964 /* skip dequant / idct if we are really late ;) */
3965 if(s->hurry_up>1) goto skip_idct;
3966 if(s->avctx->skip_idct){
3967 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
3968 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
3969 || s->avctx->skip_idct >= AVDISCARD_ALL)
3973 /* add dct residue */
3974 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3975 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3976 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3977 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3978 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3979 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3981 if(!(s->flags&CODEC_FLAG_GRAY)){
3982 if (s->chroma_y_shift){
3983 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3984 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3988 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
3989 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
3990 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
3991 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
3994 } else if(s->codec_id != CODEC_ID_WMV2){
3995 add_dct(s, block[0], 0, dest_y , dct_linesize);
3996 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3997 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3998 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
4000 if(!(s->flags&CODEC_FLAG_GRAY)){
4001 if(s->chroma_y_shift){//Chroma420
4002 add_dct(s, block[4], 4, dest_cb, uvlinesize);
4003 add_dct(s, block[5], 5, dest_cr, uvlinesize);
4006 dct_linesize = uvlinesize << s->interlaced_dct;
4007 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4009 add_dct(s, block[4], 4, dest_cb, dct_linesize);
4010 add_dct(s, block[5], 5, dest_cr, dct_linesize);
4011 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
4012 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
4013 if(!s->chroma_x_shift){//Chroma444
4014 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
4015 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
4016 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
4017 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
4023 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
4026 /* dct only in intra block */
4027 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
4028 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4029 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4030 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4031 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4033 if(!(s->flags&CODEC_FLAG_GRAY)){
4034 if(s->chroma_y_shift){
4035 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4036 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4040 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4041 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4042 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4043 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4047 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
4048 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
4049 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
4050 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
4052 if(!(s->flags&CODEC_FLAG_GRAY)){
4053 if(s->chroma_y_shift){
4054 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
4055 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
4058 dct_linesize = uvlinesize << s->interlaced_dct;
4059 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4061 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
4062 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
4063 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
4064 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
4065 if(!s->chroma_x_shift){//Chroma444
4066 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
4067 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
4068 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
4069 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
4077 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
4078 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
4079 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
4084 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
4085 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
4086 else MPV_decode_mb_internal(s, block, 0);
4089 #ifdef CONFIG_ENCODERS
4091 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
4093 static const char tab[64]=
4105 DCTELEM *block= s->block[n];
4106 const int last_index= s->block_last_index[n];
4111 threshold= -threshold;
4115 /* are all which we could set to zero are allready zero? */
4116 if(last_index<=skip_dc - 1) return;
4118 for(i=0; i<=last_index; i++){
4119 const int j = s->intra_scantable.permutated[i];
4120 const int level = ABS(block[j]);
4122 if(skip_dc && i==0) continue;
4131 if(score >= threshold) return;
4132 for(i=skip_dc; i<=last_index; i++){
4133 const int j = s->intra_scantable.permutated[i];
4136 if(block[0]) s->block_last_index[n]= 0;
4137 else s->block_last_index[n]= -1;
4140 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
4143 const int maxlevel= s->max_qcoeff;
4144 const int minlevel= s->min_qcoeff;
4148 i=1; //skip clipping of intra dc
4152 for(;i<=last_index; i++){
4153 const int j= s->intra_scantable.permutated[i];
4154 int level = block[j];
4156 if (level>maxlevel){
4159 }else if(level<minlevel){
4167 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
4168 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
4171 #endif //CONFIG_ENCODERS
4175 * @param h is the normal height, this will be reduced automatically if needed for the last row
4177 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
4178 if (s->avctx->draw_horiz_band) {
4182 if(s->picture_structure != PICT_FRAME){
4185 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
4188 h= FFMIN(h, s->avctx->height - y);
4190 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
4191 src= (AVFrame*)s->current_picture_ptr;
4192 else if(s->last_picture_ptr)
4193 src= (AVFrame*)s->last_picture_ptr;
4197 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
4203 offset[0]= y * s->linesize;;
4205 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
4211 s->avctx->draw_horiz_band(s->avctx, src, offset,
4212 y, s->picture_structure, h);
4216 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4217 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
4218 const int uvlinesize= s->current_picture.linesize[1];
4219 const int mb_size= 4 - s->avctx->lowres;
4221 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4222 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4223 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4224 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4225 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4226 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;
4227 //block_index is not used by mpeg2, so it is not affected by chroma_format
4229 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4230 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4231 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4233 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4235 s->dest[0] += s->mb_y * linesize << mb_size;
4236 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4237 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4241 #ifdef CONFIG_ENCODERS
4243 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4253 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4254 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4255 int v= ptr[x2 + y2*stride];
4261 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4266 static always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count)
4268 int16_t weight[8][64];
4269 DCTELEM orig[8][64];
4270 const int mb_x= s->mb_x;
4271 const int mb_y= s->mb_y;
4274 int dct_offset = s->linesize*8; //default for progressive frames
4275 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4278 for(i=0; i<mb_block_count; i++) skip_dct[i]=0;
4280 if(s->adaptive_quant){
4281 const int last_qp= s->qscale;
4282 const int mb_xy= mb_x + mb_y*s->mb_stride;
4284 s->lambda= s->lambda_table[mb_xy];
4287 if(!(s->flags&CODEC_FLAG_QP_RD)){
4288 s->dquant= s->qscale - last_qp;
4290 if(s->out_format==FMT_H263){
4291 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4293 if(s->codec_id==CODEC_ID_MPEG4){
4295 if(s->pict_type == B_TYPE){
4297 s->dquant= (s->dquant/2)*2;
4298 if(s->mv_dir&MV_DIRECT)
4301 if(s->mv_type==MV_TYPE_8X8)
4307 ff_set_qscale(s, last_qp + s->dquant);
4308 }else if(s->flags&CODEC_FLAG_QP_RD)
4309 ff_set_qscale(s, s->qscale + s->dquant);
4311 wrap_y = s->linesize;
4312 wrap_c = s->uvlinesize;
4313 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4314 ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4315 ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4317 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4318 uint8_t *ebuf= s->edge_emu_buffer + 32;
4319 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4321 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);
4322 ptr_cb= ebuf+18*wrap_y;
4323 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);
4324 ptr_cr= ebuf+18*wrap_y+8;
4328 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4329 int progressive_score, interlaced_score;
4331 s->interlaced_dct=0;
4332 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4333 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4335 if(progressive_score > 0){
4336 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4337 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4338 if(progressive_score > interlaced_score){
4339 s->interlaced_dct=1;
4343 if (s->chroma_format == CHROMA_422)
4349 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4350 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4351 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4352 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4354 if(s->flags&CODEC_FLAG_GRAY){
4358 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4359 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4360 if(!s->chroma_y_shift){ /* 422 */
4361 s->dsp.get_pixels(s->block[6], ptr_cb + (dct_offset>>1), wrap_c);
4362 s->dsp.get_pixels(s->block[7], ptr_cr + (dct_offset>>1), wrap_c);
4366 op_pixels_func (*op_pix)[4];
4367 qpel_mc_func (*op_qpix)[16];
4368 uint8_t *dest_y, *dest_cb, *dest_cr;
4370 dest_y = s->dest[0];
4371 dest_cb = s->dest[1];
4372 dest_cr = s->dest[2];
4374 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4375 op_pix = s->dsp.put_pixels_tab;
4376 op_qpix= s->dsp.put_qpel_pixels_tab;
4378 op_pix = s->dsp.put_no_rnd_pixels_tab;
4379 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4382 if (s->mv_dir & MV_DIR_FORWARD) {
4383 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4384 op_pix = s->dsp.avg_pixels_tab;
4385 op_qpix= s->dsp.avg_qpel_pixels_tab;
4387 if (s->mv_dir & MV_DIR_BACKWARD) {
4388 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4391 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4392 int progressive_score, interlaced_score;
4394 s->interlaced_dct=0;
4395 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4396 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4398 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4400 if(progressive_score>0){
4401 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4402 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4404 if(progressive_score > interlaced_score){
4405 s->interlaced_dct=1;
4409 if (s->chroma_format == CHROMA_422)
4415 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4416 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4417 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4418 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4420 if(s->flags&CODEC_FLAG_GRAY){
4424 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4425 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4426 if(!s->chroma_y_shift){ /* 422 */
4427 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset>>1), dest_cb + (dct_offset>>1), wrap_c);
4428 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset>>1), dest_cr + (dct_offset>>1), wrap_c);
4431 /* pre quantization */
4432 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4434 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4435 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4436 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4437 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;
4438 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4439 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4440 if(!s->chroma_y_shift){ /* 422 */
4441 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;
4442 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;
4447 if(s->avctx->quantizer_noise_shaping){
4448 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4449 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4450 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4451 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4452 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4453 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4454 if(!s->chroma_y_shift){ /* 422 */
4455 if(!skip_dct[6]) get_vissual_weight(weight[6], ptr_cb + (dct_offset>>1), wrap_c);
4456 if(!skip_dct[7]) get_vissual_weight(weight[7], ptr_cr + (dct_offset>>1), wrap_c);
4458 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*mb_block_count);
4461 /* DCT & quantize */
4462 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4464 for(i=0;i<mb_block_count;i++) {
4467 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4468 // FIXME we could decide to change to quantizer instead of clipping
4469 // JS: I don't think that would be a good idea it could lower quality instead
4470 // of improve it. Just INTRADC clipping deserves changes in quantizer
4471 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4473 s->block_last_index[i]= -1;
4475 if(s->avctx->quantizer_noise_shaping){
4476 for(i=0;i<mb_block_count;i++) {
4478 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4483 if(s->luma_elim_threshold && !s->mb_intra)
4485 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4486 if(s->chroma_elim_threshold && !s->mb_intra)
4487 for(i=4; i<mb_block_count; i++)
4488 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4490 if(s->flags & CODEC_FLAG_CBP_RD){
4491 for(i=0;i<mb_block_count;i++) {
4492 if(s->block_last_index[i] == -1)
4493 s->coded_score[i]= INT_MAX/256;
4498 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4499 s->block_last_index[4]=
4500 s->block_last_index[5]= 0;
4502 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4505 //non c quantize code returns incorrect block_last_index FIXME
4506 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4507 for(i=0; i<mb_block_count; i++){
4509 if(s->block_last_index[i]>0){
4510 for(j=63; j>0; j--){
4511 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4513 s->block_last_index[i]= j;
4518 /* huffman encode */
4519 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4520 case CODEC_ID_MPEG1VIDEO:
4521 case CODEC_ID_MPEG2VIDEO:
4522 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4523 case CODEC_ID_MPEG4:
4524 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4525 case CODEC_ID_MSMPEG4V2:
4526 case CODEC_ID_MSMPEG4V3:
4528 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4530 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4531 #ifdef CONFIG_H261_ENCODER
4533 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4536 case CODEC_ID_H263P:
4540 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4541 case CODEC_ID_MJPEG:
4542 mjpeg_encode_mb(s, s->block); break;
4548 static always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4550 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
4551 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
4554 #endif //CONFIG_ENCODERS
4556 void ff_mpeg_flush(AVCodecContext *avctx){
4558 MpegEncContext *s = avctx->priv_data;
4560 if(s==NULL || s->picture==NULL)
4563 for(i=0; i<MAX_PICTURE_COUNT; i++){
4564 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4565 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4566 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4568 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4570 s->mb_x= s->mb_y= 0;
4572 s->parse_context.state= -1;
4573 s->parse_context.frame_start_found= 0;
4574 s->parse_context.overread= 0;
4575 s->parse_context.overread_index= 0;
4576 s->parse_context.index= 0;
4577 s->parse_context.last_index= 0;
4578 s->bitstream_buffer_size=0;
4581 #ifdef CONFIG_ENCODERS
4582 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4584 const uint16_t *srcw= (uint16_t*)src;
4585 int words= length>>4;
4586 int bits= length&15;
4589 if(length==0) return;
4592 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4593 }else if(put_bits_count(pb)&7){
4594 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4596 for(i=0; put_bits_count(pb)&31; i++)
4597 put_bits(pb, 8, src[i]);
4599 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4600 skip_put_bytes(pb, 2*words-i);
4603 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4606 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4609 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4612 d->mb_skip_run= s->mb_skip_run;
4614 d->last_dc[i]= s->last_dc[i];
4617 d->mv_bits= s->mv_bits;
4618 d->i_tex_bits= s->i_tex_bits;
4619 d->p_tex_bits= s->p_tex_bits;
4620 d->i_count= s->i_count;
4621 d->f_count= s->f_count;
4622 d->b_count= s->b_count;
4623 d->skip_count= s->skip_count;
4624 d->misc_bits= s->misc_bits;
4628 d->qscale= s->qscale;
4629 d->dquant= s->dquant;
4632 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4635 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
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;
4653 d->mb_intra= s->mb_intra;
4654 d->mb_skipped= s->mb_skipped;
4655 d->mv_type= s->mv_type;
4656 d->mv_dir= s->mv_dir;
4658 if(s->data_partitioning){
4660 d->tex_pb= s->tex_pb;
4664 d->block_last_index[i]= s->block_last_index[i];
4665 d->interlaced_dct= s->interlaced_dct;
4666 d->qscale= s->qscale;
4669 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4670 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4671 int *dmin, int *next_block, int motion_x, int motion_y)
4674 uint8_t *dest_backup[3];
4676 copy_context_before_encode(s, backup, type);
4678 s->block= s->blocks[*next_block];
4679 s->pb= pb[*next_block];
4680 if(s->data_partitioning){
4681 s->pb2 = pb2 [*next_block];
4682 s->tex_pb= tex_pb[*next_block];
4686 memcpy(dest_backup, s->dest, sizeof(s->dest));
4687 s->dest[0] = s->rd_scratchpad;
4688 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4689 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4690 assert(s->linesize >= 32); //FIXME
4693 encode_mb(s, motion_x, motion_y);
4695 score= put_bits_count(&s->pb);
4696 if(s->data_partitioning){
4697 score+= put_bits_count(&s->pb2);
4698 score+= put_bits_count(&s->tex_pb);
4701 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4702 MPV_decode_mb(s, s->block);
4704 score *= s->lambda2;
4705 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4709 memcpy(s->dest, dest_backup, sizeof(s->dest));
4716 copy_context_after_encode(best, s, type);
4720 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4721 uint32_t *sq = squareTbl + 256;
4726 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4727 else if(w==8 && h==8)
4728 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4732 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4741 static int sse_mb(MpegEncContext *s){
4745 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4746 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4749 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4750 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)
4751 +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)
4752 +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);
4754 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)
4755 +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)
4756 +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);
4759 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)
4760 +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)
4761 +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);
4764 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4765 MpegEncContext *s= arg;
4769 s->me.dia_size= s->avctx->pre_dia_size;
4770 s->first_slice_line=1;
4771 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4772 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4773 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4775 s->first_slice_line=0;
4783 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4784 MpegEncContext *s= arg;
4786 s->me.dia_size= s->avctx->dia_size;
4787 s->first_slice_line=1;
4788 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4789 s->mb_x=0; //for block init below
4790 ff_init_block_index(s);
4791 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4792 s->block_index[0]+=2;
4793 s->block_index[1]+=2;
4794 s->block_index[2]+=2;
4795 s->block_index[3]+=2;
4797 /* compute motion vector & mb_type and store in context */
4798 if(s->pict_type==B_TYPE)
4799 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4801 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4803 s->first_slice_line=0;
4808 static int mb_var_thread(AVCodecContext *c, void *arg){
4809 MpegEncContext *s= arg;
4812 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4813 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4816 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4818 int sum = s->dsp.pix_sum(pix, s->linesize);
4820 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4822 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4823 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4824 s->me.mb_var_sum_temp += varc;
4830 static void write_slice_end(MpegEncContext *s){
4831 if(s->codec_id==CODEC_ID_MPEG4){
4832 if(s->partitioned_frame){
4833 ff_mpeg4_merge_partitions(s);
4836 ff_mpeg4_stuffing(&s->pb);
4837 }else if(s->out_format == FMT_MJPEG){
4838 ff_mjpeg_stuffing(&s->pb);
4841 align_put_bits(&s->pb);
4842 flush_put_bits(&s->pb);
4844 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4845 s->misc_bits+= get_bits_diff(s);
4848 static int encode_thread(AVCodecContext *c, void *arg){
4849 MpegEncContext *s= arg;
4850 int mb_x, mb_y, pdif = 0;
4852 MpegEncContext best_s, backup_s;
4853 uint8_t bit_buf[2][MAX_MB_BYTES];
4854 uint8_t bit_buf2[2][MAX_MB_BYTES];
4855 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4856 PutBitContext pb[2], pb2[2], tex_pb[2];
4857 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4860 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4861 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4862 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4865 s->last_bits= put_bits_count(&s->pb);
4876 /* init last dc values */
4877 /* note: quant matrix value (8) is implied here */
4878 s->last_dc[i] = 128 << s->intra_dc_precision;
4880 s->current_picture.error[i] = 0;
4883 memset(s->last_mv, 0, sizeof(s->last_mv));
4887 switch(s->codec_id){
4889 case CODEC_ID_H263P:
4891 s->gob_index = ff_h263_get_gob_height(s);
4893 case CODEC_ID_MPEG4:
4894 if(s->partitioned_frame)
4895 ff_mpeg4_init_partitions(s);
4901 s->first_slice_line = 1;
4902 s->ptr_lastgob = s->pb.buf;
4903 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4904 // printf("row %d at %X\n", s->mb_y, (int)s);
4908 ff_set_qscale(s, s->qscale);
4909 ff_init_block_index(s);
4911 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4912 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4913 int mb_type= s->mb_type[xy];
4918 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4919 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4922 if(s->data_partitioning){
4923 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4924 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4925 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4931 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4932 ff_update_block_index(s);
4934 #ifdef CONFIG_H261_ENCODER
4935 if(s->codec_id == CODEC_ID_H261){
4936 ff_h261_reorder_mb_index(s);
4937 xy= s->mb_y*s->mb_stride + s->mb_x;
4938 mb_type= s->mb_type[xy];
4942 /* write gob / video packet header */
4944 int current_packet_size, is_gob_start;
4946 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4948 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4950 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4952 switch(s->codec_id){
4954 case CODEC_ID_H263P:
4955 if(!s->h263_slice_structured)
4956 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4958 case CODEC_ID_MPEG2VIDEO:
4959 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4960 case CODEC_ID_MPEG1VIDEO:
4961 if(s->mb_skip_run) is_gob_start=0;
4966 if(s->start_mb_y != mb_y || mb_x!=0){
4969 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4970 ff_mpeg4_init_partitions(s);
4974 assert((put_bits_count(&s->pb)&7) == 0);
4975 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4977 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4978 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
4979 int d= 100 / s->avctx->error_rate;
4981 current_packet_size=0;
4982 #ifndef ALT_BITSTREAM_WRITER
4983 s->pb.buf_ptr= s->ptr_lastgob;
4985 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4989 if (s->avctx->rtp_callback){
4990 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
4991 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
4994 switch(s->codec_id){
4995 case CODEC_ID_MPEG4:
4996 ff_mpeg4_encode_video_packet_header(s);
4997 ff_mpeg4_clean_buffers(s);
4999 case CODEC_ID_MPEG1VIDEO:
5000 case CODEC_ID_MPEG2VIDEO:
5001 ff_mpeg1_encode_slice_header(s);
5002 ff_mpeg1_clean_buffers(s);
5005 case CODEC_ID_H263P:
5006 h263_encode_gob_header(s, mb_y);
5010 if(s->flags&CODEC_FLAG_PASS1){
5011 int bits= put_bits_count(&s->pb);
5012 s->misc_bits+= bits - s->last_bits;
5016 s->ptr_lastgob += current_packet_size;
5017 s->first_slice_line=1;
5018 s->resync_mb_x=mb_x;
5019 s->resync_mb_y=mb_y;
5023 if( (s->resync_mb_x == s->mb_x)
5024 && s->resync_mb_y+1 == s->mb_y){
5025 s->first_slice_line=0;
5029 s->dquant=0; //only for QP_RD
5031 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
5033 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
5035 copy_context_before_encode(&backup_s, s, -1);
5037 best_s.data_partitioning= s->data_partitioning;
5038 best_s.partitioned_frame= s->partitioned_frame;
5039 if(s->data_partitioning){
5040 backup_s.pb2= s->pb2;
5041 backup_s.tex_pb= s->tex_pb;
5044 if(mb_type&CANDIDATE_MB_TYPE_INTER){
5045 s->mv_dir = MV_DIR_FORWARD;
5046 s->mv_type = MV_TYPE_16X16;
5048 s->mv[0][0][0] = s->p_mv_table[xy][0];
5049 s->mv[0][0][1] = s->p_mv_table[xy][1];
5050 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
5051 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5053 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
5054 s->mv_dir = MV_DIR_FORWARD;
5055 s->mv_type = MV_TYPE_FIELD;
5058 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5059 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5060 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5062 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
5063 &dmin, &next_block, 0, 0);
5065 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
5066 s->mv_dir = MV_DIR_FORWARD;
5067 s->mv_type = MV_TYPE_16X16;
5071 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
5072 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5074 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
5075 s->mv_dir = MV_DIR_FORWARD;
5076 s->mv_type = MV_TYPE_8X8;
5079 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5080 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5082 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
5083 &dmin, &next_block, 0, 0);
5085 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
5086 s->mv_dir = MV_DIR_FORWARD;
5087 s->mv_type = MV_TYPE_16X16;
5089 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5090 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5091 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
5092 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5094 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
5095 s->mv_dir = MV_DIR_BACKWARD;
5096 s->mv_type = MV_TYPE_16X16;
5098 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5099 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5100 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
5101 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
5103 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
5104 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5105 s->mv_type = MV_TYPE_16X16;
5107 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5108 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5109 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5110 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5111 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
5112 &dmin, &next_block, 0, 0);
5114 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
5115 int mx= s->b_direct_mv_table[xy][0];
5116 int my= s->b_direct_mv_table[xy][1];
5118 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5120 ff_mpeg4_set_direct_mv(s, mx, my);
5121 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
5122 &dmin, &next_block, mx, my);
5124 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
5125 s->mv_dir = MV_DIR_FORWARD;
5126 s->mv_type = MV_TYPE_FIELD;
5129 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5130 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5131 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5133 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
5134 &dmin, &next_block, 0, 0);
5136 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
5137 s->mv_dir = MV_DIR_BACKWARD;
5138 s->mv_type = MV_TYPE_FIELD;
5141 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5142 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5143 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5145 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
5146 &dmin, &next_block, 0, 0);
5148 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
5149 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5150 s->mv_type = MV_TYPE_FIELD;
5152 for(dir=0; dir<2; dir++){
5154 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5155 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5156 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5159 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
5160 &dmin, &next_block, 0, 0);
5162 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
5164 s->mv_type = MV_TYPE_16X16;
5168 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
5169 &dmin, &next_block, 0, 0);
5170 if(s->h263_pred || s->h263_aic){
5172 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
5174 ff_clean_intra_table_entries(s); //old mode?
5178 if(s->flags & CODEC_FLAG_QP_RD){
5179 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
5180 const int last_qp= backup_s.qscale;
5181 int dquant, dir, qp, dc[6];
5183 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
5185 assert(backup_s.dquant == 0);
5188 s->mv_dir= best_s.mv_dir;
5189 s->mv_type = MV_TYPE_16X16;
5190 s->mb_intra= best_s.mb_intra;
5191 s->mv[0][0][0] = best_s.mv[0][0][0];
5192 s->mv[0][0][1] = best_s.mv[0][0][1];
5193 s->mv[1][0][0] = best_s.mv[1][0][0];
5194 s->mv[1][0][1] = best_s.mv[1][0][1];
5196 dir= s->pict_type == B_TYPE ? 2 : 1;
5197 if(last_qp + dir > s->avctx->qmax) dir= -dir;
5198 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
5199 qp= last_qp + dquant;
5200 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
5202 backup_s.dquant= dquant;
5203 if(s->mb_intra && s->dc_val[0]){
5205 dc[i]= s->dc_val[0][ s->block_index[i] ];
5206 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
5210 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
5211 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
5212 if(best_s.qscale != qp){
5213 if(s->mb_intra && s->dc_val[0]){
5215 s->dc_val[0][ s->block_index[i] ]= dc[i];
5216 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
5219 if(dir > 0 && dquant==dir){
5227 s->current_picture.qscale_table[xy]= qp;
5231 copy_context_after_encode(s, &best_s, -1);
5233 pb_bits_count= put_bits_count(&s->pb);
5234 flush_put_bits(&s->pb);
5235 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
5238 if(s->data_partitioning){
5239 pb2_bits_count= put_bits_count(&s->pb2);
5240 flush_put_bits(&s->pb2);
5241 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5242 s->pb2= backup_s.pb2;
5244 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5245 flush_put_bits(&s->tex_pb);
5246 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5247 s->tex_pb= backup_s.tex_pb;
5249 s->last_bits= put_bits_count(&s->pb);
5251 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5252 ff_h263_update_motion_val(s);
5254 if(next_block==0){ //FIXME 16 vs linesize16
5255 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5256 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5257 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5260 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5261 MPV_decode_mb(s, s->block);
5263 int motion_x, motion_y;
5264 s->mv_type=MV_TYPE_16X16;
5265 // only one MB-Type possible
5268 case CANDIDATE_MB_TYPE_INTRA:
5271 motion_x= s->mv[0][0][0] = 0;
5272 motion_y= s->mv[0][0][1] = 0;
5274 case CANDIDATE_MB_TYPE_INTER:
5275 s->mv_dir = MV_DIR_FORWARD;
5277 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5278 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5280 case CANDIDATE_MB_TYPE_INTER_I:
5281 s->mv_dir = MV_DIR_FORWARD;
5282 s->mv_type = MV_TYPE_FIELD;
5285 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5286 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5287 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5289 motion_x = motion_y = 0;
5291 case CANDIDATE_MB_TYPE_INTER4V:
5292 s->mv_dir = MV_DIR_FORWARD;
5293 s->mv_type = MV_TYPE_8X8;
5296 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5297 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5299 motion_x= motion_y= 0;
5301 case CANDIDATE_MB_TYPE_DIRECT:
5302 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5304 motion_x=s->b_direct_mv_table[xy][0];
5305 motion_y=s->b_direct_mv_table[xy][1];
5306 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5308 case CANDIDATE_MB_TYPE_BIDIR:
5309 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5313 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5314 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5315 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5316 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5318 case CANDIDATE_MB_TYPE_BACKWARD:
5319 s->mv_dir = MV_DIR_BACKWARD;
5321 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5322 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5324 case CANDIDATE_MB_TYPE_FORWARD:
5325 s->mv_dir = MV_DIR_FORWARD;
5327 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5328 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5329 // printf(" %d %d ", motion_x, motion_y);
5331 case CANDIDATE_MB_TYPE_FORWARD_I:
5332 s->mv_dir = MV_DIR_FORWARD;
5333 s->mv_type = MV_TYPE_FIELD;
5336 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5337 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5338 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5340 motion_x=motion_y=0;
5342 case CANDIDATE_MB_TYPE_BACKWARD_I:
5343 s->mv_dir = MV_DIR_BACKWARD;
5344 s->mv_type = MV_TYPE_FIELD;
5347 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5348 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5349 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5351 motion_x=motion_y=0;
5353 case CANDIDATE_MB_TYPE_BIDIR_I:
5354 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5355 s->mv_type = MV_TYPE_FIELD;
5357 for(dir=0; dir<2; dir++){
5359 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5360 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5361 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5364 motion_x=motion_y=0;
5367 motion_x=motion_y=0; //gcc warning fix
5368 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5371 encode_mb(s, motion_x, motion_y);
5373 // RAL: Update last macroblock type
5374 s->last_mv_dir = s->mv_dir;
5376 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5377 ff_h263_update_motion_val(s);
5379 MPV_decode_mb(s, s->block);
5382 /* clean the MV table in IPS frames for direct mode in B frames */
5383 if(s->mb_intra /* && I,P,S_TYPE */){
5384 s->p_mv_table[xy][0]=0;
5385 s->p_mv_table[xy][1]=0;
5388 if(s->flags&CODEC_FLAG_PSNR){
5392 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5393 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5395 s->current_picture.error[0] += sse(
5396 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5397 s->dest[0], w, h, s->linesize);
5398 s->current_picture.error[1] += sse(
5399 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5400 s->dest[1], w>>1, h>>1, s->uvlinesize);
5401 s->current_picture.error[2] += sse(
5402 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5403 s->dest[2], w>>1, h>>1, s->uvlinesize);
5406 if(s->out_format == FMT_H263)
5407 ff_h263_loop_filter(s);
5409 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5413 //not beautiful here but we must write it before flushing so it has to be here
5414 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5415 msmpeg4_encode_ext_header(s);
5419 /* Send the last GOB if RTP */
5420 if (s->avctx->rtp_callback) {
5421 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5422 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5423 /* Call the RTP callback to send the last GOB */
5425 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5431 #define MERGE(field) dst->field += src->field; src->field=0
5432 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5433 MERGE(me.scene_change_score);
5434 MERGE(me.mc_mb_var_sum_temp);
5435 MERGE(me.mb_var_sum_temp);
5438 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5441 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5442 MERGE(dct_count[1]);
5452 MERGE(padding_bug_score);
5453 MERGE(current_picture.error[0]);
5454 MERGE(current_picture.error[1]);
5455 MERGE(current_picture.error[2]);
5457 if(dst->avctx->noise_reduction){
5458 for(i=0; i<64; i++){
5459 MERGE(dct_error_sum[0][i]);
5460 MERGE(dct_error_sum[1][i]);
5464 assert(put_bits_count(&src->pb) % 8 ==0);
5465 assert(put_bits_count(&dst->pb) % 8 ==0);
5466 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5467 flush_put_bits(&dst->pb);
5470 static void estimate_qp(MpegEncContext *s, int dry_run){
5471 if (!s->fixed_qscale)
5472 s->current_picture_ptr->quality=
5473 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
5475 if(s->adaptive_quant){
5476 switch(s->codec_id){
5477 case CODEC_ID_MPEG4:
5478 ff_clean_mpeg4_qscales(s);
5481 case CODEC_ID_H263P:
5483 ff_clean_h263_qscales(s);
5487 s->lambda= s->lambda_table[0];
5490 s->lambda= s->current_picture.quality;
5491 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5495 static void encode_picture(MpegEncContext *s, int picture_number)
5500 s->picture_number = picture_number;
5502 /* Reset the average MB variance */
5503 s->me.mb_var_sum_temp =
5504 s->me.mc_mb_var_sum_temp = 0;
5506 /* we need to initialize some time vars before we can encode b-frames */
5507 // RAL: Condition added for MPEG1VIDEO
5508 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5509 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5511 s->me.scene_change_score=0;
5513 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5515 if(s->pict_type==I_TYPE){
5516 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5517 else s->no_rounding=0;
5518 }else if(s->pict_type!=B_TYPE){
5519 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5520 s->no_rounding ^= 1;
5523 if(s->flags & CODEC_FLAG_PASS2){
5525 ff_get_2pass_fcode(s);
5526 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
5527 if(s->pict_type==B_TYPE)
5528 s->lambda= s->last_lambda_for[s->pict_type];
5530 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
5534 s->mb_intra=0; //for the rate distortion & bit compare functions
5535 for(i=1; i<s->avctx->thread_count; i++){
5536 ff_update_duplicate_context(s->thread_context[i], s);
5541 /* Estimate motion for every MB */
5542 if(s->pict_type != I_TYPE){
5543 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5544 s->lambda2= (s->lambda2* s->avctx->me_penalty_compensation + 128)>>8;
5545 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5546 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5547 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5551 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5552 }else /* if(s->pict_type == I_TYPE) */{
5554 for(i=0; i<s->mb_stride*s->mb_height; i++)
5555 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5557 if(!s->fixed_qscale){
5558 /* finding spatial complexity for I-frame rate control */
5559 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5562 for(i=1; i<s->avctx->thread_count; i++){
5563 merge_context_after_me(s, s->thread_context[i]);
5565 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5566 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5569 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5570 s->pict_type= I_TYPE;
5571 for(i=0; i<s->mb_stride*s->mb_height; i++)
5572 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5573 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5577 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5578 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5580 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5582 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5583 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5584 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5587 ff_fix_long_p_mvs(s);
5588 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5589 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5593 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5594 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5599 if(s->pict_type==B_TYPE){
5602 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5603 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5604 s->f_code = FFMAX(a, b);
5606 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5607 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5608 s->b_code = FFMAX(a, b);
5610 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5611 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5612 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5613 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5614 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5616 for(dir=0; dir<2; dir++){
5619 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5620 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5621 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5622 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5632 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5633 s->qscale= 3; //reduce clipping problems
5635 if (s->out_format == FMT_MJPEG) {
5636 /* for mjpeg, we do include qscale in the matrix */
5637 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5639 int j= s->dsp.idct_permutation[i];
5641 s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5643 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5644 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5648 //FIXME var duplication
5649 s->current_picture_ptr->key_frame=
5650 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5651 s->current_picture_ptr->pict_type=
5652 s->current_picture.pict_type= s->pict_type;
5654 if(s->current_picture.key_frame)
5655 s->picture_in_gop_number=0;
5657 s->last_bits= put_bits_count(&s->pb);
5658 switch(s->out_format) {
5660 mjpeg_picture_header(s);
5662 #ifdef CONFIG_H261_ENCODER
5664 ff_h261_encode_picture_header(s, picture_number);
5668 if (s->codec_id == CODEC_ID_WMV2)
5669 ff_wmv2_encode_picture_header(s, picture_number);
5670 else if (s->h263_msmpeg4)
5671 msmpeg4_encode_picture_header(s, picture_number);
5672 else if (s->h263_pred)
5673 mpeg4_encode_picture_header(s, picture_number);
5674 #ifdef CONFIG_RV10_ENCODER
5675 else if (s->codec_id == CODEC_ID_RV10)
5676 rv10_encode_picture_header(s, picture_number);
5678 #ifdef CONFIG_RV20_ENCODER
5679 else if (s->codec_id == CODEC_ID_RV20)
5680 rv20_encode_picture_header(s, picture_number);
5682 else if (s->codec_id == CODEC_ID_FLV1)
5683 ff_flv_encode_picture_header(s, picture_number);
5685 h263_encode_picture_header(s, picture_number);
5688 mpeg1_encode_picture_header(s, picture_number);
5695 bits= put_bits_count(&s->pb);
5696 s->header_bits= bits - s->last_bits;
5698 for(i=1; i<s->avctx->thread_count; i++){
5699 update_duplicate_context_after_me(s->thread_context[i], s);
5701 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5702 for(i=1; i<s->avctx->thread_count; i++){
5703 merge_context_after_encode(s, s->thread_context[i]);
5708 #endif //CONFIG_ENCODERS
5710 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5711 const int intra= s->mb_intra;
5714 s->dct_count[intra]++;
5716 for(i=0; i<64; i++){
5717 int level= block[i];
5721 s->dct_error_sum[intra][i] += level;
5722 level -= s->dct_offset[intra][i];
5723 if(level<0) level=0;
5725 s->dct_error_sum[intra][i] -= level;
5726 level += s->dct_offset[intra][i];
5727 if(level>0) level=0;
5734 #ifdef CONFIG_ENCODERS
5736 static int dct_quantize_trellis_c(MpegEncContext *s,
5737 DCTELEM *block, int n,
5738 int qscale, int *overflow){
5740 const uint8_t *scantable= s->intra_scantable.scantable;
5741 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5743 unsigned int threshold1, threshold2;
5755 int coeff_count[64];
5756 int qmul, qadd, start_i, last_non_zero, i, dc;
5757 const int esc_length= s->ac_esc_length;
5759 uint8_t * last_length;
5760 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5762 s->dsp.fdct (block);
5764 if(s->dct_error_sum)
5765 s->denoise_dct(s, block);
5767 qadd= ((qscale-1)|1)*8;
5778 /* For AIC we skip quant/dequant of INTRADC */
5783 /* note: block[0] is assumed to be positive */
5784 block[0] = (block[0] + (q >> 1)) / q;
5787 qmat = s->q_intra_matrix[qscale];
5788 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5789 bias= 1<<(QMAT_SHIFT-1);
5790 length = s->intra_ac_vlc_length;
5791 last_length= s->intra_ac_vlc_last_length;
5795 qmat = s->q_inter_matrix[qscale];
5796 length = s->inter_ac_vlc_length;
5797 last_length= s->inter_ac_vlc_last_length;
5801 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5802 threshold2= (threshold1<<1);
5804 for(i=63; i>=start_i; i--) {
5805 const int j = scantable[i];
5806 int level = block[j] * qmat[j];
5808 if(((unsigned)(level+threshold1))>threshold2){
5814 for(i=start_i; i<=last_non_zero; i++) {
5815 const int j = scantable[i];
5816 int level = block[j] * qmat[j];
5818 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5819 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5820 if(((unsigned)(level+threshold1))>threshold2){
5822 level= (bias + level)>>QMAT_SHIFT;
5824 coeff[1][i]= level-1;
5825 // coeff[2][k]= level-2;
5827 level= (bias - level)>>QMAT_SHIFT;
5828 coeff[0][i]= -level;
5829 coeff[1][i]= -level+1;
5830 // coeff[2][k]= -level+2;
5832 coeff_count[i]= FFMIN(level, 2);
5833 assert(coeff_count[i]);
5836 coeff[0][i]= (level>>31)|1;
5841 *overflow= s->max_qcoeff < max; //overflow might have happened
5843 if(last_non_zero < start_i){
5844 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5845 return last_non_zero;
5848 score_tab[start_i]= 0;
5849 survivor[0]= start_i;
5852 for(i=start_i; i<=last_non_zero; i++){
5854 const int dct_coeff= ABS(block[ scantable[i] ]);
5855 const int zero_distoration= dct_coeff*dct_coeff;
5856 int best_score=256*256*256*120;
5857 for(level_index=0; level_index < coeff_count[i]; level_index++){
5859 int level= coeff[level_index][i];
5860 const int alevel= ABS(level);
5865 if(s->out_format == FMT_H263){
5866 unquant_coeff= alevel*qmul + qadd;
5868 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5870 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5871 unquant_coeff = (unquant_coeff - 1) | 1;
5873 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5874 unquant_coeff = (unquant_coeff - 1) | 1;
5879 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5881 if((level&(~127)) == 0){
5882 for(j=survivor_count-1; j>=0; j--){
5883 int run= i - survivor[j];
5884 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5885 score += score_tab[i-run];
5887 if(score < best_score){
5890 level_tab[i+1]= level-64;
5894 if(s->out_format == FMT_H263){
5895 for(j=survivor_count-1; j>=0; j--){
5896 int run= i - survivor[j];
5897 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5898 score += score_tab[i-run];
5899 if(score < last_score){
5902 last_level= level-64;
5908 distoration += esc_length*lambda;
5909 for(j=survivor_count-1; j>=0; j--){
5910 int run= i - survivor[j];
5911 int score= distoration + score_tab[i-run];
5913 if(score < best_score){
5916 level_tab[i+1]= level-64;
5920 if(s->out_format == FMT_H263){
5921 for(j=survivor_count-1; j>=0; j--){
5922 int run= i - survivor[j];
5923 int score= distoration + score_tab[i-run];
5924 if(score < last_score){
5927 last_level= level-64;
5935 score_tab[i+1]= best_score;
5937 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5938 if(last_non_zero <= 27){
5939 for(; survivor_count; survivor_count--){
5940 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5944 for(; survivor_count; survivor_count--){
5945 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5950 survivor[ survivor_count++ ]= i+1;
5953 if(s->out_format != FMT_H263){
5954 last_score= 256*256*256*120;
5955 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5956 int score= score_tab[i];
5957 if(i) score += lambda*2; //FIXME exacter?
5959 if(score < last_score){
5962 last_level= level_tab[i];
5963 last_run= run_tab[i];
5968 s->coded_score[n] = last_score;
5971 last_non_zero= last_i - 1;
5972 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5974 if(last_non_zero < start_i)
5975 return last_non_zero;
5977 if(last_non_zero == 0 && start_i == 0){
5979 int best_score= dc * dc;
5981 for(i=0; i<coeff_count[0]; i++){
5982 int level= coeff[i][0];
5983 int alevel= ABS(level);
5984 int unquant_coeff, score, distortion;
5986 if(s->out_format == FMT_H263){
5987 unquant_coeff= (alevel*qmul + qadd)>>3;
5989 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5990 unquant_coeff = (unquant_coeff - 1) | 1;
5992 unquant_coeff = (unquant_coeff + 4) >> 3;
5993 unquant_coeff<<= 3 + 3;
5995 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5997 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5998 else score= distortion + esc_length*lambda;
6000 if(score < best_score){
6002 best_level= level - 64;
6005 block[0]= best_level;
6006 s->coded_score[n] = best_score - dc*dc;
6007 if(best_level == 0) return -1;
6008 else return last_non_zero;
6014 block[ perm_scantable[last_non_zero] ]= last_level;
6017 for(; i>start_i; i -= run_tab[i] + 1){
6018 block[ perm_scantable[i-1] ]= level_tab[i];
6021 return last_non_zero;
6024 //#define REFINE_STATS 1
6025 static int16_t basis[64][64];
6027 static void build_basis(uint8_t *perm){
6034 double s= 0.25*(1<<BASIS_SHIFT);
6036 int perm_index= perm[index];
6037 if(i==0) s*= sqrt(0.5);
6038 if(j==0) s*= sqrt(0.5);
6039 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)));
6046 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
6047 DCTELEM *block, int16_t *weight, DCTELEM *orig,
6050 DECLARE_ALIGNED_16(DCTELEM, d1[64]);
6052 const uint8_t *scantable= s->intra_scantable.scantable;
6053 const uint8_t *perm_scantable= s->intra_scantable.permutated;
6054 // unsigned int threshold1, threshold2;
6059 int qmul, qadd, start_i, last_non_zero, i, dc;
6061 uint8_t * last_length;
6063 int rle_index, run, q, sum;
6066 static int after_last=0;
6067 static int to_zero=0;
6068 static int from_zero=0;
6071 static int messed_sign=0;
6074 if(basis[0][0] == 0)
6075 build_basis(s->dsp.idct_permutation);
6086 /* For AIC we skip quant/dequant of INTRADC */
6090 q <<= RECON_SHIFT-3;
6091 /* note: block[0] is assumed to be positive */
6093 // block[0] = (block[0] + (q >> 1)) / q;
6095 qmat = s->q_intra_matrix[qscale];
6096 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
6097 // bias= 1<<(QMAT_SHIFT-1);
6098 length = s->intra_ac_vlc_length;
6099 last_length= s->intra_ac_vlc_last_length;
6103 qmat = s->q_inter_matrix[qscale];
6104 length = s->inter_ac_vlc_length;
6105 last_length= s->inter_ac_vlc_last_length;
6107 last_non_zero = s->block_last_index[n];
6112 dc += (1<<(RECON_SHIFT-1));
6113 for(i=0; i<64; i++){
6114 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
6117 STOP_TIMER("memset rem[]")}
6120 for(i=0; i<64; i++){
6125 w= ABS(weight[i]) + qns*one;
6126 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
6129 // w=weight[i] = (63*qns + (w/2)) / w;
6135 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
6141 for(i=start_i; i<=last_non_zero; i++){
6142 int j= perm_scantable[i];
6143 const int level= block[j];
6147 if(level<0) coeff= qmul*level - qadd;
6148 else coeff= qmul*level + qadd;
6149 run_tab[rle_index++]=run;
6152 s->dsp.add_8x8basis(rem, basis[j], coeff);
6158 if(last_non_zero>0){
6159 STOP_TIMER("init rem[]")
6166 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
6169 int run2, best_unquant_change=0, analyze_gradient;
6173 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
6175 if(analyze_gradient){
6179 for(i=0; i<64; i++){
6182 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
6185 STOP_TIMER("rem*w*w")}
6195 const int level= block[0];
6196 int change, old_coeff;
6198 assert(s->mb_intra);
6202 for(change=-1; change<=1; change+=2){
6203 int new_level= level + change;
6204 int score, new_coeff;
6206 new_coeff= q*new_level;
6207 if(new_coeff >= 2048 || new_coeff < 0)
6210 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
6211 if(score<best_score){
6214 best_change= change;
6215 best_unquant_change= new_coeff - old_coeff;
6222 run2= run_tab[rle_index++];
6226 for(i=start_i; i<64; i++){
6227 int j= perm_scantable[i];
6228 const int level= block[j];
6229 int change, old_coeff;
6231 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
6235 if(level<0) old_coeff= qmul*level - qadd;
6236 else old_coeff= qmul*level + qadd;
6237 run2= run_tab[rle_index++]; //FIXME ! maybe after last
6241 assert(run2>=0 || i >= last_non_zero );
6244 for(change=-1; change<=1; change+=2){
6245 int new_level= level + change;
6246 int score, new_coeff, unquant_change;
6249 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
6253 if(new_level<0) new_coeff= qmul*new_level - qadd;
6254 else new_coeff= qmul*new_level + qadd;
6255 if(new_coeff >= 2048 || new_coeff <= -2048)
6257 //FIXME check for overflow
6260 if(level < 63 && level > -63){
6261 if(i < last_non_zero)
6262 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6263 - length[UNI_AC_ENC_INDEX(run, level+64)];
6265 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6266 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6269 assert(ABS(new_level)==1);
6271 if(analyze_gradient){
6272 int g= d1[ scantable[i] ];
6273 if(g && (g^new_level) >= 0)
6277 if(i < last_non_zero){
6278 int next_i= i + run2 + 1;
6279 int next_level= block[ perm_scantable[next_i] ] + 64;
6281 if(next_level&(~127))
6284 if(next_i < last_non_zero)
6285 score += length[UNI_AC_ENC_INDEX(run, 65)]
6286 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6287 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6289 score += length[UNI_AC_ENC_INDEX(run, 65)]
6290 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6291 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6293 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6295 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6296 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6302 assert(ABS(level)==1);
6304 if(i < last_non_zero){
6305 int next_i= i + run2 + 1;
6306 int next_level= block[ perm_scantable[next_i] ] + 64;
6308 if(next_level&(~127))
6311 if(next_i < last_non_zero)
6312 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6313 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6314 - length[UNI_AC_ENC_INDEX(run, 65)];
6316 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6317 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6318 - length[UNI_AC_ENC_INDEX(run, 65)];
6320 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6322 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6323 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6330 unquant_change= new_coeff - old_coeff;
6331 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6333 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6334 if(score<best_score){
6337 best_change= change;
6338 best_unquant_change= unquant_change;
6342 prev_level= level + 64;
6343 if(prev_level&(~127))
6352 STOP_TIMER("iterative step")}
6356 int j= perm_scantable[ best_coeff ];
6358 block[j] += best_change;
6360 if(best_coeff > last_non_zero){
6361 last_non_zero= best_coeff;
6369 if(block[j] - best_change){
6370 if(ABS(block[j]) > ABS(block[j] - best_change)){
6382 for(; last_non_zero>=start_i; last_non_zero--){
6383 if(block[perm_scantable[last_non_zero]])
6389 if(256*256*256*64 % count == 0){
6390 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);
6395 for(i=start_i; i<=last_non_zero; i++){
6396 int j= perm_scantable[i];
6397 const int level= block[j];
6400 run_tab[rle_index++]=run;
6407 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6413 if(last_non_zero>0){
6414 STOP_TIMER("iterative search")
6419 return last_non_zero;
6422 static int dct_quantize_c(MpegEncContext *s,
6423 DCTELEM *block, int n,
6424 int qscale, int *overflow)
6426 int i, j, level, last_non_zero, q, start_i;
6428 const uint8_t *scantable= s->intra_scantable.scantable;
6431 unsigned int threshold1, threshold2;
6433 s->dsp.fdct (block);
6435 if(s->dct_error_sum)
6436 s->denoise_dct(s, block);
6446 /* For AIC we skip quant/dequant of INTRADC */
6449 /* note: block[0] is assumed to be positive */
6450 block[0] = (block[0] + (q >> 1)) / q;
6453 qmat = s->q_intra_matrix[qscale];
6454 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6458 qmat = s->q_inter_matrix[qscale];
6459 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6461 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6462 threshold2= (threshold1<<1);
6463 for(i=63;i>=start_i;i--) {
6465 level = block[j] * qmat[j];
6467 if(((unsigned)(level+threshold1))>threshold2){
6474 for(i=start_i; i<=last_non_zero; i++) {
6476 level = block[j] * qmat[j];
6478 // if( bias+level >= (1<<QMAT_SHIFT)
6479 // || bias-level >= (1<<QMAT_SHIFT)){
6480 if(((unsigned)(level+threshold1))>threshold2){
6482 level= (bias + level)>>QMAT_SHIFT;
6485 level= (bias - level)>>QMAT_SHIFT;
6493 *overflow= s->max_qcoeff < max; //overflow might have happened
6495 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6496 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6497 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6499 return last_non_zero;
6502 #endif //CONFIG_ENCODERS
6504 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6505 DCTELEM *block, int n, int qscale)
6507 int i, level, nCoeffs;
6508 const uint16_t *quant_matrix;
6510 nCoeffs= s->block_last_index[n];
6513 block[0] = block[0] * s->y_dc_scale;
6515 block[0] = block[0] * s->c_dc_scale;
6516 /* XXX: only mpeg1 */
6517 quant_matrix = s->intra_matrix;
6518 for(i=1;i<=nCoeffs;i++) {
6519 int j= s->intra_scantable.permutated[i];
6524 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6525 level = (level - 1) | 1;
6528 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6529 level = (level - 1) | 1;
6536 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6537 DCTELEM *block, int n, int qscale)
6539 int i, level, nCoeffs;
6540 const uint16_t *quant_matrix;
6542 nCoeffs= s->block_last_index[n];
6544 quant_matrix = s->inter_matrix;
6545 for(i=0; i<=nCoeffs; i++) {
6546 int j= s->intra_scantable.permutated[i];
6551 level = (((level << 1) + 1) * qscale *
6552 ((int) (quant_matrix[j]))) >> 4;
6553 level = (level - 1) | 1;
6556 level = (((level << 1) + 1) * qscale *
6557 ((int) (quant_matrix[j]))) >> 4;
6558 level = (level - 1) | 1;
6565 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6566 DCTELEM *block, int n, int qscale)
6568 int i, level, nCoeffs;
6569 const uint16_t *quant_matrix;
6571 if(s->alternate_scan) nCoeffs= 63;
6572 else nCoeffs= s->block_last_index[n];
6575 block[0] = block[0] * s->y_dc_scale;
6577 block[0] = block[0] * s->c_dc_scale;
6578 quant_matrix = s->intra_matrix;
6579 for(i=1;i<=nCoeffs;i++) {
6580 int j= s->intra_scantable.permutated[i];
6585 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6588 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6595 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
6596 DCTELEM *block, int n, int qscale)
6598 int i, level, nCoeffs;
6599 const uint16_t *quant_matrix;
6602 if(s->alternate_scan) nCoeffs= 63;
6603 else nCoeffs= s->block_last_index[n];
6606 block[0] = block[0] * s->y_dc_scale;
6608 block[0] = block[0] * s->c_dc_scale;
6609 quant_matrix = s->intra_matrix;
6610 for(i=1;i<=nCoeffs;i++) {
6611 int j= s->intra_scantable.permutated[i];
6616 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6619 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6628 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6629 DCTELEM *block, int n, int qscale)
6631 int i, level, nCoeffs;
6632 const uint16_t *quant_matrix;
6635 if(s->alternate_scan) nCoeffs= 63;
6636 else nCoeffs= s->block_last_index[n];
6638 quant_matrix = s->inter_matrix;
6639 for(i=0; i<=nCoeffs; i++) {
6640 int j= s->intra_scantable.permutated[i];
6645 level = (((level << 1) + 1) * qscale *
6646 ((int) (quant_matrix[j]))) >> 4;
6649 level = (((level << 1) + 1) * qscale *
6650 ((int) (quant_matrix[j]))) >> 4;
6659 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6660 DCTELEM *block, int n, int qscale)
6662 int i, level, qmul, qadd;
6665 assert(s->block_last_index[n]>=0);
6671 block[0] = block[0] * s->y_dc_scale;
6673 block[0] = block[0] * s->c_dc_scale;
6674 qadd = (qscale - 1) | 1;
6681 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6683 for(i=1; i<=nCoeffs; i++) {
6687 level = level * qmul - qadd;
6689 level = level * qmul + qadd;
6696 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6697 DCTELEM *block, int n, int qscale)
6699 int i, level, qmul, qadd;
6702 assert(s->block_last_index[n]>=0);
6704 qadd = (qscale - 1) | 1;
6707 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6709 for(i=0; i<=nCoeffs; i++) {
6713 level = level * qmul - qadd;
6715 level = level * qmul + qadd;
6722 #ifdef CONFIG_ENCODERS
6723 AVCodec h263_encoder = {
6727 sizeof(MpegEncContext),
6731 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6734 AVCodec h263p_encoder = {
6738 sizeof(MpegEncContext),
6742 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6745 AVCodec flv_encoder = {
6749 sizeof(MpegEncContext),
6753 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6756 AVCodec rv10_encoder = {
6760 sizeof(MpegEncContext),
6764 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6767 AVCodec rv20_encoder = {
6771 sizeof(MpegEncContext),
6775 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6778 AVCodec mpeg4_encoder = {
6782 sizeof(MpegEncContext),
6786 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6787 .capabilities= CODEC_CAP_DELAY,
6790 AVCodec msmpeg4v1_encoder = {
6794 sizeof(MpegEncContext),
6798 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6801 AVCodec msmpeg4v2_encoder = {
6805 sizeof(MpegEncContext),
6809 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6812 AVCodec msmpeg4v3_encoder = {
6816 sizeof(MpegEncContext),
6820 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6823 AVCodec wmv1_encoder = {
6827 sizeof(MpegEncContext),
6831 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6834 AVCodec mjpeg_encoder = {
6838 sizeof(MpegEncContext),
6842 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, -1},
6845 #endif //CONFIG_ENCODERS