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_inter_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
57 #ifdef CONFIG_ENCODERS
58 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
59 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
60 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
61 static int sse_mb(MpegEncContext *s);
62 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
63 #endif //CONFIG_ENCODERS
66 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
67 extern void XVMC_field_end(MpegEncContext *s);
68 extern void XVMC_decode_mb(MpegEncContext *s);
71 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
74 /* enable all paranoid tests for rounding, overflows, etc... */
80 /* for jpeg fast DCT */
83 static const uint16_t aanscales[64] = {
84 /* precomputed values scaled up by 14 bits */
85 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
86 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
87 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
88 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
89 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
90 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
91 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
92 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
95 static const uint8_t h263_chroma_roundtab[16] = {
96 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
97 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
100 static const uint8_t ff_default_chroma_qscale_table[32]={
101 // 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
102 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
105 #ifdef CONFIG_ENCODERS
106 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
107 static uint8_t default_fcode_tab[MAX_MV*2+1];
109 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
111 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
112 const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
117 for(qscale=qmin; qscale<=qmax; qscale++){
119 if (dsp->fdct == ff_jpeg_fdct_islow
120 #ifdef FAAN_POSTSCALE
121 || dsp->fdct == ff_faandct
125 const int j= dsp->idct_permutation[i];
126 /* 16 <= qscale * quant_matrix[i] <= 7905 */
127 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
128 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
129 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
131 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
132 (qscale * quant_matrix[j]));
134 } else if (dsp->fdct == fdct_ifast
135 #ifndef FAAN_POSTSCALE
136 || dsp->fdct == ff_faandct
140 const int j= dsp->idct_permutation[i];
141 /* 16 <= qscale * quant_matrix[i] <= 7905 */
142 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
143 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
144 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
146 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
147 (aanscales[i] * qscale * quant_matrix[j]));
151 const int j= dsp->idct_permutation[i];
152 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
153 So 16 <= qscale * quant_matrix[i] <= 7905
154 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
155 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
157 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
158 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
159 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
161 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
162 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
166 for(i=intra; i<64; i++){
168 if (dsp->fdct == fdct_ifast
169 #ifndef FAAN_POSTSCALE
170 || dsp->fdct == ff_faandct
173 max= (8191LL*aanscales[i]) >> 14;
175 while(((max * qmat[qscale][i]) >> shift) > INT_MAX){
181 av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger then %d, overflows possible\n", QMAT_SHIFT - shift);
185 static inline void update_qscale(MpegEncContext *s){
186 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
187 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
189 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
191 #endif //CONFIG_ENCODERS
193 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
197 st->scantable= src_scantable;
201 j = src_scantable[i];
202 st->permutated[i] = permutation[j];
211 j = st->permutated[i];
213 st->raster_end[i]= end;
217 #ifdef CONFIG_ENCODERS
218 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
224 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
229 #endif //CONFIG_ENCODERS
231 /* init common dct for both encoder and decoder */
232 int DCT_common_init(MpegEncContext *s)
234 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
235 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
236 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
237 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
238 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
239 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
241 #ifdef CONFIG_ENCODERS
242 s->dct_quantize= dct_quantize_c;
243 s->denoise_dct= denoise_dct_c;
244 #endif //CONFIG_ENCODERS
247 MPV_common_init_mmx(s);
250 MPV_common_init_axp(s);
253 MPV_common_init_mlib(s);
256 MPV_common_init_mmi(s);
259 MPV_common_init_armv4l(s);
262 MPV_common_init_ppc(s);
265 #ifdef CONFIG_ENCODERS
266 s->fast_dct_quantize= s->dct_quantize;
268 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
269 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
272 #endif //CONFIG_ENCODERS
274 /* load & permutate scantables
275 note: only wmv uses different ones
277 if(s->alternate_scan){
278 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
279 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
281 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
282 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
284 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
285 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
290 static void copy_picture(Picture *dst, Picture *src){
292 dst->type= FF_BUFFER_TYPE_COPY;
295 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
298 dst->pict_type = src->pict_type;
299 dst->quality = src->quality;
300 dst->coded_picture_number = src->coded_picture_number;
301 dst->display_picture_number = src->display_picture_number;
302 // dst->reference = src->reference;
304 dst->interlaced_frame = src->interlaced_frame;
305 dst->top_field_first = src->top_field_first;
307 if(s->avctx->me_threshold){
308 if(!src->motion_val[0])
309 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
311 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
312 if(!src->ref_index[0])
313 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
314 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
315 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
316 src->motion_subsample_log2, dst->motion_subsample_log2);
318 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
321 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
322 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
324 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
325 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
327 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
328 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
335 * allocates a Picture
336 * The pixels are allocated/set by calling get_buffer() if shared=0
338 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
339 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
340 const int mb_array_size= s->mb_stride*s->mb_height;
341 const int b8_array_size= s->b8_stride*s->mb_height*2;
342 const int b4_array_size= s->b4_stride*s->mb_height*4;
346 assert(pic->data[0]);
347 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
348 pic->type= FF_BUFFER_TYPE_SHARED;
352 assert(!pic->data[0]);
354 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
356 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
357 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
361 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
362 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
366 if(pic->linesize[1] != pic->linesize[2]){
367 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
371 s->linesize = pic->linesize[0];
372 s->uvlinesize= pic->linesize[1];
375 if(pic->qscale_table==NULL){
377 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
378 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
379 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
382 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
383 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
384 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
385 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
386 if(s->out_format == FMT_H264){
388 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t))
389 pic->motion_val[i]= pic->motion_val_base[i]+4;
390 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
392 pic->motion_subsample_log2= 2;
393 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
395 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
396 pic->motion_val[i]= pic->motion_val_base[i]+4;
397 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
399 pic->motion_subsample_log2= 3;
401 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
402 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
404 pic->qstride= s->mb_stride;
405 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
408 //it might be nicer if the application would keep track of these but it would require a API change
409 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
410 s->prev_pict_types[0]= s->pict_type;
411 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
412 pic->age= INT_MAX; // skipped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
415 fail: //for the CHECKED_ALLOCZ macro
420 * deallocates a picture
422 static void free_picture(MpegEncContext *s, Picture *pic){
425 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
426 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
429 av_freep(&pic->mb_var);
430 av_freep(&pic->mc_mb_var);
431 av_freep(&pic->mb_mean);
432 av_freep(&pic->mbskip_table);
433 av_freep(&pic->qscale_table);
434 av_freep(&pic->mb_type_base);
435 av_freep(&pic->dct_coeff);
436 av_freep(&pic->pan_scan);
439 av_freep(&pic->motion_val_base[i]);
440 av_freep(&pic->ref_index[i]);
443 if(pic->type == FF_BUFFER_TYPE_SHARED){
452 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
455 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
456 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
457 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
459 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
460 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
461 s->rd_scratchpad= s->me.scratchpad;
462 s->b_scratchpad= s->me.scratchpad;
463 s->obmc_scratchpad= s->me.scratchpad + 16;
465 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
466 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
467 if(s->avctx->noise_reduction){
468 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
471 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
472 s->block= s->blocks[0];
475 s->pblocks[i] = (short *)(&s->block[i]);
479 return -1; //free() through MPV_common_end()
482 static void free_duplicate_context(MpegEncContext *s){
485 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
486 av_freep(&s->me.scratchpad);
489 s->obmc_scratchpad= NULL;
491 av_freep(&s->dct_error_sum);
492 av_freep(&s->me.map);
493 av_freep(&s->me.score_map);
494 av_freep(&s->blocks);
498 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
499 #define COPY(a) bak->a= src->a
500 COPY(allocated_edge_emu_buffer);
501 COPY(edge_emu_buffer);
505 COPY(obmc_scratchpad);
512 COPY(me.map_generation);
520 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
523 //FIXME copy only needed parts
525 backup_duplicate_context(&bak, dst);
526 memcpy(dst, src, sizeof(MpegEncContext));
527 backup_duplicate_context(dst, &bak);
529 dst->pblocks[i] = (short *)(&dst->block[i]);
531 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
534 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
535 #define COPY(a) dst->a= src->a
537 COPY(current_picture);
543 COPY(picture_in_gop_number);
544 COPY(gop_picture_number);
545 COPY(frame_pred_frame_dct); //FIXME don't set in encode_header
546 COPY(progressive_frame); //FIXME don't set in encode_header
547 COPY(partitioned_frame); //FIXME don't set in encode_header
552 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
553 * the changed fields will not depend upon the prior state of the MpegEncContext.
555 static void MPV_common_defaults(MpegEncContext *s){
557 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
558 s->chroma_qscale_table= ff_default_chroma_qscale_table;
559 s->progressive_frame= 1;
560 s->progressive_sequence= 1;
561 s->picture_structure= PICT_FRAME;
563 s->coded_picture_number = 0;
564 s->picture_number = 0;
565 s->input_picture_number = 0;
567 s->picture_in_gop_number = 0;
574 * sets the given MpegEncContext to defaults for decoding.
575 * the changed fields will not depend upon the prior state of the MpegEncContext.
577 void MPV_decode_defaults(MpegEncContext *s){
578 MPV_common_defaults(s);
582 * sets the given MpegEncContext to defaults for encoding.
583 * the changed fields will not depend upon the prior state of the MpegEncContext.
586 #ifdef CONFIG_ENCODERS
587 static void MPV_encode_defaults(MpegEncContext *s){
590 MPV_common_defaults(s);
596 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
597 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
599 for(i=-16; i<16; i++){
600 default_fcode_tab[i + MAX_MV]= 1;
603 s->me.mv_penalty= default_mv_penalty;
604 s->fcode_tab= default_fcode_tab;
606 #endif //CONFIG_ENCODERS
609 * init common structure for both encoder and decoder.
610 * this assumes that some variables like width/height are already set
612 int MPV_common_init(MpegEncContext *s)
614 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
616 if(s->avctx->thread_count > MAX_THREADS || (16*s->avctx->thread_count > s->height && s->height)){
617 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
621 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
624 dsputil_init(&s->dsp, s->avctx);
627 s->flags= s->avctx->flags;
628 s->flags2= s->avctx->flags2;
630 s->mb_width = (s->width + 15) / 16;
631 s->mb_height = (s->height + 15) / 16;
632 s->mb_stride = s->mb_width + 1;
633 s->b8_stride = s->mb_width*2 + 1;
634 s->b4_stride = s->mb_width*4 + 1;
635 mb_array_size= s->mb_height * s->mb_stride;
636 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
638 /* set chroma shifts */
639 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
640 &(s->chroma_y_shift) );
642 /* set default edge pos, will be overriden in decode_header if needed */
643 s->h_edge_pos= s->mb_width*16;
644 s->v_edge_pos= s->mb_height*16;
646 s->mb_num = s->mb_width * s->mb_height;
651 s->block_wrap[3]= s->b8_stride;
653 s->block_wrap[5]= s->mb_stride;
655 y_size = s->b8_stride * (2 * s->mb_height + 1);
656 c_size = s->mb_stride * (s->mb_height + 1);
657 yc_size = y_size + 2 * c_size;
659 /* convert fourcc to upper case */
660 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
661 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
662 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
663 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
665 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
666 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
667 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
668 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
670 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
672 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
673 for(y=0; y<s->mb_height; y++){
674 for(x=0; x<s->mb_width; x++){
675 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
678 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
681 /* Allocate MV tables */
682 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
683 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
684 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
685 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
686 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
687 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
688 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
689 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
690 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
691 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
692 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
693 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
695 if(s->msmpeg4_version){
696 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
698 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
700 /* Allocate MB type table */
701 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
703 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
705 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
706 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
707 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
708 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
709 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
710 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
712 if(s->avctx->noise_reduction){
713 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
716 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
718 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
720 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
721 /* interlaced direct mode decoding tables */
726 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
727 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
729 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
730 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
731 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
733 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
736 if (s->out_format == FMT_H263) {
738 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
739 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
740 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
741 s->ac_val[2] = s->ac_val[1] + c_size;
744 CHECKED_ALLOCZ(s->coded_block_base, y_size);
745 s->coded_block= s->coded_block_base + s->b8_stride + 1;
747 /* cbp, ac_pred, pred_dir */
748 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
749 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
752 if (s->h263_pred || s->h263_plus || !s->encoding) {
754 //MN: we need these for error resilience of intra-frames
755 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
756 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
757 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
758 s->dc_val[2] = s->dc_val[1] + c_size;
759 for(i=0;i<yc_size;i++)
760 s->dc_val_base[i] = 1024;
763 /* which mb is a intra block */
764 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
765 memset(s->mbintra_table, 1, mb_array_size);
767 /* init macroblock skip table */
768 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
769 //Note the +1 is for a quicker mpeg4 slice_end detection
770 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
772 s->parse_context.state= -1;
773 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
774 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
775 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
776 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
779 s->context_initialized = 1;
781 s->thread_context[0]= s;
782 for(i=1; i<s->avctx->thread_count; i++){
783 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
784 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
787 for(i=0; i<s->avctx->thread_count; i++){
788 if(init_duplicate_context(s->thread_context[i], s) < 0)
790 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
791 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
800 /* init common structure for both encoder and decoder */
801 void MPV_common_end(MpegEncContext *s)
805 for(i=0; i<s->avctx->thread_count; i++){
806 free_duplicate_context(s->thread_context[i]);
808 for(i=1; i<s->avctx->thread_count; i++){
809 av_freep(&s->thread_context[i]);
812 av_freep(&s->parse_context.buffer);
813 s->parse_context.buffer_size=0;
815 av_freep(&s->mb_type);
816 av_freep(&s->p_mv_table_base);
817 av_freep(&s->b_forw_mv_table_base);
818 av_freep(&s->b_back_mv_table_base);
819 av_freep(&s->b_bidir_forw_mv_table_base);
820 av_freep(&s->b_bidir_back_mv_table_base);
821 av_freep(&s->b_direct_mv_table_base);
823 s->b_forw_mv_table= NULL;
824 s->b_back_mv_table= NULL;
825 s->b_bidir_forw_mv_table= NULL;
826 s->b_bidir_back_mv_table= NULL;
827 s->b_direct_mv_table= NULL;
831 av_freep(&s->b_field_mv_table_base[i][j][k]);
832 s->b_field_mv_table[i][j][k]=NULL;
834 av_freep(&s->b_field_select_table[i][j]);
835 av_freep(&s->p_field_mv_table_base[i][j]);
836 s->p_field_mv_table[i][j]=NULL;
838 av_freep(&s->p_field_select_table[i]);
841 av_freep(&s->dc_val_base);
842 av_freep(&s->ac_val_base);
843 av_freep(&s->coded_block_base);
844 av_freep(&s->mbintra_table);
845 av_freep(&s->cbp_table);
846 av_freep(&s->pred_dir_table);
848 av_freep(&s->mbskip_table);
849 av_freep(&s->prev_pict_types);
850 av_freep(&s->bitstream_buffer);
851 s->allocated_bitstream_buffer_size=0;
853 av_freep(&s->avctx->stats_out);
854 av_freep(&s->ac_stats);
855 av_freep(&s->error_status_table);
856 av_freep(&s->mb_index2xy);
857 av_freep(&s->lambda_table);
858 av_freep(&s->q_intra_matrix);
859 av_freep(&s->q_inter_matrix);
860 av_freep(&s->q_intra_matrix16);
861 av_freep(&s->q_inter_matrix16);
862 av_freep(&s->input_picture);
863 av_freep(&s->reordered_input_picture);
864 av_freep(&s->dct_offset);
867 for(i=0; i<MAX_PICTURE_COUNT; i++){
868 free_picture(s, &s->picture[i]);
871 av_freep(&s->picture);
872 s->context_initialized = 0;
875 s->current_picture_ptr= NULL;
876 s->linesize= s->uvlinesize= 0;
879 av_freep(&s->visualization_buffer[i]);
881 avcodec_default_free_buffers(s->avctx);
884 #ifdef CONFIG_ENCODERS
886 /* init video encoder */
887 int MPV_encode_init(AVCodecContext *avctx)
889 MpegEncContext *s = avctx->priv_data;
891 int chroma_h_shift, chroma_v_shift;
893 MPV_encode_defaults(s);
895 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUV420P){
896 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
900 if(avctx->codec_id == CODEC_ID_MJPEG || avctx->codec_id == CODEC_ID_LJPEG){
901 if(avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL && avctx->pix_fmt != PIX_FMT_YUVJ420P){
902 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
906 if(avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL && avctx->pix_fmt != PIX_FMT_YUV420P){
907 av_log(avctx, AV_LOG_ERROR, "colorspace not supported\n");
912 s->bit_rate = avctx->bit_rate;
913 s->width = avctx->width;
914 s->height = avctx->height;
915 if(avctx->gop_size > 600){
916 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
919 s->gop_size = avctx->gop_size;
921 s->flags= avctx->flags;
922 s->flags2= avctx->flags2;
923 s->max_b_frames= avctx->max_b_frames;
924 s->codec_id= avctx->codec->id;
925 s->luma_elim_threshold = avctx->luma_elim_threshold;
926 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
927 s->strict_std_compliance= avctx->strict_std_compliance;
928 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
929 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
930 s->mpeg_quant= avctx->mpeg_quant;
931 s->rtp_mode= !!avctx->rtp_payload_size;
932 s->intra_dc_precision= avctx->intra_dc_precision;
933 s->user_specified_pts = AV_NOPTS_VALUE;
935 if (s->gop_size <= 1) {
942 s->me_method = avctx->me_method;
945 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
947 s->adaptive_quant= ( s->avctx->lumi_masking
948 || s->avctx->dark_masking
949 || s->avctx->temporal_cplx_masking
950 || s->avctx->spatial_cplx_masking
951 || s->avctx->p_masking
952 || s->avctx->border_masking
953 || (s->flags&CODEC_FLAG_QP_RD))
956 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
957 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
958 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
960 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
961 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
965 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
966 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
969 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
970 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
974 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
975 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
979 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
980 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
981 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
983 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");
986 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
987 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
988 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
992 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
993 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
997 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
998 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
1002 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1003 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1007 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1008 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1012 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1013 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1017 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1018 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1019 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1023 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1024 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
1028 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1029 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1033 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1034 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1038 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1039 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1043 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1044 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1045 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1046 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1050 if(s->avctx->thread_count > 1)
1053 if(!avctx->time_base.den || !avctx->time_base.num){
1054 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
1058 i= (INT_MAX/2+128)>>8;
1059 if(avctx->me_threshold >= i){
1060 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
1063 if(avctx->mb_threshold >= i){
1064 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
1068 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){
1069 av_log(avctx, AV_LOG_ERROR, "b_frame_strategy must be 0 on the second pass\n");
1073 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
1075 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1076 avctx->time_base.den /= i;
1077 avctx->time_base.num /= i;
1081 if(s->codec_id==CODEC_ID_MJPEG){
1082 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1083 s->inter_quant_bias= 0;
1084 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1085 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1086 s->inter_quant_bias= 0;
1088 s->intra_quant_bias=0;
1089 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1092 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1093 s->intra_quant_bias= avctx->intra_quant_bias;
1094 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1095 s->inter_quant_bias= avctx->inter_quant_bias;
1097 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1099 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
1100 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
1103 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1105 switch(avctx->codec->id) {
1106 case CODEC_ID_MPEG1VIDEO:
1107 s->out_format = FMT_MPEG1;
1108 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1109 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1111 case CODEC_ID_MPEG2VIDEO:
1112 s->out_format = FMT_MPEG1;
1113 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1114 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1117 case CODEC_ID_LJPEG:
1118 case CODEC_ID_JPEGLS:
1119 case CODEC_ID_MJPEG:
1120 s->out_format = FMT_MJPEG;
1121 s->intra_only = 1; /* force intra only for jpeg */
1122 s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;
1123 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1124 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1125 s->mjpeg_vsample[1] = 1;
1126 s->mjpeg_vsample[2] = 1;
1127 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1128 s->mjpeg_hsample[1] = 1;
1129 s->mjpeg_hsample[2] = 1;
1130 if (mjpeg_init(s) < 0)
1136 s->out_format = FMT_H261;
1141 if (h263_get_picture_format(s->width, s->height) == 7) {
1142 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);
1145 s->out_format = FMT_H263;
1146 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1150 case CODEC_ID_H263P:
1151 s->out_format = FMT_H263;
1154 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1155 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1156 s->modified_quant= s->h263_aic;
1157 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1158 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1159 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1160 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1161 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1164 /* These are just to be sure */
1169 s->out_format = FMT_H263;
1170 s->h263_flv = 2; /* format = 1; 11-bit codes */
1171 s->unrestricted_mv = 1;
1172 s->rtp_mode=0; /* don't allow GOB */
1177 s->out_format = FMT_H263;
1182 s->out_format = FMT_H263;
1185 s->modified_quant=1;
1189 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1191 case CODEC_ID_MPEG4:
1192 s->out_format = FMT_H263;
1194 s->unrestricted_mv = 1;
1195 s->low_delay= s->max_b_frames ? 0 : 1;
1196 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1198 case CODEC_ID_MSMPEG4V1:
1199 s->out_format = FMT_H263;
1200 s->h263_msmpeg4 = 1;
1202 s->unrestricted_mv = 1;
1203 s->msmpeg4_version= 1;
1207 case CODEC_ID_MSMPEG4V2:
1208 s->out_format = FMT_H263;
1209 s->h263_msmpeg4 = 1;
1211 s->unrestricted_mv = 1;
1212 s->msmpeg4_version= 2;
1216 case CODEC_ID_MSMPEG4V3:
1217 s->out_format = FMT_H263;
1218 s->h263_msmpeg4 = 1;
1220 s->unrestricted_mv = 1;
1221 s->msmpeg4_version= 3;
1222 s->flipflop_rounding=1;
1227 s->out_format = FMT_H263;
1228 s->h263_msmpeg4 = 1;
1230 s->unrestricted_mv = 1;
1231 s->msmpeg4_version= 4;
1232 s->flipflop_rounding=1;
1237 s->out_format = FMT_H263;
1238 s->h263_msmpeg4 = 1;
1240 s->unrestricted_mv = 1;
1241 s->msmpeg4_version= 5;
1242 s->flipflop_rounding=1;
1250 avctx->has_b_frames= !s->low_delay;
1255 if (MPV_common_init(s) < 0)
1258 if(s->modified_quant)
1259 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1260 s->progressive_frame=
1261 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1262 s->quant_precision=5;
1264 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1265 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1267 #ifdef CONFIG_H261_ENCODER
1268 if (s->out_format == FMT_H261)
1269 ff_h261_encode_init(s);
1271 if (s->out_format == FMT_H263)
1272 h263_encode_init(s);
1273 if(s->msmpeg4_version)
1274 ff_msmpeg4_encode_init(s);
1275 if (s->out_format == FMT_MPEG1)
1276 ff_mpeg1_encode_init(s);
1280 int j= s->dsp.idct_permutation[i];
1281 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1282 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1283 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1284 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1285 s->intra_matrix[j] =
1286 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1289 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1290 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1292 if(s->avctx->intra_matrix)
1293 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1294 if(s->avctx->inter_matrix)
1295 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1298 /* precompute matrix */
1299 /* for mjpeg, we do include qscale in the matrix */
1300 if (s->out_format != FMT_MJPEG) {
1301 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1302 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1303 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1304 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1307 if(ff_rate_control_init(s) < 0)
1313 int MPV_encode_end(AVCodecContext *avctx)
1315 MpegEncContext *s = avctx->priv_data;
1321 ff_rate_control_uninit(s);
1324 if (s->out_format == FMT_MJPEG)
1327 av_freep(&avctx->extradata);
1332 #endif //CONFIG_ENCODERS
1334 void init_rl(RLTable *rl, int use_static)
1336 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1337 uint8_t index_run[MAX_RUN+1];
1338 int last, run, level, start, end, i;
1340 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1341 if(use_static && rl->max_level[0])
1344 /* compute max_level[], max_run[] and index_run[] */
1345 for(last=0;last<2;last++) {
1354 memset(max_level, 0, MAX_RUN + 1);
1355 memset(max_run, 0, MAX_LEVEL + 1);
1356 memset(index_run, rl->n, MAX_RUN + 1);
1357 for(i=start;i<end;i++) {
1358 run = rl->table_run[i];
1359 level = rl->table_level[i];
1360 if (index_run[run] == rl->n)
1362 if (level > max_level[run])
1363 max_level[run] = level;
1364 if (run > max_run[level])
1365 max_run[level] = run;
1368 rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
1370 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1371 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1373 rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
1375 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1376 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1378 rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
1380 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1381 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1385 /* draw the edges of width 'w' of an image of size width, height */
1386 //FIXME check that this is ok for mpeg4 interlaced
1387 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1389 uint8_t *ptr, *last_line;
1392 last_line = buf + (height - 1) * wrap;
1394 /* top and bottom */
1395 memcpy(buf - (i + 1) * wrap, buf, width);
1396 memcpy(last_line + (i + 1) * wrap, last_line, width);
1398 /* left and right */
1400 for(i=0;i<height;i++) {
1401 memset(ptr - w, ptr[0], w);
1402 memset(ptr + width, ptr[width-1], w);
1407 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1408 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1409 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1410 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1414 int ff_find_unused_picture(MpegEncContext *s, int shared){
1418 for(i=0; i<MAX_PICTURE_COUNT; i++){
1419 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1422 for(i=0; i<MAX_PICTURE_COUNT; i++){
1423 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1425 for(i=0; i<MAX_PICTURE_COUNT; i++){
1426 if(s->picture[i].data[0]==NULL) return i;
1434 static void update_noise_reduction(MpegEncContext *s){
1437 for(intra=0; intra<2; intra++){
1438 if(s->dct_count[intra] > (1<<16)){
1439 for(i=0; i<64; i++){
1440 s->dct_error_sum[intra][i] >>=1;
1442 s->dct_count[intra] >>= 1;
1445 for(i=0; i<64; i++){
1446 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);
1452 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1454 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1460 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1462 /* mark&release old frames */
1463 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1464 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1466 /* release forgotten pictures */
1467 /* if(mpeg124/h263) */
1469 for(i=0; i<MAX_PICTURE_COUNT; i++){
1470 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1471 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1472 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1479 /* release non reference frames */
1480 for(i=0; i<MAX_PICTURE_COUNT; i++){
1481 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1482 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1486 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1487 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1489 i= ff_find_unused_picture(s, 0);
1490 pic= (AVFrame*)&s->picture[i];
1493 pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
1494 && !s->dropable ? 3 : 0;
1496 pic->coded_picture_number= s->coded_picture_number++;
1498 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1501 s->current_picture_ptr= (Picture*)pic;
1502 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1503 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1506 s->current_picture_ptr->pict_type= s->pict_type;
1507 // if(s->flags && CODEC_FLAG_QSCALE)
1508 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1509 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1511 copy_picture(&s->current_picture, s->current_picture_ptr);
1513 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1514 if (s->pict_type != B_TYPE) {
1515 s->last_picture_ptr= s->next_picture_ptr;
1517 s->next_picture_ptr= s->current_picture_ptr;
1519 /* 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,
1520 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1521 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1522 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1523 s->pict_type, s->dropable);*/
1525 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1526 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1528 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1529 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1530 assert(s->pict_type != B_TYPE); //these should have been dropped if we don't have a reference
1534 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1536 if(s->picture_structure!=PICT_FRAME){
1539 if(s->picture_structure == PICT_BOTTOM_FIELD){
1540 s->current_picture.data[i] += s->current_picture.linesize[i];
1542 s->current_picture.linesize[i] *= 2;
1543 s->last_picture.linesize[i] *=2;
1544 s->next_picture.linesize[i] *=2;
1549 s->hurry_up= s->avctx->hurry_up;
1550 s->error_resilience= avctx->error_resilience;
1552 /* set dequantizer, we can't do it during init as it might change for mpeg4
1553 and we can't do it in the header decode as init isnt called for mpeg4 there yet */
1554 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1555 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1556 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1557 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1558 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1559 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1561 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1562 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1565 if(s->dct_error_sum){
1566 assert(s->avctx->noise_reduction && s->encoding);
1568 update_noise_reduction(s);
1572 if(s->avctx->xvmc_acceleration)
1573 return XVMC_field_start(s, avctx);
1578 /* generic function for encode/decode called after a frame has been coded/decoded */
1579 void MPV_frame_end(MpegEncContext *s)
1582 /* draw edge for correct motion prediction if outside */
1584 //just to make sure that all data is rendered.
1585 if(s->avctx->xvmc_acceleration){
1589 if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1590 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1591 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1592 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1596 s->last_pict_type = s->pict_type;
1597 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1598 if(s->pict_type!=B_TYPE){
1599 s->last_non_b_pict_type= s->pict_type;
1602 /* copy back current_picture variables */
1603 for(i=0; i<MAX_PICTURE_COUNT; i++){
1604 if(s->picture[i].data[0] == s->current_picture.data[0]){
1605 s->picture[i]= s->current_picture;
1609 assert(i<MAX_PICTURE_COUNT);
1613 /* release non-reference frames */
1614 for(i=0; i<MAX_PICTURE_COUNT; i++){
1615 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1616 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1620 // clear copies, to avoid confusion
1622 memset(&s->last_picture, 0, sizeof(Picture));
1623 memset(&s->next_picture, 0, sizeof(Picture));
1624 memset(&s->current_picture, 0, sizeof(Picture));
1626 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1630 * draws an line from (ex, ey) -> (sx, sy).
1631 * @param w width of the image
1632 * @param h height of the image
1633 * @param stride stride/linesize of the image
1634 * @param color color of the arrow
1636 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1639 sx= clip(sx, 0, w-1);
1640 sy= clip(sy, 0, h-1);
1641 ex= clip(ex, 0, w-1);
1642 ey= clip(ey, 0, h-1);
1644 buf[sy*stride + sx]+= color;
1646 if(ABS(ex - sx) > ABS(ey - sy)){
1651 buf+= sx + sy*stride;
1653 f= ((ey-sy)<<16)/ex;
1654 for(x= 0; x <= ex; x++){
1657 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1658 buf[(y+1)*stride + x]+= (color* fr )>>16;
1665 buf+= sx + sy*stride;
1667 if(ey) f= ((ex-sx)<<16)/ey;
1669 for(y= 0; y <= ey; y++){
1672 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1673 buf[y*stride + x+1]+= (color* fr )>>16;;
1679 * draws an arrow from (ex, ey) -> (sx, sy).
1680 * @param w width of the image
1681 * @param h height of the image
1682 * @param stride stride/linesize of the image
1683 * @param color color of the arrow
1685 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1688 sx= clip(sx, -100, w+100);
1689 sy= clip(sy, -100, h+100);
1690 ex= clip(ex, -100, w+100);
1691 ey= clip(ey, -100, h+100);
1696 if(dx*dx + dy*dy > 3*3){
1699 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1701 //FIXME subpixel accuracy
1702 rx= ROUNDED_DIV(rx*3<<4, length);
1703 ry= ROUNDED_DIV(ry*3<<4, length);
1705 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1706 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1708 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1712 * prints debuging info for the given picture.
1714 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1716 if(!pict || !pict->mb_type) return;
1718 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1721 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1722 switch (pict->pict_type) {
1723 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1724 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1725 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1726 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1727 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1728 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1730 for(y=0; y<s->mb_height; y++){
1731 for(x=0; x<s->mb_width; x++){
1732 if(s->avctx->debug&FF_DEBUG_SKIP){
1733 int count= s->mbskip_table[x + y*s->mb_stride];
1734 if(count>9) count=9;
1735 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1737 if(s->avctx->debug&FF_DEBUG_QP){
1738 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1740 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1741 int mb_type= pict->mb_type[x + y*s->mb_stride];
1742 //Type & MV direction
1744 av_log(s->avctx, AV_LOG_DEBUG, "P");
1745 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1746 av_log(s->avctx, AV_LOG_DEBUG, "A");
1747 else if(IS_INTRA4x4(mb_type))
1748 av_log(s->avctx, AV_LOG_DEBUG, "i");
1749 else if(IS_INTRA16x16(mb_type))
1750 av_log(s->avctx, AV_LOG_DEBUG, "I");
1751 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1752 av_log(s->avctx, AV_LOG_DEBUG, "d");
1753 else if(IS_DIRECT(mb_type))
1754 av_log(s->avctx, AV_LOG_DEBUG, "D");
1755 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1756 av_log(s->avctx, AV_LOG_DEBUG, "g");
1757 else if(IS_GMC(mb_type))
1758 av_log(s->avctx, AV_LOG_DEBUG, "G");
1759 else if(IS_SKIP(mb_type))
1760 av_log(s->avctx, AV_LOG_DEBUG, "S");
1761 else if(!USES_LIST(mb_type, 1))
1762 av_log(s->avctx, AV_LOG_DEBUG, ">");
1763 else if(!USES_LIST(mb_type, 0))
1764 av_log(s->avctx, AV_LOG_DEBUG, "<");
1766 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1767 av_log(s->avctx, AV_LOG_DEBUG, "X");
1772 av_log(s->avctx, AV_LOG_DEBUG, "+");
1773 else if(IS_16X8(mb_type))
1774 av_log(s->avctx, AV_LOG_DEBUG, "-");
1775 else if(IS_8X16(mb_type))
1776 av_log(s->avctx, AV_LOG_DEBUG, "|");
1777 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1778 av_log(s->avctx, AV_LOG_DEBUG, " ");
1780 av_log(s->avctx, AV_LOG_DEBUG, "?");
1783 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1784 av_log(s->avctx, AV_LOG_DEBUG, "=");
1786 av_log(s->avctx, AV_LOG_DEBUG, " ");
1788 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1790 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1794 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1795 const int shift= 1 + s->quarter_sample;
1799 int h_chroma_shift, v_chroma_shift;
1800 const int width = s->avctx->width;
1801 const int height= s->avctx->height;
1802 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1803 const int mv_stride= (s->mb_width << mv_sample_log2) + 1;
1804 s->low_delay=0; //needed to see the vectors without trashing the buffers
1806 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1808 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1809 pict->data[i]= s->visualization_buffer[i];
1811 pict->type= FF_BUFFER_TYPE_COPY;
1814 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1816 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1817 const int mb_index= mb_x + mb_y*s->mb_stride;
1818 if((s->avctx->debug_mv) && pict->motion_val){
1820 for(type=0; type<3; type++){
1823 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1827 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1831 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1836 if(!USES_LIST(pict->mb_type[mb_index], direction))
1839 if(IS_8X8(pict->mb_type[mb_index])){
1842 int sx= mb_x*16 + 4 + 8*(i&1);
1843 int sy= mb_y*16 + 4 + 8*(i>>1);
1844 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1845 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1846 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1847 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1849 }else if(IS_16X8(pict->mb_type[mb_index])){
1853 int sy=mb_y*16 + 4 + 8*i;
1854 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1855 int mx=(pict->motion_val[direction][xy][0]>>shift);
1856 int my=(pict->motion_val[direction][xy][1]>>shift);
1858 if(IS_INTERLACED(pict->mb_type[mb_index]))
1861 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1863 }else if(IS_8X16(pict->mb_type[mb_index])){
1866 int sx=mb_x*16 + 4 + 8*i;
1868 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1869 int mx=(pict->motion_val[direction][xy][0]>>shift);
1870 int my=(pict->motion_val[direction][xy][1]>>shift);
1872 if(IS_INTERLACED(pict->mb_type[mb_index]))
1875 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1878 int sx= mb_x*16 + 8;
1879 int sy= mb_y*16 + 8;
1880 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1881 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1882 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1883 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1887 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1888 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1891 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1892 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1895 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1896 int mb_type= pict->mb_type[mb_index];
1899 #define COLOR(theta, r)\
1900 u= (int)(128 + r*cos(theta*3.141592/180));\
1901 v= (int)(128 + r*sin(theta*3.141592/180));
1905 if(IS_PCM(mb_type)){
1907 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1909 }else if(IS_INTRA4x4(mb_type)){
1911 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1913 }else if(IS_DIRECT(mb_type)){
1915 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1917 }else if(IS_GMC(mb_type)){
1919 }else if(IS_SKIP(mb_type)){
1921 }else if(!USES_LIST(mb_type, 1)){
1923 }else if(!USES_LIST(mb_type, 0)){
1926 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1930 u*= 0x0101010101010101ULL;
1931 v*= 0x0101010101010101ULL;
1933 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1934 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1938 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1939 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1940 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1942 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1944 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1946 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1947 int dm= 1 << (mv_sample_log2-2);
1949 int sx= mb_x*16 + 8*(i&1);
1950 int sy= mb_y*16 + 8*(i>>1);
1951 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1953 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1954 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1956 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1957 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1958 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1962 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1966 s->mbskip_table[mb_index]=0;
1972 #ifdef CONFIG_ENCODERS
1974 static int get_sae(uint8_t *src, int ref, int stride){
1978 for(y=0; y<16; y++){
1979 for(x=0; x<16; x++){
1980 acc+= ABS(src[x+y*stride] - ref);
1987 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1994 for(y=0; y<h; y+=16){
1995 for(x=0; x<w; x+=16){
1996 int offset= x + y*stride;
1997 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1998 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1999 int sae = get_sae(src + offset, mean, stride);
2001 acc+= sae + 500 < sad;
2008 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2012 const int encoding_delay= s->max_b_frames;
2017 pic_arg->display_picture_number= s->input_picture_number++;
2019 if(pts != AV_NOPTS_VALUE){
2020 if(s->user_specified_pts != AV_NOPTS_VALUE){
2022 int64_t last= s->user_specified_pts;
2025 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
2029 s->user_specified_pts= pts;
2031 if(s->user_specified_pts != AV_NOPTS_VALUE){
2032 s->user_specified_pts=
2033 pts= s->user_specified_pts + 1;
2034 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
2036 pts= pic_arg->display_picture_number;
2042 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2043 if(pic_arg->linesize[0] != s->linesize) direct=0;
2044 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2045 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2047 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2050 i= ff_find_unused_picture(s, 1);
2052 pic= (AVFrame*)&s->picture[i];
2056 pic->data[i]= pic_arg->data[i];
2057 pic->linesize[i]= pic_arg->linesize[i];
2059 alloc_picture(s, (Picture*)pic, 1);
2061 i= ff_find_unused_picture(s, 0);
2063 pic= (AVFrame*)&s->picture[i];
2066 alloc_picture(s, (Picture*)pic, 0);
2068 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0]
2069 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1]
2070 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){
2073 int h_chroma_shift, v_chroma_shift;
2074 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2077 int src_stride= pic_arg->linesize[i];
2078 int dst_stride= i ? s->uvlinesize : s->linesize;
2079 int h_shift= i ? h_chroma_shift : 0;
2080 int v_shift= i ? v_chroma_shift : 0;
2081 int w= s->width >>h_shift;
2082 int h= s->height>>v_shift;
2083 uint8_t *src= pic_arg->data[i];
2084 uint8_t *dst= pic->data[i] + INPLACE_OFFSET;
2086 if(src_stride==dst_stride)
2087 memcpy(dst, src, src_stride*h);
2090 memcpy(dst, src, w);
2098 copy_picture_attributes(s, pic, pic_arg);
2099 pic->pts= pts; //we set this here to avoid modifiying pic_arg
2102 /* shift buffer entries */
2103 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2104 s->input_picture[i-1]= s->input_picture[i];
2106 s->input_picture[encoding_delay]= (Picture*)pic;
2111 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2116 for(plane=0; plane<3; plane++){
2117 const int stride= p->linesize[plane];
2118 const int bw= plane ? 1 : 2;
2119 for(y=0; y<s->mb_height*bw; y++){
2120 for(x=0; x<s->mb_width*bw; x++){
2121 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16;
2122 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);
2124 switch(s->avctx->frame_skip_exp){
2125 case 0: score= FFMAX(score, v); break;
2126 case 1: score+= ABS(v);break;
2127 case 2: score+= v*v;break;
2128 case 3: score64+= ABS(v*v*(int64_t)v);break;
2129 case 4: score64+= v*v*(int64_t)(v*v);break;
2135 if(score) score64= score;
2137 if(score64 < s->avctx->frame_skip_threshold)
2139 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2144 static int estimate_best_b_count(MpegEncContext *s){
2145 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id);
2146 AVCodecContext *c= avcodec_alloc_context();
2147 AVFrame input[FF_MAX_B_FRAMES+2];
2148 const int scale= s->avctx->brd_scale;
2149 int i, j, out_size, p_lambda, b_lambda, lambda2;
2150 int outbuf_size= s->width * s->height; //FIXME
2151 uint8_t *outbuf= av_malloc(outbuf_size);
2152 ImgReSampleContext *resample;
2153 int64_t best_rd= INT64_MAX;
2154 int best_b_count= -1;
2157 p_lambda= s->last_lambda_for[P_TYPE]; //s->next_picture_ptr->quality;
2158 b_lambda= s->last_lambda_for[B_TYPE]; //p_lambda *ABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
2159 if(!b_lambda) b_lambda= p_lambda; //FIXME we should do this somewhere else
2160 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT;
2162 c->width = s->width >> scale;
2163 c->height= s->height>> scale;
2164 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
2165 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL;
2166 c->mb_decision= s->avctx->mb_decision;
2167 c->me_cmp= s->avctx->me_cmp;
2168 c->mb_cmp= s->avctx->mb_cmp;
2169 c->me_sub_cmp= s->avctx->me_sub_cmp;
2170 c->pix_fmt = PIX_FMT_YUV420P;
2171 c->time_base= s->avctx->time_base;
2172 c->max_b_frames= s->max_b_frames;
2174 if (avcodec_open(c, codec) < 0)
2177 resample= img_resample_init(c->width, c->height, s->width, s->height); //FIXME use sws
2179 for(i=0; i<s->max_b_frames+2; i++){
2180 int ysize= c->width*c->height;
2181 int csize= (c->width/2)*(c->height/2);
2182 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr;
2185 pre_input= *pre_input_ptr;
2187 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i){
2188 pre_input.data[0]+=INPLACE_OFFSET;
2189 pre_input.data[1]+=INPLACE_OFFSET;
2190 pre_input.data[2]+=INPLACE_OFFSET;
2193 avcodec_get_frame_defaults(&input[i]);
2194 input[i].data[0]= av_malloc(ysize + 2*csize);
2195 input[i].data[1]= input[i].data[0] + ysize;
2196 input[i].data[2]= input[i].data[1] + csize;
2197 input[i].linesize[0]= c->width;
2198 input[i].linesize[1]=
2199 input[i].linesize[2]= c->width/2;
2201 if(!i || s->input_picture[i-1])
2202 img_resample(resample, &input[i], &pre_input);
2205 for(j=0; j<s->max_b_frames+1; j++){
2208 if(!s->input_picture[j])
2211 c->error[0]= c->error[1]= c->error[2]= 0;
2213 input[0].pict_type= I_TYPE;
2214 input[0].quality= 1 * FF_QP2LAMBDA;
2215 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]);
2216 // rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
2218 for(i=0; i<s->max_b_frames+1; i++){
2219 int is_p= i % (j+1) == j || i==s->max_b_frames;
2221 input[i+1].pict_type= is_p ? P_TYPE : B_TYPE;
2222 input[i+1].quality= is_p ? p_lambda : b_lambda;
2223 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]);
2224 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2227 /* get the delayed frames */
2229 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
2230 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2233 rd += c->error[0] + c->error[1] + c->error[2];
2244 img_resample_close(resample);
2246 for(i=0; i<s->max_b_frames+2; i++){
2247 av_freep(&input[i].data[0]);
2250 return best_b_count;
2253 static void select_input_picture(MpegEncContext *s){
2256 for(i=1; i<MAX_PICTURE_COUNT; i++)
2257 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2258 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2260 /* set next picture type & ordering */
2261 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2262 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2263 s->reordered_input_picture[0]= s->input_picture[0];
2264 s->reordered_input_picture[0]->pict_type= I_TYPE;
2265 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2269 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2270 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2271 //FIXME check that te gop check above is +-1 correct
2272 //av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2274 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2276 s->input_picture[0]->data[i]= NULL;
2277 s->input_picture[0]->type= 0;
2279 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2280 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2282 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2286 ff_vbv_update(s, 0);
2292 if(s->flags&CODEC_FLAG_PASS2){
2293 for(i=0; i<s->max_b_frames+1; i++){
2294 int pict_num= s->input_picture[0]->display_picture_number + i;
2296 if(pict_num >= s->rc_context.num_entries)
2298 if(!s->input_picture[i]){
2299 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2303 s->input_picture[i]->pict_type=
2304 s->rc_context.entry[pict_num].new_pict_type;
2308 if(s->avctx->b_frame_strategy==0){
2309 b_frames= s->max_b_frames;
2310 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2311 }else if(s->avctx->b_frame_strategy==1){
2312 for(i=1; i<s->max_b_frames+1; i++){
2313 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2314 s->input_picture[i]->b_frame_score=
2315 get_intra_count(s, s->input_picture[i ]->data[0],
2316 s->input_picture[i-1]->data[0], s->linesize) + 1;
2319 for(i=0; i<s->max_b_frames+1; i++){
2320 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2323 b_frames= FFMAX(0, i-1);
2326 for(i=0; i<b_frames+1; i++){
2327 s->input_picture[i]->b_frame_score=0;
2329 }else if(s->avctx->b_frame_strategy==2){
2330 b_frames= estimate_best_b_count(s);
2332 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2337 //static int b_count=0;
2338 //b_count+= b_frames;
2339 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2341 for(i= b_frames - 1; i>=0; i--){
2342 int type= s->input_picture[i]->pict_type;
2343 if(type && type != B_TYPE)
2346 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2347 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2350 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2351 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2352 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2354 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2356 s->input_picture[b_frames]->pict_type= I_TYPE;
2360 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2362 && s->input_picture[b_frames]->pict_type== I_TYPE)
2365 s->reordered_input_picture[0]= s->input_picture[b_frames];
2366 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2367 s->reordered_input_picture[0]->pict_type= P_TYPE;
2368 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2369 for(i=0; i<b_frames; i++){
2370 s->reordered_input_picture[i+1]= s->input_picture[i];
2371 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2372 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2377 if(s->reordered_input_picture[0]){
2378 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2380 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2382 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2383 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable
2385 int i= ff_find_unused_picture(s, 0);
2386 Picture *pic= &s->picture[i];
2388 /* mark us unused / free shared pic */
2390 s->reordered_input_picture[0]->data[i]= NULL;
2391 s->reordered_input_picture[0]->type= 0;
2393 pic->reference = s->reordered_input_picture[0]->reference;
2395 alloc_picture(s, pic, 0);
2397 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2399 s->current_picture_ptr= pic;
2401 // input is not a shared pix -> reuse buffer for current_pix
2403 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2404 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2406 s->current_picture_ptr= s->reordered_input_picture[0];
2408 s->new_picture.data[i]+= INPLACE_OFFSET;
2411 copy_picture(&s->current_picture, s->current_picture_ptr);
2413 s->picture_number= s->new_picture.display_picture_number;
2414 //printf("dpn:%d\n", s->picture_number);
2416 memset(&s->new_picture, 0, sizeof(Picture));
2420 int MPV_encode_picture(AVCodecContext *avctx,
2421 unsigned char *buf, int buf_size, void *data)
2423 MpegEncContext *s = avctx->priv_data;
2424 AVFrame *pic_arg = data;
2425 int i, stuffing_count;
2427 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUVJ420P){
2428 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2432 for(i=0; i<avctx->thread_count; i++){
2433 int start_y= s->thread_context[i]->start_mb_y;
2434 int end_y= s->thread_context[i]-> end_mb_y;
2435 int h= s->mb_height;
2436 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
2437 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
2439 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2442 s->picture_in_gop_number++;
2444 if(load_input_picture(s, pic_arg) < 0)
2447 select_input_picture(s);
2450 if(s->new_picture.data[0]){
2451 s->pict_type= s->new_picture.pict_type;
2453 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2454 MPV_frame_start(s, avctx);
2456 encode_picture(s, s->picture_number);
2458 avctx->real_pict_num = s->picture_number;
2459 avctx->header_bits = s->header_bits;
2460 avctx->mv_bits = s->mv_bits;
2461 avctx->misc_bits = s->misc_bits;
2462 avctx->i_tex_bits = s->i_tex_bits;
2463 avctx->p_tex_bits = s->p_tex_bits;
2464 avctx->i_count = s->i_count;
2465 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2466 avctx->skip_count = s->skip_count;
2470 if (s->out_format == FMT_MJPEG)
2471 mjpeg_picture_trailer(s);
2473 if(s->flags&CODEC_FLAG_PASS1)
2474 ff_write_pass1_stats(s);
2477 s->current_picture_ptr->error[i]= s->current_picture.error[i];
2478 avctx->error[i] += s->current_picture_ptr->error[i];
2481 if(s->flags&CODEC_FLAG_PASS1)
2482 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2483 flush_put_bits(&s->pb);
2484 s->frame_bits = put_bits_count(&s->pb);
2486 stuffing_count= ff_vbv_update(s, s->frame_bits);
2488 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2489 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2493 switch(s->codec_id){
2494 case CODEC_ID_MPEG1VIDEO:
2495 case CODEC_ID_MPEG2VIDEO:
2496 while(stuffing_count--){
2497 put_bits(&s->pb, 8, 0);
2500 case CODEC_ID_MPEG4:
2501 put_bits(&s->pb, 16, 0);
2502 put_bits(&s->pb, 16, 0x1C3);
2503 stuffing_count -= 4;
2504 while(stuffing_count--){
2505 put_bits(&s->pb, 8, 0xFF);
2509 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2511 flush_put_bits(&s->pb);
2512 s->frame_bits = put_bits_count(&s->pb);
2515 /* update mpeg1/2 vbv_delay for CBR */
2516 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2517 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2520 assert(s->repeat_first_field==0);
2522 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2523 assert(vbv_delay < 0xFFFF);
2525 s->vbv_delay_ptr[0] &= 0xF8;
2526 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2527 s->vbv_delay_ptr[1] = vbv_delay>>5;
2528 s->vbv_delay_ptr[2] &= 0x07;
2529 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2531 s->total_bits += s->frame_bits;
2532 avctx->frame_bits = s->frame_bits;
2534 assert((pbBufPtr(&s->pb) == s->pb.buf));
2537 assert((s->frame_bits&7)==0);
2539 return s->frame_bits/8;
2542 #endif //CONFIG_ENCODERS
2544 static inline void gmc1_motion(MpegEncContext *s,
2545 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2546 uint8_t **ref_picture)
2549 int offset, src_x, src_y, linesize, uvlinesize;
2550 int motion_x, motion_y;
2553 motion_x= s->sprite_offset[0][0];
2554 motion_y= s->sprite_offset[0][1];
2555 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2556 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2557 motion_x<<=(3-s->sprite_warping_accuracy);
2558 motion_y<<=(3-s->sprite_warping_accuracy);
2559 src_x = clip(src_x, -16, s->width);
2560 if (src_x == s->width)
2562 src_y = clip(src_y, -16, s->height);
2563 if (src_y == s->height)
2566 linesize = s->linesize;
2567 uvlinesize = s->uvlinesize;
2569 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2571 if(s->flags&CODEC_FLAG_EMU_EDGE){
2572 if( (unsigned)src_x >= s->h_edge_pos - 17
2573 || (unsigned)src_y >= s->v_edge_pos - 17){
2574 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2575 ptr= s->edge_emu_buffer;
2579 if((motion_x|motion_y)&7){
2580 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2581 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2585 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2586 if (s->no_rounding){
2587 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2589 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2593 if(s->flags&CODEC_FLAG_GRAY) return;
2595 motion_x= s->sprite_offset[1][0];
2596 motion_y= s->sprite_offset[1][1];
2597 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2598 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2599 motion_x<<=(3-s->sprite_warping_accuracy);
2600 motion_y<<=(3-s->sprite_warping_accuracy);
2601 src_x = clip(src_x, -8, s->width>>1);
2602 if (src_x == s->width>>1)
2604 src_y = clip(src_y, -8, s->height>>1);
2605 if (src_y == s->height>>1)
2608 offset = (src_y * uvlinesize) + src_x;
2609 ptr = ref_picture[1] + offset;
2610 if(s->flags&CODEC_FLAG_EMU_EDGE){
2611 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2612 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2613 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);
2614 ptr= s->edge_emu_buffer;
2618 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2620 ptr = ref_picture[2] + offset;
2622 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);
2623 ptr= s->edge_emu_buffer;
2625 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2630 static inline void gmc_motion(MpegEncContext *s,
2631 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2632 uint8_t **ref_picture)
2635 int linesize, uvlinesize;
2636 const int a= s->sprite_warping_accuracy;
2639 linesize = s->linesize;
2640 uvlinesize = s->uvlinesize;
2642 ptr = ref_picture[0];
2644 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2645 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2647 s->dsp.gmc(dest_y, ptr, linesize, 16,
2650 s->sprite_delta[0][0], s->sprite_delta[0][1],
2651 s->sprite_delta[1][0], s->sprite_delta[1][1],
2652 a+1, (1<<(2*a+1)) - s->no_rounding,
2653 s->h_edge_pos, s->v_edge_pos);
2654 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2655 ox + s->sprite_delta[0][0]*8,
2656 oy + s->sprite_delta[1][0]*8,
2657 s->sprite_delta[0][0], s->sprite_delta[0][1],
2658 s->sprite_delta[1][0], s->sprite_delta[1][1],
2659 a+1, (1<<(2*a+1)) - s->no_rounding,
2660 s->h_edge_pos, s->v_edge_pos);
2662 if(s->flags&CODEC_FLAG_GRAY) return;
2664 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2665 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2667 ptr = ref_picture[1];
2668 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2671 s->sprite_delta[0][0], s->sprite_delta[0][1],
2672 s->sprite_delta[1][0], s->sprite_delta[1][1],
2673 a+1, (1<<(2*a+1)) - s->no_rounding,
2674 s->h_edge_pos>>1, s->v_edge_pos>>1);
2676 ptr = ref_picture[2];
2677 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2680 s->sprite_delta[0][0], s->sprite_delta[0][1],
2681 s->sprite_delta[1][0], s->sprite_delta[1][1],
2682 a+1, (1<<(2*a+1)) - s->no_rounding,
2683 s->h_edge_pos>>1, s->v_edge_pos>>1);
2687 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2688 * @param buf destination buffer
2689 * @param src source buffer
2690 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2691 * @param block_w width of block
2692 * @param block_h height of block
2693 * @param src_x x coordinate of the top left sample of the block in the source buffer
2694 * @param src_y y coordinate of the top left sample of the block in the source buffer
2695 * @param w width of the source buffer
2696 * @param h height of the source buffer
2698 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2699 int src_x, int src_y, int w, int h){
2701 int start_y, start_x, end_y, end_x;
2704 src+= (h-1-src_y)*linesize;
2706 }else if(src_y<=-block_h){
2707 src+= (1-block_h-src_y)*linesize;
2713 }else if(src_x<=-block_w){
2714 src+= (1-block_w-src_x);
2718 start_y= FFMAX(0, -src_y);
2719 start_x= FFMAX(0, -src_x);
2720 end_y= FFMIN(block_h, h-src_y);
2721 end_x= FFMIN(block_w, w-src_x);
2723 // copy existing part
2724 for(y=start_y; y<end_y; y++){
2725 for(x=start_x; x<end_x; x++){
2726 buf[x + y*linesize]= src[x + y*linesize];
2731 for(y=0; y<start_y; y++){
2732 for(x=start_x; x<end_x; x++){
2733 buf[x + y*linesize]= buf[x + start_y*linesize];
2738 for(y=end_y; y<block_h; y++){
2739 for(x=start_x; x<end_x; x++){
2740 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2744 for(y=0; y<block_h; y++){
2746 for(x=0; x<start_x; x++){
2747 buf[x + y*linesize]= buf[start_x + y*linesize];
2751 for(x=end_x; x<block_w; x++){
2752 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2757 static inline int hpel_motion(MpegEncContext *s,
2758 uint8_t *dest, uint8_t *src,
2759 int field_based, int field_select,
2760 int src_x, int src_y,
2761 int width, int height, int stride,
2762 int h_edge_pos, int v_edge_pos,
2763 int w, int h, op_pixels_func *pix_op,
2764 int motion_x, int motion_y)
2769 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2770 src_x += motion_x >> 1;
2771 src_y += motion_y >> 1;
2773 /* WARNING: do no forget half pels */
2774 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2777 src_y = clip(src_y, -16, height);
2778 if (src_y == height)
2780 src += src_y * stride + src_x;
2782 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2783 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2784 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2785 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2786 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2787 src= s->edge_emu_buffer;
2793 pix_op[dxy](dest, src, stride, h);
2797 static inline int hpel_motion_lowres(MpegEncContext *s,
2798 uint8_t *dest, uint8_t *src,
2799 int field_based, int field_select,
2800 int src_x, int src_y,
2801 int width, int height, int stride,
2802 int h_edge_pos, int v_edge_pos,
2803 int w, int h, h264_chroma_mc_func *pix_op,
2804 int motion_x, int motion_y)
2806 const int lowres= s->avctx->lowres;
2807 const int s_mask= (2<<lowres)-1;
2811 if(s->quarter_sample){
2816 sx= motion_x & s_mask;
2817 sy= motion_y & s_mask;
2818 src_x += motion_x >> (lowres+1);
2819 src_y += motion_y >> (lowres+1);
2821 src += src_y * stride + src_x;
2823 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2824 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2825 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2826 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2827 src= s->edge_emu_buffer;
2835 pix_op[lowres](dest, src, stride, h, sx, sy);
2839 /* apply one mpeg motion vector to the three components */
2840 static always_inline void mpeg_motion(MpegEncContext *s,
2841 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2842 int field_based, int bottom_field, int field_select,
2843 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2844 int motion_x, int motion_y, int h)
2846 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2847 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2850 if(s->quarter_sample)
2857 v_edge_pos = s->v_edge_pos >> field_based;
2858 linesize = s->current_picture.linesize[0] << field_based;
2859 uvlinesize = s->current_picture.linesize[1] << field_based;
2861 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2862 src_x = s->mb_x* 16 + (motion_x >> 1);
2863 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2865 if (s->out_format == FMT_H263) {
2866 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2867 mx = (motion_x>>1)|(motion_x&1);
2869 uvdxy = ((my & 1) << 1) | (mx & 1);
2870 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2871 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2873 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2877 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2881 uvsrc_x = s->mb_x*8 + mx;
2882 uvsrc_y = s->mb_y*8 + my;
2884 if(s->chroma_y_shift){
2887 uvdxy = ((my & 1) << 1) | (mx & 1);
2888 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2889 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2891 if(s->chroma_x_shift){
2894 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2895 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2906 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2907 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2908 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2910 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2911 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2912 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2913 s->codec_id == CODEC_ID_MPEG1VIDEO){
2914 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2917 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2918 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2919 ptr_y = s->edge_emu_buffer;
2920 if(!(s->flags&CODEC_FLAG_GRAY)){
2921 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2922 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2923 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2924 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2925 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2931 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2932 dest_y += s->linesize;
2933 dest_cb+= s->uvlinesize;
2934 dest_cr+= s->uvlinesize;
2938 ptr_y += s->linesize;
2939 ptr_cb+= s->uvlinesize;
2940 ptr_cr+= s->uvlinesize;
2943 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2945 if(!(s->flags&CODEC_FLAG_GRAY)){
2946 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2947 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2949 #if defined(CONFIG_H261_ENCODER) || defined(CONFIG_H261_DECODER)
2950 if(s->out_format == FMT_H261){
2951 ff_h261_loop_filter(s);
2956 /* apply one mpeg motion vector to the three components */
2957 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
2958 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2959 int field_based, int bottom_field, int field_select,
2960 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
2961 int motion_x, int motion_y, int h)
2963 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2964 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
2965 const int lowres= s->avctx->lowres;
2966 const int block_s= 8>>lowres;
2967 const int s_mask= (2<<lowres)-1;
2968 const int h_edge_pos = s->h_edge_pos >> lowres;
2969 const int v_edge_pos = s->v_edge_pos >> lowres;
2970 linesize = s->current_picture.linesize[0] << field_based;
2971 uvlinesize = s->current_picture.linesize[1] << field_based;
2973 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
2979 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
2982 sx= motion_x & s_mask;
2983 sy= motion_y & s_mask;
2984 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
2985 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
2987 if (s->out_format == FMT_H263) {
2988 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
2989 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
2992 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2995 uvsx = (2*mx) & s_mask;
2996 uvsy = (2*my) & s_mask;
2997 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
2998 uvsrc_y = s->mb_y*block_s + (my >> lowres);
3004 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
3005 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
3008 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3009 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3010 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3012 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
3013 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
3014 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3015 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
3016 ptr_y = s->edge_emu_buffer;
3017 if(!(s->flags&CODEC_FLAG_GRAY)){
3018 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3019 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3020 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3021 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3022 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3028 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3029 dest_y += s->linesize;
3030 dest_cb+= s->uvlinesize;
3031 dest_cr+= s->uvlinesize;
3035 ptr_y += s->linesize;
3036 ptr_cb+= s->uvlinesize;
3037 ptr_cr+= s->uvlinesize;
3042 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
3044 if(!(s->flags&CODEC_FLAG_GRAY)){
3045 uvsx <<= 2 - lowres;
3046 uvsy <<= 2 - lowres;
3047 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3048 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3050 //FIXME h261 lowres loop filter
3053 //FIXME move to dsputil, avg variant, 16x16 version
3054 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
3056 uint8_t * const top = src[1];
3057 uint8_t * const left = src[2];
3058 uint8_t * const mid = src[0];
3059 uint8_t * const right = src[3];
3060 uint8_t * const bottom= src[4];
3061 #define OBMC_FILTER(x, t, l, m, r, b)\
3062 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
3063 #define OBMC_FILTER4(x, t, l, m, r, b)\
3064 OBMC_FILTER(x , t, l, m, r, b);\
3065 OBMC_FILTER(x+1 , t, l, m, r, b);\
3066 OBMC_FILTER(x +stride, t, l, m, r, b);\
3067 OBMC_FILTER(x+1+stride, t, l, m, r, b);
3070 OBMC_FILTER (x , 2, 2, 4, 0, 0);
3071 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
3072 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
3073 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
3074 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
3075 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
3077 OBMC_FILTER (x , 1, 2, 5, 0, 0);
3078 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
3079 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
3080 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
3082 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
3083 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
3084 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
3085 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
3087 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
3088 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
3089 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
3090 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
3092 OBMC_FILTER (x , 0, 2, 5, 0, 1);
3093 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
3094 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
3095 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
3096 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
3097 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
3099 OBMC_FILTER (x , 0, 2, 4, 0, 2);
3100 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
3101 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
3102 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
3105 /* obmc for 1 8x8 luma block */
3106 static inline void obmc_motion(MpegEncContext *s,
3107 uint8_t *dest, uint8_t *src,
3108 int src_x, int src_y,
3109 op_pixels_func *pix_op,
3110 int16_t mv[5][2]/* mid top left right bottom*/)
3116 assert(s->quarter_sample==0);
3119 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
3122 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3123 hpel_motion(s, ptr[i], src, 0, 0,
3125 s->width, s->height, s->linesize,
3126 s->h_edge_pos, s->v_edge_pos,
3128 mv[i][0], mv[i][1]);
3132 put_obmc(dest, ptr, s->linesize);
3135 static inline void qpel_motion(MpegEncContext *s,
3136 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3137 int field_based, int bottom_field, int field_select,
3138 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3139 qpel_mc_func (*qpix_op)[16],
3140 int motion_x, int motion_y, int h)
3142 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3143 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3145 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3146 src_x = s->mb_x * 16 + (motion_x >> 2);
3147 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3149 v_edge_pos = s->v_edge_pos >> field_based;
3150 linesize = s->linesize << field_based;
3151 uvlinesize = s->uvlinesize << field_based;
3156 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3157 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3158 mx= (motion_x>>1) + rtab[motion_x&7];
3159 my= (motion_y>>1) + rtab[motion_y&7];
3160 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3161 mx= (motion_x>>1)|(motion_x&1);
3162 my= (motion_y>>1)|(motion_y&1);
3170 uvdxy= (mx&1) | ((my&1)<<1);
3174 uvsrc_x = s->mb_x * 8 + mx;
3175 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3177 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3178 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3179 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3181 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3182 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3183 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3184 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3185 ptr_y= s->edge_emu_buffer;
3186 if(!(s->flags&CODEC_FLAG_GRAY)){
3187 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3188 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3189 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3190 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3191 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3198 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3201 dest_y += s->linesize;
3202 dest_cb+= s->uvlinesize;
3203 dest_cr+= s->uvlinesize;
3207 ptr_y += s->linesize;
3208 ptr_cb += s->uvlinesize;
3209 ptr_cr += s->uvlinesize;
3211 //damn interlaced mode
3212 //FIXME boundary mirroring is not exactly correct here
3213 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3214 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3216 if(!(s->flags&CODEC_FLAG_GRAY)){
3217 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3218 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3222 inline int ff_h263_round_chroma(int x){
3224 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3227 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3232 * h263 chorma 4mv motion compensation.
3234 static inline void chroma_4mv_motion(MpegEncContext *s,
3235 uint8_t *dest_cb, uint8_t *dest_cr,
3236 uint8_t **ref_picture,
3237 op_pixels_func *pix_op,
3239 int dxy, emu=0, src_x, src_y, offset;
3242 /* In case of 8X8, we construct a single chroma motion vector
3243 with a special rounding */
3244 mx= ff_h263_round_chroma(mx);
3245 my= ff_h263_round_chroma(my);
3247 dxy = ((my & 1) << 1) | (mx & 1);
3251 src_x = s->mb_x * 8 + mx;
3252 src_y = s->mb_y * 8 + my;
3253 src_x = clip(src_x, -8, s->width/2);
3254 if (src_x == s->width/2)
3256 src_y = clip(src_y, -8, s->height/2);
3257 if (src_y == s->height/2)
3260 offset = (src_y * (s->uvlinesize)) + src_x;
3261 ptr = ref_picture[1] + offset;
3262 if(s->flags&CODEC_FLAG_EMU_EDGE){
3263 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3264 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3265 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);
3266 ptr= s->edge_emu_buffer;
3270 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3272 ptr = ref_picture[2] + offset;
3274 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);
3275 ptr= s->edge_emu_buffer;
3277 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3280 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3281 uint8_t *dest_cb, uint8_t *dest_cr,
3282 uint8_t **ref_picture,
3283 h264_chroma_mc_func *pix_op,
3285 const int lowres= s->avctx->lowres;
3286 const int block_s= 8>>lowres;
3287 const int s_mask= (2<<lowres)-1;
3288 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3289 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3290 int emu=0, src_x, src_y, offset, sx, sy;
3293 if(s->quarter_sample){
3298 /* In case of 8X8, we construct a single chroma motion vector
3299 with a special rounding */
3300 mx= ff_h263_round_chroma(mx);
3301 my= ff_h263_round_chroma(my);
3305 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3306 src_y = s->mb_y*block_s + (my >> (lowres+1));
3308 offset = src_y * s->uvlinesize + src_x;
3309 ptr = ref_picture[1] + offset;
3310 if(s->flags&CODEC_FLAG_EMU_EDGE){
3311 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3312 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3313 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3314 ptr= s->edge_emu_buffer;
3320 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3322 ptr = ref_picture[2] + offset;
3324 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3325 ptr= s->edge_emu_buffer;
3327 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3331 * motion compensation of a single macroblock
3333 * @param dest_y luma destination pointer
3334 * @param dest_cb chroma cb/u destination pointer
3335 * @param dest_cr chroma cr/v destination pointer
3336 * @param dir direction (0->forward, 1->backward)
3337 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3338 * @param pic_op halfpel motion compensation function (average or put normally)
3339 * @param pic_op qpel motion compensation function (average or put normally)
3340 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3342 static inline void MPV_motion(MpegEncContext *s,
3343 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3344 int dir, uint8_t **ref_picture,
3345 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3347 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3349 uint8_t *ptr, *dest;
3354 if(s->obmc && s->pict_type != B_TYPE){
3355 int16_t mv_cache[4][4][2];
3356 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3357 const int mot_stride= s->b8_stride;
3358 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3360 assert(!s->mb_skipped);
3362 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3363 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3364 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3366 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3367 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3369 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3372 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3373 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3374 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3376 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3377 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3380 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3381 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3382 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3384 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3385 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3391 const int x= (i&1)+1;
3392 const int y= (i>>1)+1;
3394 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3395 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3396 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3397 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3398 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3400 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3402 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3409 if(!(s->flags&CODEC_FLAG_GRAY))
3410 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3415 switch(s->mv_type) {
3418 if(s->real_sprite_warping_points==1){
3419 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3422 gmc_motion(s, dest_y, dest_cb, dest_cr,
3425 }else if(s->quarter_sample){
3426 qpel_motion(s, dest_y, dest_cb, dest_cr,
3428 ref_picture, pix_op, qpix_op,
3429 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3431 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3432 ref_picture, pix_op,
3433 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3436 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3438 ref_picture, pix_op,
3439 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3445 if(s->quarter_sample){
3447 motion_x = s->mv[dir][i][0];
3448 motion_y = s->mv[dir][i][1];
3450 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3451 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3452 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3454 /* WARNING: do no forget half pels */
3455 src_x = clip(src_x, -16, s->width);
3456 if (src_x == s->width)
3458 src_y = clip(src_y, -16, s->height);
3459 if (src_y == s->height)
3462 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3463 if(s->flags&CODEC_FLAG_EMU_EDGE){
3464 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3465 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3466 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);
3467 ptr= s->edge_emu_buffer;
3470 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3471 qpix_op[1][dxy](dest, ptr, s->linesize);
3473 mx += s->mv[dir][i][0]/2;
3474 my += s->mv[dir][i][1]/2;
3478 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3479 ref_picture[0], 0, 0,
3480 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3481 s->width, s->height, s->linesize,
3482 s->h_edge_pos, s->v_edge_pos,
3484 s->mv[dir][i][0], s->mv[dir][i][1]);
3486 mx += s->mv[dir][i][0];
3487 my += s->mv[dir][i][1];
3491 if(!(s->flags&CODEC_FLAG_GRAY))
3492 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3495 if (s->picture_structure == PICT_FRAME) {
3496 if(s->quarter_sample){
3498 qpel_motion(s, dest_y, dest_cb, dest_cr,
3499 1, i, s->field_select[dir][i],
3500 ref_picture, pix_op, qpix_op,
3501 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3505 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3506 1, 0, s->field_select[dir][0],
3507 ref_picture, pix_op,
3508 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3510 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3511 1, 1, s->field_select[dir][1],
3512 ref_picture, pix_op,
3513 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3516 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3517 ref_picture= s->current_picture_ptr->data;
3520 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3521 0, 0, s->field_select[dir][0],
3522 ref_picture, pix_op,
3523 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3528 uint8_t ** ref2picture;
3530 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3531 ref2picture= ref_picture;
3533 ref2picture= s->current_picture_ptr->data;
3536 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3537 0, 0, s->field_select[dir][i],
3538 ref2picture, pix_op,
3539 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3541 dest_y += 16*s->linesize;
3542 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3543 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3547 if(s->picture_structure == PICT_FRAME){
3551 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3553 ref_picture, pix_op,
3554 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3556 pix_op = s->dsp.avg_pixels_tab;
3560 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3561 0, 0, s->picture_structure != i+1,
3562 ref_picture, pix_op,
3563 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3565 // after put we make avg of the same block
3566 pix_op=s->dsp.avg_pixels_tab;
3568 //opposite parity is always in the same frame if this is second field
3569 if(!s->first_field){
3570 ref_picture = s->current_picture_ptr->data;
3580 * motion compensation of a single macroblock
3582 * @param dest_y luma destination pointer
3583 * @param dest_cb chroma cb/u destination pointer
3584 * @param dest_cr chroma cr/v destination pointer
3585 * @param dir direction (0->forward, 1->backward)
3586 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3587 * @param pic_op halfpel motion compensation function (average or put normally)
3588 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3590 static inline void MPV_motion_lowres(MpegEncContext *s,
3591 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3592 int dir, uint8_t **ref_picture,
3593 h264_chroma_mc_func *pix_op)
3597 const int lowres= s->avctx->lowres;
3598 const int block_s= 8>>lowres;
3603 switch(s->mv_type) {
3605 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3607 ref_picture, pix_op,
3608 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3614 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3615 ref_picture[0], 0, 0,
3616 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3617 s->width, s->height, s->linesize,
3618 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3619 block_s, block_s, pix_op,
3620 s->mv[dir][i][0], s->mv[dir][i][1]);
3622 mx += s->mv[dir][i][0];
3623 my += s->mv[dir][i][1];
3626 if(!(s->flags&CODEC_FLAG_GRAY))
3627 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3630 if (s->picture_structure == PICT_FRAME) {
3632 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3633 1, 0, s->field_select[dir][0],
3634 ref_picture, pix_op,
3635 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3637 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3638 1, 1, s->field_select[dir][1],
3639 ref_picture, pix_op,
3640 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3642 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3643 ref_picture= s->current_picture_ptr->data;
3646 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3647 0, 0, s->field_select[dir][0],
3648 ref_picture, pix_op,
3649 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3654 uint8_t ** ref2picture;
3656 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3657 ref2picture= ref_picture;
3659 ref2picture= s->current_picture_ptr->data;
3662 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3663 0, 0, s->field_select[dir][i],
3664 ref2picture, pix_op,
3665 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3667 dest_y += 2*block_s*s->linesize;
3668 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3669 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3673 if(s->picture_structure == PICT_FRAME){
3677 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3679 ref_picture, pix_op,
3680 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3682 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3686 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3687 0, 0, s->picture_structure != i+1,
3688 ref_picture, pix_op,
3689 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3691 // after put we make avg of the same block
3692 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3694 //opposite parity is always in the same frame if this is second field
3695 if(!s->first_field){
3696 ref_picture = s->current_picture_ptr->data;
3705 /* put block[] to dest[] */
3706 static inline void put_dct(MpegEncContext *s,
3707 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3709 s->dct_unquantize_intra(s, block, i, qscale);
3710 s->dsp.idct_put (dest, line_size, block);
3713 /* add block[] to dest[] */
3714 static inline void add_dct(MpegEncContext *s,
3715 DCTELEM *block, int i, uint8_t *dest, int line_size)
3717 if (s->block_last_index[i] >= 0) {
3718 s->dsp.idct_add (dest, line_size, block);
3722 static inline void add_dequant_dct(MpegEncContext *s,
3723 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3725 if (s->block_last_index[i] >= 0) {
3726 s->dct_unquantize_inter(s, block, i, qscale);
3728 s->dsp.idct_add (dest, line_size, block);
3733 * cleans dc, ac, coded_block for the current non intra MB
3735 void ff_clean_intra_table_entries(MpegEncContext *s)
3737 int wrap = s->b8_stride;
3738 int xy = s->block_index[0];
3741 s->dc_val[0][xy + 1 ] =
3742 s->dc_val[0][xy + wrap] =
3743 s->dc_val[0][xy + 1 + wrap] = 1024;
3745 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3746 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3747 if (s->msmpeg4_version>=3) {
3748 s->coded_block[xy ] =
3749 s->coded_block[xy + 1 ] =
3750 s->coded_block[xy + wrap] =
3751 s->coded_block[xy + 1 + wrap] = 0;
3754 wrap = s->mb_stride;
3755 xy = s->mb_x + s->mb_y * wrap;
3757 s->dc_val[2][xy] = 1024;
3759 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3760 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3762 s->mbintra_table[xy]= 0;
3765 /* generic function called after a macroblock has been parsed by the
3766 decoder or after it has been encoded by the encoder.
3768 Important variables used:
3769 s->mb_intra : true if intra macroblock
3770 s->mv_dir : motion vector direction
3771 s->mv_type : motion vector type
3772 s->mv : motion vector
3773 s->interlaced_dct : true if interlaced dct used (mpeg2)
3775 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3778 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3780 if(s->avctx->xvmc_acceleration){
3781 XVMC_decode_mb(s);//xvmc uses pblocks
3789 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3790 /* save DCT coefficients */
3792 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3795 *dct++ = block[i][s->dsp.idct_permutation[j]];
3798 s->current_picture.qscale_table[mb_xy]= s->qscale;
3800 /* update DC predictors for P macroblocks */
3802 if (s->h263_pred || s->h263_aic) {
3803 if(s->mbintra_table[mb_xy])
3804 ff_clean_intra_table_entries(s);
3808 s->last_dc[2] = 128 << s->intra_dc_precision;
3811 else if (s->h263_pred || s->h263_aic)
3812 s->mbintra_table[mb_xy]=1;
3814 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3815 uint8_t *dest_y, *dest_cb, *dest_cr;
3816 int dct_linesize, dct_offset;
3817 op_pixels_func (*op_pix)[4];
3818 qpel_mc_func (*op_qpix)[16];
3819 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3820 const int uvlinesize= s->current_picture.linesize[1];
3821 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3822 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3824 /* avoid copy if macroblock skipped in last frame too */
3825 /* skip only during decoding as we might trash the buffers during encoding a bit */
3827 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3828 const int age= s->current_picture.age;
3832 if (s->mb_skipped) {
3834 assert(s->pict_type!=I_TYPE);
3836 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3837 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3839 /* if previous was skipped too, then nothing to do ! */
3840 if (*mbskip_ptr >= age && s->current_picture.reference){
3843 } else if(!s->current_picture.reference){
3844 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3845 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3847 *mbskip_ptr = 0; /* not skipped */
3851 dct_linesize = linesize << s->interlaced_dct;
3852 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3856 dest_cb= s->dest[1];
3857 dest_cr= s->dest[2];
3859 dest_y = s->b_scratchpad;
3860 dest_cb= s->b_scratchpad+16*linesize;
3861 dest_cr= s->b_scratchpad+32*linesize;
3865 /* motion handling */
3866 /* decoding or more than one mb_type (MC was already done otherwise) */
3869 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3871 if (s->mv_dir & MV_DIR_FORWARD) {
3872 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3873 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3875 if (s->mv_dir & MV_DIR_BACKWARD) {
3876 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3879 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3880 op_pix = s->dsp.put_pixels_tab;
3881 op_qpix= s->dsp.put_qpel_pixels_tab;
3883 op_pix = s->dsp.put_no_rnd_pixels_tab;
3884 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3886 if (s->mv_dir & MV_DIR_FORWARD) {
3887 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3888 op_pix = s->dsp.avg_pixels_tab;
3889 op_qpix= s->dsp.avg_qpel_pixels_tab;
3891 if (s->mv_dir & MV_DIR_BACKWARD) {
3892 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3897 /* skip dequant / idct if we are really late ;) */
3898 if(s->hurry_up>1) goto skip_idct;
3899 if(s->avctx->skip_idct){
3900 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
3901 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
3902 || s->avctx->skip_idct >= AVDISCARD_ALL)
3906 /* add dct residue */
3907 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3908 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3909 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3910 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3911 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3912 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3914 if(!(s->flags&CODEC_FLAG_GRAY)){
3915 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3916 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3918 } else if(s->codec_id != CODEC_ID_WMV2){
3919 add_dct(s, block[0], 0, dest_y , dct_linesize);
3920 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3921 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3922 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
3924 if(!(s->flags&CODEC_FLAG_GRAY)){
3925 if(s->chroma_y_shift){//Chroma420
3926 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3927 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3930 dct_linesize = uvlinesize << s->interlaced_dct;
3931 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3933 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3934 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3935 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3936 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3937 if(!s->chroma_x_shift){//Chroma444
3938 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3939 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3940 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3941 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3947 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3950 /* dct only in intra block */
3951 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3952 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3953 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3954 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3955 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3957 if(!(s->flags&CODEC_FLAG_GRAY)){
3958 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3959 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3962 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3963 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3964 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3965 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3967 if(!(s->flags&CODEC_FLAG_GRAY)){
3968 if(s->chroma_y_shift){
3969 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3970 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3973 dct_linesize = uvlinesize << s->interlaced_dct;
3974 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3976 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3977 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3978 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3979 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3980 if(!s->chroma_x_shift){//Chroma444
3981 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3982 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3983 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3984 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3992 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3993 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3994 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3999 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
4000 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
4001 else MPV_decode_mb_internal(s, block, 0);
4004 #ifdef CONFIG_ENCODERS
4006 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
4008 static const char tab[64]=
4020 DCTELEM *block= s->block[n];
4021 const int last_index= s->block_last_index[n];
4026 threshold= -threshold;
4030 /* are all which we could set to zero are allready zero? */
4031 if(last_index<=skip_dc - 1) return;
4033 for(i=0; i<=last_index; i++){
4034 const int j = s->intra_scantable.permutated[i];
4035 const int level = ABS(block[j]);
4037 if(skip_dc && i==0) continue;
4046 if(score >= threshold) return;
4047 for(i=skip_dc; i<=last_index; i++){
4048 const int j = s->intra_scantable.permutated[i];
4051 if(block[0]) s->block_last_index[n]= 0;
4052 else s->block_last_index[n]= -1;
4055 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
4058 const int maxlevel= s->max_qcoeff;
4059 const int minlevel= s->min_qcoeff;
4063 i=1; //skip clipping of intra dc
4067 for(;i<=last_index; i++){
4068 const int j= s->intra_scantable.permutated[i];
4069 int level = block[j];
4071 if (level>maxlevel){
4074 }else if(level<minlevel){
4082 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
4083 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
4086 #endif //CONFIG_ENCODERS
4090 * @param h is the normal height, this will be reduced automatically if needed for the last row
4092 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
4093 if (s->avctx->draw_horiz_band) {
4097 if(s->picture_structure != PICT_FRAME){
4100 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
4103 h= FFMIN(h, s->avctx->height - y);
4105 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
4106 src= (AVFrame*)s->current_picture_ptr;
4107 else if(s->last_picture_ptr)
4108 src= (AVFrame*)s->last_picture_ptr;
4112 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
4118 offset[0]= y * s->linesize;;
4120 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
4126 s->avctx->draw_horiz_band(s->avctx, src, offset,
4127 y, s->picture_structure, h);
4131 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4132 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
4133 const int uvlinesize= s->current_picture.linesize[1];
4134 const int mb_size= 4 - s->avctx->lowres;
4136 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4137 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4138 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4139 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4140 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4141 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;
4142 //block_index is not used by mpeg2, so it is not affected by chroma_format
4144 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4145 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4146 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4148 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4150 s->dest[0] += s->mb_y * linesize << mb_size;
4151 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4152 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4156 #ifdef CONFIG_ENCODERS
4158 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4168 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4169 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4170 int v= ptr[x2 + y2*stride];
4176 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4181 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4183 int16_t weight[6][64];
4184 DCTELEM orig[6][64];
4185 const int mb_x= s->mb_x;
4186 const int mb_y= s->mb_y;
4189 int dct_offset = s->linesize*8; //default for progressive frames
4190 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4193 for(i=0; i<6; i++) skip_dct[i]=0;
4195 if(s->adaptive_quant){
4196 const int last_qp= s->qscale;
4197 const int mb_xy= mb_x + mb_y*s->mb_stride;
4199 s->lambda= s->lambda_table[mb_xy];
4202 if(!(s->flags&CODEC_FLAG_QP_RD)){
4203 s->dquant= s->qscale - last_qp;
4205 if(s->out_format==FMT_H263){
4206 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4208 if(s->codec_id==CODEC_ID_MPEG4){
4210 if(s->pict_type == B_TYPE){
4212 s->dquant= (s->dquant/2)*2;
4213 if(s->mv_dir&MV_DIRECT)
4216 if(s->mv_type==MV_TYPE_8X8)
4222 ff_set_qscale(s, last_qp + s->dquant);
4223 }else if(s->flags&CODEC_FLAG_QP_RD)
4224 ff_set_qscale(s, s->qscale + s->dquant);
4226 wrap_y = s->linesize;
4227 wrap_c = s->uvlinesize;
4228 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4229 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
4230 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
4232 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4233 uint8_t *ebuf= s->edge_emu_buffer + 32;
4234 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4236 ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
4237 ptr_cb= ebuf+18*wrap_y;
4238 ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
4239 ptr_cr= ebuf+18*wrap_y+8;
4243 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4244 int progressive_score, interlaced_score;
4246 s->interlaced_dct=0;
4247 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4248 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4250 if(progressive_score > 0){
4251 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4252 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4253 if(progressive_score > interlaced_score){
4254 s->interlaced_dct=1;
4262 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4263 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4264 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4265 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4267 if(s->flags&CODEC_FLAG_GRAY){
4271 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4272 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4275 op_pixels_func (*op_pix)[4];
4276 qpel_mc_func (*op_qpix)[16];
4277 uint8_t *dest_y, *dest_cb, *dest_cr;
4279 dest_y = s->dest[0];
4280 dest_cb = s->dest[1];
4281 dest_cr = s->dest[2];
4283 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4284 op_pix = s->dsp.put_pixels_tab;
4285 op_qpix= s->dsp.put_qpel_pixels_tab;
4287 op_pix = s->dsp.put_no_rnd_pixels_tab;
4288 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4291 if (s->mv_dir & MV_DIR_FORWARD) {
4292 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4293 op_pix = s->dsp.avg_pixels_tab;
4294 op_qpix= s->dsp.avg_qpel_pixels_tab;
4296 if (s->mv_dir & MV_DIR_BACKWARD) {
4297 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4300 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4301 int progressive_score, interlaced_score;
4303 s->interlaced_dct=0;
4304 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4305 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4307 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4309 if(progressive_score>0){
4310 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4311 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4313 if(progressive_score > interlaced_score){
4314 s->interlaced_dct=1;
4322 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4323 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4324 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4325 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4327 if(s->flags&CODEC_FLAG_GRAY){
4331 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4332 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4334 /* pre quantization */
4335 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4337 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4338 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4339 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4340 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;
4341 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4342 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4346 if(s->avctx->quantizer_noise_shaping){
4347 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4348 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4349 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4350 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4351 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4352 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4353 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
4356 /* DCT & quantize */
4357 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4362 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4363 // FIXME we could decide to change to quantizer instead of clipping
4364 // JS: I don't think that would be a good idea it could lower quality instead
4365 // of improve it. Just INTRADC clipping deserves changes in quantizer
4366 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4368 s->block_last_index[i]= -1;
4370 if(s->avctx->quantizer_noise_shaping){
4373 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4378 if(s->luma_elim_threshold && !s->mb_intra)
4380 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4381 if(s->chroma_elim_threshold && !s->mb_intra)
4383 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4385 if(s->flags & CODEC_FLAG_CBP_RD){
4387 if(s->block_last_index[i] == -1)
4388 s->coded_score[i]= INT_MAX/256;
4393 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4394 s->block_last_index[4]=
4395 s->block_last_index[5]= 0;
4397 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4400 //non c quantize code returns incorrect block_last_index FIXME
4401 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4404 if(s->block_last_index[i]>0){
4405 for(j=63; j>0; j--){
4406 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4408 s->block_last_index[i]= j;
4413 /* huffman encode */
4414 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4415 case CODEC_ID_MPEG1VIDEO:
4416 case CODEC_ID_MPEG2VIDEO:
4417 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4418 case CODEC_ID_MPEG4:
4419 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4420 case CODEC_ID_MSMPEG4V2:
4421 case CODEC_ID_MSMPEG4V3:
4423 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4425 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4426 #ifdef CONFIG_H261_ENCODER
4428 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4431 case CODEC_ID_H263P:
4435 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4436 case CODEC_ID_MJPEG:
4437 mjpeg_encode_mb(s, s->block); break;
4443 #endif //CONFIG_ENCODERS
4445 void ff_mpeg_flush(AVCodecContext *avctx){
4447 MpegEncContext *s = avctx->priv_data;
4449 if(s==NULL || s->picture==NULL)
4452 for(i=0; i<MAX_PICTURE_COUNT; i++){
4453 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4454 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4455 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4457 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4459 s->mb_x= s->mb_y= 0;
4461 s->parse_context.state= -1;
4462 s->parse_context.frame_start_found= 0;
4463 s->parse_context.overread= 0;
4464 s->parse_context.overread_index= 0;
4465 s->parse_context.index= 0;
4466 s->parse_context.last_index= 0;
4467 s->bitstream_buffer_size=0;
4470 #ifdef CONFIG_ENCODERS
4471 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4473 const uint16_t *srcw= (uint16_t*)src;
4474 int words= length>>4;
4475 int bits= length&15;
4478 if(length==0) return;
4481 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4482 }else if(put_bits_count(pb)&7){
4483 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4485 for(i=0; put_bits_count(pb)&31; i++)
4486 put_bits(pb, 8, src[i]);
4488 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4489 skip_put_bytes(pb, 2*words-i);
4492 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4495 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4498 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4501 d->mb_skip_run= s->mb_skip_run;
4503 d->last_dc[i]= s->last_dc[i];
4506 d->mv_bits= s->mv_bits;
4507 d->i_tex_bits= s->i_tex_bits;
4508 d->p_tex_bits= s->p_tex_bits;
4509 d->i_count= s->i_count;
4510 d->f_count= s->f_count;
4511 d->b_count= s->b_count;
4512 d->skip_count= s->skip_count;
4513 d->misc_bits= s->misc_bits;
4517 d->qscale= s->qscale;
4518 d->dquant= s->dquant;
4521 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4524 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4525 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4528 d->mb_skip_run= s->mb_skip_run;
4530 d->last_dc[i]= s->last_dc[i];
4533 d->mv_bits= s->mv_bits;
4534 d->i_tex_bits= s->i_tex_bits;
4535 d->p_tex_bits= s->p_tex_bits;
4536 d->i_count= s->i_count;
4537 d->f_count= s->f_count;
4538 d->b_count= s->b_count;
4539 d->skip_count= s->skip_count;
4540 d->misc_bits= s->misc_bits;
4542 d->mb_intra= s->mb_intra;
4543 d->mb_skipped= s->mb_skipped;
4544 d->mv_type= s->mv_type;
4545 d->mv_dir= s->mv_dir;
4547 if(s->data_partitioning){
4549 d->tex_pb= s->tex_pb;
4553 d->block_last_index[i]= s->block_last_index[i];
4554 d->interlaced_dct= s->interlaced_dct;
4555 d->qscale= s->qscale;
4558 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4559 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4560 int *dmin, int *next_block, int motion_x, int motion_y)
4563 uint8_t *dest_backup[3];
4565 copy_context_before_encode(s, backup, type);
4567 s->block= s->blocks[*next_block];
4568 s->pb= pb[*next_block];
4569 if(s->data_partitioning){
4570 s->pb2 = pb2 [*next_block];
4571 s->tex_pb= tex_pb[*next_block];
4575 memcpy(dest_backup, s->dest, sizeof(s->dest));
4576 s->dest[0] = s->rd_scratchpad;
4577 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4578 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4579 assert(s->linesize >= 32); //FIXME
4582 encode_mb(s, motion_x, motion_y);
4584 score= put_bits_count(&s->pb);
4585 if(s->data_partitioning){
4586 score+= put_bits_count(&s->pb2);
4587 score+= put_bits_count(&s->tex_pb);
4590 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4591 MPV_decode_mb(s, s->block);
4593 score *= s->lambda2;
4594 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4598 memcpy(s->dest, dest_backup, sizeof(s->dest));
4605 copy_context_after_encode(best, s, type);
4609 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4610 uint32_t *sq = squareTbl + 256;
4615 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4616 else if(w==8 && h==8)
4617 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4621 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4630 static int sse_mb(MpegEncContext *s){
4634 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4635 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4638 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4639 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)
4640 +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)
4641 +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);
4643 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)
4644 +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)
4645 +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);
4648 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)
4649 +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)
4650 +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);
4653 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4654 MpegEncContext *s= arg;
4658 s->me.dia_size= s->avctx->pre_dia_size;
4659 s->first_slice_line=1;
4660 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4661 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4662 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4664 s->first_slice_line=0;
4672 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4673 MpegEncContext *s= arg;
4675 s->me.dia_size= s->avctx->dia_size;
4676 s->first_slice_line=1;
4677 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4678 s->mb_x=0; //for block init below
4679 ff_init_block_index(s);
4680 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4681 s->block_index[0]+=2;
4682 s->block_index[1]+=2;
4683 s->block_index[2]+=2;
4684 s->block_index[3]+=2;
4686 /* compute motion vector & mb_type and store in context */
4687 if(s->pict_type==B_TYPE)
4688 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4690 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4692 s->first_slice_line=0;
4697 static int mb_var_thread(AVCodecContext *c, void *arg){
4698 MpegEncContext *s= arg;
4701 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4702 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4705 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4707 int sum = s->dsp.pix_sum(pix, s->linesize);
4709 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4711 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4712 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4713 s->me.mb_var_sum_temp += varc;
4719 static void write_slice_end(MpegEncContext *s){
4720 if(s->codec_id==CODEC_ID_MPEG4){
4721 if(s->partitioned_frame){
4722 ff_mpeg4_merge_partitions(s);
4725 ff_mpeg4_stuffing(&s->pb);
4726 }else if(s->out_format == FMT_MJPEG){
4727 ff_mjpeg_stuffing(&s->pb);
4730 align_put_bits(&s->pb);
4731 flush_put_bits(&s->pb);
4733 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4734 s->misc_bits+= get_bits_diff(s);
4737 static int encode_thread(AVCodecContext *c, void *arg){
4738 MpegEncContext *s= arg;
4739 int mb_x, mb_y, pdif = 0;
4741 MpegEncContext best_s, backup_s;
4742 uint8_t bit_buf[2][MAX_MB_BYTES];
4743 uint8_t bit_buf2[2][MAX_MB_BYTES];
4744 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4745 PutBitContext pb[2], pb2[2], tex_pb[2];
4746 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4749 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4750 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4751 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4754 s->last_bits= put_bits_count(&s->pb);
4765 /* init last dc values */
4766 /* note: quant matrix value (8) is implied here */
4767 s->last_dc[i] = 128 << s->intra_dc_precision;
4769 s->current_picture.error[i] = 0;
4772 memset(s->last_mv, 0, sizeof(s->last_mv));
4776 switch(s->codec_id){
4778 case CODEC_ID_H263P:
4780 s->gob_index = ff_h263_get_gob_height(s);
4782 case CODEC_ID_MPEG4:
4783 if(s->partitioned_frame)
4784 ff_mpeg4_init_partitions(s);
4790 s->first_slice_line = 1;
4791 s->ptr_lastgob = s->pb.buf;
4792 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4793 // printf("row %d at %X\n", s->mb_y, (int)s);
4797 ff_set_qscale(s, s->qscale);
4798 ff_init_block_index(s);
4800 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4801 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4802 int mb_type= s->mb_type[xy];
4807 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4808 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4811 if(s->data_partitioning){
4812 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4813 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4814 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4820 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4821 ff_update_block_index(s);
4823 #ifdef CONFIG_H261_ENCODER
4824 if(s->codec_id == CODEC_ID_H261){
4825 ff_h261_reorder_mb_index(s);
4826 xy= s->mb_y*s->mb_stride + s->mb_x;
4827 mb_type= s->mb_type[xy];
4831 /* write gob / video packet header */
4833 int current_packet_size, is_gob_start;
4835 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4837 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4839 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4841 switch(s->codec_id){
4843 case CODEC_ID_H263P:
4844 if(!s->h263_slice_structured)
4845 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4847 case CODEC_ID_MPEG2VIDEO:
4848 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4849 case CODEC_ID_MPEG1VIDEO:
4850 if(s->mb_skip_run) is_gob_start=0;
4855 if(s->start_mb_y != mb_y || mb_x!=0){
4858 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4859 ff_mpeg4_init_partitions(s);
4863 assert((put_bits_count(&s->pb)&7) == 0);
4864 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4866 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4867 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
4868 int d= 100 / s->avctx->error_rate;
4870 current_packet_size=0;
4871 #ifndef ALT_BITSTREAM_WRITER
4872 s->pb.buf_ptr= s->ptr_lastgob;
4874 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4878 if (s->avctx->rtp_callback){
4879 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
4880 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
4883 switch(s->codec_id){
4884 case CODEC_ID_MPEG4:
4885 ff_mpeg4_encode_video_packet_header(s);
4886 ff_mpeg4_clean_buffers(s);
4888 case CODEC_ID_MPEG1VIDEO:
4889 case CODEC_ID_MPEG2VIDEO:
4890 ff_mpeg1_encode_slice_header(s);
4891 ff_mpeg1_clean_buffers(s);
4894 case CODEC_ID_H263P:
4895 h263_encode_gob_header(s, mb_y);
4899 if(s->flags&CODEC_FLAG_PASS1){
4900 int bits= put_bits_count(&s->pb);
4901 s->misc_bits+= bits - s->last_bits;
4905 s->ptr_lastgob += current_packet_size;
4906 s->first_slice_line=1;
4907 s->resync_mb_x=mb_x;
4908 s->resync_mb_y=mb_y;
4912 if( (s->resync_mb_x == s->mb_x)
4913 && s->resync_mb_y+1 == s->mb_y){
4914 s->first_slice_line=0;
4918 s->dquant=0; //only for QP_RD
4920 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4922 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4924 copy_context_before_encode(&backup_s, s, -1);
4926 best_s.data_partitioning= s->data_partitioning;
4927 best_s.partitioned_frame= s->partitioned_frame;
4928 if(s->data_partitioning){
4929 backup_s.pb2= s->pb2;
4930 backup_s.tex_pb= s->tex_pb;
4933 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4934 s->mv_dir = MV_DIR_FORWARD;
4935 s->mv_type = MV_TYPE_16X16;
4937 s->mv[0][0][0] = s->p_mv_table[xy][0];
4938 s->mv[0][0][1] = s->p_mv_table[xy][1];
4939 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4940 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4942 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4943 s->mv_dir = MV_DIR_FORWARD;
4944 s->mv_type = MV_TYPE_FIELD;
4947 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4948 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4949 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4951 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4952 &dmin, &next_block, 0, 0);
4954 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
4955 s->mv_dir = MV_DIR_FORWARD;
4956 s->mv_type = MV_TYPE_16X16;
4960 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
4961 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4963 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4964 s->mv_dir = MV_DIR_FORWARD;
4965 s->mv_type = MV_TYPE_8X8;
4968 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4969 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4971 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4972 &dmin, &next_block, 0, 0);
4974 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4975 s->mv_dir = MV_DIR_FORWARD;
4976 s->mv_type = MV_TYPE_16X16;
4978 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4979 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4980 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4981 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4983 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4984 s->mv_dir = MV_DIR_BACKWARD;
4985 s->mv_type = MV_TYPE_16X16;
4987 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4988 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4989 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4990 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4992 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4993 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4994 s->mv_type = MV_TYPE_16X16;
4996 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4997 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4998 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4999 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5000 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
5001 &dmin, &next_block, 0, 0);
5003 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
5004 int mx= s->b_direct_mv_table[xy][0];
5005 int my= s->b_direct_mv_table[xy][1];
5007 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5009 ff_mpeg4_set_direct_mv(s, mx, my);
5010 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
5011 &dmin, &next_block, mx, my);
5013 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
5014 s->mv_dir = MV_DIR_FORWARD;
5015 s->mv_type = MV_TYPE_FIELD;
5018 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5019 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5020 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5022 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
5023 &dmin, &next_block, 0, 0);
5025 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
5026 s->mv_dir = MV_DIR_BACKWARD;
5027 s->mv_type = MV_TYPE_FIELD;
5030 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5031 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5032 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5034 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
5035 &dmin, &next_block, 0, 0);
5037 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
5038 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5039 s->mv_type = MV_TYPE_FIELD;
5041 for(dir=0; dir<2; dir++){
5043 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5044 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5045 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5048 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
5049 &dmin, &next_block, 0, 0);
5051 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
5053 s->mv_type = MV_TYPE_16X16;
5057 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
5058 &dmin, &next_block, 0, 0);
5059 if(s->h263_pred || s->h263_aic){
5061 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
5063 ff_clean_intra_table_entries(s); //old mode?
5067 if(s->flags & CODEC_FLAG_QP_RD){
5068 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
5069 const int last_qp= backup_s.qscale;
5070 int dquant, dir, qp, dc[6];
5072 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
5074 assert(backup_s.dquant == 0);
5077 s->mv_dir= best_s.mv_dir;
5078 s->mv_type = MV_TYPE_16X16;
5079 s->mb_intra= best_s.mb_intra;
5080 s->mv[0][0][0] = best_s.mv[0][0][0];
5081 s->mv[0][0][1] = best_s.mv[0][0][1];
5082 s->mv[1][0][0] = best_s.mv[1][0][0];
5083 s->mv[1][0][1] = best_s.mv[1][0][1];
5085 dir= s->pict_type == B_TYPE ? 2 : 1;
5086 if(last_qp + dir > s->avctx->qmax) dir= -dir;
5087 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
5088 qp= last_qp + dquant;
5089 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
5091 backup_s.dquant= dquant;
5092 if(s->mb_intra && s->dc_val[0]){
5094 dc[i]= s->dc_val[0][ s->block_index[i] ];
5095 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
5099 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
5100 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
5101 if(best_s.qscale != qp){
5102 if(s->mb_intra && s->dc_val[0]){
5104 s->dc_val[0][ s->block_index[i] ]= dc[i];
5105 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
5108 if(dir > 0 && dquant==dir){
5116 s->current_picture.qscale_table[xy]= qp;
5120 copy_context_after_encode(s, &best_s, -1);
5122 pb_bits_count= put_bits_count(&s->pb);
5123 flush_put_bits(&s->pb);
5124 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
5127 if(s->data_partitioning){
5128 pb2_bits_count= put_bits_count(&s->pb2);
5129 flush_put_bits(&s->pb2);
5130 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5131 s->pb2= backup_s.pb2;
5133 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5134 flush_put_bits(&s->tex_pb);
5135 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5136 s->tex_pb= backup_s.tex_pb;
5138 s->last_bits= put_bits_count(&s->pb);
5140 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5141 ff_h263_update_motion_val(s);
5143 if(next_block==0){ //FIXME 16 vs linesize16
5144 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5145 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5146 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5149 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5150 MPV_decode_mb(s, s->block);
5152 int motion_x, motion_y;
5153 s->mv_type=MV_TYPE_16X16;
5154 // only one MB-Type possible
5157 case CANDIDATE_MB_TYPE_INTRA:
5160 motion_x= s->mv[0][0][0] = 0;
5161 motion_y= s->mv[0][0][1] = 0;
5163 case CANDIDATE_MB_TYPE_INTER:
5164 s->mv_dir = MV_DIR_FORWARD;
5166 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5167 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5169 case CANDIDATE_MB_TYPE_INTER_I:
5170 s->mv_dir = MV_DIR_FORWARD;
5171 s->mv_type = MV_TYPE_FIELD;
5174 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5175 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5176 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5178 motion_x = motion_y = 0;
5180 case CANDIDATE_MB_TYPE_INTER4V:
5181 s->mv_dir = MV_DIR_FORWARD;
5182 s->mv_type = MV_TYPE_8X8;
5185 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5186 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5188 motion_x= motion_y= 0;
5190 case CANDIDATE_MB_TYPE_DIRECT:
5191 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5193 motion_x=s->b_direct_mv_table[xy][0];
5194 motion_y=s->b_direct_mv_table[xy][1];
5195 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5197 case CANDIDATE_MB_TYPE_BIDIR:
5198 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5202 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5203 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5204 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5205 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5207 case CANDIDATE_MB_TYPE_BACKWARD:
5208 s->mv_dir = MV_DIR_BACKWARD;
5210 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5211 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5213 case CANDIDATE_MB_TYPE_FORWARD:
5214 s->mv_dir = MV_DIR_FORWARD;
5216 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5217 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5218 // printf(" %d %d ", motion_x, motion_y);
5220 case CANDIDATE_MB_TYPE_FORWARD_I:
5221 s->mv_dir = MV_DIR_FORWARD;
5222 s->mv_type = MV_TYPE_FIELD;
5225 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5226 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5227 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5229 motion_x=motion_y=0;
5231 case CANDIDATE_MB_TYPE_BACKWARD_I:
5232 s->mv_dir = MV_DIR_BACKWARD;
5233 s->mv_type = MV_TYPE_FIELD;
5236 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5237 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5238 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5240 motion_x=motion_y=0;
5242 case CANDIDATE_MB_TYPE_BIDIR_I:
5243 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5244 s->mv_type = MV_TYPE_FIELD;
5246 for(dir=0; dir<2; dir++){
5248 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5249 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5250 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5253 motion_x=motion_y=0;
5256 motion_x=motion_y=0; //gcc warning fix
5257 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5260 encode_mb(s, motion_x, motion_y);
5262 // RAL: Update last macroblock type
5263 s->last_mv_dir = s->mv_dir;
5265 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5266 ff_h263_update_motion_val(s);
5268 MPV_decode_mb(s, s->block);
5271 /* clean the MV table in IPS frames for direct mode in B frames */
5272 if(s->mb_intra /* && I,P,S_TYPE */){
5273 s->p_mv_table[xy][0]=0;
5274 s->p_mv_table[xy][1]=0;
5277 if(s->flags&CODEC_FLAG_PSNR){
5281 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5282 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5284 s->current_picture.error[0] += sse(
5285 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5286 s->dest[0], w, h, s->linesize);
5287 s->current_picture.error[1] += sse(
5288 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5289 s->dest[1], w>>1, h>>1, s->uvlinesize);
5290 s->current_picture.error[2] += sse(
5291 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5292 s->dest[2], w>>1, h>>1, s->uvlinesize);
5295 if(s->out_format == FMT_H263)
5296 ff_h263_loop_filter(s);
5298 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5302 //not beautiful here but we must write it before flushing so it has to be here
5303 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5304 msmpeg4_encode_ext_header(s);
5308 /* Send the last GOB if RTP */
5309 if (s->avctx->rtp_callback) {
5310 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5311 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5312 /* Call the RTP callback to send the last GOB */
5314 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5320 #define MERGE(field) dst->field += src->field; src->field=0
5321 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5322 MERGE(me.scene_change_score);
5323 MERGE(me.mc_mb_var_sum_temp);
5324 MERGE(me.mb_var_sum_temp);
5327 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5330 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5331 MERGE(dct_count[1]);
5341 MERGE(padding_bug_score);
5342 MERGE(current_picture.error[0]);
5343 MERGE(current_picture.error[1]);
5344 MERGE(current_picture.error[2]);
5346 if(dst->avctx->noise_reduction){
5347 for(i=0; i<64; i++){
5348 MERGE(dct_error_sum[0][i]);
5349 MERGE(dct_error_sum[1][i]);
5353 assert(put_bits_count(&src->pb) % 8 ==0);
5354 assert(put_bits_count(&dst->pb) % 8 ==0);
5355 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5356 flush_put_bits(&dst->pb);
5359 static void estimate_qp(MpegEncContext *s, int dry_run){
5360 if (!s->fixed_qscale)
5361 s->current_picture_ptr->quality=
5362 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
5364 if(s->adaptive_quant){
5365 switch(s->codec_id){
5366 case CODEC_ID_MPEG4:
5367 ff_clean_mpeg4_qscales(s);
5370 case CODEC_ID_H263P:
5372 ff_clean_h263_qscales(s);
5376 s->lambda= s->lambda_table[0];
5379 s->lambda= s->current_picture.quality;
5380 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5384 static void encode_picture(MpegEncContext *s, int picture_number)
5389 s->picture_number = picture_number;
5391 /* Reset the average MB variance */
5392 s->me.mb_var_sum_temp =
5393 s->me.mc_mb_var_sum_temp = 0;
5395 /* we need to initialize some time vars before we can encode b-frames */
5396 // RAL: Condition added for MPEG1VIDEO
5397 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5398 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5400 s->me.scene_change_score=0;
5402 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5404 if(s->pict_type==I_TYPE){
5405 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5406 else s->no_rounding=0;
5407 }else if(s->pict_type!=B_TYPE){
5408 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5409 s->no_rounding ^= 1;
5412 if(s->flags & CODEC_FLAG_PASS2){
5414 ff_get_2pass_fcode(s);
5415 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
5416 if(s->pict_type==B_TYPE)
5417 s->lambda= s->last_lambda_for[s->pict_type];
5419 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
5423 s->mb_intra=0; //for the rate distortion & bit compare functions
5424 for(i=1; i<s->avctx->thread_count; i++){
5425 ff_update_duplicate_context(s->thread_context[i], s);
5430 /* Estimate motion for every MB */
5431 if(s->pict_type != I_TYPE){
5432 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5433 s->lambda2= (s->lambda2* s->avctx->me_penalty_compensation + 128)>>8;
5434 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5435 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5436 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5440 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5441 }else /* if(s->pict_type == I_TYPE) */{
5443 for(i=0; i<s->mb_stride*s->mb_height; i++)
5444 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5446 if(!s->fixed_qscale){
5447 /* finding spatial complexity for I-frame rate control */
5448 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5451 for(i=1; i<s->avctx->thread_count; i++){
5452 merge_context_after_me(s, s->thread_context[i]);
5454 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5455 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5458 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5459 s->pict_type= I_TYPE;
5460 for(i=0; i<s->mb_stride*s->mb_height; i++)
5461 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5462 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5466 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5467 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5469 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5471 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5472 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5473 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5476 ff_fix_long_p_mvs(s);
5477 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5478 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5482 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5483 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5488 if(s->pict_type==B_TYPE){
5491 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5492 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5493 s->f_code = FFMAX(a, b);
5495 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5496 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5497 s->b_code = FFMAX(a, b);
5499 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5500 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5501 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5502 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5503 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5505 for(dir=0; dir<2; dir++){
5508 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5509 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5510 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5511 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5521 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5522 s->qscale= 3; //reduce clipping problems
5524 if (s->out_format == FMT_MJPEG) {
5525 /* for mjpeg, we do include qscale in the matrix */
5526 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5528 int j= s->dsp.idct_permutation[i];
5530 s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3) & 0xFF;
5532 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5533 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5537 //FIXME var duplication
5538 s->current_picture_ptr->key_frame=
5539 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5540 s->current_picture_ptr->pict_type=
5541 s->current_picture.pict_type= s->pict_type;
5543 if(s->current_picture.key_frame)
5544 s->picture_in_gop_number=0;
5546 s->last_bits= put_bits_count(&s->pb);
5547 switch(s->out_format) {
5549 mjpeg_picture_header(s);
5551 #ifdef CONFIG_H261_ENCODER
5553 ff_h261_encode_picture_header(s, picture_number);
5557 if (s->codec_id == CODEC_ID_WMV2)
5558 ff_wmv2_encode_picture_header(s, picture_number);
5559 else if (s->h263_msmpeg4)
5560 msmpeg4_encode_picture_header(s, picture_number);
5561 else if (s->h263_pred)
5562 mpeg4_encode_picture_header(s, picture_number);
5563 #ifdef CONFIG_RV10_ENCODER
5564 else if (s->codec_id == CODEC_ID_RV10)
5565 rv10_encode_picture_header(s, picture_number);
5567 #ifdef CONFIG_RV20_ENCODER
5568 else if (s->codec_id == CODEC_ID_RV20)
5569 rv20_encode_picture_header(s, picture_number);
5571 else if (s->codec_id == CODEC_ID_FLV1)
5572 ff_flv_encode_picture_header(s, picture_number);
5574 h263_encode_picture_header(s, picture_number);
5577 mpeg1_encode_picture_header(s, picture_number);
5584 bits= put_bits_count(&s->pb);
5585 s->header_bits= bits - s->last_bits;
5587 for(i=1; i<s->avctx->thread_count; i++){
5588 update_duplicate_context_after_me(s->thread_context[i], s);
5590 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5591 for(i=1; i<s->avctx->thread_count; i++){
5592 merge_context_after_encode(s, s->thread_context[i]);
5597 #endif //CONFIG_ENCODERS
5599 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5600 const int intra= s->mb_intra;
5603 s->dct_count[intra]++;
5605 for(i=0; i<64; i++){
5606 int level= block[i];
5610 s->dct_error_sum[intra][i] += level;
5611 level -= s->dct_offset[intra][i];
5612 if(level<0) level=0;
5614 s->dct_error_sum[intra][i] -= level;
5615 level += s->dct_offset[intra][i];
5616 if(level>0) level=0;
5623 #ifdef CONFIG_ENCODERS
5625 static int dct_quantize_trellis_c(MpegEncContext *s,
5626 DCTELEM *block, int n,
5627 int qscale, int *overflow){
5629 const uint8_t *scantable= s->intra_scantable.scantable;
5630 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5632 unsigned int threshold1, threshold2;
5644 int coeff_count[64];
5645 int qmul, qadd, start_i, last_non_zero, i, dc;
5646 const int esc_length= s->ac_esc_length;
5648 uint8_t * last_length;
5649 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5651 s->dsp.fdct (block);
5653 if(s->dct_error_sum)
5654 s->denoise_dct(s, block);
5656 qadd= ((qscale-1)|1)*8;
5667 /* For AIC we skip quant/dequant of INTRADC */
5672 /* note: block[0] is assumed to be positive */
5673 block[0] = (block[0] + (q >> 1)) / q;
5676 qmat = s->q_intra_matrix[qscale];
5677 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5678 bias= 1<<(QMAT_SHIFT-1);
5679 length = s->intra_ac_vlc_length;
5680 last_length= s->intra_ac_vlc_last_length;
5684 qmat = s->q_inter_matrix[qscale];
5685 length = s->inter_ac_vlc_length;
5686 last_length= s->inter_ac_vlc_last_length;
5690 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5691 threshold2= (threshold1<<1);
5693 for(i=63; i>=start_i; i--) {
5694 const int j = scantable[i];
5695 int level = block[j] * qmat[j];
5697 if(((unsigned)(level+threshold1))>threshold2){
5703 for(i=start_i; i<=last_non_zero; i++) {
5704 const int j = scantable[i];
5705 int level = block[j] * qmat[j];
5707 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5708 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5709 if(((unsigned)(level+threshold1))>threshold2){
5711 level= (bias + level)>>QMAT_SHIFT;
5713 coeff[1][i]= level-1;
5714 // coeff[2][k]= level-2;
5716 level= (bias - level)>>QMAT_SHIFT;
5717 coeff[0][i]= -level;
5718 coeff[1][i]= -level+1;
5719 // coeff[2][k]= -level+2;
5721 coeff_count[i]= FFMIN(level, 2);
5722 assert(coeff_count[i]);
5725 coeff[0][i]= (level>>31)|1;
5730 *overflow= s->max_qcoeff < max; //overflow might have happened
5732 if(last_non_zero < start_i){
5733 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5734 return last_non_zero;
5737 score_tab[start_i]= 0;
5738 survivor[0]= start_i;
5741 for(i=start_i; i<=last_non_zero; i++){
5743 const int dct_coeff= ABS(block[ scantable[i] ]);
5744 const int zero_distoration= dct_coeff*dct_coeff;
5745 int best_score=256*256*256*120;
5746 for(level_index=0; level_index < coeff_count[i]; level_index++){
5748 int level= coeff[level_index][i];
5749 const int alevel= ABS(level);
5754 if(s->out_format == FMT_H263){
5755 unquant_coeff= alevel*qmul + qadd;
5757 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5759 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5760 unquant_coeff = (unquant_coeff - 1) | 1;
5762 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5763 unquant_coeff = (unquant_coeff - 1) | 1;
5768 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5770 if((level&(~127)) == 0){
5771 for(j=survivor_count-1; j>=0; j--){
5772 int run= i - survivor[j];
5773 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5774 score += score_tab[i-run];
5776 if(score < best_score){
5779 level_tab[i+1]= level-64;
5783 if(s->out_format == FMT_H263){
5784 for(j=survivor_count-1; j>=0; j--){
5785 int run= i - survivor[j];
5786 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5787 score += score_tab[i-run];
5788 if(score < last_score){
5791 last_level= level-64;
5797 distoration += esc_length*lambda;
5798 for(j=survivor_count-1; j>=0; j--){
5799 int run= i - survivor[j];
5800 int score= distoration + score_tab[i-run];
5802 if(score < best_score){
5805 level_tab[i+1]= level-64;
5809 if(s->out_format == FMT_H263){
5810 for(j=survivor_count-1; j>=0; j--){
5811 int run= i - survivor[j];
5812 int score= distoration + score_tab[i-run];
5813 if(score < last_score){
5816 last_level= level-64;
5824 score_tab[i+1]= best_score;
5826 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5827 if(last_non_zero <= 27){
5828 for(; survivor_count; survivor_count--){
5829 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5833 for(; survivor_count; survivor_count--){
5834 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5839 survivor[ survivor_count++ ]= i+1;
5842 if(s->out_format != FMT_H263){
5843 last_score= 256*256*256*120;
5844 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5845 int score= score_tab[i];
5846 if(i) score += lambda*2; //FIXME exacter?
5848 if(score < last_score){
5851 last_level= level_tab[i];
5852 last_run= run_tab[i];
5857 s->coded_score[n] = last_score;
5860 last_non_zero= last_i - 1;
5861 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5863 if(last_non_zero < start_i)
5864 return last_non_zero;
5866 if(last_non_zero == 0 && start_i == 0){
5868 int best_score= dc * dc;
5870 for(i=0; i<coeff_count[0]; i++){
5871 int level= coeff[i][0];
5872 int alevel= ABS(level);
5873 int unquant_coeff, score, distortion;
5875 if(s->out_format == FMT_H263){
5876 unquant_coeff= (alevel*qmul + qadd)>>3;
5878 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5879 unquant_coeff = (unquant_coeff - 1) | 1;
5881 unquant_coeff = (unquant_coeff + 4) >> 3;
5882 unquant_coeff<<= 3 + 3;
5884 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5886 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5887 else score= distortion + esc_length*lambda;
5889 if(score < best_score){
5891 best_level= level - 64;
5894 block[0]= best_level;
5895 s->coded_score[n] = best_score - dc*dc;
5896 if(best_level == 0) return -1;
5897 else return last_non_zero;
5903 block[ perm_scantable[last_non_zero] ]= last_level;
5906 for(; i>start_i; i -= run_tab[i] + 1){
5907 block[ perm_scantable[i-1] ]= level_tab[i];
5910 return last_non_zero;
5913 //#define REFINE_STATS 1
5914 static int16_t basis[64][64];
5916 static void build_basis(uint8_t *perm){
5923 double s= 0.25*(1<<BASIS_SHIFT);
5925 int perm_index= perm[index];
5926 if(i==0) s*= sqrt(0.5);
5927 if(j==0) s*= sqrt(0.5);
5928 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)));
5935 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5936 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5939 DCTELEM d1[64] __align16;
5941 const uint8_t *scantable= s->intra_scantable.scantable;
5942 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5943 // unsigned int threshold1, threshold2;
5948 int qmul, qadd, start_i, last_non_zero, i, dc;
5950 uint8_t * last_length;
5952 int rle_index, run, q, sum;
5955 static int after_last=0;
5956 static int to_zero=0;
5957 static int from_zero=0;
5960 static int messed_sign=0;
5963 if(basis[0][0] == 0)
5964 build_basis(s->dsp.idct_permutation);
5975 /* For AIC we skip quant/dequant of INTRADC */
5979 q <<= RECON_SHIFT-3;
5980 /* note: block[0] is assumed to be positive */
5982 // block[0] = (block[0] + (q >> 1)) / q;
5984 qmat = s->q_intra_matrix[qscale];
5985 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5986 // bias= 1<<(QMAT_SHIFT-1);
5987 length = s->intra_ac_vlc_length;
5988 last_length= s->intra_ac_vlc_last_length;
5992 qmat = s->q_inter_matrix[qscale];
5993 length = s->inter_ac_vlc_length;
5994 last_length= s->inter_ac_vlc_last_length;
5996 last_non_zero = s->block_last_index[n];
6001 dc += (1<<(RECON_SHIFT-1));
6002 for(i=0; i<64; i++){
6003 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
6006 STOP_TIMER("memset rem[]")}
6009 for(i=0; i<64; i++){
6014 w= ABS(weight[i]) + qns*one;
6015 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
6018 // w=weight[i] = (63*qns + (w/2)) / w;
6024 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
6030 for(i=start_i; i<=last_non_zero; i++){
6031 int j= perm_scantable[i];
6032 const int level= block[j];
6036 if(level<0) coeff= qmul*level - qadd;
6037 else coeff= qmul*level + qadd;
6038 run_tab[rle_index++]=run;
6041 s->dsp.add_8x8basis(rem, basis[j], coeff);
6047 if(last_non_zero>0){
6048 STOP_TIMER("init rem[]")
6055 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
6058 int run2, best_unquant_change=0, analyze_gradient;
6062 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
6064 if(analyze_gradient){
6068 for(i=0; i<64; i++){
6071 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
6074 STOP_TIMER("rem*w*w")}
6084 const int level= block[0];
6085 int change, old_coeff;
6087 assert(s->mb_intra);
6091 for(change=-1; change<=1; change+=2){
6092 int new_level= level + change;
6093 int score, new_coeff;
6095 new_coeff= q*new_level;
6096 if(new_coeff >= 2048 || new_coeff < 0)
6099 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
6100 if(score<best_score){
6103 best_change= change;
6104 best_unquant_change= new_coeff - old_coeff;
6111 run2= run_tab[rle_index++];
6115 for(i=start_i; i<64; i++){
6116 int j= perm_scantable[i];
6117 const int level= block[j];
6118 int change, old_coeff;
6120 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
6124 if(level<0) old_coeff= qmul*level - qadd;
6125 else old_coeff= qmul*level + qadd;
6126 run2= run_tab[rle_index++]; //FIXME ! maybe after last
6130 assert(run2>=0 || i >= last_non_zero );
6133 for(change=-1; change<=1; change+=2){
6134 int new_level= level + change;
6135 int score, new_coeff, unquant_change;
6138 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
6142 if(new_level<0) new_coeff= qmul*new_level - qadd;
6143 else new_coeff= qmul*new_level + qadd;
6144 if(new_coeff >= 2048 || new_coeff <= -2048)
6146 //FIXME check for overflow
6149 if(level < 63 && level > -63){
6150 if(i < last_non_zero)
6151 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6152 - length[UNI_AC_ENC_INDEX(run, level+64)];
6154 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6155 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6158 assert(ABS(new_level)==1);
6160 if(analyze_gradient){
6161 int g= d1[ scantable[i] ];
6162 if(g && (g^new_level) >= 0)
6166 if(i < last_non_zero){
6167 int next_i= i + run2 + 1;
6168 int next_level= block[ perm_scantable[next_i] ] + 64;
6170 if(next_level&(~127))
6173 if(next_i < last_non_zero)
6174 score += length[UNI_AC_ENC_INDEX(run, 65)]
6175 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6176 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6178 score += length[UNI_AC_ENC_INDEX(run, 65)]
6179 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6180 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6182 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6184 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6185 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6191 assert(ABS(level)==1);
6193 if(i < last_non_zero){
6194 int next_i= i + run2 + 1;
6195 int next_level= block[ perm_scantable[next_i] ] + 64;
6197 if(next_level&(~127))
6200 if(next_i < last_non_zero)
6201 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6202 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6203 - length[UNI_AC_ENC_INDEX(run, 65)];
6205 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6206 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6207 - length[UNI_AC_ENC_INDEX(run, 65)];
6209 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6211 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6212 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6219 unquant_change= new_coeff - old_coeff;
6220 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6222 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6223 if(score<best_score){
6226 best_change= change;
6227 best_unquant_change= unquant_change;
6231 prev_level= level + 64;
6232 if(prev_level&(~127))
6241 STOP_TIMER("iterative step")}
6245 int j= perm_scantable[ best_coeff ];
6247 block[j] += best_change;
6249 if(best_coeff > last_non_zero){
6250 last_non_zero= best_coeff;
6258 if(block[j] - best_change){
6259 if(ABS(block[j]) > ABS(block[j] - best_change)){
6271 for(; last_non_zero>=start_i; last_non_zero--){
6272 if(block[perm_scantable[last_non_zero]])
6278 if(256*256*256*64 % count == 0){
6279 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);
6284 for(i=start_i; i<=last_non_zero; i++){
6285 int j= perm_scantable[i];
6286 const int level= block[j];
6289 run_tab[rle_index++]=run;
6296 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6302 if(last_non_zero>0){
6303 STOP_TIMER("iterative search")
6308 return last_non_zero;
6311 static int dct_quantize_c(MpegEncContext *s,
6312 DCTELEM *block, int n,
6313 int qscale, int *overflow)
6315 int i, j, level, last_non_zero, q, start_i;
6317 const uint8_t *scantable= s->intra_scantable.scantable;
6320 unsigned int threshold1, threshold2;
6322 s->dsp.fdct (block);
6324 if(s->dct_error_sum)
6325 s->denoise_dct(s, block);
6335 /* For AIC we skip quant/dequant of INTRADC */
6338 /* note: block[0] is assumed to be positive */
6339 block[0] = (block[0] + (q >> 1)) / q;
6342 qmat = s->q_intra_matrix[qscale];
6343 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6347 qmat = s->q_inter_matrix[qscale];
6348 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6350 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6351 threshold2= (threshold1<<1);
6352 for(i=63;i>=start_i;i--) {
6354 level = block[j] * qmat[j];
6356 if(((unsigned)(level+threshold1))>threshold2){
6363 for(i=start_i; i<=last_non_zero; i++) {
6365 level = block[j] * qmat[j];
6367 // if( bias+level >= (1<<QMAT_SHIFT)
6368 // || bias-level >= (1<<QMAT_SHIFT)){
6369 if(((unsigned)(level+threshold1))>threshold2){
6371 level= (bias + level)>>QMAT_SHIFT;
6374 level= (bias - level)>>QMAT_SHIFT;
6382 *overflow= s->max_qcoeff < max; //overflow might have happened
6384 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6385 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6386 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6388 return last_non_zero;
6391 #endif //CONFIG_ENCODERS
6393 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6394 DCTELEM *block, int n, int qscale)
6396 int i, level, nCoeffs;
6397 const uint16_t *quant_matrix;
6399 nCoeffs= s->block_last_index[n];
6402 block[0] = block[0] * s->y_dc_scale;
6404 block[0] = block[0] * s->c_dc_scale;
6405 /* XXX: only mpeg1 */
6406 quant_matrix = s->intra_matrix;
6407 for(i=1;i<=nCoeffs;i++) {
6408 int j= s->intra_scantable.permutated[i];
6413 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6414 level = (level - 1) | 1;
6417 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6418 level = (level - 1) | 1;
6425 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6426 DCTELEM *block, int n, int qscale)
6428 int i, level, nCoeffs;
6429 const uint16_t *quant_matrix;
6431 nCoeffs= s->block_last_index[n];
6433 quant_matrix = s->inter_matrix;
6434 for(i=0; i<=nCoeffs; i++) {
6435 int j= s->intra_scantable.permutated[i];
6440 level = (((level << 1) + 1) * qscale *
6441 ((int) (quant_matrix[j]))) >> 4;
6442 level = (level - 1) | 1;
6445 level = (((level << 1) + 1) * qscale *
6446 ((int) (quant_matrix[j]))) >> 4;
6447 level = (level - 1) | 1;
6454 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6455 DCTELEM *block, int n, int qscale)
6457 int i, level, nCoeffs;
6458 const uint16_t *quant_matrix;
6460 if(s->alternate_scan) nCoeffs= 63;
6461 else nCoeffs= s->block_last_index[n];
6464 block[0] = block[0] * s->y_dc_scale;
6466 block[0] = block[0] * s->c_dc_scale;
6467 quant_matrix = s->intra_matrix;
6468 for(i=1;i<=nCoeffs;i++) {
6469 int j= s->intra_scantable.permutated[i];
6474 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6477 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6484 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6485 DCTELEM *block, int n, int qscale)
6487 int i, level, nCoeffs;
6488 const uint16_t *quant_matrix;
6491 if(s->alternate_scan) nCoeffs= 63;
6492 else nCoeffs= s->block_last_index[n];
6494 quant_matrix = s->inter_matrix;
6495 for(i=0; i<=nCoeffs; i++) {
6496 int j= s->intra_scantable.permutated[i];
6501 level = (((level << 1) + 1) * qscale *
6502 ((int) (quant_matrix[j]))) >> 4;
6505 level = (((level << 1) + 1) * qscale *
6506 ((int) (quant_matrix[j]))) >> 4;
6515 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6516 DCTELEM *block, int n, int qscale)
6518 int i, level, qmul, qadd;
6521 assert(s->block_last_index[n]>=0);
6527 block[0] = block[0] * s->y_dc_scale;
6529 block[0] = block[0] * s->c_dc_scale;
6530 qadd = (qscale - 1) | 1;
6537 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6539 for(i=1; i<=nCoeffs; i++) {
6543 level = level * qmul - qadd;
6545 level = level * qmul + qadd;
6552 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6553 DCTELEM *block, int n, int qscale)
6555 int i, level, qmul, qadd;
6558 assert(s->block_last_index[n]>=0);
6560 qadd = (qscale - 1) | 1;
6563 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6565 for(i=0; i<=nCoeffs; i++) {
6569 level = level * qmul - qadd;
6571 level = level * qmul + qadd;
6578 #ifdef CONFIG_ENCODERS
6579 AVCodec h263_encoder = {
6583 sizeof(MpegEncContext),
6587 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6590 AVCodec h263p_encoder = {
6594 sizeof(MpegEncContext),
6598 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6601 AVCodec flv_encoder = {
6605 sizeof(MpegEncContext),
6609 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6612 AVCodec rv10_encoder = {
6616 sizeof(MpegEncContext),
6620 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6623 AVCodec rv20_encoder = {
6627 sizeof(MpegEncContext),
6631 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6634 AVCodec mpeg4_encoder = {
6638 sizeof(MpegEncContext),
6642 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6643 .capabilities= CODEC_CAP_DELAY,
6646 AVCodec msmpeg4v1_encoder = {
6650 sizeof(MpegEncContext),
6654 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6657 AVCodec msmpeg4v2_encoder = {
6661 sizeof(MpegEncContext),
6665 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6668 AVCodec msmpeg4v3_encoder = {
6672 sizeof(MpegEncContext),
6676 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6679 AVCodec wmv1_encoder = {
6683 sizeof(MpegEncContext),
6687 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6690 AVCodec mjpeg_encoder = {
6694 sizeof(MpegEncContext),
6698 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, -1},
6701 #endif //CONFIG_ENCODERS