2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
35 #include "fastmemcpy.h"
41 #ifdef CONFIG_ENCODERS
42 static void encode_picture(MpegEncContext *s, int picture_number);
43 #endif //CONFIG_ENCODERS
44 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void 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");
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, "Input picture size isn't suitable for h263 codec! try h263+\n");
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 if(s->pict_type!=B_TYPE){
1598 s->last_non_b_pict_type= s->pict_type;
1601 /* copy back current_picture variables */
1602 for(i=0; i<MAX_PICTURE_COUNT; i++){
1603 if(s->picture[i].data[0] == s->current_picture.data[0]){
1604 s->picture[i]= s->current_picture;
1608 assert(i<MAX_PICTURE_COUNT);
1612 /* release non-reference frames */
1613 for(i=0; i<MAX_PICTURE_COUNT; i++){
1614 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1615 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1619 // clear copies, to avoid confusion
1621 memset(&s->last_picture, 0, sizeof(Picture));
1622 memset(&s->next_picture, 0, sizeof(Picture));
1623 memset(&s->current_picture, 0, sizeof(Picture));
1625 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1629 * draws an line from (ex, ey) -> (sx, sy).
1630 * @param w width of the image
1631 * @param h height of the image
1632 * @param stride stride/linesize of the image
1633 * @param color color of the arrow
1635 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1638 sx= clip(sx, 0, w-1);
1639 sy= clip(sy, 0, h-1);
1640 ex= clip(ex, 0, w-1);
1641 ey= clip(ey, 0, h-1);
1643 buf[sy*stride + sx]+= color;
1645 if(ABS(ex - sx) > ABS(ey - sy)){
1650 buf+= sx + sy*stride;
1652 f= ((ey-sy)<<16)/ex;
1653 for(x= 0; x <= ex; x++){
1656 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1657 buf[(y+1)*stride + x]+= (color* fr )>>16;
1664 buf+= sx + sy*stride;
1666 if(ey) f= ((ex-sx)<<16)/ey;
1668 for(y= 0; y <= ey; y++){
1671 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1672 buf[y*stride + x+1]+= (color* fr )>>16;;
1678 * draws an arrow from (ex, ey) -> (sx, sy).
1679 * @param w width of the image
1680 * @param h height of the image
1681 * @param stride stride/linesize of the image
1682 * @param color color of the arrow
1684 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1687 sx= clip(sx, -100, w+100);
1688 sy= clip(sy, -100, h+100);
1689 ex= clip(ex, -100, w+100);
1690 ey= clip(ey, -100, h+100);
1695 if(dx*dx + dy*dy > 3*3){
1698 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1700 //FIXME subpixel accuracy
1701 rx= ROUNDED_DIV(rx*3<<4, length);
1702 ry= ROUNDED_DIV(ry*3<<4, length);
1704 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1705 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1707 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1711 * prints debuging info for the given picture.
1713 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1715 if(!pict || !pict->mb_type) return;
1717 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1720 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1721 switch (pict->pict_type) {
1722 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1723 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1724 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1725 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1726 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1727 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1729 for(y=0; y<s->mb_height; y++){
1730 for(x=0; x<s->mb_width; x++){
1731 if(s->avctx->debug&FF_DEBUG_SKIP){
1732 int count= s->mbskip_table[x + y*s->mb_stride];
1733 if(count>9) count=9;
1734 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1736 if(s->avctx->debug&FF_DEBUG_QP){
1737 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1739 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1740 int mb_type= pict->mb_type[x + y*s->mb_stride];
1741 //Type & MV direction
1743 av_log(s->avctx, AV_LOG_DEBUG, "P");
1744 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1745 av_log(s->avctx, AV_LOG_DEBUG, "A");
1746 else if(IS_INTRA4x4(mb_type))
1747 av_log(s->avctx, AV_LOG_DEBUG, "i");
1748 else if(IS_INTRA16x16(mb_type))
1749 av_log(s->avctx, AV_LOG_DEBUG, "I");
1750 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1751 av_log(s->avctx, AV_LOG_DEBUG, "d");
1752 else if(IS_DIRECT(mb_type))
1753 av_log(s->avctx, AV_LOG_DEBUG, "D");
1754 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1755 av_log(s->avctx, AV_LOG_DEBUG, "g");
1756 else if(IS_GMC(mb_type))
1757 av_log(s->avctx, AV_LOG_DEBUG, "G");
1758 else if(IS_SKIP(mb_type))
1759 av_log(s->avctx, AV_LOG_DEBUG, "S");
1760 else if(!USES_LIST(mb_type, 1))
1761 av_log(s->avctx, AV_LOG_DEBUG, ">");
1762 else if(!USES_LIST(mb_type, 0))
1763 av_log(s->avctx, AV_LOG_DEBUG, "<");
1765 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1766 av_log(s->avctx, AV_LOG_DEBUG, "X");
1771 av_log(s->avctx, AV_LOG_DEBUG, "+");
1772 else if(IS_16X8(mb_type))
1773 av_log(s->avctx, AV_LOG_DEBUG, "-");
1774 else if(IS_8X16(mb_type))
1775 av_log(s->avctx, AV_LOG_DEBUG, "|");
1776 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1777 av_log(s->avctx, AV_LOG_DEBUG, " ");
1779 av_log(s->avctx, AV_LOG_DEBUG, "?");
1782 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1783 av_log(s->avctx, AV_LOG_DEBUG, "=");
1785 av_log(s->avctx, AV_LOG_DEBUG, " ");
1787 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1789 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1793 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1794 const int shift= 1 + s->quarter_sample;
1798 int h_chroma_shift, v_chroma_shift;
1799 const int width = s->avctx->width;
1800 const int height= s->avctx->height;
1801 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1802 const int mv_stride= (s->mb_width << mv_sample_log2) + 1;
1803 s->low_delay=0; //needed to see the vectors without trashing the buffers
1805 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1807 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1808 pict->data[i]= s->visualization_buffer[i];
1810 pict->type= FF_BUFFER_TYPE_COPY;
1813 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1815 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1816 const int mb_index= mb_x + mb_y*s->mb_stride;
1817 if((s->avctx->debug_mv) && pict->motion_val){
1819 for(type=0; type<3; type++){
1822 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1826 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1830 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1835 if(!USES_LIST(pict->mb_type[mb_index], direction))
1838 if(IS_8X8(pict->mb_type[mb_index])){
1841 int sx= mb_x*16 + 4 + 8*(i&1);
1842 int sy= mb_y*16 + 4 + 8*(i>>1);
1843 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1844 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1845 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1846 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1848 }else if(IS_16X8(pict->mb_type[mb_index])){
1852 int sy=mb_y*16 + 4 + 8*i;
1853 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1854 int mx=(pict->motion_val[direction][xy][0]>>shift);
1855 int my=(pict->motion_val[direction][xy][1]>>shift);
1857 if(IS_INTERLACED(pict->mb_type[mb_index]))
1860 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1862 }else if(IS_8X16(pict->mb_type[mb_index])){
1865 int sx=mb_x*16 + 4 + 8*i;
1867 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1868 int mx=(pict->motion_val[direction][xy][0]>>shift);
1869 int my=(pict->motion_val[direction][xy][1]>>shift);
1871 if(IS_INTERLACED(pict->mb_type[mb_index]))
1874 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1877 int sx= mb_x*16 + 8;
1878 int sy= mb_y*16 + 8;
1879 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1880 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1881 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1882 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1886 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1887 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1890 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1891 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1894 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1895 int mb_type= pict->mb_type[mb_index];
1898 #define COLOR(theta, r)\
1899 u= (int)(128 + r*cos(theta*3.141592/180));\
1900 v= (int)(128 + r*sin(theta*3.141592/180));
1904 if(IS_PCM(mb_type)){
1906 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1908 }else if(IS_INTRA4x4(mb_type)){
1910 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1912 }else if(IS_DIRECT(mb_type)){
1914 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1916 }else if(IS_GMC(mb_type)){
1918 }else if(IS_SKIP(mb_type)){
1920 }else if(!USES_LIST(mb_type, 1)){
1922 }else if(!USES_LIST(mb_type, 0)){
1925 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1929 u*= 0x0101010101010101ULL;
1930 v*= 0x0101010101010101ULL;
1932 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1933 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1937 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1938 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1939 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1941 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1943 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1945 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1946 int dm= 1 << (mv_sample_log2-2);
1948 int sx= mb_x*16 + 8*(i&1);
1949 int sy= mb_y*16 + 8*(i>>1);
1950 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1952 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1953 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1955 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1956 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1957 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1961 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1965 s->mbskip_table[mb_index]=0;
1971 #ifdef CONFIG_ENCODERS
1973 static int get_sae(uint8_t *src, int ref, int stride){
1977 for(y=0; y<16; y++){
1978 for(x=0; x<16; x++){
1979 acc+= ABS(src[x+y*stride] - ref);
1986 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1993 for(y=0; y<h; y+=16){
1994 for(x=0; x<w; x+=16){
1995 int offset= x + y*stride;
1996 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1997 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1998 int sae = get_sae(src + offset, mean, stride);
2000 acc+= sae + 500 < sad;
2007 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2011 const int encoding_delay= s->max_b_frames;
2016 pic_arg->display_picture_number= s->input_picture_number++;
2018 if(pts != AV_NOPTS_VALUE){
2019 if(s->user_specified_pts != AV_NOPTS_VALUE){
2021 int64_t last= s->user_specified_pts;
2024 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
2028 s->user_specified_pts= pts;
2030 if(s->user_specified_pts != AV_NOPTS_VALUE){
2031 s->user_specified_pts=
2032 pts= s->user_specified_pts + 1;
2033 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
2035 pts= pic_arg->display_picture_number;
2041 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2042 if(pic_arg->linesize[0] != s->linesize) direct=0;
2043 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2044 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2046 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2049 i= ff_find_unused_picture(s, 1);
2051 pic= (AVFrame*)&s->picture[i];
2055 pic->data[i]= pic_arg->data[i];
2056 pic->linesize[i]= pic_arg->linesize[i];
2058 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] + offset == pic_arg->data[0]
2069 && pic->data[1] + offset == pic_arg->data[1]
2070 && pic->data[2] + 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] + 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 void select_input_picture(MpegEncContext *s){
2147 for(i=1; i<MAX_PICTURE_COUNT; i++)
2148 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2149 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2151 /* set next picture type & ordering */
2152 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2153 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2154 s->reordered_input_picture[0]= s->input_picture[0];
2155 s->reordered_input_picture[0]->pict_type= I_TYPE;
2156 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2160 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2161 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2162 //FIXME check that te gop check above is +-1 correct
2163 //av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2165 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2167 s->input_picture[0]->data[i]= NULL;
2168 s->input_picture[0]->type= 0;
2170 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2171 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2173 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2177 ff_vbv_update(s, 0);
2183 if(s->flags&CODEC_FLAG_PASS2){
2184 for(i=0; i<s->max_b_frames+1; i++){
2185 int pict_num= s->input_picture[0]->display_picture_number + i;
2187 if(pict_num >= s->rc_context.num_entries)
2189 if(!s->input_picture[i]){
2190 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2194 s->input_picture[i]->pict_type=
2195 s->rc_context.entry[pict_num].new_pict_type;
2199 if(s->avctx->b_frame_strategy==0){
2200 b_frames= s->max_b_frames;
2201 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2202 }else if(s->avctx->b_frame_strategy==1){
2203 for(i=1; i<s->max_b_frames+1; i++){
2204 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2205 s->input_picture[i]->b_frame_score=
2206 get_intra_count(s, s->input_picture[i ]->data[0],
2207 s->input_picture[i-1]->data[0], s->linesize) + 1;
2210 for(i=0; i<s->max_b_frames+1; i++){
2211 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2214 b_frames= FFMAX(0, i-1);
2217 for(i=0; i<b_frames+1; i++){
2218 s->input_picture[i]->b_frame_score=0;
2221 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2226 //static int b_count=0;
2227 //b_count+= b_frames;
2228 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2230 for(i= b_frames - 1; i>=0; i--){
2231 int type= s->input_picture[i]->pict_type;
2232 if(type && type != B_TYPE)
2235 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2236 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2239 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2240 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2241 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2243 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2245 s->input_picture[b_frames]->pict_type= I_TYPE;
2249 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2251 && s->input_picture[b_frames]->pict_type== I_TYPE)
2254 s->reordered_input_picture[0]= s->input_picture[b_frames];
2255 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2256 s->reordered_input_picture[0]->pict_type= P_TYPE;
2257 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2258 for(i=0; i<b_frames; i++){
2259 s->reordered_input_picture[i+1]= s->input_picture[i];
2260 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2261 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2266 if(s->reordered_input_picture[0]){
2267 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2269 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2271 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2272 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable
2274 int i= ff_find_unused_picture(s, 0);
2275 Picture *pic= &s->picture[i];
2277 /* mark us unused / free shared pic */
2279 s->reordered_input_picture[0]->data[i]= NULL;
2280 s->reordered_input_picture[0]->type= 0;
2282 pic->reference = s->reordered_input_picture[0]->reference;
2284 alloc_picture(s, pic, 0);
2286 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2288 s->current_picture_ptr= pic;
2290 // input is not a shared pix -> reuse buffer for current_pix
2292 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2293 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2295 s->current_picture_ptr= s->reordered_input_picture[0];
2297 s->new_picture.data[i]+=16;
2300 copy_picture(&s->current_picture, s->current_picture_ptr);
2302 s->picture_number= s->new_picture.display_picture_number;
2303 //printf("dpn:%d\n", s->picture_number);
2305 memset(&s->new_picture, 0, sizeof(Picture));
2309 int MPV_encode_picture(AVCodecContext *avctx,
2310 unsigned char *buf, int buf_size, void *data)
2312 MpegEncContext *s = avctx->priv_data;
2313 AVFrame *pic_arg = data;
2314 int i, stuffing_count;
2316 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUVJ420P){
2317 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2321 for(i=0; i<avctx->thread_count; i++){
2322 int start_y= s->thread_context[i]->start_mb_y;
2323 int end_y= s->thread_context[i]-> end_mb_y;
2324 int h= s->mb_height;
2325 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
2326 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
2328 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2331 s->picture_in_gop_number++;
2333 if(load_input_picture(s, pic_arg) < 0)
2336 select_input_picture(s);
2339 if(s->new_picture.data[0]){
2340 s->pict_type= s->new_picture.pict_type;
2342 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2343 MPV_frame_start(s, avctx);
2345 encode_picture(s, s->picture_number);
2347 avctx->real_pict_num = s->picture_number;
2348 avctx->header_bits = s->header_bits;
2349 avctx->mv_bits = s->mv_bits;
2350 avctx->misc_bits = s->misc_bits;
2351 avctx->i_tex_bits = s->i_tex_bits;
2352 avctx->p_tex_bits = s->p_tex_bits;
2353 avctx->i_count = s->i_count;
2354 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2355 avctx->skip_count = s->skip_count;
2359 if (s->out_format == FMT_MJPEG)
2360 mjpeg_picture_trailer(s);
2362 if(s->flags&CODEC_FLAG_PASS1)
2363 ff_write_pass1_stats(s);
2366 s->current_picture_ptr->error[i]= s->current_picture.error[i];
2367 avctx->error[i] += s->current_picture_ptr->error[i];
2370 if(s->flags&CODEC_FLAG_PASS1)
2371 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2372 flush_put_bits(&s->pb);
2373 s->frame_bits = put_bits_count(&s->pb);
2375 stuffing_count= ff_vbv_update(s, s->frame_bits);
2377 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2378 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2382 switch(s->codec_id){
2383 case CODEC_ID_MPEG1VIDEO:
2384 case CODEC_ID_MPEG2VIDEO:
2385 while(stuffing_count--){
2386 put_bits(&s->pb, 8, 0);
2389 case CODEC_ID_MPEG4:
2390 put_bits(&s->pb, 16, 0);
2391 put_bits(&s->pb, 16, 0x1C3);
2392 stuffing_count -= 4;
2393 while(stuffing_count--){
2394 put_bits(&s->pb, 8, 0xFF);
2398 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2400 flush_put_bits(&s->pb);
2401 s->frame_bits = put_bits_count(&s->pb);
2404 /* update mpeg1/2 vbv_delay for CBR */
2405 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2406 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2409 assert(s->repeat_first_field==0);
2411 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2412 assert(vbv_delay < 0xFFFF);
2414 s->vbv_delay_ptr[0] &= 0xF8;
2415 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2416 s->vbv_delay_ptr[1] = vbv_delay>>5;
2417 s->vbv_delay_ptr[2] &= 0x07;
2418 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2420 s->total_bits += s->frame_bits;
2421 avctx->frame_bits = s->frame_bits;
2423 assert((pbBufPtr(&s->pb) == s->pb.buf));
2426 assert((s->frame_bits&7)==0);
2428 return s->frame_bits/8;
2431 #endif //CONFIG_ENCODERS
2433 static inline void gmc1_motion(MpegEncContext *s,
2434 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2435 uint8_t **ref_picture)
2438 int offset, src_x, src_y, linesize, uvlinesize;
2439 int motion_x, motion_y;
2442 motion_x= s->sprite_offset[0][0];
2443 motion_y= s->sprite_offset[0][1];
2444 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2445 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2446 motion_x<<=(3-s->sprite_warping_accuracy);
2447 motion_y<<=(3-s->sprite_warping_accuracy);
2448 src_x = clip(src_x, -16, s->width);
2449 if (src_x == s->width)
2451 src_y = clip(src_y, -16, s->height);
2452 if (src_y == s->height)
2455 linesize = s->linesize;
2456 uvlinesize = s->uvlinesize;
2458 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2460 if(s->flags&CODEC_FLAG_EMU_EDGE){
2461 if( (unsigned)src_x >= s->h_edge_pos - 17
2462 || (unsigned)src_y >= s->v_edge_pos - 17){
2463 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2464 ptr= s->edge_emu_buffer;
2468 if((motion_x|motion_y)&7){
2469 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2470 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2474 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2475 if (s->no_rounding){
2476 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2478 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2482 if(s->flags&CODEC_FLAG_GRAY) return;
2484 motion_x= s->sprite_offset[1][0];
2485 motion_y= s->sprite_offset[1][1];
2486 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2487 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2488 motion_x<<=(3-s->sprite_warping_accuracy);
2489 motion_y<<=(3-s->sprite_warping_accuracy);
2490 src_x = clip(src_x, -8, s->width>>1);
2491 if (src_x == s->width>>1)
2493 src_y = clip(src_y, -8, s->height>>1);
2494 if (src_y == s->height>>1)
2497 offset = (src_y * uvlinesize) + src_x;
2498 ptr = ref_picture[1] + offset;
2499 if(s->flags&CODEC_FLAG_EMU_EDGE){
2500 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2501 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2502 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);
2503 ptr= s->edge_emu_buffer;
2507 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2509 ptr = ref_picture[2] + offset;
2511 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);
2512 ptr= s->edge_emu_buffer;
2514 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2519 static inline void gmc_motion(MpegEncContext *s,
2520 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2521 uint8_t **ref_picture)
2524 int linesize, uvlinesize;
2525 const int a= s->sprite_warping_accuracy;
2528 linesize = s->linesize;
2529 uvlinesize = s->uvlinesize;
2531 ptr = ref_picture[0];
2533 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2534 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2536 s->dsp.gmc(dest_y, ptr, linesize, 16,
2539 s->sprite_delta[0][0], s->sprite_delta[0][1],
2540 s->sprite_delta[1][0], s->sprite_delta[1][1],
2541 a+1, (1<<(2*a+1)) - s->no_rounding,
2542 s->h_edge_pos, s->v_edge_pos);
2543 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2544 ox + s->sprite_delta[0][0]*8,
2545 oy + s->sprite_delta[1][0]*8,
2546 s->sprite_delta[0][0], s->sprite_delta[0][1],
2547 s->sprite_delta[1][0], s->sprite_delta[1][1],
2548 a+1, (1<<(2*a+1)) - s->no_rounding,
2549 s->h_edge_pos, s->v_edge_pos);
2551 if(s->flags&CODEC_FLAG_GRAY) return;
2553 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2554 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2556 ptr = ref_picture[1];
2557 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2560 s->sprite_delta[0][0], s->sprite_delta[0][1],
2561 s->sprite_delta[1][0], s->sprite_delta[1][1],
2562 a+1, (1<<(2*a+1)) - s->no_rounding,
2563 s->h_edge_pos>>1, s->v_edge_pos>>1);
2565 ptr = ref_picture[2];
2566 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2569 s->sprite_delta[0][0], s->sprite_delta[0][1],
2570 s->sprite_delta[1][0], s->sprite_delta[1][1],
2571 a+1, (1<<(2*a+1)) - s->no_rounding,
2572 s->h_edge_pos>>1, s->v_edge_pos>>1);
2576 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2577 * @param buf destination buffer
2578 * @param src source buffer
2579 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2580 * @param block_w width of block
2581 * @param block_h height of block
2582 * @param src_x x coordinate of the top left sample of the block in the source buffer
2583 * @param src_y y coordinate of the top left sample of the block in the source buffer
2584 * @param w width of the source buffer
2585 * @param h height of the source buffer
2587 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2588 int src_x, int src_y, int w, int h){
2590 int start_y, start_x, end_y, end_x;
2593 src+= (h-1-src_y)*linesize;
2595 }else if(src_y<=-block_h){
2596 src+= (1-block_h-src_y)*linesize;
2602 }else if(src_x<=-block_w){
2603 src+= (1-block_w-src_x);
2607 start_y= FFMAX(0, -src_y);
2608 start_x= FFMAX(0, -src_x);
2609 end_y= FFMIN(block_h, h-src_y);
2610 end_x= FFMIN(block_w, w-src_x);
2612 // copy existing part
2613 for(y=start_y; y<end_y; y++){
2614 for(x=start_x; x<end_x; x++){
2615 buf[x + y*linesize]= src[x + y*linesize];
2620 for(y=0; y<start_y; y++){
2621 for(x=start_x; x<end_x; x++){
2622 buf[x + y*linesize]= buf[x + start_y*linesize];
2627 for(y=end_y; y<block_h; y++){
2628 for(x=start_x; x<end_x; x++){
2629 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2633 for(y=0; y<block_h; y++){
2635 for(x=0; x<start_x; x++){
2636 buf[x + y*linesize]= buf[start_x + y*linesize];
2640 for(x=end_x; x<block_w; x++){
2641 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2646 static inline int hpel_motion(MpegEncContext *s,
2647 uint8_t *dest, uint8_t *src,
2648 int field_based, int field_select,
2649 int src_x, int src_y,
2650 int width, int height, int stride,
2651 int h_edge_pos, int v_edge_pos,
2652 int w, int h, op_pixels_func *pix_op,
2653 int motion_x, int motion_y)
2658 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2659 src_x += motion_x >> 1;
2660 src_y += motion_y >> 1;
2662 /* WARNING: do no forget half pels */
2663 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2666 src_y = clip(src_y, -16, height);
2667 if (src_y == height)
2669 src += src_y * stride + src_x;
2671 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2672 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2673 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2674 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2675 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2676 src= s->edge_emu_buffer;
2682 pix_op[dxy](dest, src, stride, h);
2686 static inline int hpel_motion_lowres(MpegEncContext *s,
2687 uint8_t *dest, uint8_t *src,
2688 int field_based, int field_select,
2689 int src_x, int src_y,
2690 int width, int height, int stride,
2691 int h_edge_pos, int v_edge_pos,
2692 int w, int h, h264_chroma_mc_func *pix_op,
2693 int motion_x, int motion_y)
2695 const int lowres= s->avctx->lowres;
2696 const int s_mask= (2<<lowres)-1;
2700 if(s->quarter_sample){
2705 sx= motion_x & s_mask;
2706 sy= motion_y & s_mask;
2707 src_x += motion_x >> (lowres+1);
2708 src_y += motion_y >> (lowres+1);
2710 src += src_y * stride + src_x;
2712 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2713 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2714 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2715 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2716 src= s->edge_emu_buffer;
2724 pix_op[lowres](dest, src, stride, h, sx, sy);
2728 /* apply one mpeg motion vector to the three components */
2729 static always_inline void mpeg_motion(MpegEncContext *s,
2730 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2731 int field_based, int bottom_field, int field_select,
2732 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2733 int motion_x, int motion_y, int h)
2735 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2736 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2739 if(s->quarter_sample)
2746 v_edge_pos = s->v_edge_pos >> field_based;
2747 linesize = s->current_picture.linesize[0] << field_based;
2748 uvlinesize = s->current_picture.linesize[1] << field_based;
2750 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2751 src_x = s->mb_x* 16 + (motion_x >> 1);
2752 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2754 if (s->out_format == FMT_H263) {
2755 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2756 mx = (motion_x>>1)|(motion_x&1);
2758 uvdxy = ((my & 1) << 1) | (mx & 1);
2759 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2760 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2762 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2766 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2770 uvsrc_x = s->mb_x*8 + mx;
2771 uvsrc_y = s->mb_y*8 + my;
2773 if(s->chroma_y_shift){
2776 uvdxy = ((my & 1) << 1) | (mx & 1);
2777 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2778 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2780 if(s->chroma_x_shift){
2783 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2784 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2795 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2796 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2797 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2799 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2800 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2801 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2802 s->codec_id == CODEC_ID_MPEG1VIDEO){
2803 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2806 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2807 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2808 ptr_y = s->edge_emu_buffer;
2809 if(!(s->flags&CODEC_FLAG_GRAY)){
2810 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2811 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2812 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2813 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2814 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2820 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2821 dest_y += s->linesize;
2822 dest_cb+= s->uvlinesize;
2823 dest_cr+= s->uvlinesize;
2827 ptr_y += s->linesize;
2828 ptr_cb+= s->uvlinesize;
2829 ptr_cr+= s->uvlinesize;
2832 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2834 if(!(s->flags&CODEC_FLAG_GRAY)){
2835 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2836 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2838 #if defined(CONFIG_H261_ENCODER) || defined(CONFIG_H261_DECODER)
2839 if(s->out_format == FMT_H261){
2840 ff_h261_loop_filter(s);
2845 /* apply one mpeg motion vector to the three components */
2846 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
2847 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2848 int field_based, int bottom_field, int field_select,
2849 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
2850 int motion_x, int motion_y, int h)
2852 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2853 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
2854 const int lowres= s->avctx->lowres;
2855 const int block_s= 8>>lowres;
2856 const int s_mask= (2<<lowres)-1;
2857 const int h_edge_pos = s->h_edge_pos >> lowres;
2858 const int v_edge_pos = s->v_edge_pos >> lowres;
2859 linesize = s->current_picture.linesize[0] << field_based;
2860 uvlinesize = s->current_picture.linesize[1] << field_based;
2862 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
2868 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
2871 sx= motion_x & s_mask;
2872 sy= motion_y & s_mask;
2873 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
2874 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
2876 if (s->out_format == FMT_H263) {
2877 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
2878 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
2881 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2884 uvsx = (2*mx) & s_mask;
2885 uvsy = (2*my) & s_mask;
2886 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
2887 uvsrc_y = s->mb_y*block_s + (my >> lowres);
2893 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2894 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
2897 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2898 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2899 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2901 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
2902 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2903 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2904 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2905 ptr_y = s->edge_emu_buffer;
2906 if(!(s->flags&CODEC_FLAG_GRAY)){
2907 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2908 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2909 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2910 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2911 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2917 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2918 dest_y += s->linesize;
2919 dest_cb+= s->uvlinesize;
2920 dest_cr+= s->uvlinesize;
2924 ptr_y += s->linesize;
2925 ptr_cb+= s->uvlinesize;
2926 ptr_cr+= s->uvlinesize;
2931 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
2933 if(!(s->flags&CODEC_FLAG_GRAY)){
2934 uvsx <<= 2 - lowres;
2935 uvsy <<= 2 - lowres;
2936 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2937 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2939 //FIXME h261 lowres loop filter
2942 //FIXME move to dsputil, avg variant, 16x16 version
2943 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2945 uint8_t * const top = src[1];
2946 uint8_t * const left = src[2];
2947 uint8_t * const mid = src[0];
2948 uint8_t * const right = src[3];
2949 uint8_t * const bottom= src[4];
2950 #define OBMC_FILTER(x, t, l, m, r, b)\
2951 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2952 #define OBMC_FILTER4(x, t, l, m, r, b)\
2953 OBMC_FILTER(x , t, l, m, r, b);\
2954 OBMC_FILTER(x+1 , t, l, m, r, b);\
2955 OBMC_FILTER(x +stride, t, l, m, r, b);\
2956 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2959 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2960 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2961 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2962 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2963 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2964 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2966 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2967 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2968 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2969 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2971 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2972 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2973 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2974 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2976 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2977 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2978 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2979 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2981 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2982 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2983 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2984 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2985 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2986 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2988 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2989 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2990 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2991 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2994 /* obmc for 1 8x8 luma block */
2995 static inline void obmc_motion(MpegEncContext *s,
2996 uint8_t *dest, uint8_t *src,
2997 int src_x, int src_y,
2998 op_pixels_func *pix_op,
2999 int16_t mv[5][2]/* mid top left right bottom*/)
3005 assert(s->quarter_sample==0);
3008 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
3011 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3012 hpel_motion(s, ptr[i], src, 0, 0,
3014 s->width, s->height, s->linesize,
3015 s->h_edge_pos, s->v_edge_pos,
3017 mv[i][0], mv[i][1]);
3021 put_obmc(dest, ptr, s->linesize);
3024 static inline void qpel_motion(MpegEncContext *s,
3025 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3026 int field_based, int bottom_field, int field_select,
3027 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3028 qpel_mc_func (*qpix_op)[16],
3029 int motion_x, int motion_y, int h)
3031 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3032 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3034 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3035 src_x = s->mb_x * 16 + (motion_x >> 2);
3036 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3038 v_edge_pos = s->v_edge_pos >> field_based;
3039 linesize = s->linesize << field_based;
3040 uvlinesize = s->uvlinesize << field_based;
3045 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3046 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3047 mx= (motion_x>>1) + rtab[motion_x&7];
3048 my= (motion_y>>1) + rtab[motion_y&7];
3049 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3050 mx= (motion_x>>1)|(motion_x&1);
3051 my= (motion_y>>1)|(motion_y&1);
3059 uvdxy= (mx&1) | ((my&1)<<1);
3063 uvsrc_x = s->mb_x * 8 + mx;
3064 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3066 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3067 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3068 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3070 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3071 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3072 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3073 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3074 ptr_y= s->edge_emu_buffer;
3075 if(!(s->flags&CODEC_FLAG_GRAY)){
3076 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3077 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3078 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3079 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3080 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3087 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3090 dest_y += s->linesize;
3091 dest_cb+= s->uvlinesize;
3092 dest_cr+= s->uvlinesize;
3096 ptr_y += s->linesize;
3097 ptr_cb += s->uvlinesize;
3098 ptr_cr += s->uvlinesize;
3100 //damn interlaced mode
3101 //FIXME boundary mirroring is not exactly correct here
3102 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3103 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3105 if(!(s->flags&CODEC_FLAG_GRAY)){
3106 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3107 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3111 inline int ff_h263_round_chroma(int x){
3113 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3116 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3121 * h263 chorma 4mv motion compensation.
3123 static inline void chroma_4mv_motion(MpegEncContext *s,
3124 uint8_t *dest_cb, uint8_t *dest_cr,
3125 uint8_t **ref_picture,
3126 op_pixels_func *pix_op,
3128 int dxy, emu=0, src_x, src_y, offset;
3131 /* In case of 8X8, we construct a single chroma motion vector
3132 with a special rounding */
3133 mx= ff_h263_round_chroma(mx);
3134 my= ff_h263_round_chroma(my);
3136 dxy = ((my & 1) << 1) | (mx & 1);
3140 src_x = s->mb_x * 8 + mx;
3141 src_y = s->mb_y * 8 + my;
3142 src_x = clip(src_x, -8, s->width/2);
3143 if (src_x == s->width/2)
3145 src_y = clip(src_y, -8, s->height/2);
3146 if (src_y == s->height/2)
3149 offset = (src_y * (s->uvlinesize)) + src_x;
3150 ptr = ref_picture[1] + offset;
3151 if(s->flags&CODEC_FLAG_EMU_EDGE){
3152 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3153 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3154 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);
3155 ptr= s->edge_emu_buffer;
3159 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3161 ptr = ref_picture[2] + offset;
3163 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);
3164 ptr= s->edge_emu_buffer;
3166 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3169 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3170 uint8_t *dest_cb, uint8_t *dest_cr,
3171 uint8_t **ref_picture,
3172 h264_chroma_mc_func *pix_op,
3174 const int lowres= s->avctx->lowres;
3175 const int block_s= 8>>lowres;
3176 const int s_mask= (2<<lowres)-1;
3177 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3178 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3179 int emu=0, src_x, src_y, offset, sx, sy;
3182 if(s->quarter_sample){
3187 /* In case of 8X8, we construct a single chroma motion vector
3188 with a special rounding */
3189 mx= ff_h263_round_chroma(mx);
3190 my= ff_h263_round_chroma(my);
3194 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3195 src_y = s->mb_y*block_s + (my >> (lowres+1));
3197 offset = src_y * s->uvlinesize + src_x;
3198 ptr = ref_picture[1] + offset;
3199 if(s->flags&CODEC_FLAG_EMU_EDGE){
3200 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3201 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3202 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3203 ptr= s->edge_emu_buffer;
3209 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3211 ptr = ref_picture[2] + offset;
3213 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3214 ptr= s->edge_emu_buffer;
3216 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3220 * motion compensation of a single macroblock
3222 * @param dest_y luma destination pointer
3223 * @param dest_cb chroma cb/u destination pointer
3224 * @param dest_cr chroma cr/v destination pointer
3225 * @param dir direction (0->forward, 1->backward)
3226 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3227 * @param pic_op halfpel motion compensation function (average or put normally)
3228 * @param pic_op qpel motion compensation function (average or put normally)
3229 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3231 static inline void MPV_motion(MpegEncContext *s,
3232 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3233 int dir, uint8_t **ref_picture,
3234 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3236 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3238 uint8_t *ptr, *dest;
3243 if(s->obmc && s->pict_type != B_TYPE){
3244 int16_t mv_cache[4][4][2];
3245 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3246 const int mot_stride= s->b8_stride;
3247 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3249 assert(!s->mb_skipped);
3251 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3252 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3253 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3255 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3256 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3258 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3261 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3262 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3263 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3265 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3266 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3269 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3270 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3271 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3273 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3274 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3280 const int x= (i&1)+1;
3281 const int y= (i>>1)+1;
3283 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3284 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3285 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3286 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3287 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3289 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3291 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3298 if(!(s->flags&CODEC_FLAG_GRAY))
3299 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3304 switch(s->mv_type) {
3307 if(s->real_sprite_warping_points==1){
3308 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3311 gmc_motion(s, dest_y, dest_cb, dest_cr,
3314 }else if(s->quarter_sample){
3315 qpel_motion(s, dest_y, dest_cb, dest_cr,
3317 ref_picture, pix_op, qpix_op,
3318 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3320 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3321 ref_picture, pix_op,
3322 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3325 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3327 ref_picture, pix_op,
3328 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3334 if(s->quarter_sample){
3336 motion_x = s->mv[dir][i][0];
3337 motion_y = s->mv[dir][i][1];
3339 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3340 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3341 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3343 /* WARNING: do no forget half pels */
3344 src_x = clip(src_x, -16, s->width);
3345 if (src_x == s->width)
3347 src_y = clip(src_y, -16, s->height);
3348 if (src_y == s->height)
3351 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3352 if(s->flags&CODEC_FLAG_EMU_EDGE){
3353 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3354 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3355 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);
3356 ptr= s->edge_emu_buffer;
3359 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3360 qpix_op[1][dxy](dest, ptr, s->linesize);
3362 mx += s->mv[dir][i][0]/2;
3363 my += s->mv[dir][i][1]/2;
3367 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3368 ref_picture[0], 0, 0,
3369 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3370 s->width, s->height, s->linesize,
3371 s->h_edge_pos, s->v_edge_pos,
3373 s->mv[dir][i][0], s->mv[dir][i][1]);
3375 mx += s->mv[dir][i][0];
3376 my += s->mv[dir][i][1];
3380 if(!(s->flags&CODEC_FLAG_GRAY))
3381 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3384 if (s->picture_structure == PICT_FRAME) {
3385 if(s->quarter_sample){
3387 qpel_motion(s, dest_y, dest_cb, dest_cr,
3388 1, i, s->field_select[dir][i],
3389 ref_picture, pix_op, qpix_op,
3390 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3394 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3395 1, 0, s->field_select[dir][0],
3396 ref_picture, pix_op,
3397 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3399 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3400 1, 1, s->field_select[dir][1],
3401 ref_picture, pix_op,
3402 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3405 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3406 ref_picture= s->current_picture_ptr->data;
3409 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3410 0, 0, s->field_select[dir][0],
3411 ref_picture, pix_op,
3412 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3417 uint8_t ** ref2picture;
3419 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3420 ref2picture= ref_picture;
3422 ref2picture= s->current_picture_ptr->data;
3425 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3426 0, 0, s->field_select[dir][i],
3427 ref2picture, pix_op,
3428 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3430 dest_y += 16*s->linesize;
3431 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3432 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3436 if(s->picture_structure == PICT_FRAME){
3440 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3442 ref_picture, pix_op,
3443 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3445 pix_op = s->dsp.avg_pixels_tab;
3449 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3450 0, 0, s->picture_structure != i+1,
3451 ref_picture, pix_op,
3452 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3454 // after put we make avg of the same block
3455 pix_op=s->dsp.avg_pixels_tab;
3457 //opposite parity is always in the same frame if this is second field
3458 if(!s->first_field){
3459 ref_picture = s->current_picture_ptr->data;
3469 * motion compensation of a single macroblock
3471 * @param dest_y luma destination pointer
3472 * @param dest_cb chroma cb/u destination pointer
3473 * @param dest_cr chroma cr/v destination pointer
3474 * @param dir direction (0->forward, 1->backward)
3475 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3476 * @param pic_op halfpel motion compensation function (average or put normally)
3477 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3479 static inline void MPV_motion_lowres(MpegEncContext *s,
3480 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3481 int dir, uint8_t **ref_picture,
3482 h264_chroma_mc_func *pix_op)
3486 const int lowres= s->avctx->lowres;
3487 const int block_s= 8>>lowres;
3492 switch(s->mv_type) {
3494 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3496 ref_picture, pix_op,
3497 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3503 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3504 ref_picture[0], 0, 0,
3505 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3506 s->width, s->height, s->linesize,
3507 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3508 block_s, block_s, pix_op,
3509 s->mv[dir][i][0], s->mv[dir][i][1]);
3511 mx += s->mv[dir][i][0];
3512 my += s->mv[dir][i][1];
3515 if(!(s->flags&CODEC_FLAG_GRAY))
3516 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3519 if (s->picture_structure == PICT_FRAME) {
3521 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3522 1, 0, s->field_select[dir][0],
3523 ref_picture, pix_op,
3524 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3526 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3527 1, 1, s->field_select[dir][1],
3528 ref_picture, pix_op,
3529 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3531 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3532 ref_picture= s->current_picture_ptr->data;
3535 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3536 0, 0, s->field_select[dir][0],
3537 ref_picture, pix_op,
3538 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3543 uint8_t ** ref2picture;
3545 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3546 ref2picture= ref_picture;
3548 ref2picture= s->current_picture_ptr->data;
3551 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3552 0, 0, s->field_select[dir][i],
3553 ref2picture, pix_op,
3554 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3556 dest_y += 2*block_s*s->linesize;
3557 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3558 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3562 if(s->picture_structure == PICT_FRAME){
3566 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3568 ref_picture, pix_op,
3569 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3571 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3575 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3576 0, 0, s->picture_structure != i+1,
3577 ref_picture, pix_op,
3578 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3580 // after put we make avg of the same block
3581 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3583 //opposite parity is always in the same frame if this is second field
3584 if(!s->first_field){
3585 ref_picture = s->current_picture_ptr->data;
3594 /* put block[] to dest[] */
3595 static inline void put_dct(MpegEncContext *s,
3596 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3598 s->dct_unquantize_intra(s, block, i, qscale);
3599 s->dsp.idct_put (dest, line_size, block);
3602 /* add block[] to dest[] */
3603 static inline void add_dct(MpegEncContext *s,
3604 DCTELEM *block, int i, uint8_t *dest, int line_size)
3606 if (s->block_last_index[i] >= 0) {
3607 s->dsp.idct_add (dest, line_size, block);
3611 static inline void add_dequant_dct(MpegEncContext *s,
3612 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3614 if (s->block_last_index[i] >= 0) {
3615 s->dct_unquantize_inter(s, block, i, qscale);
3617 s->dsp.idct_add (dest, line_size, block);
3622 * cleans dc, ac, coded_block for the current non intra MB
3624 void ff_clean_intra_table_entries(MpegEncContext *s)
3626 int wrap = s->b8_stride;
3627 int xy = s->block_index[0];
3630 s->dc_val[0][xy + 1 ] =
3631 s->dc_val[0][xy + wrap] =
3632 s->dc_val[0][xy + 1 + wrap] = 1024;
3634 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3635 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3636 if (s->msmpeg4_version>=3) {
3637 s->coded_block[xy ] =
3638 s->coded_block[xy + 1 ] =
3639 s->coded_block[xy + wrap] =
3640 s->coded_block[xy + 1 + wrap] = 0;
3643 wrap = s->mb_stride;
3644 xy = s->mb_x + s->mb_y * wrap;
3646 s->dc_val[2][xy] = 1024;
3648 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3649 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3651 s->mbintra_table[xy]= 0;
3654 /* generic function called after a macroblock has been parsed by the
3655 decoder or after it has been encoded by the encoder.
3657 Important variables used:
3658 s->mb_intra : true if intra macroblock
3659 s->mv_dir : motion vector direction
3660 s->mv_type : motion vector type
3661 s->mv : motion vector
3662 s->interlaced_dct : true if interlaced dct used (mpeg2)
3664 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3667 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3669 if(s->avctx->xvmc_acceleration){
3670 XVMC_decode_mb(s);//xvmc uses pblocks
3678 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3679 /* save DCT coefficients */
3681 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3684 *dct++ = block[i][s->dsp.idct_permutation[j]];
3687 s->current_picture.qscale_table[mb_xy]= s->qscale;
3689 /* update DC predictors for P macroblocks */
3691 if (s->h263_pred || s->h263_aic) {
3692 if(s->mbintra_table[mb_xy])
3693 ff_clean_intra_table_entries(s);
3697 s->last_dc[2] = 128 << s->intra_dc_precision;
3700 else if (s->h263_pred || s->h263_aic)
3701 s->mbintra_table[mb_xy]=1;
3703 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3704 uint8_t *dest_y, *dest_cb, *dest_cr;
3705 int dct_linesize, dct_offset;
3706 op_pixels_func (*op_pix)[4];
3707 qpel_mc_func (*op_qpix)[16];
3708 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3709 const int uvlinesize= s->current_picture.linesize[1];
3710 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3711 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3713 /* avoid copy if macroblock skipped in last frame too */
3714 /* skip only during decoding as we might trash the buffers during encoding a bit */
3716 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3717 const int age= s->current_picture.age;
3721 if (s->mb_skipped) {
3723 assert(s->pict_type!=I_TYPE);
3725 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3726 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3728 /* if previous was skipped too, then nothing to do ! */
3729 if (*mbskip_ptr >= age && s->current_picture.reference){
3732 } else if(!s->current_picture.reference){
3733 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3734 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3736 *mbskip_ptr = 0; /* not skipped */
3740 dct_linesize = linesize << s->interlaced_dct;
3741 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3745 dest_cb= s->dest[1];
3746 dest_cr= s->dest[2];
3748 dest_y = s->b_scratchpad;
3749 dest_cb= s->b_scratchpad+16*linesize;
3750 dest_cr= s->b_scratchpad+32*linesize;
3754 /* motion handling */
3755 /* decoding or more than one mb_type (MC was already done otherwise) */
3758 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3760 if (s->mv_dir & MV_DIR_FORWARD) {
3761 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3762 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3764 if (s->mv_dir & MV_DIR_BACKWARD) {
3765 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3768 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3769 op_pix = s->dsp.put_pixels_tab;
3770 op_qpix= s->dsp.put_qpel_pixels_tab;
3772 op_pix = s->dsp.put_no_rnd_pixels_tab;
3773 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3775 if (s->mv_dir & MV_DIR_FORWARD) {
3776 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3777 op_pix = s->dsp.avg_pixels_tab;
3778 op_qpix= s->dsp.avg_qpel_pixels_tab;
3780 if (s->mv_dir & MV_DIR_BACKWARD) {
3781 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3786 /* skip dequant / idct if we are really late ;) */
3787 if(s->hurry_up>1) goto skip_idct;
3788 if(s->avctx->skip_idct){
3789 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
3790 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
3791 || s->avctx->skip_idct >= AVDISCARD_ALL)
3795 /* add dct residue */
3796 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3797 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3798 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3799 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3800 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3801 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3803 if(!(s->flags&CODEC_FLAG_GRAY)){
3804 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3805 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3807 } else if(s->codec_id != CODEC_ID_WMV2){
3808 add_dct(s, block[0], 0, dest_y , dct_linesize);
3809 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3810 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3811 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
3813 if(!(s->flags&CODEC_FLAG_GRAY)){
3814 if(s->chroma_y_shift){//Chroma420
3815 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3816 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3819 dct_linesize = uvlinesize << s->interlaced_dct;
3820 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3822 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3823 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3824 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3825 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3826 if(!s->chroma_x_shift){//Chroma444
3827 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3828 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3829 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3830 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3836 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3839 /* dct only in intra block */
3840 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3841 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3842 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3843 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3844 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3846 if(!(s->flags&CODEC_FLAG_GRAY)){
3847 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3848 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3851 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3852 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3853 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3854 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3856 if(!(s->flags&CODEC_FLAG_GRAY)){
3857 if(s->chroma_y_shift){
3858 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3859 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3862 dct_linesize = uvlinesize << s->interlaced_dct;
3863 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3865 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3866 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3867 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3868 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3869 if(!s->chroma_x_shift){//Chroma444
3870 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3871 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3872 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3873 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3881 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3882 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3883 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3888 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
3889 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
3890 else MPV_decode_mb_internal(s, block, 0);
3893 #ifdef CONFIG_ENCODERS
3895 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3897 static const char tab[64]=
3909 DCTELEM *block= s->block[n];
3910 const int last_index= s->block_last_index[n];
3915 threshold= -threshold;
3919 /* are all which we could set to zero are allready zero? */
3920 if(last_index<=skip_dc - 1) return;
3922 for(i=0; i<=last_index; i++){
3923 const int j = s->intra_scantable.permutated[i];
3924 const int level = ABS(block[j]);
3926 if(skip_dc && i==0) continue;
3935 if(score >= threshold) return;
3936 for(i=skip_dc; i<=last_index; i++){
3937 const int j = s->intra_scantable.permutated[i];
3940 if(block[0]) s->block_last_index[n]= 0;
3941 else s->block_last_index[n]= -1;
3944 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3947 const int maxlevel= s->max_qcoeff;
3948 const int minlevel= s->min_qcoeff;
3952 i=1; //skip clipping of intra dc
3956 for(;i<=last_index; i++){
3957 const int j= s->intra_scantable.permutated[i];
3958 int level = block[j];
3960 if (level>maxlevel){
3963 }else if(level<minlevel){
3971 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3972 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
3975 #endif //CONFIG_ENCODERS
3979 * @param h is the normal height, this will be reduced automatically if needed for the last row
3981 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3982 if (s->avctx->draw_horiz_band) {
3986 if(s->picture_structure != PICT_FRAME){
3989 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3992 h= FFMIN(h, s->avctx->height - y);
3994 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3995 src= (AVFrame*)s->current_picture_ptr;
3996 else if(s->last_picture_ptr)
3997 src= (AVFrame*)s->last_picture_ptr;
4001 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
4007 offset[0]= y * s->linesize;;
4009 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
4015 s->avctx->draw_horiz_band(s->avctx, src, offset,
4016 y, s->picture_structure, h);
4020 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4021 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
4022 const int uvlinesize= s->current_picture.linesize[1];
4023 const int mb_size= 4 - s->avctx->lowres;
4025 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4026 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4027 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4028 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4029 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4030 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;
4031 //block_index is not used by mpeg2, so it is not affected by chroma_format
4033 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4034 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4035 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4037 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4039 s->dest[0] += s->mb_y * linesize << mb_size;
4040 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4041 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4045 #ifdef CONFIG_ENCODERS
4047 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4057 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4058 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4059 int v= ptr[x2 + y2*stride];
4065 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4070 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4072 int16_t weight[6][64];
4073 DCTELEM orig[6][64];
4074 const int mb_x= s->mb_x;
4075 const int mb_y= s->mb_y;
4078 int dct_offset = s->linesize*8; //default for progressive frames
4079 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4082 for(i=0; i<6; i++) skip_dct[i]=0;
4084 if(s->adaptive_quant){
4085 const int last_qp= s->qscale;
4086 const int mb_xy= mb_x + mb_y*s->mb_stride;
4088 s->lambda= s->lambda_table[mb_xy];
4091 if(!(s->flags&CODEC_FLAG_QP_RD)){
4092 s->dquant= s->qscale - last_qp;
4094 if(s->out_format==FMT_H263){
4095 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4097 if(s->codec_id==CODEC_ID_MPEG4){
4099 if(s->pict_type == B_TYPE){
4101 s->dquant= (s->dquant/2)*2;
4102 if(s->mv_dir&MV_DIRECT)
4105 if(s->mv_type==MV_TYPE_8X8)
4111 ff_set_qscale(s, last_qp + s->dquant);
4112 }else if(s->flags&CODEC_FLAG_QP_RD)
4113 ff_set_qscale(s, s->qscale + s->dquant);
4115 wrap_y = s->linesize;
4116 wrap_c = s->uvlinesize;
4117 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4118 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
4119 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
4121 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4122 uint8_t *ebuf= s->edge_emu_buffer + 32;
4123 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4125 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);
4126 ptr_cb= ebuf+18*wrap_y;
4127 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);
4128 ptr_cr= ebuf+18*wrap_y+8;
4132 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4133 int progressive_score, interlaced_score;
4135 s->interlaced_dct=0;
4136 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4137 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4139 if(progressive_score > 0){
4140 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4141 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4142 if(progressive_score > interlaced_score){
4143 s->interlaced_dct=1;
4151 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4152 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4153 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4154 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4156 if(s->flags&CODEC_FLAG_GRAY){
4160 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4161 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4164 op_pixels_func (*op_pix)[4];
4165 qpel_mc_func (*op_qpix)[16];
4166 uint8_t *dest_y, *dest_cb, *dest_cr;
4168 dest_y = s->dest[0];
4169 dest_cb = s->dest[1];
4170 dest_cr = s->dest[2];
4172 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4173 op_pix = s->dsp.put_pixels_tab;
4174 op_qpix= s->dsp.put_qpel_pixels_tab;
4176 op_pix = s->dsp.put_no_rnd_pixels_tab;
4177 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4180 if (s->mv_dir & MV_DIR_FORWARD) {
4181 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4182 op_pix = s->dsp.avg_pixels_tab;
4183 op_qpix= s->dsp.avg_qpel_pixels_tab;
4185 if (s->mv_dir & MV_DIR_BACKWARD) {
4186 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4189 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4190 int progressive_score, interlaced_score;
4192 s->interlaced_dct=0;
4193 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4194 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4196 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4198 if(progressive_score>0){
4199 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4200 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4202 if(progressive_score > interlaced_score){
4203 s->interlaced_dct=1;
4211 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4212 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4213 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4214 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4216 if(s->flags&CODEC_FLAG_GRAY){
4220 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4221 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4223 /* pre quantization */
4224 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4226 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4227 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4228 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4229 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;
4230 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4231 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4235 if(s->avctx->quantizer_noise_shaping){
4236 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4237 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4238 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4239 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4240 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4241 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4242 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
4245 /* DCT & quantize */
4246 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4251 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4252 // FIXME we could decide to change to quantizer instead of clipping
4253 // JS: I don't think that would be a good idea it could lower quality instead
4254 // of improve it. Just INTRADC clipping deserves changes in quantizer
4255 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4257 s->block_last_index[i]= -1;
4259 if(s->avctx->quantizer_noise_shaping){
4262 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4267 if(s->luma_elim_threshold && !s->mb_intra)
4269 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4270 if(s->chroma_elim_threshold && !s->mb_intra)
4272 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4274 if(s->flags & CODEC_FLAG_CBP_RD){
4276 if(s->block_last_index[i] == -1)
4277 s->coded_score[i]= INT_MAX/256;
4282 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4283 s->block_last_index[4]=
4284 s->block_last_index[5]= 0;
4286 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4289 //non c quantize code returns incorrect block_last_index FIXME
4290 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4293 if(s->block_last_index[i]>0){
4294 for(j=63; j>0; j--){
4295 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4297 s->block_last_index[i]= j;
4302 /* huffman encode */
4303 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4304 case CODEC_ID_MPEG1VIDEO:
4305 case CODEC_ID_MPEG2VIDEO:
4306 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4307 case CODEC_ID_MPEG4:
4308 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4309 case CODEC_ID_MSMPEG4V2:
4310 case CODEC_ID_MSMPEG4V3:
4312 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4314 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4315 #ifdef CONFIG_H261_ENCODER
4317 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4320 case CODEC_ID_H263P:
4324 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4325 case CODEC_ID_MJPEG:
4326 mjpeg_encode_mb(s, s->block); break;
4332 #endif //CONFIG_ENCODERS
4334 void ff_mpeg_flush(AVCodecContext *avctx){
4336 MpegEncContext *s = avctx->priv_data;
4338 if(s==NULL || s->picture==NULL)
4341 for(i=0; i<MAX_PICTURE_COUNT; i++){
4342 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4343 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4344 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4346 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4348 s->mb_x= s->mb_y= 0;
4350 s->parse_context.state= -1;
4351 s->parse_context.frame_start_found= 0;
4352 s->parse_context.overread= 0;
4353 s->parse_context.overread_index= 0;
4354 s->parse_context.index= 0;
4355 s->parse_context.last_index= 0;
4356 s->bitstream_buffer_size=0;
4359 #ifdef CONFIG_ENCODERS
4360 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4362 const uint16_t *srcw= (uint16_t*)src;
4363 int words= length>>4;
4364 int bits= length&15;
4367 if(length==0) return;
4370 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4371 }else if(put_bits_count(pb)&7){
4372 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4374 for(i=0; put_bits_count(pb)&31; i++)
4375 put_bits(pb, 8, src[i]);
4377 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4378 skip_put_bytes(pb, 2*words-i);
4381 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4384 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4387 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4390 d->mb_skip_run= s->mb_skip_run;
4392 d->last_dc[i]= s->last_dc[i];
4395 d->mv_bits= s->mv_bits;
4396 d->i_tex_bits= s->i_tex_bits;
4397 d->p_tex_bits= s->p_tex_bits;
4398 d->i_count= s->i_count;
4399 d->f_count= s->f_count;
4400 d->b_count= s->b_count;
4401 d->skip_count= s->skip_count;
4402 d->misc_bits= s->misc_bits;
4406 d->qscale= s->qscale;
4407 d->dquant= s->dquant;
4410 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4413 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4414 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4417 d->mb_skip_run= s->mb_skip_run;
4419 d->last_dc[i]= s->last_dc[i];
4422 d->mv_bits= s->mv_bits;
4423 d->i_tex_bits= s->i_tex_bits;
4424 d->p_tex_bits= s->p_tex_bits;
4425 d->i_count= s->i_count;
4426 d->f_count= s->f_count;
4427 d->b_count= s->b_count;
4428 d->skip_count= s->skip_count;
4429 d->misc_bits= s->misc_bits;
4431 d->mb_intra= s->mb_intra;
4432 d->mb_skipped= s->mb_skipped;
4433 d->mv_type= s->mv_type;
4434 d->mv_dir= s->mv_dir;
4436 if(s->data_partitioning){
4438 d->tex_pb= s->tex_pb;
4442 d->block_last_index[i]= s->block_last_index[i];
4443 d->interlaced_dct= s->interlaced_dct;
4444 d->qscale= s->qscale;
4447 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4448 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4449 int *dmin, int *next_block, int motion_x, int motion_y)
4452 uint8_t *dest_backup[3];
4454 copy_context_before_encode(s, backup, type);
4456 s->block= s->blocks[*next_block];
4457 s->pb= pb[*next_block];
4458 if(s->data_partitioning){
4459 s->pb2 = pb2 [*next_block];
4460 s->tex_pb= tex_pb[*next_block];
4464 memcpy(dest_backup, s->dest, sizeof(s->dest));
4465 s->dest[0] = s->rd_scratchpad;
4466 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4467 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4468 assert(s->linesize >= 32); //FIXME
4471 encode_mb(s, motion_x, motion_y);
4473 score= put_bits_count(&s->pb);
4474 if(s->data_partitioning){
4475 score+= put_bits_count(&s->pb2);
4476 score+= put_bits_count(&s->tex_pb);
4479 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4480 MPV_decode_mb(s, s->block);
4482 score *= s->lambda2;
4483 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4487 memcpy(s->dest, dest_backup, sizeof(s->dest));
4494 copy_context_after_encode(best, s, type);
4498 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4499 uint32_t *sq = squareTbl + 256;
4504 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4505 else if(w==8 && h==8)
4506 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4510 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4519 static int sse_mb(MpegEncContext *s){
4523 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4524 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4527 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4528 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)
4529 +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)
4530 +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);
4532 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)
4533 +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)
4534 +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);
4537 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)
4538 +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)
4539 +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);
4542 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4543 MpegEncContext *s= arg;
4547 s->me.dia_size= s->avctx->pre_dia_size;
4548 s->first_slice_line=1;
4549 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4550 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4551 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4553 s->first_slice_line=0;
4561 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4562 MpegEncContext *s= arg;
4564 s->me.dia_size= s->avctx->dia_size;
4565 s->first_slice_line=1;
4566 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4567 s->mb_x=0; //for block init below
4568 ff_init_block_index(s);
4569 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4570 s->block_index[0]+=2;
4571 s->block_index[1]+=2;
4572 s->block_index[2]+=2;
4573 s->block_index[3]+=2;
4575 /* compute motion vector & mb_type and store in context */
4576 if(s->pict_type==B_TYPE)
4577 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4579 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4581 s->first_slice_line=0;
4586 static int mb_var_thread(AVCodecContext *c, void *arg){
4587 MpegEncContext *s= arg;
4590 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4591 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4594 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4596 int sum = s->dsp.pix_sum(pix, s->linesize);
4598 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4600 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4601 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4602 s->me.mb_var_sum_temp += varc;
4608 static void write_slice_end(MpegEncContext *s){
4609 if(s->codec_id==CODEC_ID_MPEG4){
4610 if(s->partitioned_frame){
4611 ff_mpeg4_merge_partitions(s);
4614 ff_mpeg4_stuffing(&s->pb);
4615 }else if(s->out_format == FMT_MJPEG){
4616 ff_mjpeg_stuffing(&s->pb);
4619 align_put_bits(&s->pb);
4620 flush_put_bits(&s->pb);
4622 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4623 s->misc_bits+= get_bits_diff(s);
4626 static int encode_thread(AVCodecContext *c, void *arg){
4627 MpegEncContext *s= arg;
4628 int mb_x, mb_y, pdif = 0;
4630 MpegEncContext best_s, backup_s;
4631 uint8_t bit_buf[2][MAX_MB_BYTES];
4632 uint8_t bit_buf2[2][MAX_MB_BYTES];
4633 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4634 PutBitContext pb[2], pb2[2], tex_pb[2];
4635 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4638 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4639 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4640 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4643 s->last_bits= put_bits_count(&s->pb);
4654 /* init last dc values */
4655 /* note: quant matrix value (8) is implied here */
4656 s->last_dc[i] = 128 << s->intra_dc_precision;
4658 s->current_picture.error[i] = 0;
4661 memset(s->last_mv, 0, sizeof(s->last_mv));
4665 switch(s->codec_id){
4667 case CODEC_ID_H263P:
4669 s->gob_index = ff_h263_get_gob_height(s);
4671 case CODEC_ID_MPEG4:
4672 if(s->partitioned_frame)
4673 ff_mpeg4_init_partitions(s);
4679 s->first_slice_line = 1;
4680 s->ptr_lastgob = s->pb.buf;
4681 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4682 // printf("row %d at %X\n", s->mb_y, (int)s);
4686 ff_set_qscale(s, s->qscale);
4687 ff_init_block_index(s);
4689 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4690 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4691 int mb_type= s->mb_type[xy];
4696 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4697 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4700 if(s->data_partitioning){
4701 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4702 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4703 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4709 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4710 ff_update_block_index(s);
4712 #ifdef CONFIG_H261_ENCODER
4713 if(s->codec_id == CODEC_ID_H261){
4714 ff_h261_reorder_mb_index(s);
4715 xy= s->mb_y*s->mb_stride + s->mb_x;
4716 mb_type= s->mb_type[xy];
4720 /* write gob / video packet header */
4722 int current_packet_size, is_gob_start;
4724 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4726 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4728 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4730 switch(s->codec_id){
4732 case CODEC_ID_H263P:
4733 if(!s->h263_slice_structured)
4734 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4736 case CODEC_ID_MPEG2VIDEO:
4737 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4738 case CODEC_ID_MPEG1VIDEO:
4739 if(s->mb_skip_run) is_gob_start=0;
4744 if(s->start_mb_y != mb_y || mb_x!=0){
4747 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4748 ff_mpeg4_init_partitions(s);
4752 assert((put_bits_count(&s->pb)&7) == 0);
4753 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4755 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4756 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
4757 int d= 100 / s->avctx->error_rate;
4759 current_packet_size=0;
4760 #ifndef ALT_BITSTREAM_WRITER
4761 s->pb.buf_ptr= s->ptr_lastgob;
4763 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4767 if (s->avctx->rtp_callback){
4768 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
4769 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
4772 switch(s->codec_id){
4773 case CODEC_ID_MPEG4:
4774 ff_mpeg4_encode_video_packet_header(s);
4775 ff_mpeg4_clean_buffers(s);
4777 case CODEC_ID_MPEG1VIDEO:
4778 case CODEC_ID_MPEG2VIDEO:
4779 ff_mpeg1_encode_slice_header(s);
4780 ff_mpeg1_clean_buffers(s);
4783 case CODEC_ID_H263P:
4784 h263_encode_gob_header(s, mb_y);
4788 if(s->flags&CODEC_FLAG_PASS1){
4789 int bits= put_bits_count(&s->pb);
4790 s->misc_bits+= bits - s->last_bits;
4794 s->ptr_lastgob += current_packet_size;
4795 s->first_slice_line=1;
4796 s->resync_mb_x=mb_x;
4797 s->resync_mb_y=mb_y;
4801 if( (s->resync_mb_x == s->mb_x)
4802 && s->resync_mb_y+1 == s->mb_y){
4803 s->first_slice_line=0;
4807 s->dquant=0; //only for QP_RD
4809 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4811 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4813 copy_context_before_encode(&backup_s, s, -1);
4815 best_s.data_partitioning= s->data_partitioning;
4816 best_s.partitioned_frame= s->partitioned_frame;
4817 if(s->data_partitioning){
4818 backup_s.pb2= s->pb2;
4819 backup_s.tex_pb= s->tex_pb;
4822 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4823 s->mv_dir = MV_DIR_FORWARD;
4824 s->mv_type = MV_TYPE_16X16;
4826 s->mv[0][0][0] = s->p_mv_table[xy][0];
4827 s->mv[0][0][1] = s->p_mv_table[xy][1];
4828 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4829 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4831 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4832 s->mv_dir = MV_DIR_FORWARD;
4833 s->mv_type = MV_TYPE_FIELD;
4836 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4837 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4838 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4840 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4841 &dmin, &next_block, 0, 0);
4843 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
4844 s->mv_dir = MV_DIR_FORWARD;
4845 s->mv_type = MV_TYPE_16X16;
4849 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
4850 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4852 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4853 s->mv_dir = MV_DIR_FORWARD;
4854 s->mv_type = MV_TYPE_8X8;
4857 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4858 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4860 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4861 &dmin, &next_block, 0, 0);
4863 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4864 s->mv_dir = MV_DIR_FORWARD;
4865 s->mv_type = MV_TYPE_16X16;
4867 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4868 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4869 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4870 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4872 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4873 s->mv_dir = MV_DIR_BACKWARD;
4874 s->mv_type = MV_TYPE_16X16;
4876 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4877 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4878 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4879 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4881 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4882 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4883 s->mv_type = MV_TYPE_16X16;
4885 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4886 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4887 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4888 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4889 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4890 &dmin, &next_block, 0, 0);
4892 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4893 int mx= s->b_direct_mv_table[xy][0];
4894 int my= s->b_direct_mv_table[xy][1];
4896 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4898 ff_mpeg4_set_direct_mv(s, mx, my);
4899 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4900 &dmin, &next_block, mx, my);
4902 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4903 s->mv_dir = MV_DIR_FORWARD;
4904 s->mv_type = MV_TYPE_FIELD;
4907 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4908 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4909 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4911 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4912 &dmin, &next_block, 0, 0);
4914 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4915 s->mv_dir = MV_DIR_BACKWARD;
4916 s->mv_type = MV_TYPE_FIELD;
4919 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4920 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4921 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4923 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4924 &dmin, &next_block, 0, 0);
4926 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4927 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4928 s->mv_type = MV_TYPE_FIELD;
4930 for(dir=0; dir<2; dir++){
4932 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4933 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4934 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4937 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4938 &dmin, &next_block, 0, 0);
4940 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4942 s->mv_type = MV_TYPE_16X16;
4946 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4947 &dmin, &next_block, 0, 0);
4948 if(s->h263_pred || s->h263_aic){
4950 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4952 ff_clean_intra_table_entries(s); //old mode?
4956 if(s->flags & CODEC_FLAG_QP_RD){
4957 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4958 const int last_qp= backup_s.qscale;
4959 int dquant, dir, qp, dc[6];
4961 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4963 assert(backup_s.dquant == 0);
4966 s->mv_dir= best_s.mv_dir;
4967 s->mv_type = MV_TYPE_16X16;
4968 s->mb_intra= best_s.mb_intra;
4969 s->mv[0][0][0] = best_s.mv[0][0][0];
4970 s->mv[0][0][1] = best_s.mv[0][0][1];
4971 s->mv[1][0][0] = best_s.mv[1][0][0];
4972 s->mv[1][0][1] = best_s.mv[1][0][1];
4974 dir= s->pict_type == B_TYPE ? 2 : 1;
4975 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4976 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4977 qp= last_qp + dquant;
4978 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4980 backup_s.dquant= dquant;
4981 if(s->mb_intra && s->dc_val[0]){
4983 dc[i]= s->dc_val[0][ s->block_index[i] ];
4984 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4988 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4989 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4990 if(best_s.qscale != qp){
4991 if(s->mb_intra && s->dc_val[0]){
4993 s->dc_val[0][ s->block_index[i] ]= dc[i];
4994 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4997 if(dir > 0 && dquant==dir){
5005 s->current_picture.qscale_table[xy]= qp;
5009 copy_context_after_encode(s, &best_s, -1);
5011 pb_bits_count= put_bits_count(&s->pb);
5012 flush_put_bits(&s->pb);
5013 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
5016 if(s->data_partitioning){
5017 pb2_bits_count= put_bits_count(&s->pb2);
5018 flush_put_bits(&s->pb2);
5019 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5020 s->pb2= backup_s.pb2;
5022 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5023 flush_put_bits(&s->tex_pb);
5024 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5025 s->tex_pb= backup_s.tex_pb;
5027 s->last_bits= put_bits_count(&s->pb);
5029 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5030 ff_h263_update_motion_val(s);
5032 if(next_block==0){ //FIXME 16 vs linesize16
5033 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5034 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5035 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5038 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5039 MPV_decode_mb(s, s->block);
5041 int motion_x, motion_y;
5042 s->mv_type=MV_TYPE_16X16;
5043 // only one MB-Type possible
5046 case CANDIDATE_MB_TYPE_INTRA:
5049 motion_x= s->mv[0][0][0] = 0;
5050 motion_y= s->mv[0][0][1] = 0;
5052 case CANDIDATE_MB_TYPE_INTER:
5053 s->mv_dir = MV_DIR_FORWARD;
5055 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5056 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5058 case CANDIDATE_MB_TYPE_INTER_I:
5059 s->mv_dir = MV_DIR_FORWARD;
5060 s->mv_type = MV_TYPE_FIELD;
5063 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5064 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5065 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5067 motion_x = motion_y = 0;
5069 case CANDIDATE_MB_TYPE_INTER4V:
5070 s->mv_dir = MV_DIR_FORWARD;
5071 s->mv_type = MV_TYPE_8X8;
5074 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5075 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5077 motion_x= motion_y= 0;
5079 case CANDIDATE_MB_TYPE_DIRECT:
5080 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5082 motion_x=s->b_direct_mv_table[xy][0];
5083 motion_y=s->b_direct_mv_table[xy][1];
5084 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5086 case CANDIDATE_MB_TYPE_BIDIR:
5087 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5091 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5092 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5093 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5094 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5096 case CANDIDATE_MB_TYPE_BACKWARD:
5097 s->mv_dir = MV_DIR_BACKWARD;
5099 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5100 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5102 case CANDIDATE_MB_TYPE_FORWARD:
5103 s->mv_dir = MV_DIR_FORWARD;
5105 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5106 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5107 // printf(" %d %d ", motion_x, motion_y);
5109 case CANDIDATE_MB_TYPE_FORWARD_I:
5110 s->mv_dir = MV_DIR_FORWARD;
5111 s->mv_type = MV_TYPE_FIELD;
5114 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5115 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5116 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5118 motion_x=motion_y=0;
5120 case CANDIDATE_MB_TYPE_BACKWARD_I:
5121 s->mv_dir = MV_DIR_BACKWARD;
5122 s->mv_type = MV_TYPE_FIELD;
5125 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5126 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5127 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5129 motion_x=motion_y=0;
5131 case CANDIDATE_MB_TYPE_BIDIR_I:
5132 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5133 s->mv_type = MV_TYPE_FIELD;
5135 for(dir=0; dir<2; dir++){
5137 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5138 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5139 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5142 motion_x=motion_y=0;
5145 motion_x=motion_y=0; //gcc warning fix
5146 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5149 encode_mb(s, motion_x, motion_y);
5151 // RAL: Update last macroblock type
5152 s->last_mv_dir = s->mv_dir;
5154 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5155 ff_h263_update_motion_val(s);
5157 MPV_decode_mb(s, s->block);
5160 /* clean the MV table in IPS frames for direct mode in B frames */
5161 if(s->mb_intra /* && I,P,S_TYPE */){
5162 s->p_mv_table[xy][0]=0;
5163 s->p_mv_table[xy][1]=0;
5166 if(s->flags&CODEC_FLAG_PSNR){
5170 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5171 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5173 s->current_picture.error[0] += sse(
5174 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5175 s->dest[0], w, h, s->linesize);
5176 s->current_picture.error[1] += sse(
5177 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5178 s->dest[1], w>>1, h>>1, s->uvlinesize);
5179 s->current_picture.error[2] += sse(
5180 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5181 s->dest[2], w>>1, h>>1, s->uvlinesize);
5184 if(s->out_format == FMT_H263)
5185 ff_h263_loop_filter(s);
5187 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5191 //not beautiful here but we must write it before flushing so it has to be here
5192 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5193 msmpeg4_encode_ext_header(s);
5197 /* Send the last GOB if RTP */
5198 if (s->avctx->rtp_callback) {
5199 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5200 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5201 /* Call the RTP callback to send the last GOB */
5203 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5209 #define MERGE(field) dst->field += src->field; src->field=0
5210 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5211 MERGE(me.scene_change_score);
5212 MERGE(me.mc_mb_var_sum_temp);
5213 MERGE(me.mb_var_sum_temp);
5216 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5219 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5220 MERGE(dct_count[1]);
5230 MERGE(padding_bug_score);
5231 MERGE(current_picture.error[0]);
5232 MERGE(current_picture.error[1]);
5233 MERGE(current_picture.error[2]);
5235 if(dst->avctx->noise_reduction){
5236 for(i=0; i<64; i++){
5237 MERGE(dct_error_sum[0][i]);
5238 MERGE(dct_error_sum[1][i]);
5242 assert(put_bits_count(&src->pb) % 8 ==0);
5243 assert(put_bits_count(&dst->pb) % 8 ==0);
5244 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5245 flush_put_bits(&dst->pb);
5248 static void estimate_qp(MpegEncContext *s, int dry_run){
5249 if (!s->fixed_qscale)
5250 s->current_picture_ptr->quality=
5251 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
5253 if(s->adaptive_quant){
5254 switch(s->codec_id){
5255 case CODEC_ID_MPEG4:
5256 ff_clean_mpeg4_qscales(s);
5259 case CODEC_ID_H263P:
5261 ff_clean_h263_qscales(s);
5265 s->lambda= s->lambda_table[0];
5268 s->lambda= s->current_picture.quality;
5269 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5273 static void encode_picture(MpegEncContext *s, int picture_number)
5278 s->picture_number = picture_number;
5280 /* Reset the average MB variance */
5281 s->me.mb_var_sum_temp =
5282 s->me.mc_mb_var_sum_temp = 0;
5284 /* we need to initialize some time vars before we can encode b-frames */
5285 // RAL: Condition added for MPEG1VIDEO
5286 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5287 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5289 s->me.scene_change_score=0;
5291 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5293 if(s->pict_type==I_TYPE){
5294 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5295 else s->no_rounding=0;
5296 }else if(s->pict_type!=B_TYPE){
5297 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5298 s->no_rounding ^= 1;
5301 if(s->flags & CODEC_FLAG_PASS2)
5305 s->mb_intra=0; //for the rate distortion & bit compare functions
5306 for(i=1; i<s->avctx->thread_count; i++){
5307 ff_update_duplicate_context(s->thread_context[i], s);
5312 /* Estimate motion for every MB */
5313 if(s->pict_type != I_TYPE){
5314 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5315 s->lambda2= (s->lambda2* s->avctx->me_penalty_compensation + 128)>>8;
5316 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5317 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5318 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5322 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5323 }else /* if(s->pict_type == I_TYPE) */{
5325 for(i=0; i<s->mb_stride*s->mb_height; i++)
5326 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5328 if(!s->fixed_qscale){
5329 /* finding spatial complexity for I-frame rate control */
5330 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5333 for(i=1; i<s->avctx->thread_count; i++){
5334 merge_context_after_me(s, s->thread_context[i]);
5336 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5337 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5340 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5341 s->pict_type= I_TYPE;
5342 for(i=0; i<s->mb_stride*s->mb_height; i++)
5343 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5344 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5348 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5349 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5351 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5353 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5354 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5355 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5358 ff_fix_long_p_mvs(s);
5359 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5360 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5364 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5365 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5370 if(s->pict_type==B_TYPE){
5373 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5374 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5375 s->f_code = FFMAX(a, b);
5377 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5378 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5379 s->b_code = FFMAX(a, b);
5381 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5382 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5383 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5384 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5385 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5387 for(dir=0; dir<2; dir++){
5390 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5391 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5392 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5393 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5403 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5404 s->qscale= 3; //reduce clipping problems
5406 if (s->out_format == FMT_MJPEG) {
5407 /* for mjpeg, we do include qscale in the matrix */
5408 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5410 int j= s->dsp.idct_permutation[i];
5412 s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3) & 0xFF;
5414 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5415 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5419 //FIXME var duplication
5420 s->current_picture_ptr->key_frame=
5421 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5422 s->current_picture_ptr->pict_type=
5423 s->current_picture.pict_type= s->pict_type;
5425 if(s->current_picture.key_frame)
5426 s->picture_in_gop_number=0;
5428 s->last_bits= put_bits_count(&s->pb);
5429 switch(s->out_format) {
5431 mjpeg_picture_header(s);
5433 #ifdef CONFIG_H261_ENCODER
5435 ff_h261_encode_picture_header(s, picture_number);
5439 if (s->codec_id == CODEC_ID_WMV2)
5440 ff_wmv2_encode_picture_header(s, picture_number);
5441 else if (s->h263_msmpeg4)
5442 msmpeg4_encode_picture_header(s, picture_number);
5443 else if (s->h263_pred)
5444 mpeg4_encode_picture_header(s, picture_number);
5445 #ifdef CONFIG_RV10_ENCODER
5446 else if (s->codec_id == CODEC_ID_RV10)
5447 rv10_encode_picture_header(s, picture_number);
5449 #ifdef CONFIG_RV20_ENCODER
5450 else if (s->codec_id == CODEC_ID_RV20)
5451 rv20_encode_picture_header(s, picture_number);
5453 else if (s->codec_id == CODEC_ID_FLV1)
5454 ff_flv_encode_picture_header(s, picture_number);
5456 h263_encode_picture_header(s, picture_number);
5459 mpeg1_encode_picture_header(s, picture_number);
5466 bits= put_bits_count(&s->pb);
5467 s->header_bits= bits - s->last_bits;
5469 for(i=1; i<s->avctx->thread_count; i++){
5470 update_duplicate_context_after_me(s->thread_context[i], s);
5472 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5473 for(i=1; i<s->avctx->thread_count; i++){
5474 merge_context_after_encode(s, s->thread_context[i]);
5479 #endif //CONFIG_ENCODERS
5481 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5482 const int intra= s->mb_intra;
5485 s->dct_count[intra]++;
5487 for(i=0; i<64; i++){
5488 int level= block[i];
5492 s->dct_error_sum[intra][i] += level;
5493 level -= s->dct_offset[intra][i];
5494 if(level<0) level=0;
5496 s->dct_error_sum[intra][i] -= level;
5497 level += s->dct_offset[intra][i];
5498 if(level>0) level=0;
5505 #ifdef CONFIG_ENCODERS
5507 static int dct_quantize_trellis_c(MpegEncContext *s,
5508 DCTELEM *block, int n,
5509 int qscale, int *overflow){
5511 const uint8_t *scantable= s->intra_scantable.scantable;
5512 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5514 unsigned int threshold1, threshold2;
5526 int coeff_count[64];
5527 int qmul, qadd, start_i, last_non_zero, i, dc;
5528 const int esc_length= s->ac_esc_length;
5530 uint8_t * last_length;
5531 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5533 s->dsp.fdct (block);
5535 if(s->dct_error_sum)
5536 s->denoise_dct(s, block);
5538 qadd= ((qscale-1)|1)*8;
5549 /* For AIC we skip quant/dequant of INTRADC */
5554 /* note: block[0] is assumed to be positive */
5555 block[0] = (block[0] + (q >> 1)) / q;
5558 qmat = s->q_intra_matrix[qscale];
5559 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5560 bias= 1<<(QMAT_SHIFT-1);
5561 length = s->intra_ac_vlc_length;
5562 last_length= s->intra_ac_vlc_last_length;
5566 qmat = s->q_inter_matrix[qscale];
5567 length = s->inter_ac_vlc_length;
5568 last_length= s->inter_ac_vlc_last_length;
5572 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5573 threshold2= (threshold1<<1);
5575 for(i=63; i>=start_i; i--) {
5576 const int j = scantable[i];
5577 int level = block[j] * qmat[j];
5579 if(((unsigned)(level+threshold1))>threshold2){
5585 for(i=start_i; i<=last_non_zero; i++) {
5586 const int j = scantable[i];
5587 int level = block[j] * qmat[j];
5589 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5590 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5591 if(((unsigned)(level+threshold1))>threshold2){
5593 level= (bias + level)>>QMAT_SHIFT;
5595 coeff[1][i]= level-1;
5596 // coeff[2][k]= level-2;
5598 level= (bias - level)>>QMAT_SHIFT;
5599 coeff[0][i]= -level;
5600 coeff[1][i]= -level+1;
5601 // coeff[2][k]= -level+2;
5603 coeff_count[i]= FFMIN(level, 2);
5604 assert(coeff_count[i]);
5607 coeff[0][i]= (level>>31)|1;
5612 *overflow= s->max_qcoeff < max; //overflow might have happened
5614 if(last_non_zero < start_i){
5615 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5616 return last_non_zero;
5619 score_tab[start_i]= 0;
5620 survivor[0]= start_i;
5623 for(i=start_i; i<=last_non_zero; i++){
5625 const int dct_coeff= ABS(block[ scantable[i] ]);
5626 const int zero_distoration= dct_coeff*dct_coeff;
5627 int best_score=256*256*256*120;
5628 for(level_index=0; level_index < coeff_count[i]; level_index++){
5630 int level= coeff[level_index][i];
5631 const int alevel= ABS(level);
5636 if(s->out_format == FMT_H263){
5637 unquant_coeff= alevel*qmul + qadd;
5639 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5641 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5642 unquant_coeff = (unquant_coeff - 1) | 1;
5644 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5645 unquant_coeff = (unquant_coeff - 1) | 1;
5650 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5652 if((level&(~127)) == 0){
5653 for(j=survivor_count-1; j>=0; j--){
5654 int run= i - survivor[j];
5655 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5656 score += score_tab[i-run];
5658 if(score < best_score){
5661 level_tab[i+1]= level-64;
5665 if(s->out_format == FMT_H263){
5666 for(j=survivor_count-1; j>=0; j--){
5667 int run= i - survivor[j];
5668 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5669 score += score_tab[i-run];
5670 if(score < last_score){
5673 last_level= level-64;
5679 distoration += esc_length*lambda;
5680 for(j=survivor_count-1; j>=0; j--){
5681 int run= i - survivor[j];
5682 int score= distoration + score_tab[i-run];
5684 if(score < best_score){
5687 level_tab[i+1]= level-64;
5691 if(s->out_format == FMT_H263){
5692 for(j=survivor_count-1; j>=0; j--){
5693 int run= i - survivor[j];
5694 int score= distoration + score_tab[i-run];
5695 if(score < last_score){
5698 last_level= level-64;
5706 score_tab[i+1]= best_score;
5708 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5709 if(last_non_zero <= 27){
5710 for(; survivor_count; survivor_count--){
5711 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5715 for(; survivor_count; survivor_count--){
5716 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5721 survivor[ survivor_count++ ]= i+1;
5724 if(s->out_format != FMT_H263){
5725 last_score= 256*256*256*120;
5726 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5727 int score= score_tab[i];
5728 if(i) score += lambda*2; //FIXME exacter?
5730 if(score < last_score){
5733 last_level= level_tab[i];
5734 last_run= run_tab[i];
5739 s->coded_score[n] = last_score;
5742 last_non_zero= last_i - 1;
5743 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5745 if(last_non_zero < start_i)
5746 return last_non_zero;
5748 if(last_non_zero == 0 && start_i == 0){
5750 int best_score= dc * dc;
5752 for(i=0; i<coeff_count[0]; i++){
5753 int level= coeff[i][0];
5754 int alevel= ABS(level);
5755 int unquant_coeff, score, distortion;
5757 if(s->out_format == FMT_H263){
5758 unquant_coeff= (alevel*qmul + qadd)>>3;
5760 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5761 unquant_coeff = (unquant_coeff - 1) | 1;
5763 unquant_coeff = (unquant_coeff + 4) >> 3;
5764 unquant_coeff<<= 3 + 3;
5766 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5768 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5769 else score= distortion + esc_length*lambda;
5771 if(score < best_score){
5773 best_level= level - 64;
5776 block[0]= best_level;
5777 s->coded_score[n] = best_score - dc*dc;
5778 if(best_level == 0) return -1;
5779 else return last_non_zero;
5785 block[ perm_scantable[last_non_zero] ]= last_level;
5788 for(; i>start_i; i -= run_tab[i] + 1){
5789 block[ perm_scantable[i-1] ]= level_tab[i];
5792 return last_non_zero;
5795 //#define REFINE_STATS 1
5796 static int16_t basis[64][64];
5798 static void build_basis(uint8_t *perm){
5805 double s= 0.25*(1<<BASIS_SHIFT);
5807 int perm_index= perm[index];
5808 if(i==0) s*= sqrt(0.5);
5809 if(j==0) s*= sqrt(0.5);
5810 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)));
5817 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5818 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5821 DCTELEM d1[64] __align16;
5823 const uint8_t *scantable= s->intra_scantable.scantable;
5824 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5825 // unsigned int threshold1, threshold2;
5830 int qmul, qadd, start_i, last_non_zero, i, dc;
5832 uint8_t * last_length;
5834 int rle_index, run, q, sum;
5837 static int after_last=0;
5838 static int to_zero=0;
5839 static int from_zero=0;
5842 static int messed_sign=0;
5845 if(basis[0][0] == 0)
5846 build_basis(s->dsp.idct_permutation);
5857 /* For AIC we skip quant/dequant of INTRADC */
5861 q <<= RECON_SHIFT-3;
5862 /* note: block[0] is assumed to be positive */
5864 // block[0] = (block[0] + (q >> 1)) / q;
5866 qmat = s->q_intra_matrix[qscale];
5867 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5868 // bias= 1<<(QMAT_SHIFT-1);
5869 length = s->intra_ac_vlc_length;
5870 last_length= s->intra_ac_vlc_last_length;
5874 qmat = s->q_inter_matrix[qscale];
5875 length = s->inter_ac_vlc_length;
5876 last_length= s->inter_ac_vlc_last_length;
5878 last_non_zero = s->block_last_index[n];
5883 dc += (1<<(RECON_SHIFT-1));
5884 for(i=0; i<64; i++){
5885 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
5888 STOP_TIMER("memset rem[]")}
5891 for(i=0; i<64; i++){
5896 w= ABS(weight[i]) + qns*one;
5897 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5900 // w=weight[i] = (63*qns + (w/2)) / w;
5906 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5912 for(i=start_i; i<=last_non_zero; i++){
5913 int j= perm_scantable[i];
5914 const int level= block[j];
5918 if(level<0) coeff= qmul*level - qadd;
5919 else coeff= qmul*level + qadd;
5920 run_tab[rle_index++]=run;
5923 s->dsp.add_8x8basis(rem, basis[j], coeff);
5929 if(last_non_zero>0){
5930 STOP_TIMER("init rem[]")
5937 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5940 int run2, best_unquant_change=0, analyze_gradient;
5944 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5946 if(analyze_gradient){
5950 for(i=0; i<64; i++){
5953 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5956 STOP_TIMER("rem*w*w")}
5966 const int level= block[0];
5967 int change, old_coeff;
5969 assert(s->mb_intra);
5973 for(change=-1; change<=1; change+=2){
5974 int new_level= level + change;
5975 int score, new_coeff;
5977 new_coeff= q*new_level;
5978 if(new_coeff >= 2048 || new_coeff < 0)
5981 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5982 if(score<best_score){
5985 best_change= change;
5986 best_unquant_change= new_coeff - old_coeff;
5993 run2= run_tab[rle_index++];
5997 for(i=start_i; i<64; i++){
5998 int j= perm_scantable[i];
5999 const int level= block[j];
6000 int change, old_coeff;
6002 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
6006 if(level<0) old_coeff= qmul*level - qadd;
6007 else old_coeff= qmul*level + qadd;
6008 run2= run_tab[rle_index++]; //FIXME ! maybe after last
6012 assert(run2>=0 || i >= last_non_zero );
6015 for(change=-1; change<=1; change+=2){
6016 int new_level= level + change;
6017 int score, new_coeff, unquant_change;
6020 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
6024 if(new_level<0) new_coeff= qmul*new_level - qadd;
6025 else new_coeff= qmul*new_level + qadd;
6026 if(new_coeff >= 2048 || new_coeff <= -2048)
6028 //FIXME check for overflow
6031 if(level < 63 && level > -63){
6032 if(i < last_non_zero)
6033 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6034 - length[UNI_AC_ENC_INDEX(run, level+64)];
6036 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6037 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6040 assert(ABS(new_level)==1);
6042 if(analyze_gradient){
6043 int g= d1[ scantable[i] ];
6044 if(g && (g^new_level) >= 0)
6048 if(i < last_non_zero){
6049 int next_i= i + run2 + 1;
6050 int next_level= block[ perm_scantable[next_i] ] + 64;
6052 if(next_level&(~127))
6055 if(next_i < last_non_zero)
6056 score += length[UNI_AC_ENC_INDEX(run, 65)]
6057 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6058 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6060 score += length[UNI_AC_ENC_INDEX(run, 65)]
6061 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6062 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6064 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6066 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6067 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6073 assert(ABS(level)==1);
6075 if(i < last_non_zero){
6076 int next_i= i + run2 + 1;
6077 int next_level= block[ perm_scantable[next_i] ] + 64;
6079 if(next_level&(~127))
6082 if(next_i < last_non_zero)
6083 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6084 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6085 - length[UNI_AC_ENC_INDEX(run, 65)];
6087 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6088 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6089 - length[UNI_AC_ENC_INDEX(run, 65)];
6091 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6093 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6094 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6101 unquant_change= new_coeff - old_coeff;
6102 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6104 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6105 if(score<best_score){
6108 best_change= change;
6109 best_unquant_change= unquant_change;
6113 prev_level= level + 64;
6114 if(prev_level&(~127))
6123 STOP_TIMER("iterative step")}
6127 int j= perm_scantable[ best_coeff ];
6129 block[j] += best_change;
6131 if(best_coeff > last_non_zero){
6132 last_non_zero= best_coeff;
6140 if(block[j] - best_change){
6141 if(ABS(block[j]) > ABS(block[j] - best_change)){
6153 for(; last_non_zero>=start_i; last_non_zero--){
6154 if(block[perm_scantable[last_non_zero]])
6160 if(256*256*256*64 % count == 0){
6161 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);
6166 for(i=start_i; i<=last_non_zero; i++){
6167 int j= perm_scantable[i];
6168 const int level= block[j];
6171 run_tab[rle_index++]=run;
6178 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6184 if(last_non_zero>0){
6185 STOP_TIMER("iterative search")
6190 return last_non_zero;
6193 static int dct_quantize_c(MpegEncContext *s,
6194 DCTELEM *block, int n,
6195 int qscale, int *overflow)
6197 int i, j, level, last_non_zero, q, start_i;
6199 const uint8_t *scantable= s->intra_scantable.scantable;
6202 unsigned int threshold1, threshold2;
6204 s->dsp.fdct (block);
6206 if(s->dct_error_sum)
6207 s->denoise_dct(s, block);
6217 /* For AIC we skip quant/dequant of INTRADC */
6220 /* note: block[0] is assumed to be positive */
6221 block[0] = (block[0] + (q >> 1)) / q;
6224 qmat = s->q_intra_matrix[qscale];
6225 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6229 qmat = s->q_inter_matrix[qscale];
6230 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6232 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6233 threshold2= (threshold1<<1);
6234 for(i=63;i>=start_i;i--) {
6236 level = block[j] * qmat[j];
6238 if(((unsigned)(level+threshold1))>threshold2){
6245 for(i=start_i; i<=last_non_zero; i++) {
6247 level = block[j] * qmat[j];
6249 // if( bias+level >= (1<<QMAT_SHIFT)
6250 // || bias-level >= (1<<QMAT_SHIFT)){
6251 if(((unsigned)(level+threshold1))>threshold2){
6253 level= (bias + level)>>QMAT_SHIFT;
6256 level= (bias - level)>>QMAT_SHIFT;
6264 *overflow= s->max_qcoeff < max; //overflow might have happened
6266 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6267 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6268 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6270 return last_non_zero;
6273 #endif //CONFIG_ENCODERS
6275 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6276 DCTELEM *block, int n, int qscale)
6278 int i, level, nCoeffs;
6279 const uint16_t *quant_matrix;
6281 nCoeffs= s->block_last_index[n];
6284 block[0] = block[0] * s->y_dc_scale;
6286 block[0] = block[0] * s->c_dc_scale;
6287 /* XXX: only mpeg1 */
6288 quant_matrix = s->intra_matrix;
6289 for(i=1;i<=nCoeffs;i++) {
6290 int j= s->intra_scantable.permutated[i];
6295 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6296 level = (level - 1) | 1;
6299 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6300 level = (level - 1) | 1;
6307 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6308 DCTELEM *block, int n, int qscale)
6310 int i, level, nCoeffs;
6311 const uint16_t *quant_matrix;
6313 nCoeffs= s->block_last_index[n];
6315 quant_matrix = s->inter_matrix;
6316 for(i=0; i<=nCoeffs; i++) {
6317 int j= s->intra_scantable.permutated[i];
6322 level = (((level << 1) + 1) * qscale *
6323 ((int) (quant_matrix[j]))) >> 4;
6324 level = (level - 1) | 1;
6327 level = (((level << 1) + 1) * qscale *
6328 ((int) (quant_matrix[j]))) >> 4;
6329 level = (level - 1) | 1;
6336 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6337 DCTELEM *block, int n, int qscale)
6339 int i, level, nCoeffs;
6340 const uint16_t *quant_matrix;
6342 if(s->alternate_scan) nCoeffs= 63;
6343 else nCoeffs= s->block_last_index[n];
6346 block[0] = block[0] * s->y_dc_scale;
6348 block[0] = block[0] * s->c_dc_scale;
6349 quant_matrix = s->intra_matrix;
6350 for(i=1;i<=nCoeffs;i++) {
6351 int j= s->intra_scantable.permutated[i];
6356 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6359 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6366 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6367 DCTELEM *block, int n, int qscale)
6369 int i, level, nCoeffs;
6370 const uint16_t *quant_matrix;
6373 if(s->alternate_scan) nCoeffs= 63;
6374 else nCoeffs= s->block_last_index[n];
6376 quant_matrix = s->inter_matrix;
6377 for(i=0; i<=nCoeffs; i++) {
6378 int j= s->intra_scantable.permutated[i];
6383 level = (((level << 1) + 1) * qscale *
6384 ((int) (quant_matrix[j]))) >> 4;
6387 level = (((level << 1) + 1) * qscale *
6388 ((int) (quant_matrix[j]))) >> 4;
6397 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6398 DCTELEM *block, int n, int qscale)
6400 int i, level, qmul, qadd;
6403 assert(s->block_last_index[n]>=0);
6409 block[0] = block[0] * s->y_dc_scale;
6411 block[0] = block[0] * s->c_dc_scale;
6412 qadd = (qscale - 1) | 1;
6419 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6421 for(i=1; i<=nCoeffs; i++) {
6425 level = level * qmul - qadd;
6427 level = level * qmul + qadd;
6434 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6435 DCTELEM *block, int n, int qscale)
6437 int i, level, qmul, qadd;
6440 assert(s->block_last_index[n]>=0);
6442 qadd = (qscale - 1) | 1;
6445 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6447 for(i=0; i<=nCoeffs; i++) {
6451 level = level * qmul - qadd;
6453 level = level * qmul + qadd;
6460 #ifdef CONFIG_ENCODERS
6461 AVCodec h263_encoder = {
6465 sizeof(MpegEncContext),
6469 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6472 AVCodec h263p_encoder = {
6476 sizeof(MpegEncContext),
6480 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6483 AVCodec flv_encoder = {
6487 sizeof(MpegEncContext),
6491 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6494 AVCodec rv10_encoder = {
6498 sizeof(MpegEncContext),
6502 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6505 AVCodec rv20_encoder = {
6509 sizeof(MpegEncContext),
6513 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6516 AVCodec mpeg4_encoder = {
6520 sizeof(MpegEncContext),
6524 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6525 .capabilities= CODEC_CAP_DELAY,
6528 AVCodec msmpeg4v1_encoder = {
6532 sizeof(MpegEncContext),
6536 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6539 AVCodec msmpeg4v2_encoder = {
6543 sizeof(MpegEncContext),
6547 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6550 AVCodec msmpeg4v3_encoder = {
6554 sizeof(MpegEncContext),
6558 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6561 AVCodec wmv1_encoder = {
6565 sizeof(MpegEncContext),
6569 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6572 AVCodec mjpeg_encoder = {
6576 sizeof(MpegEncContext),
6580 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, -1},
6583 #endif //CONFIG_ENCODERS