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;
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 differnt 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 doesnt 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 missmatch)\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+2) * sizeof(int16_t))
389 pic->motion_val[i]= pic->motion_val_base[i]+2;
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+2) * sizeof(int16_t))
396 pic->motion_val[i]= pic->motion_val_base[i]+2;
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; // skiped 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 dont set in encode_header
546 COPY(progressive_frame); //FIXME dont set in encode_header
547 COPY(partitioned_frame); //FIXME dont 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 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
897 s->bit_rate = avctx->bit_rate;
898 s->width = avctx->width;
899 s->height = avctx->height;
900 if(avctx->gop_size > 600){
901 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
904 s->gop_size = avctx->gop_size;
906 s->flags= avctx->flags;
907 s->flags2= avctx->flags2;
908 s->max_b_frames= avctx->max_b_frames;
909 s->codec_id= avctx->codec->id;
910 s->luma_elim_threshold = avctx->luma_elim_threshold;
911 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
912 s->strict_std_compliance= avctx->strict_std_compliance;
913 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
914 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
915 s->mpeg_quant= avctx->mpeg_quant;
916 s->rtp_mode= !!avctx->rtp_payload_size;
917 s->intra_dc_precision= avctx->intra_dc_precision;
918 s->user_specified_pts = AV_NOPTS_VALUE;
920 if (s->gop_size <= 1) {
927 s->me_method = avctx->me_method;
930 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
932 s->adaptive_quant= ( s->avctx->lumi_masking
933 || s->avctx->dark_masking
934 || s->avctx->temporal_cplx_masking
935 || s->avctx->spatial_cplx_masking
936 || s->avctx->p_masking
937 || (s->flags&CODEC_FLAG_QP_RD))
940 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
941 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
942 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
944 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
945 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
949 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
950 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");
953 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
954 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
958 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
959 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
963 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
964 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
965 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
967 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");
970 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
971 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
972 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
976 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
977 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
981 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
982 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
986 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
987 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
991 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
992 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
996 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
997 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1001 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1002 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1003 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1007 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1008 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");
1012 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1013 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1017 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1018 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1022 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1023 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1027 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1028 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1029 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1030 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1034 if(s->avctx->thread_count > 1)
1037 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
1039 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1040 avctx->frame_rate /= i;
1041 avctx->frame_rate_base /= i;
1045 if(s->codec_id==CODEC_ID_MJPEG){
1046 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1047 s->inter_quant_bias= 0;
1048 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1049 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1050 s->inter_quant_bias= 0;
1052 s->intra_quant_bias=0;
1053 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1056 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1057 s->intra_quant_bias= avctx->intra_quant_bias;
1058 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1059 s->inter_quant_bias= avctx->inter_quant_bias;
1061 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1063 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
1064 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1066 switch(avctx->codec->id) {
1067 case CODEC_ID_MPEG1VIDEO:
1068 s->out_format = FMT_MPEG1;
1069 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1070 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1072 case CODEC_ID_MPEG2VIDEO:
1073 s->out_format = FMT_MPEG1;
1074 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1075 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1078 case CODEC_ID_LJPEG:
1079 case CODEC_ID_MJPEG:
1080 s->out_format = FMT_MJPEG;
1081 s->intra_only = 1; /* force intra only for jpeg */
1082 s->mjpeg_write_tables = 1; /* write all tables */
1083 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1084 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1085 s->mjpeg_vsample[1] = 1;
1086 s->mjpeg_vsample[2] = 1;
1087 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1088 s->mjpeg_hsample[1] = 1;
1089 s->mjpeg_hsample[2] = 1;
1090 if (mjpeg_init(s) < 0)
1097 s->out_format = FMT_H261;
1102 if (h263_get_picture_format(s->width, s->height) == 7) {
1103 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
1106 s->out_format = FMT_H263;
1107 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1111 case CODEC_ID_H263P:
1112 s->out_format = FMT_H263;
1115 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1116 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1117 s->modified_quant= s->h263_aic;
1118 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1119 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1120 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1121 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1122 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1125 /* These are just to be sure */
1130 s->out_format = FMT_H263;
1131 s->h263_flv = 2; /* format = 1; 11-bit codes */
1132 s->unrestricted_mv = 1;
1133 s->rtp_mode=0; /* don't allow GOB */
1138 s->out_format = FMT_H263;
1143 s->out_format = FMT_H263;
1146 s->modified_quant=1;
1150 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1152 case CODEC_ID_MPEG4:
1153 s->out_format = FMT_H263;
1155 s->unrestricted_mv = 1;
1156 s->low_delay= s->max_b_frames ? 0 : 1;
1157 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1159 case CODEC_ID_MSMPEG4V1:
1160 s->out_format = FMT_H263;
1161 s->h263_msmpeg4 = 1;
1163 s->unrestricted_mv = 1;
1164 s->msmpeg4_version= 1;
1168 case CODEC_ID_MSMPEG4V2:
1169 s->out_format = FMT_H263;
1170 s->h263_msmpeg4 = 1;
1172 s->unrestricted_mv = 1;
1173 s->msmpeg4_version= 2;
1177 case CODEC_ID_MSMPEG4V3:
1178 s->out_format = FMT_H263;
1179 s->h263_msmpeg4 = 1;
1181 s->unrestricted_mv = 1;
1182 s->msmpeg4_version= 3;
1183 s->flipflop_rounding=1;
1188 s->out_format = FMT_H263;
1189 s->h263_msmpeg4 = 1;
1191 s->unrestricted_mv = 1;
1192 s->msmpeg4_version= 4;
1193 s->flipflop_rounding=1;
1198 s->out_format = FMT_H263;
1199 s->h263_msmpeg4 = 1;
1201 s->unrestricted_mv = 1;
1202 s->msmpeg4_version= 5;
1203 s->flipflop_rounding=1;
1212 avctx->has_b_frames= !s->low_delay;
1217 if (MPV_common_init(s) < 0)
1220 if(s->modified_quant)
1221 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1222 s->progressive_frame=
1223 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1224 s->quant_precision=5;
1226 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1227 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1229 #ifdef CONFIG_ENCODERS
1231 if (s->out_format == FMT_H261)
1232 ff_h261_encode_init(s);
1233 if (s->out_format == FMT_H263)
1234 h263_encode_init(s);
1235 if(s->msmpeg4_version)
1236 ff_msmpeg4_encode_init(s);
1238 if (s->out_format == FMT_MPEG1)
1239 ff_mpeg1_encode_init(s);
1244 int j= s->dsp.idct_permutation[i];
1246 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1247 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1248 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1249 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1250 s->intra_matrix[j] =
1251 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1255 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1256 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1258 if(s->avctx->intra_matrix)
1259 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1260 if(s->avctx->inter_matrix)
1261 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1264 /* precompute matrix */
1265 /* for mjpeg, we do include qscale in the matrix */
1266 if (s->out_format != FMT_MJPEG) {
1267 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1268 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1269 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1270 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1273 if(ff_rate_control_init(s) < 0)
1279 int MPV_encode_end(AVCodecContext *avctx)
1281 MpegEncContext *s = avctx->priv_data;
1287 ff_rate_control_uninit(s);
1290 if (s->out_format == FMT_MJPEG)
1293 av_freep(&avctx->extradata);
1298 #endif //CONFIG_ENCODERS
1300 void init_rl(RLTable *rl, int use_static)
1302 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1303 uint8_t index_run[MAX_RUN+1];
1304 int last, run, level, start, end, i;
1306 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1307 if(use_static && rl->max_level[0])
1310 /* compute max_level[], max_run[] and index_run[] */
1311 for(last=0;last<2;last++) {
1320 memset(max_level, 0, MAX_RUN + 1);
1321 memset(max_run, 0, MAX_LEVEL + 1);
1322 memset(index_run, rl->n, MAX_RUN + 1);
1323 for(i=start;i<end;i++) {
1324 run = rl->table_run[i];
1325 level = rl->table_level[i];
1326 if (index_run[run] == rl->n)
1328 if (level > max_level[run])
1329 max_level[run] = level;
1330 if (run > max_run[level])
1331 max_run[level] = run;
1334 rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
1336 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1337 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1339 rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
1341 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1342 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1344 rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
1346 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1347 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1351 /* draw the edges of width 'w' of an image of size width, height */
1352 //FIXME check that this is ok for mpeg4 interlaced
1353 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1355 uint8_t *ptr, *last_line;
1358 last_line = buf + (height - 1) * wrap;
1360 /* top and bottom */
1361 memcpy(buf - (i + 1) * wrap, buf, width);
1362 memcpy(last_line + (i + 1) * wrap, last_line, width);
1364 /* left and right */
1366 for(i=0;i<height;i++) {
1367 memset(ptr - w, ptr[0], w);
1368 memset(ptr + width, ptr[width-1], w);
1373 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1374 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1375 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1376 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1380 int ff_find_unused_picture(MpegEncContext *s, int shared){
1384 for(i=0; i<MAX_PICTURE_COUNT; i++){
1385 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1388 for(i=0; i<MAX_PICTURE_COUNT; i++){
1389 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1391 for(i=0; i<MAX_PICTURE_COUNT; i++){
1392 if(s->picture[i].data[0]==NULL) return i;
1400 static void update_noise_reduction(MpegEncContext *s){
1403 for(intra=0; intra<2; intra++){
1404 if(s->dct_count[intra] > (1<<16)){
1405 for(i=0; i<64; i++){
1406 s->dct_error_sum[intra][i] >>=1;
1408 s->dct_count[intra] >>= 1;
1411 for(i=0; i<64; i++){
1412 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);
1418 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1420 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1426 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1428 /* mark&release old frames */
1429 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1430 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1432 /* release forgotten pictures */
1433 /* if(mpeg124/h263) */
1435 for(i=0; i<MAX_PICTURE_COUNT; i++){
1436 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1437 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1438 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1445 /* release non refernce frames */
1446 for(i=0; i<MAX_PICTURE_COUNT; i++){
1447 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1448 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1452 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1453 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1455 i= ff_find_unused_picture(s, 0);
1456 pic= (AVFrame*)&s->picture[i];
1459 pic->reference= s->pict_type != B_TYPE && !s->dropable ? 3 : 0;
1461 pic->coded_picture_number= s->coded_picture_number++;
1463 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1466 s->current_picture_ptr= (Picture*)pic;
1467 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1468 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1471 s->current_picture_ptr->pict_type= s->pict_type;
1472 // if(s->flags && CODEC_FLAG_QSCALE)
1473 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1474 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1476 copy_picture(&s->current_picture, s->current_picture_ptr);
1478 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1479 if (s->pict_type != B_TYPE) {
1480 s->last_picture_ptr= s->next_picture_ptr;
1482 s->next_picture_ptr= s->current_picture_ptr;
1484 /* 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,
1485 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1486 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1487 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1488 s->pict_type, s->dropable);*/
1490 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1491 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1493 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1494 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1495 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1499 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1501 if(s->picture_structure!=PICT_FRAME){
1504 if(s->picture_structure == PICT_BOTTOM_FIELD){
1505 s->current_picture.data[i] += s->current_picture.linesize[i];
1507 s->current_picture.linesize[i] *= 2;
1508 s->last_picture.linesize[i] *=2;
1509 s->next_picture.linesize[i] *=2;
1514 s->hurry_up= s->avctx->hurry_up;
1515 s->error_resilience= avctx->error_resilience;
1517 /* set dequantizer, we cant do it during init as it might change for mpeg4
1518 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1519 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1520 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1521 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1522 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1523 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1524 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1526 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1527 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1530 if(s->dct_error_sum){
1531 assert(s->avctx->noise_reduction && s->encoding);
1533 update_noise_reduction(s);
1537 if(s->avctx->xvmc_acceleration)
1538 return XVMC_field_start(s, avctx);
1543 /* generic function for encode/decode called after a frame has been coded/decoded */
1544 void MPV_frame_end(MpegEncContext *s)
1547 /* draw edge for correct motion prediction if outside */
1549 //just to make sure that all data is rendered.
1550 if(s->avctx->xvmc_acceleration){
1554 if(s->unrestricted_mv && s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1555 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1556 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1557 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1561 s->last_pict_type = s->pict_type;
1562 if(s->pict_type!=B_TYPE){
1563 s->last_non_b_pict_type= s->pict_type;
1566 /* copy back current_picture variables */
1567 for(i=0; i<MAX_PICTURE_COUNT; i++){
1568 if(s->picture[i].data[0] == s->current_picture.data[0]){
1569 s->picture[i]= s->current_picture;
1573 assert(i<MAX_PICTURE_COUNT);
1577 /* release non refernce frames */
1578 for(i=0; i<MAX_PICTURE_COUNT; i++){
1579 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1580 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1584 // clear copies, to avoid confusion
1586 memset(&s->last_picture, 0, sizeof(Picture));
1587 memset(&s->next_picture, 0, sizeof(Picture));
1588 memset(&s->current_picture, 0, sizeof(Picture));
1590 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1594 * draws an line from (ex, ey) -> (sx, sy).
1595 * @param w width of the image
1596 * @param h height of the image
1597 * @param stride stride/linesize of the image
1598 * @param color color of the arrow
1600 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1603 sx= clip(sx, 0, w-1);
1604 sy= clip(sy, 0, h-1);
1605 ex= clip(ex, 0, w-1);
1606 ey= clip(ey, 0, h-1);
1608 buf[sy*stride + sx]+= color;
1610 if(ABS(ex - sx) > ABS(ey - sy)){
1615 buf+= sx + sy*stride;
1617 f= ((ey-sy)<<16)/ex;
1618 for(x= 0; x <= ex; x++){
1621 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1622 buf[(y+1)*stride + x]+= (color* fr )>>16;
1629 buf+= sx + sy*stride;
1631 if(ey) f= ((ex-sx)<<16)/ey;
1633 for(y= 0; y <= ey; y++){
1636 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1637 buf[y*stride + x+1]+= (color* fr )>>16;;
1643 * draws an arrow from (ex, ey) -> (sx, sy).
1644 * @param w width of the image
1645 * @param h height of the image
1646 * @param stride stride/linesize of the image
1647 * @param color color of the arrow
1649 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1652 sx= clip(sx, -100, w+100);
1653 sy= clip(sy, -100, h+100);
1654 ex= clip(ex, -100, w+100);
1655 ey= clip(ey, -100, h+100);
1660 if(dx*dx + dy*dy > 3*3){
1663 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1665 //FIXME subpixel accuracy
1666 rx= ROUNDED_DIV(rx*3<<4, length);
1667 ry= ROUNDED_DIV(ry*3<<4, length);
1669 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1670 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1672 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1676 * prints debuging info for the given picture.
1678 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1680 if(!pict || !pict->mb_type) return;
1682 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1685 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1686 switch (pict->pict_type) {
1687 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1688 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1689 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1690 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1691 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1692 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1694 for(y=0; y<s->mb_height; y++){
1695 for(x=0; x<s->mb_width; x++){
1696 if(s->avctx->debug&FF_DEBUG_SKIP){
1697 int count= s->mbskip_table[x + y*s->mb_stride];
1698 if(count>9) count=9;
1699 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1701 if(s->avctx->debug&FF_DEBUG_QP){
1702 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1704 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1705 int mb_type= pict->mb_type[x + y*s->mb_stride];
1706 //Type & MV direction
1708 av_log(s->avctx, AV_LOG_DEBUG, "P");
1709 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1710 av_log(s->avctx, AV_LOG_DEBUG, "A");
1711 else if(IS_INTRA4x4(mb_type))
1712 av_log(s->avctx, AV_LOG_DEBUG, "i");
1713 else if(IS_INTRA16x16(mb_type))
1714 av_log(s->avctx, AV_LOG_DEBUG, "I");
1715 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1716 av_log(s->avctx, AV_LOG_DEBUG, "d");
1717 else if(IS_DIRECT(mb_type))
1718 av_log(s->avctx, AV_LOG_DEBUG, "D");
1719 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1720 av_log(s->avctx, AV_LOG_DEBUG, "g");
1721 else if(IS_GMC(mb_type))
1722 av_log(s->avctx, AV_LOG_DEBUG, "G");
1723 else if(IS_SKIP(mb_type))
1724 av_log(s->avctx, AV_LOG_DEBUG, "S");
1725 else if(!USES_LIST(mb_type, 1))
1726 av_log(s->avctx, AV_LOG_DEBUG, ">");
1727 else if(!USES_LIST(mb_type, 0))
1728 av_log(s->avctx, AV_LOG_DEBUG, "<");
1730 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1731 av_log(s->avctx, AV_LOG_DEBUG, "X");
1736 av_log(s->avctx, AV_LOG_DEBUG, "+");
1737 else if(IS_16X8(mb_type))
1738 av_log(s->avctx, AV_LOG_DEBUG, "-");
1739 else if(IS_8X16(mb_type))
1740 av_log(s->avctx, AV_LOG_DEBUG, "¦");
1741 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1742 av_log(s->avctx, AV_LOG_DEBUG, " ");
1744 av_log(s->avctx, AV_LOG_DEBUG, "?");
1747 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1748 av_log(s->avctx, AV_LOG_DEBUG, "=");
1750 av_log(s->avctx, AV_LOG_DEBUG, " ");
1752 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1754 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1758 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1759 const int shift= 1 + s->quarter_sample;
1763 int h_chroma_shift, v_chroma_shift;
1764 const int width = s->avctx->width;
1765 const int height= s->avctx->height;
1766 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1767 const int mv_stride= (s->mb_width << mv_sample_log2) + 1;
1768 s->low_delay=0; //needed to see the vectors without trashing the buffers
1770 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1772 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1773 pict->data[i]= s->visualization_buffer[i];
1775 pict->type= FF_BUFFER_TYPE_COPY;
1778 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1780 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1781 const int mb_index= mb_x + mb_y*s->mb_stride;
1782 if((s->avctx->debug_mv) && pict->motion_val){
1784 for(type=0; type<3; type++){
1787 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1791 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1795 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1800 if(!USES_LIST(pict->mb_type[mb_index], direction))
1803 if(IS_8X8(pict->mb_type[mb_index])){
1806 int sx= mb_x*16 + 4 + 8*(i&1);
1807 int sy= mb_y*16 + 4 + 8*(i>>1);
1808 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << mv_sample_log2-1;
1809 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1810 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1811 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1813 }else if(IS_16X8(pict->mb_type[mb_index])){
1817 int sy=mb_y*16 + 4 + 8*i;
1818 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << mv_sample_log2-1;
1819 int mx=(pict->motion_val[direction][xy][0]>>shift);
1820 int my=(pict->motion_val[direction][xy][1]>>shift);
1822 if(IS_INTERLACED(pict->mb_type[mb_index]))
1825 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1827 }else if(IS_8X16(pict->mb_type[mb_index])){
1830 int sx=mb_x*16 + 4 + 8*i;
1832 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << mv_sample_log2-1;
1833 int mx=(pict->motion_val[direction][xy][0]>>shift);
1834 int my=(pict->motion_val[direction][xy][1]>>shift);
1836 if(IS_INTERLACED(pict->mb_type[mb_index]))
1839 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1842 int sx= mb_x*16 + 8;
1843 int sy= mb_y*16 + 8;
1844 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1845 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1846 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1847 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1851 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1852 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1855 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1856 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1859 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1860 int mb_type= pict->mb_type[mb_index];
1863 #define COLOR(theta, r)\
1864 u= (int)(128 + r*cos(theta*3.141592/180));\
1865 v= (int)(128 + r*sin(theta*3.141592/180));
1869 if(IS_PCM(mb_type)){
1871 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1873 }else if(IS_INTRA4x4(mb_type)){
1875 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1877 }else if(IS_DIRECT(mb_type)){
1879 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1881 }else if(IS_GMC(mb_type)){
1883 }else if(IS_SKIP(mb_type)){
1885 }else if(!USES_LIST(mb_type, 1)){
1887 }else if(!USES_LIST(mb_type, 0)){
1890 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1894 u*= 0x0101010101010101ULL;
1895 v*= 0x0101010101010101ULL;
1897 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1898 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1902 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1903 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1904 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1906 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1908 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1911 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1915 s->mbskip_table[mb_index]=0;
1921 #ifdef CONFIG_ENCODERS
1923 static int get_sae(uint8_t *src, int ref, int stride){
1927 for(y=0; y<16; y++){
1928 for(x=0; x<16; x++){
1929 acc+= ABS(src[x+y*stride] - ref);
1936 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1943 for(y=0; y<h; y+=16){
1944 for(x=0; x<w; x+=16){
1945 int offset= x + y*stride;
1946 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1947 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1948 int sae = get_sae(src + offset, mean, stride);
1950 acc+= sae + 500 < sad;
1957 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1960 const int encoding_delay= s->max_b_frames;
1964 if(pic_arg->pts != AV_NOPTS_VALUE){
1965 if(s->user_specified_pts != AV_NOPTS_VALUE){
1966 int64_t time= av_rescale(pic_arg->pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE);
1967 int64_t last= av_rescale(s->user_specified_pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE);
1970 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%Ld, last=%Ld\n", pic_arg->pts, s->user_specified_pts);
1974 s->user_specified_pts= pic_arg->pts;
1976 if(s->user_specified_pts != AV_NOPTS_VALUE){
1977 s->user_specified_pts=
1978 pic_arg->pts= s->user_specified_pts + AV_TIME_BASE*(int64_t)s->avctx->frame_rate_base / s->avctx->frame_rate;
1979 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pic_arg->pts);
1981 pic_arg->pts= av_rescale(pic_arg->display_picture_number*(int64_t)s->avctx->frame_rate_base, AV_TIME_BASE, s->avctx->frame_rate);
1987 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1988 if(pic_arg->linesize[0] != s->linesize) direct=0;
1989 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1990 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1992 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1995 i= ff_find_unused_picture(s, 1);
1997 pic= (AVFrame*)&s->picture[i];
2001 pic->data[i]= pic_arg->data[i];
2002 pic->linesize[i]= pic_arg->linesize[i];
2004 alloc_picture(s, (Picture*)pic, 1);
2007 i= ff_find_unused_picture(s, 0);
2009 pic= (AVFrame*)&s->picture[i];
2012 alloc_picture(s, (Picture*)pic, 0);
2014 if( pic->data[0] + offset == pic_arg->data[0]
2015 && pic->data[1] + offset == pic_arg->data[1]
2016 && pic->data[2] + offset == pic_arg->data[2]){
2019 int h_chroma_shift, v_chroma_shift;
2020 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2023 int src_stride= pic_arg->linesize[i];
2024 int dst_stride= i ? s->uvlinesize : s->linesize;
2025 int h_shift= i ? h_chroma_shift : 0;
2026 int v_shift= i ? v_chroma_shift : 0;
2027 int w= s->width >>h_shift;
2028 int h= s->height>>v_shift;
2029 uint8_t *src= pic_arg->data[i];
2030 uint8_t *dst= pic->data[i] + offset;
2032 if(src_stride==dst_stride)
2033 memcpy(dst, src, src_stride*h);
2036 memcpy(dst, src, w);
2044 copy_picture_attributes(s, pic, pic_arg);
2046 pic->display_picture_number= s->input_picture_number++;
2050 /* shift buffer entries */
2051 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2052 s->input_picture[i-1]= s->input_picture[i];
2054 s->input_picture[encoding_delay]= (Picture*)pic;
2059 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2065 for(plane=0; plane<3; plane++){
2066 const int stride= p->linesize[plane];
2067 const int bw= plane ? 1 : 2;
2068 for(y=0; y<s->mb_height*bw; y++){
2069 for(x=0; x<s->mb_width*bw; x++){
2070 int v= s->dsp.frame_skip_cmp[1](s, p->data[plane] + 8*(x + y*stride), ref->data[plane] + 8*(x + y*stride), stride, 8);
2072 switch(s->avctx->frame_skip_exp){
2073 case 0: score= FFMAX(score, v); break;
2074 case 1: score+= ABS(v);break;
2075 case 2: score+= v*v;break;
2076 case 3: score64+= ABS(v*v*(int64_t)v);break;
2077 case 4: score64+= v*v*(int64_t)(v*v);break;
2083 if(score) score64= score;
2085 if(score64 < s->avctx->frame_skip_threshold)
2087 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2092 static void select_input_picture(MpegEncContext *s){
2095 for(i=1; i<MAX_PICTURE_COUNT; i++)
2096 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2097 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2099 /* set next picture types & ordering */
2100 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2101 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2102 s->reordered_input_picture[0]= s->input_picture[0];
2103 s->reordered_input_picture[0]->pict_type= I_TYPE;
2104 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2108 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2109 if(skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2110 //av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2112 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2114 s->input_picture[0]->data[i]= NULL;
2115 s->input_picture[0]->type= 0;
2117 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2118 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2120 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2127 if(s->flags&CODEC_FLAG_PASS2){
2128 for(i=0; i<s->max_b_frames+1; i++){
2129 int pict_num= s->input_picture[0]->display_picture_number + i;
2131 if(pict_num >= s->rc_context.num_entries)
2133 if(!s->input_picture[i]){
2134 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2138 s->input_picture[i]->pict_type=
2139 s->rc_context.entry[pict_num].new_pict_type;
2143 if(s->avctx->b_frame_strategy==0){
2144 b_frames= s->max_b_frames;
2145 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2146 }else if(s->avctx->b_frame_strategy==1){
2147 for(i=1; i<s->max_b_frames+1; i++){
2148 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2149 s->input_picture[i]->b_frame_score=
2150 get_intra_count(s, s->input_picture[i ]->data[0],
2151 s->input_picture[i-1]->data[0], s->linesize) + 1;
2154 for(i=0; i<s->max_b_frames; i++){
2155 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2158 b_frames= FFMAX(0, i-1);
2161 for(i=0; i<b_frames+1; i++){
2162 s->input_picture[i]->b_frame_score=0;
2165 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2170 //static int b_count=0;
2171 //b_count+= b_frames;
2172 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2174 for(i= b_frames - 1; i>=0; i--){
2175 int type= s->input_picture[i]->pict_type;
2176 if(type && type != B_TYPE)
2179 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2180 av_log(s->avctx, AV_LOG_ERROR, "warning, too many bframes in a row\n");
2183 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2184 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2185 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2187 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2189 s->input_picture[b_frames]->pict_type= I_TYPE;
2193 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2195 && s->input_picture[b_frames]->pict_type== I_TYPE)
2198 s->reordered_input_picture[0]= s->input_picture[b_frames];
2199 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2200 s->reordered_input_picture[0]->pict_type= P_TYPE;
2201 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2202 for(i=0; i<b_frames; i++){
2203 s->reordered_input_picture[i+1]= s->input_picture[i];
2204 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2205 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2210 if(s->reordered_input_picture[0]){
2211 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2213 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2215 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2216 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
2218 int i= ff_find_unused_picture(s, 0);
2219 Picture *pic= &s->picture[i];
2221 /* mark us unused / free shared pic */
2223 s->reordered_input_picture[0]->data[i]= NULL;
2224 s->reordered_input_picture[0]->type= 0;
2226 pic->reference = s->reordered_input_picture[0]->reference;
2228 alloc_picture(s, pic, 0);
2230 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2232 s->current_picture_ptr= pic;
2234 // input is not a shared pix -> reuse buffer for current_pix
2236 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2237 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2239 s->current_picture_ptr= s->reordered_input_picture[0];
2241 s->new_picture.data[i]+=16;
2244 copy_picture(&s->current_picture, s->current_picture_ptr);
2246 s->picture_number= s->new_picture.display_picture_number;
2247 //printf("dpn:%d\n", s->picture_number);
2249 memset(&s->new_picture, 0, sizeof(Picture));
2253 int MPV_encode_picture(AVCodecContext *avctx,
2254 unsigned char *buf, int buf_size, void *data)
2256 MpegEncContext *s = avctx->priv_data;
2257 AVFrame *pic_arg = data;
2258 int i, stuffing_count;
2260 if(avctx->pix_fmt != PIX_FMT_YUV420P){
2261 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2265 for(i=0; i<avctx->thread_count; i++){
2266 int start_y= s->thread_context[i]->start_mb_y;
2267 int end_y= s->thread_context[i]-> end_mb_y;
2268 int h= s->mb_height;
2269 uint8_t *start= buf + buf_size*start_y/h;
2270 uint8_t *end = buf + buf_size* end_y/h;
2272 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2275 s->picture_in_gop_number++;
2277 if(load_input_picture(s, pic_arg) < 0)
2280 select_input_picture(s);
2283 if(s->new_picture.data[0]){
2284 s->pict_type= s->new_picture.pict_type;
2286 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2287 MPV_frame_start(s, avctx);
2289 encode_picture(s, s->picture_number);
2291 avctx->real_pict_num = s->picture_number;
2292 avctx->header_bits = s->header_bits;
2293 avctx->mv_bits = s->mv_bits;
2294 avctx->misc_bits = s->misc_bits;
2295 avctx->i_tex_bits = s->i_tex_bits;
2296 avctx->p_tex_bits = s->p_tex_bits;
2297 avctx->i_count = s->i_count;
2298 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2299 avctx->skip_count = s->skip_count;
2303 if (s->out_format == FMT_MJPEG)
2304 mjpeg_picture_trailer(s);
2306 if(s->flags&CODEC_FLAG_PASS1)
2307 ff_write_pass1_stats(s);
2310 avctx->error[i] += s->current_picture_ptr->error[i];
2313 flush_put_bits(&s->pb);
2314 s->frame_bits = put_bits_count(&s->pb);
2316 stuffing_count= ff_vbv_update(s, s->frame_bits);
2318 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2319 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2323 switch(s->codec_id){
2324 case CODEC_ID_MPEG1VIDEO:
2325 case CODEC_ID_MPEG2VIDEO:
2326 while(stuffing_count--){
2327 put_bits(&s->pb, 8, 0);
2330 case CODEC_ID_MPEG4:
2331 put_bits(&s->pb, 16, 0);
2332 put_bits(&s->pb, 16, 0x1C3);
2333 stuffing_count -= 4;
2334 while(stuffing_count--){
2335 put_bits(&s->pb, 8, 0xFF);
2339 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2341 flush_put_bits(&s->pb);
2342 s->frame_bits = put_bits_count(&s->pb);
2345 /* update mpeg1/2 vbv_delay for CBR */
2346 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2347 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2350 assert(s->repeat_first_field==0);
2352 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2353 assert(vbv_delay < 0xFFFF);
2355 s->vbv_delay_ptr[0] &= 0xF8;
2356 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2357 s->vbv_delay_ptr[1] = vbv_delay>>5;
2358 s->vbv_delay_ptr[2] &= 0x07;
2359 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2361 s->total_bits += s->frame_bits;
2362 avctx->frame_bits = s->frame_bits;
2364 assert((pbBufPtr(&s->pb) == s->pb.buf));
2367 assert((s->frame_bits&7)==0);
2369 return s->frame_bits/8;
2372 #endif //CONFIG_ENCODERS
2374 static inline void gmc1_motion(MpegEncContext *s,
2375 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2376 uint8_t **ref_picture)
2379 int offset, src_x, src_y, linesize, uvlinesize;
2380 int motion_x, motion_y;
2383 motion_x= s->sprite_offset[0][0];
2384 motion_y= s->sprite_offset[0][1];
2385 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2386 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2387 motion_x<<=(3-s->sprite_warping_accuracy);
2388 motion_y<<=(3-s->sprite_warping_accuracy);
2389 src_x = clip(src_x, -16, s->width);
2390 if (src_x == s->width)
2392 src_y = clip(src_y, -16, s->height);
2393 if (src_y == s->height)
2396 linesize = s->linesize;
2397 uvlinesize = s->uvlinesize;
2399 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2401 if(s->flags&CODEC_FLAG_EMU_EDGE){
2402 if( (unsigned)src_x >= s->h_edge_pos - 17
2403 || (unsigned)src_y >= s->v_edge_pos - 17){
2404 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2405 ptr= s->edge_emu_buffer;
2409 if((motion_x|motion_y)&7){
2410 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2411 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2415 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2416 if (s->no_rounding){
2417 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2419 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2423 if(s->flags&CODEC_FLAG_GRAY) return;
2425 motion_x= s->sprite_offset[1][0];
2426 motion_y= s->sprite_offset[1][1];
2427 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2428 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2429 motion_x<<=(3-s->sprite_warping_accuracy);
2430 motion_y<<=(3-s->sprite_warping_accuracy);
2431 src_x = clip(src_x, -8, s->width>>1);
2432 if (src_x == s->width>>1)
2434 src_y = clip(src_y, -8, s->height>>1);
2435 if (src_y == s->height>>1)
2438 offset = (src_y * uvlinesize) + src_x;
2439 ptr = ref_picture[1] + offset;
2440 if(s->flags&CODEC_FLAG_EMU_EDGE){
2441 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2442 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2443 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);
2444 ptr= s->edge_emu_buffer;
2448 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2450 ptr = ref_picture[2] + offset;
2452 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);
2453 ptr= s->edge_emu_buffer;
2455 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2460 static inline void gmc_motion(MpegEncContext *s,
2461 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2462 uint8_t **ref_picture)
2465 int linesize, uvlinesize;
2466 const int a= s->sprite_warping_accuracy;
2469 linesize = s->linesize;
2470 uvlinesize = s->uvlinesize;
2472 ptr = ref_picture[0];
2474 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2475 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2477 s->dsp.gmc(dest_y, ptr, linesize, 16,
2480 s->sprite_delta[0][0], s->sprite_delta[0][1],
2481 s->sprite_delta[1][0], s->sprite_delta[1][1],
2482 a+1, (1<<(2*a+1)) - s->no_rounding,
2483 s->h_edge_pos, s->v_edge_pos);
2484 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2485 ox + s->sprite_delta[0][0]*8,
2486 oy + s->sprite_delta[1][0]*8,
2487 s->sprite_delta[0][0], s->sprite_delta[0][1],
2488 s->sprite_delta[1][0], s->sprite_delta[1][1],
2489 a+1, (1<<(2*a+1)) - s->no_rounding,
2490 s->h_edge_pos, s->v_edge_pos);
2492 if(s->flags&CODEC_FLAG_GRAY) return;
2494 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2495 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2497 ptr = ref_picture[1];
2498 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2501 s->sprite_delta[0][0], s->sprite_delta[0][1],
2502 s->sprite_delta[1][0], s->sprite_delta[1][1],
2503 a+1, (1<<(2*a+1)) - s->no_rounding,
2504 s->h_edge_pos>>1, s->v_edge_pos>>1);
2506 ptr = ref_picture[2];
2507 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2510 s->sprite_delta[0][0], s->sprite_delta[0][1],
2511 s->sprite_delta[1][0], s->sprite_delta[1][1],
2512 a+1, (1<<(2*a+1)) - s->no_rounding,
2513 s->h_edge_pos>>1, s->v_edge_pos>>1);
2517 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2518 * @param buf destination buffer
2519 * @param src source buffer
2520 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2521 * @param block_w width of block
2522 * @param block_h height of block
2523 * @param src_x x coordinate of the top left sample of the block in the source buffer
2524 * @param src_y y coordinate of the top left sample of the block in the source buffer
2525 * @param w width of the source buffer
2526 * @param h height of the source buffer
2528 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2529 int src_x, int src_y, int w, int h){
2531 int start_y, start_x, end_y, end_x;
2534 src+= (h-1-src_y)*linesize;
2536 }else if(src_y<=-block_h){
2537 src+= (1-block_h-src_y)*linesize;
2543 }else if(src_x<=-block_w){
2544 src+= (1-block_w-src_x);
2548 start_y= FFMAX(0, -src_y);
2549 start_x= FFMAX(0, -src_x);
2550 end_y= FFMIN(block_h, h-src_y);
2551 end_x= FFMIN(block_w, w-src_x);
2553 // copy existing part
2554 for(y=start_y; y<end_y; y++){
2555 for(x=start_x; x<end_x; x++){
2556 buf[x + y*linesize]= src[x + y*linesize];
2561 for(y=0; y<start_y; y++){
2562 for(x=start_x; x<end_x; x++){
2563 buf[x + y*linesize]= buf[x + start_y*linesize];
2568 for(y=end_y; y<block_h; y++){
2569 for(x=start_x; x<end_x; x++){
2570 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2574 for(y=0; y<block_h; y++){
2576 for(x=0; x<start_x; x++){
2577 buf[x + y*linesize]= buf[start_x + y*linesize];
2581 for(x=end_x; x<block_w; x++){
2582 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2587 static inline int hpel_motion(MpegEncContext *s,
2588 uint8_t *dest, uint8_t *src,
2589 int field_based, int field_select,
2590 int src_x, int src_y,
2591 int width, int height, int stride,
2592 int h_edge_pos, int v_edge_pos,
2593 int w, int h, op_pixels_func *pix_op,
2594 int motion_x, int motion_y)
2599 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2600 src_x += motion_x >> 1;
2601 src_y += motion_y >> 1;
2603 /* WARNING: do no forget half pels */
2604 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2607 src_y = clip(src_y, -16, height);
2608 if (src_y == height)
2610 src += src_y * stride + src_x;
2612 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2613 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2614 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2615 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2616 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2617 src= s->edge_emu_buffer;
2623 pix_op[dxy](dest, src, stride, h);
2627 static inline int hpel_motion_lowres(MpegEncContext *s,
2628 uint8_t *dest, uint8_t *src,
2629 int field_based, int field_select,
2630 int src_x, int src_y,
2631 int width, int height, int stride,
2632 int h_edge_pos, int v_edge_pos,
2633 int w, int h, h264_chroma_mc_func *pix_op,
2634 int motion_x, int motion_y)
2636 const int lowres= s->avctx->lowres;
2637 const int s_mask= (2<<lowres)-1;
2641 if(s->quarter_sample){
2646 sx= motion_x & s_mask;
2647 sy= motion_y & s_mask;
2648 src_x += motion_x >> (lowres+1);
2649 src_y += motion_y >> (lowres+1);
2651 src += src_y * stride + src_x;
2653 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2654 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2655 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2656 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2657 src= s->edge_emu_buffer;
2665 pix_op[lowres](dest, src, stride, h, sx, sy);
2669 /* apply one mpeg motion vector to the three components */
2670 static always_inline void mpeg_motion(MpegEncContext *s,
2671 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2672 int field_based, int bottom_field, int field_select,
2673 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2674 int motion_x, int motion_y, int h)
2676 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2677 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2680 if(s->quarter_sample)
2687 v_edge_pos = s->v_edge_pos >> field_based;
2688 linesize = s->current_picture.linesize[0] << field_based;
2689 uvlinesize = s->current_picture.linesize[1] << field_based;
2691 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2692 src_x = s->mb_x* 16 + (motion_x >> 1);
2693 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2695 if (s->out_format == FMT_H263) {
2696 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2697 mx = (motion_x>>1)|(motion_x&1);
2699 uvdxy = ((my & 1) << 1) | (mx & 1);
2700 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2701 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2703 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2707 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2711 uvsrc_x = s->mb_x*8 + mx;
2712 uvsrc_y = s->mb_y*8 + my;
2714 if(s->chroma_y_shift){
2717 uvdxy = ((my & 1) << 1) | (mx & 1);
2718 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2719 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2721 if(s->chroma_x_shift){
2724 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2725 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2736 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2737 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2738 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2740 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2741 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2742 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2743 s->codec_id == CODEC_ID_MPEG1VIDEO){
2744 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2747 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2748 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2749 ptr_y = s->edge_emu_buffer;
2750 if(!(s->flags&CODEC_FLAG_GRAY)){
2751 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2752 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2753 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2754 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2755 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2761 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2762 dest_y += s->linesize;
2763 dest_cb+= s->uvlinesize;
2764 dest_cr+= s->uvlinesize;
2768 ptr_y += s->linesize;
2769 ptr_cb+= s->uvlinesize;
2770 ptr_cr+= s->uvlinesize;
2773 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2775 if(!(s->flags&CODEC_FLAG_GRAY)){
2776 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2777 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2779 if(s->out_format == FMT_H261){
2780 ff_h261_loop_filter(s);
2784 /* apply one mpeg motion vector to the three components */
2785 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
2786 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2787 int field_based, int bottom_field, int field_select,
2788 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
2789 int motion_x, int motion_y, int h)
2791 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2792 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
2793 const int lowres= s->avctx->lowres;
2794 const int block_s= 8>>lowres;
2795 const int s_mask= (2<<lowres)-1;
2796 const int h_edge_pos = s->h_edge_pos >> lowres;
2797 const int v_edge_pos = s->v_edge_pos >> lowres;
2798 linesize = s->current_picture.linesize[0] << field_based;
2799 uvlinesize = s->current_picture.linesize[1] << field_based;
2801 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
2807 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
2810 sx= motion_x & s_mask;
2811 sy= motion_y & s_mask;
2812 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
2813 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
2815 if (s->out_format == FMT_H263) {
2816 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
2817 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
2820 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2823 uvsx = (2*mx) & s_mask;
2824 uvsy = (2*my) & s_mask;
2825 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
2826 uvsrc_y = s->mb_y*block_s + (my >> lowres);
2832 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2833 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
2836 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2837 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2838 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2840 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
2841 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2842 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2843 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2844 ptr_y = s->edge_emu_buffer;
2845 if(!(s->flags&CODEC_FLAG_GRAY)){
2846 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2847 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2848 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2849 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2850 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2856 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2857 dest_y += s->linesize;
2858 dest_cb+= s->uvlinesize;
2859 dest_cr+= s->uvlinesize;
2863 ptr_y += s->linesize;
2864 ptr_cb+= s->uvlinesize;
2865 ptr_cr+= s->uvlinesize;
2870 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
2872 if(!(s->flags&CODEC_FLAG_GRAY)){
2873 uvsx <<= 2 - lowres;
2874 uvsy <<= 2 - lowres;
2875 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2876 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2878 //FIXME h261 lowres loop filter
2881 //FIXME move to dsputil, avg variant, 16x16 version
2882 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2884 uint8_t * const top = src[1];
2885 uint8_t * const left = src[2];
2886 uint8_t * const mid = src[0];
2887 uint8_t * const right = src[3];
2888 uint8_t * const bottom= src[4];
2889 #define OBMC_FILTER(x, t, l, m, r, b)\
2890 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2891 #define OBMC_FILTER4(x, t, l, m, r, b)\
2892 OBMC_FILTER(x , t, l, m, r, b);\
2893 OBMC_FILTER(x+1 , t, l, m, r, b);\
2894 OBMC_FILTER(x +stride, t, l, m, r, b);\
2895 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2898 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2899 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2900 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2901 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2902 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2903 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2905 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2906 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2907 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2908 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2910 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2911 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2912 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2913 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2915 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2916 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2917 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2918 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2920 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2921 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2922 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2923 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2924 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2925 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2927 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2928 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2929 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2930 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2933 /* obmc for 1 8x8 luma block */
2934 static inline void obmc_motion(MpegEncContext *s,
2935 uint8_t *dest, uint8_t *src,
2936 int src_x, int src_y,
2937 op_pixels_func *pix_op,
2938 int16_t mv[5][2]/* mid top left right bottom*/)
2944 assert(s->quarter_sample==0);
2947 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2950 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2951 hpel_motion(s, ptr[i], src, 0, 0,
2953 s->width, s->height, s->linesize,
2954 s->h_edge_pos, s->v_edge_pos,
2956 mv[i][0], mv[i][1]);
2960 put_obmc(dest, ptr, s->linesize);
2963 static inline void qpel_motion(MpegEncContext *s,
2964 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2965 int field_based, int bottom_field, int field_select,
2966 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2967 qpel_mc_func (*qpix_op)[16],
2968 int motion_x, int motion_y, int h)
2970 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2971 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
2973 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2974 src_x = s->mb_x * 16 + (motion_x >> 2);
2975 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
2977 v_edge_pos = s->v_edge_pos >> field_based;
2978 linesize = s->linesize << field_based;
2979 uvlinesize = s->uvlinesize << field_based;
2984 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2985 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2986 mx= (motion_x>>1) + rtab[motion_x&7];
2987 my= (motion_y>>1) + rtab[motion_y&7];
2988 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2989 mx= (motion_x>>1)|(motion_x&1);
2990 my= (motion_y>>1)|(motion_y&1);
2998 uvdxy= (mx&1) | ((my&1)<<1);
3002 uvsrc_x = s->mb_x * 8 + mx;
3003 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3005 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3006 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3007 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3009 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3010 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3011 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3012 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3013 ptr_y= s->edge_emu_buffer;
3014 if(!(s->flags&CODEC_FLAG_GRAY)){
3015 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3016 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3017 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3018 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3019 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3026 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3029 dest_y += s->linesize;
3030 dest_cb+= s->uvlinesize;
3031 dest_cr+= s->uvlinesize;
3035 ptr_y += s->linesize;
3036 ptr_cb += s->uvlinesize;
3037 ptr_cr += s->uvlinesize;
3039 //damn interlaced mode
3040 //FIXME boundary mirroring is not exactly correct here
3041 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3042 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3044 if(!(s->flags&CODEC_FLAG_GRAY)){
3045 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3046 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3050 inline int ff_h263_round_chroma(int x){
3052 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3055 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3060 * h263 chorma 4mv motion compensation.
3062 static inline void chroma_4mv_motion(MpegEncContext *s,
3063 uint8_t *dest_cb, uint8_t *dest_cr,
3064 uint8_t **ref_picture,
3065 op_pixels_func *pix_op,
3067 int dxy, emu=0, src_x, src_y, offset;
3070 /* In case of 8X8, we construct a single chroma motion vector
3071 with a special rounding */
3072 mx= ff_h263_round_chroma(mx);
3073 my= ff_h263_round_chroma(my);
3075 dxy = ((my & 1) << 1) | (mx & 1);
3079 src_x = s->mb_x * 8 + mx;
3080 src_y = s->mb_y * 8 + my;
3081 src_x = clip(src_x, -8, s->width/2);
3082 if (src_x == s->width/2)
3084 src_y = clip(src_y, -8, s->height/2);
3085 if (src_y == s->height/2)
3088 offset = (src_y * (s->uvlinesize)) + src_x;
3089 ptr = ref_picture[1] + offset;
3090 if(s->flags&CODEC_FLAG_EMU_EDGE){
3091 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3092 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3093 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);
3094 ptr= s->edge_emu_buffer;
3098 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3100 ptr = ref_picture[2] + offset;
3102 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);
3103 ptr= s->edge_emu_buffer;
3105 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3108 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3109 uint8_t *dest_cb, uint8_t *dest_cr,
3110 uint8_t **ref_picture,
3111 h264_chroma_mc_func *pix_op,
3113 const int lowres= s->avctx->lowres;
3114 const int block_s= 8>>lowres;
3115 const int s_mask= (2<<lowres)-1;
3116 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3117 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3118 int emu=0, src_x, src_y, offset, sx, sy;
3121 if(s->quarter_sample){
3126 /* In case of 8X8, we construct a single chroma motion vector
3127 with a special rounding */
3128 mx= ff_h263_round_chroma(mx);
3129 my= ff_h263_round_chroma(my);
3133 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3134 src_y = s->mb_y*block_s + (my >> (lowres+1));
3136 offset = src_y * s->uvlinesize + src_x;
3137 ptr = ref_picture[1] + offset;
3138 if(s->flags&CODEC_FLAG_EMU_EDGE){
3139 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3140 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3141 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3142 ptr= s->edge_emu_buffer;
3148 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3150 ptr = ref_picture[2] + offset;
3152 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3153 ptr= s->edge_emu_buffer;
3155 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3159 * motion compesation of a single macroblock
3161 * @param dest_y luma destination pointer
3162 * @param dest_cb chroma cb/u destination pointer
3163 * @param dest_cr chroma cr/v destination pointer
3164 * @param dir direction (0->forward, 1->backward)
3165 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3166 * @param pic_op halfpel motion compensation function (average or put normally)
3167 * @param pic_op qpel motion compensation function (average or put normally)
3168 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3170 static inline void MPV_motion(MpegEncContext *s,
3171 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3172 int dir, uint8_t **ref_picture,
3173 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3175 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3177 uint8_t *ptr, *dest;
3182 if(s->obmc && s->pict_type != B_TYPE){
3183 int16_t mv_cache[4][4][2];
3184 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3185 const int mot_stride= s->b8_stride;
3186 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3188 assert(!s->mb_skiped);
3190 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3191 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3192 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3194 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3195 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3197 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3200 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3201 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3202 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3204 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3205 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3208 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3209 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3210 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3212 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3213 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3219 const int x= (i&1)+1;
3220 const int y= (i>>1)+1;
3222 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3223 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3224 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3225 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3226 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3228 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3230 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3237 if(!(s->flags&CODEC_FLAG_GRAY))
3238 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3243 switch(s->mv_type) {
3247 if(s->real_sprite_warping_points==1){
3248 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3251 gmc_motion(s, dest_y, dest_cb, dest_cr,
3254 }else if(s->quarter_sample){
3255 qpel_motion(s, dest_y, dest_cb, dest_cr,
3257 ref_picture, pix_op, qpix_op,
3258 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3260 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3261 ref_picture, pix_op,
3262 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3266 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3268 ref_picture, pix_op,
3269 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3275 if(s->quarter_sample){
3277 motion_x = s->mv[dir][i][0];
3278 motion_y = s->mv[dir][i][1];
3280 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3281 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3282 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3284 /* WARNING: do no forget half pels */
3285 src_x = clip(src_x, -16, s->width);
3286 if (src_x == s->width)
3288 src_y = clip(src_y, -16, s->height);
3289 if (src_y == s->height)
3292 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3293 if(s->flags&CODEC_FLAG_EMU_EDGE){
3294 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3295 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3296 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);
3297 ptr= s->edge_emu_buffer;
3300 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3301 qpix_op[1][dxy](dest, ptr, s->linesize);
3303 mx += s->mv[dir][i][0]/2;
3304 my += s->mv[dir][i][1]/2;
3308 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3309 ref_picture[0], 0, 0,
3310 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3311 s->width, s->height, s->linesize,
3312 s->h_edge_pos, s->v_edge_pos,
3314 s->mv[dir][i][0], s->mv[dir][i][1]);
3316 mx += s->mv[dir][i][0];
3317 my += s->mv[dir][i][1];
3321 if(!(s->flags&CODEC_FLAG_GRAY))
3322 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3325 if (s->picture_structure == PICT_FRAME) {
3326 if(s->quarter_sample){
3328 qpel_motion(s, dest_y, dest_cb, dest_cr,
3329 1, i, s->field_select[dir][i],
3330 ref_picture, pix_op, qpix_op,
3331 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3335 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3336 1, 0, s->field_select[dir][0],
3337 ref_picture, pix_op,
3338 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3340 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3341 1, 1, s->field_select[dir][1],
3342 ref_picture, pix_op,
3343 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3346 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3347 ref_picture= s->current_picture_ptr->data;
3350 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3351 0, 0, s->field_select[dir][0],
3352 ref_picture, pix_op,
3353 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3358 uint8_t ** ref2picture;
3360 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3361 ref2picture= ref_picture;
3363 ref2picture= s->current_picture_ptr->data;
3366 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3367 0, 0, s->field_select[dir][i],
3368 ref2picture, pix_op,
3369 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3371 dest_y += 16*s->linesize;
3372 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3373 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3377 if(s->picture_structure == PICT_FRAME){
3381 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3383 ref_picture, pix_op,
3384 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3386 pix_op = s->dsp.avg_pixels_tab;
3390 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3391 0, 0, s->picture_structure != i+1,
3392 ref_picture, pix_op,
3393 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3395 // after put we make avg of the same block
3396 pix_op=s->dsp.avg_pixels_tab;
3398 //opposite parity is always in the same frame if this is second field
3399 if(!s->first_field){
3400 ref_picture = s->current_picture_ptr->data;
3410 * motion compesation of a single macroblock
3412 * @param dest_y luma destination pointer
3413 * @param dest_cb chroma cb/u destination pointer
3414 * @param dest_cr chroma cr/v destination pointer
3415 * @param dir direction (0->forward, 1->backward)
3416 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3417 * @param pic_op halfpel motion compensation function (average or put normally)
3418 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3420 static inline void MPV_motion_lowres(MpegEncContext *s,
3421 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3422 int dir, uint8_t **ref_picture,
3423 h264_chroma_mc_func *pix_op)
3427 const int lowres= s->avctx->lowres;
3428 const int block_s= 8>>lowres;
3433 switch(s->mv_type) {
3435 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3437 ref_picture, pix_op,
3438 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3444 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3445 ref_picture[0], 0, 0,
3446 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3447 s->width, s->height, s->linesize,
3448 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3449 block_s, block_s, pix_op,
3450 s->mv[dir][i][0], s->mv[dir][i][1]);
3452 mx += s->mv[dir][i][0];
3453 my += s->mv[dir][i][1];
3456 if(!(s->flags&CODEC_FLAG_GRAY))
3457 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3460 if (s->picture_structure == PICT_FRAME) {
3462 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3463 1, 0, s->field_select[dir][0],
3464 ref_picture, pix_op,
3465 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3467 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3468 1, 1, s->field_select[dir][1],
3469 ref_picture, pix_op,
3470 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3472 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3473 ref_picture= s->current_picture_ptr->data;
3476 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3477 0, 0, s->field_select[dir][0],
3478 ref_picture, pix_op,
3479 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3484 uint8_t ** ref2picture;
3486 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3487 ref2picture= ref_picture;
3489 ref2picture= s->current_picture_ptr->data;
3492 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3493 0, 0, s->field_select[dir][i],
3494 ref2picture, pix_op,
3495 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3497 dest_y += 2*block_s*s->linesize;
3498 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3499 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3503 if(s->picture_structure == PICT_FRAME){
3507 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3509 ref_picture, pix_op,
3510 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3512 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3516 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3517 0, 0, s->picture_structure != i+1,
3518 ref_picture, pix_op,
3519 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3521 // after put we make avg of the same block
3522 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3524 //opposite parity is always in the same frame if this is second field
3525 if(!s->first_field){
3526 ref_picture = s->current_picture_ptr->data;
3535 /* put block[] to dest[] */
3536 static inline void put_dct(MpegEncContext *s,
3537 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3539 s->dct_unquantize_intra(s, block, i, qscale);
3540 s->dsp.idct_put (dest, line_size, block);
3543 /* add block[] to dest[] */
3544 static inline void add_dct(MpegEncContext *s,
3545 DCTELEM *block, int i, uint8_t *dest, int line_size)
3547 if (s->block_last_index[i] >= 0) {
3548 s->dsp.idct_add (dest, line_size, block);
3552 static inline void add_dequant_dct(MpegEncContext *s,
3553 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3555 if (s->block_last_index[i] >= 0) {
3556 s->dct_unquantize_inter(s, block, i, qscale);
3558 s->dsp.idct_add (dest, line_size, block);
3563 * cleans dc, ac, coded_block for the current non intra MB
3565 void ff_clean_intra_table_entries(MpegEncContext *s)
3567 int wrap = s->b8_stride;
3568 int xy = s->block_index[0];
3571 s->dc_val[0][xy + 1 ] =
3572 s->dc_val[0][xy + wrap] =
3573 s->dc_val[0][xy + 1 + wrap] = 1024;
3575 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3576 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3577 if (s->msmpeg4_version>=3) {
3578 s->coded_block[xy ] =
3579 s->coded_block[xy + 1 ] =
3580 s->coded_block[xy + wrap] =
3581 s->coded_block[xy + 1 + wrap] = 0;
3584 wrap = s->mb_stride;
3585 xy = s->mb_x + s->mb_y * wrap;
3587 s->dc_val[2][xy] = 1024;
3589 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3590 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3592 s->mbintra_table[xy]= 0;
3595 /* generic function called after a macroblock has been parsed by the
3596 decoder or after it has been encoded by the encoder.
3598 Important variables used:
3599 s->mb_intra : true if intra macroblock
3600 s->mv_dir : motion vector direction
3601 s->mv_type : motion vector type
3602 s->mv : motion vector
3603 s->interlaced_dct : true if interlaced dct used (mpeg2)
3605 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3608 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3610 if(s->avctx->xvmc_acceleration){
3611 XVMC_decode_mb(s);//xvmc uses pblocks
3619 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3620 /* save DCT coefficients */
3622 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3625 *dct++ = block[i][s->dsp.idct_permutation[j]];
3628 s->current_picture.qscale_table[mb_xy]= s->qscale;
3630 /* update DC predictors for P macroblocks */
3632 if (s->h263_pred || s->h263_aic) {
3633 if(s->mbintra_table[mb_xy])
3634 ff_clean_intra_table_entries(s);
3638 s->last_dc[2] = 128 << s->intra_dc_precision;
3641 else if (s->h263_pred || s->h263_aic)
3642 s->mbintra_table[mb_xy]=1;
3644 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3645 uint8_t *dest_y, *dest_cb, *dest_cr;
3646 int dct_linesize, dct_offset;
3647 op_pixels_func (*op_pix)[4];
3648 qpel_mc_func (*op_qpix)[16];
3649 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3650 const int uvlinesize= s->current_picture.linesize[1];
3651 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3652 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3654 /* avoid copy if macroblock skipped in last frame too */
3655 /* skip only during decoding as we might trash the buffers during encoding a bit */
3657 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3658 const int age= s->current_picture.age;
3664 assert(s->pict_type!=I_TYPE);
3666 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
3667 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3669 /* if previous was skipped too, then nothing to do ! */
3670 if (*mbskip_ptr >= age && s->current_picture.reference){
3673 } else if(!s->current_picture.reference){
3674 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3675 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3677 *mbskip_ptr = 0; /* not skipped */
3681 dct_linesize = linesize << s->interlaced_dct;
3682 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3686 dest_cb= s->dest[1];
3687 dest_cr= s->dest[2];
3689 dest_y = s->b_scratchpad;
3690 dest_cb= s->b_scratchpad+16*linesize;
3691 dest_cr= s->b_scratchpad+32*linesize;
3695 /* motion handling */
3696 /* decoding or more than one mb_type (MC was allready done otherwise) */
3699 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3701 if (s->mv_dir & MV_DIR_FORWARD) {
3702 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3703 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3705 if (s->mv_dir & MV_DIR_BACKWARD) {
3706 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3709 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3710 op_pix = s->dsp.put_pixels_tab;
3711 op_qpix= s->dsp.put_qpel_pixels_tab;
3713 op_pix = s->dsp.put_no_rnd_pixels_tab;
3714 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3716 if (s->mv_dir & MV_DIR_FORWARD) {
3717 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3718 op_pix = s->dsp.avg_pixels_tab;
3719 op_qpix= s->dsp.avg_qpel_pixels_tab;
3721 if (s->mv_dir & MV_DIR_BACKWARD) {
3722 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3727 /* skip dequant / idct if we are really late ;) */
3728 if(s->hurry_up>1) return;
3730 /* add dct residue */
3731 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3732 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3733 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3734 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3735 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3736 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3738 if(!(s->flags&CODEC_FLAG_GRAY)){
3739 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3740 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3742 } else if(s->codec_id != CODEC_ID_WMV2){
3743 add_dct(s, block[0], 0, dest_y , dct_linesize);
3744 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3745 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3746 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
3748 if(!(s->flags&CODEC_FLAG_GRAY)){
3749 if(s->chroma_y_shift){//Chroma420
3750 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3751 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3754 dct_linesize = uvlinesize << s->interlaced_dct;
3755 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3757 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3758 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3759 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3760 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3761 if(!s->chroma_x_shift){//Chroma444
3762 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3763 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3764 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3765 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3772 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3776 /* dct only in intra block */
3777 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3778 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3779 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3780 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3781 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3783 if(!(s->flags&CODEC_FLAG_GRAY)){
3784 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3785 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3788 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3789 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3790 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3791 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3793 if(!(s->flags&CODEC_FLAG_GRAY)){
3794 if(s->chroma_y_shift){
3795 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3796 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3799 dct_linesize = uvlinesize << s->interlaced_dct;
3800 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3802 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3803 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3804 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3805 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3806 if(!s->chroma_x_shift){//Chroma444
3807 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3808 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3809 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3810 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3817 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3818 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3819 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3824 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
3825 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
3826 else MPV_decode_mb_internal(s, block, 0);
3829 #ifdef CONFIG_ENCODERS
3831 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3833 static const char tab[64]=
3845 DCTELEM *block= s->block[n];
3846 const int last_index= s->block_last_index[n];
3851 threshold= -threshold;
3855 /* are all which we could set to zero are allready zero? */
3856 if(last_index<=skip_dc - 1) return;
3858 for(i=0; i<=last_index; i++){
3859 const int j = s->intra_scantable.permutated[i];
3860 const int level = ABS(block[j]);
3862 if(skip_dc && i==0) continue;
3871 if(score >= threshold) return;
3872 for(i=skip_dc; i<=last_index; i++){
3873 const int j = s->intra_scantable.permutated[i];
3876 if(block[0]) s->block_last_index[n]= 0;
3877 else s->block_last_index[n]= -1;
3880 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3883 const int maxlevel= s->max_qcoeff;
3884 const int minlevel= s->min_qcoeff;
3888 i=1; //skip clipping of intra dc
3892 for(;i<=last_index; i++){
3893 const int j= s->intra_scantable.permutated[i];
3894 int level = block[j];
3896 if (level>maxlevel){
3899 }else if(level<minlevel){
3907 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3908 av_log(s->avctx, AV_LOG_INFO, "warning, cliping %d dct coefficents to %d..%d\n", overflow, minlevel, maxlevel);
3911 #endif //CONFIG_ENCODERS
3915 * @param h is the normal height, this will be reduced automatically if needed for the last row
3917 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3918 if (s->avctx->draw_horiz_band) {
3922 if(s->picture_structure != PICT_FRAME){
3925 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3928 h= FFMIN(h, s->avctx->height - y);
3930 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3931 src= (AVFrame*)s->current_picture_ptr;
3932 else if(s->last_picture_ptr)
3933 src= (AVFrame*)s->last_picture_ptr;
3937 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
3943 offset[0]= y * s->linesize;;
3945 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
3951 s->avctx->draw_horiz_band(s->avctx, src, offset,
3952 y, s->picture_structure, h);
3956 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
3957 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3958 const int uvlinesize= s->current_picture.linesize[1];
3959 const int mb_size= 4 - s->avctx->lowres;
3961 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
3962 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
3963 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
3964 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
3965 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3966 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;
3967 //block_index is not used by mpeg2, so it is not affected by chroma_format
3969 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
3970 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
3971 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
3973 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
3975 s->dest[0] += s->mb_y * linesize << mb_size;
3976 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
3977 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
3981 #ifdef CONFIG_ENCODERS
3983 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
3993 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
3994 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
3995 int v= ptr[x2 + y2*stride];
4001 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4006 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4008 int16_t weight[6][64];
4009 DCTELEM orig[6][64];
4010 const int mb_x= s->mb_x;
4011 const int mb_y= s->mb_y;
4014 int dct_offset = s->linesize*8; //default for progressive frames
4015 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4018 for(i=0; i<6; i++) skip_dct[i]=0;
4020 if(s->adaptive_quant){
4021 const int last_qp= s->qscale;
4022 const int mb_xy= mb_x + mb_y*s->mb_stride;
4024 s->lambda= s->lambda_table[mb_xy];
4027 if(!(s->flags&CODEC_FLAG_QP_RD)){
4028 s->dquant= s->qscale - last_qp;
4030 if(s->out_format==FMT_H263){
4031 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4033 if(s->codec_id==CODEC_ID_MPEG4){
4035 if(s->pict_type == B_TYPE){
4037 s->dquant= (s->dquant/2)*2;
4038 if(s->mv_dir&MV_DIRECT)
4041 if(s->mv_type==MV_TYPE_8X8)
4047 ff_set_qscale(s, last_qp + s->dquant);
4048 }else if(s->flags&CODEC_FLAG_QP_RD)
4049 ff_set_qscale(s, s->qscale + s->dquant);
4051 wrap_y = s->linesize;
4052 wrap_c = s->uvlinesize;
4053 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4054 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
4055 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
4057 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4058 uint8_t *ebuf= s->edge_emu_buffer + 32;
4059 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4061 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);
4062 ptr_cb= ebuf+18*wrap_y;
4063 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);
4064 ptr_cr= ebuf+18*wrap_y+8;
4068 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4069 int progressive_score, interlaced_score;
4071 s->interlaced_dct=0;
4072 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4073 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4075 if(progressive_score > 0){
4076 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4077 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4078 if(progressive_score > interlaced_score){
4079 s->interlaced_dct=1;
4087 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4088 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4089 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4090 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4092 if(s->flags&CODEC_FLAG_GRAY){
4096 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4097 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4100 op_pixels_func (*op_pix)[4];
4101 qpel_mc_func (*op_qpix)[16];
4102 uint8_t *dest_y, *dest_cb, *dest_cr;
4104 dest_y = s->dest[0];
4105 dest_cb = s->dest[1];
4106 dest_cr = s->dest[2];
4108 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4109 op_pix = s->dsp.put_pixels_tab;
4110 op_qpix= s->dsp.put_qpel_pixels_tab;
4112 op_pix = s->dsp.put_no_rnd_pixels_tab;
4113 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4116 if (s->mv_dir & MV_DIR_FORWARD) {
4117 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4118 op_pix = s->dsp.avg_pixels_tab;
4119 op_qpix= s->dsp.avg_qpel_pixels_tab;
4121 if (s->mv_dir & MV_DIR_BACKWARD) {
4122 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4125 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4126 int progressive_score, interlaced_score;
4128 s->interlaced_dct=0;
4129 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4130 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4132 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4134 if(progressive_score>0){
4135 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4136 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4138 if(progressive_score > interlaced_score){
4139 s->interlaced_dct=1;
4147 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4148 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4149 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4150 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4152 if(s->flags&CODEC_FLAG_GRAY){
4156 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4157 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4159 /* pre quantization */
4160 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4162 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4163 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4164 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4165 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;
4166 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4167 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4171 if(s->avctx->quantizer_noise_shaping){
4172 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4173 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4174 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4175 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4176 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4177 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4178 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
4181 /* DCT & quantize */
4182 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4187 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4188 // FIXME we could decide to change to quantizer instead of clipping
4189 // JS: I don't think that would be a good idea it could lower quality instead
4190 // of improve it. Just INTRADC clipping deserves changes in quantizer
4191 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4193 s->block_last_index[i]= -1;
4195 if(s->avctx->quantizer_noise_shaping){
4198 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4203 if(s->luma_elim_threshold && !s->mb_intra)
4205 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4206 if(s->chroma_elim_threshold && !s->mb_intra)
4208 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4210 if(s->flags & CODEC_FLAG_CBP_RD){
4212 if(s->block_last_index[i] == -1)
4213 s->coded_score[i]= INT_MAX/256;
4218 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4219 s->block_last_index[4]=
4220 s->block_last_index[5]= 0;
4222 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4225 //non c quantize code returns incorrect block_last_index FIXME
4226 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4229 if(s->block_last_index[i]>0){
4230 for(j=63; j>0; j--){
4231 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4233 s->block_last_index[i]= j;
4238 /* huffman encode */
4239 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4240 case CODEC_ID_MPEG1VIDEO:
4241 case CODEC_ID_MPEG2VIDEO:
4242 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4244 case CODEC_ID_MPEG4:
4245 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4246 case CODEC_ID_MSMPEG4V2:
4247 case CODEC_ID_MSMPEG4V3:
4249 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4251 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4253 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4255 case CODEC_ID_H263P:
4259 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4261 case CODEC_ID_MJPEG:
4262 mjpeg_encode_mb(s, s->block); break;
4268 #endif //CONFIG_ENCODERS
4270 void ff_mpeg_flush(AVCodecContext *avctx){
4272 MpegEncContext *s = avctx->priv_data;
4274 if(s==NULL || s->picture==NULL)
4277 for(i=0; i<MAX_PICTURE_COUNT; i++){
4278 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4279 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4280 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4282 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4284 s->mb_x= s->mb_y= 0;
4286 s->parse_context.state= -1;
4287 s->parse_context.frame_start_found= 0;
4288 s->parse_context.overread= 0;
4289 s->parse_context.overread_index= 0;
4290 s->parse_context.index= 0;
4291 s->parse_context.last_index= 0;
4292 s->bitstream_buffer_size=0;
4295 #ifdef CONFIG_ENCODERS
4296 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4298 const uint16_t *srcw= (uint16_t*)src;
4299 int words= length>>4;
4300 int bits= length&15;
4303 if(length==0) return;
4306 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4307 }else if(put_bits_count(pb)&7){
4308 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4310 for(i=0; put_bits_count(pb)&31; i++)
4311 put_bits(pb, 8, src[i]);
4313 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4314 skip_put_bytes(pb, 2*words-i);
4317 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4320 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4323 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4326 d->mb_skip_run= s->mb_skip_run;
4328 d->last_dc[i]= s->last_dc[i];
4331 d->mv_bits= s->mv_bits;
4332 d->i_tex_bits= s->i_tex_bits;
4333 d->p_tex_bits= s->p_tex_bits;
4334 d->i_count= s->i_count;
4335 d->f_count= s->f_count;
4336 d->b_count= s->b_count;
4337 d->skip_count= s->skip_count;
4338 d->misc_bits= s->misc_bits;
4342 d->qscale= s->qscale;
4343 d->dquant= s->dquant;
4346 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4349 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4350 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4353 d->mb_skip_run= s->mb_skip_run;
4355 d->last_dc[i]= s->last_dc[i];
4358 d->mv_bits= s->mv_bits;
4359 d->i_tex_bits= s->i_tex_bits;
4360 d->p_tex_bits= s->p_tex_bits;
4361 d->i_count= s->i_count;
4362 d->f_count= s->f_count;
4363 d->b_count= s->b_count;
4364 d->skip_count= s->skip_count;
4365 d->misc_bits= s->misc_bits;
4367 d->mb_intra= s->mb_intra;
4368 d->mb_skiped= s->mb_skiped;
4369 d->mv_type= s->mv_type;
4370 d->mv_dir= s->mv_dir;
4372 if(s->data_partitioning){
4374 d->tex_pb= s->tex_pb;
4378 d->block_last_index[i]= s->block_last_index[i];
4379 d->interlaced_dct= s->interlaced_dct;
4380 d->qscale= s->qscale;
4383 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4384 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4385 int *dmin, int *next_block, int motion_x, int motion_y)
4388 uint8_t *dest_backup[3];
4390 copy_context_before_encode(s, backup, type);
4392 s->block= s->blocks[*next_block];
4393 s->pb= pb[*next_block];
4394 if(s->data_partitioning){
4395 s->pb2 = pb2 [*next_block];
4396 s->tex_pb= tex_pb[*next_block];
4400 memcpy(dest_backup, s->dest, sizeof(s->dest));
4401 s->dest[0] = s->rd_scratchpad;
4402 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4403 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4404 assert(s->linesize >= 32); //FIXME
4407 encode_mb(s, motion_x, motion_y);
4409 score= put_bits_count(&s->pb);
4410 if(s->data_partitioning){
4411 score+= put_bits_count(&s->pb2);
4412 score+= put_bits_count(&s->tex_pb);
4415 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4416 MPV_decode_mb(s, s->block);
4418 score *= s->lambda2;
4419 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4423 memcpy(s->dest, dest_backup, sizeof(s->dest));
4430 copy_context_after_encode(best, s, type);
4434 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4435 uint32_t *sq = squareTbl + 256;
4440 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4441 else if(w==8 && h==8)
4442 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4446 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4455 static int sse_mb(MpegEncContext *s){
4459 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4460 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4463 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4464 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)
4465 +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)
4466 +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);
4468 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)
4469 +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)
4470 +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);
4473 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)
4474 +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)
4475 +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);
4478 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4479 MpegEncContext *s= arg;
4483 s->me.dia_size= s->avctx->pre_dia_size;
4484 s->first_slice_line=1;
4485 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4486 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4487 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4489 s->first_slice_line=0;
4497 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4498 MpegEncContext *s= arg;
4500 s->me.dia_size= s->avctx->dia_size;
4501 s->first_slice_line=1;
4502 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4503 s->mb_x=0; //for block init below
4504 ff_init_block_index(s);
4505 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4506 s->block_index[0]+=2;
4507 s->block_index[1]+=2;
4508 s->block_index[2]+=2;
4509 s->block_index[3]+=2;
4511 /* compute motion vector & mb_type and store in context */
4512 if(s->pict_type==B_TYPE)
4513 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4515 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4517 s->first_slice_line=0;
4522 static int mb_var_thread(AVCodecContext *c, void *arg){
4523 MpegEncContext *s= arg;
4526 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4527 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4530 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4532 int sum = s->dsp.pix_sum(pix, s->linesize);
4534 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4536 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4537 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4538 s->me.mb_var_sum_temp += varc;
4544 static void write_slice_end(MpegEncContext *s){
4545 if(s->codec_id==CODEC_ID_MPEG4){
4546 if(s->partitioned_frame){
4547 ff_mpeg4_merge_partitions(s);
4550 ff_mpeg4_stuffing(&s->pb);
4551 }else if(s->out_format == FMT_MJPEG){
4552 ff_mjpeg_stuffing(&s->pb);
4555 align_put_bits(&s->pb);
4556 flush_put_bits(&s->pb);
4559 static int encode_thread(AVCodecContext *c, void *arg){
4560 MpegEncContext *s= arg;
4561 int mb_x, mb_y, pdif = 0;
4563 MpegEncContext best_s, backup_s;
4564 uint8_t bit_buf[2][MAX_MB_BYTES];
4565 uint8_t bit_buf2[2][MAX_MB_BYTES];
4566 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4567 PutBitContext pb[2], pb2[2], tex_pb[2];
4568 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4571 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4572 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4573 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4576 s->last_bits= put_bits_count(&s->pb);
4587 /* init last dc values */
4588 /* note: quant matrix value (8) is implied here */
4589 s->last_dc[i] = 128 << s->intra_dc_precision;
4591 s->current_picture_ptr->error[i] = 0;
4594 memset(s->last_mv, 0, sizeof(s->last_mv));
4599 switch(s->codec_id){
4601 case CODEC_ID_H263P:
4603 s->gob_index = ff_h263_get_gob_height(s);
4605 case CODEC_ID_MPEG4:
4606 if(s->partitioned_frame)
4607 ff_mpeg4_init_partitions(s);
4614 s->first_slice_line = 1;
4615 s->ptr_lastgob = s->pb.buf;
4616 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4617 // printf("row %d at %X\n", s->mb_y, (int)s);
4621 ff_set_qscale(s, s->qscale);
4622 ff_init_block_index(s);
4624 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4625 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4626 int mb_type= s->mb_type[xy];
4631 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4632 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4635 if(s->data_partitioning){
4636 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4637 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4638 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4644 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4645 ff_update_block_index(s);
4647 if(s->codec_id == CODEC_ID_H261){
4648 ff_h261_reorder_mb_index(s);
4649 xy= s->mb_y*s->mb_stride + s->mb_x;
4650 mb_type= s->mb_type[xy];
4653 /* write gob / video packet header */
4656 int current_packet_size, is_gob_start;
4658 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4660 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4662 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4664 switch(s->codec_id){
4666 case CODEC_ID_H263P:
4667 if(!s->h263_slice_structured)
4668 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4670 case CODEC_ID_MPEG2VIDEO:
4671 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4672 case CODEC_ID_MPEG1VIDEO:
4673 if(s->mb_skip_run) is_gob_start=0;
4678 if(s->start_mb_y != mb_y || mb_x!=0){
4681 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4682 ff_mpeg4_init_partitions(s);
4686 assert((put_bits_count(&s->pb)&7) == 0);
4687 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4689 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4690 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
4691 int d= 100 / s->avctx->error_rate;
4693 current_packet_size=0;
4694 #ifndef ALT_BITSTREAM_WRITER
4695 s->pb.buf_ptr= s->ptr_lastgob;
4697 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4701 if (s->avctx->rtp_callback)
4702 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, 0);
4704 switch(s->codec_id){
4705 case CODEC_ID_MPEG4:
4706 ff_mpeg4_encode_video_packet_header(s);
4707 ff_mpeg4_clean_buffers(s);
4709 case CODEC_ID_MPEG1VIDEO:
4710 case CODEC_ID_MPEG2VIDEO:
4711 ff_mpeg1_encode_slice_header(s);
4712 ff_mpeg1_clean_buffers(s);
4715 case CODEC_ID_H263P:
4716 h263_encode_gob_header(s, mb_y);
4720 if(s->flags&CODEC_FLAG_PASS1){
4721 int bits= put_bits_count(&s->pb);
4722 s->misc_bits+= bits - s->last_bits;
4726 s->ptr_lastgob += current_packet_size;
4727 s->first_slice_line=1;
4728 s->resync_mb_x=mb_x;
4729 s->resync_mb_y=mb_y;
4734 if( (s->resync_mb_x == s->mb_x)
4735 && s->resync_mb_y+1 == s->mb_y){
4736 s->first_slice_line=0;
4740 s->dquant=0; //only for QP_RD
4742 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4744 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4746 copy_context_before_encode(&backup_s, s, -1);
4748 best_s.data_partitioning= s->data_partitioning;
4749 best_s.partitioned_frame= s->partitioned_frame;
4750 if(s->data_partitioning){
4751 backup_s.pb2= s->pb2;
4752 backup_s.tex_pb= s->tex_pb;
4755 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4756 s->mv_dir = MV_DIR_FORWARD;
4757 s->mv_type = MV_TYPE_16X16;
4759 s->mv[0][0][0] = s->p_mv_table[xy][0];
4760 s->mv[0][0][1] = s->p_mv_table[xy][1];
4761 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4762 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4764 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4765 s->mv_dir = MV_DIR_FORWARD;
4766 s->mv_type = MV_TYPE_FIELD;
4769 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4770 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4771 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4773 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4774 &dmin, &next_block, 0, 0);
4776 if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4777 s->mv_dir = MV_DIR_FORWARD;
4778 s->mv_type = MV_TYPE_16X16;
4782 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb,
4783 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4785 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4786 s->mv_dir = MV_DIR_FORWARD;
4787 s->mv_type = MV_TYPE_8X8;
4790 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4791 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4793 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4794 &dmin, &next_block, 0, 0);
4796 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4797 s->mv_dir = MV_DIR_FORWARD;
4798 s->mv_type = MV_TYPE_16X16;
4800 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4801 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4802 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4803 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4805 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4806 s->mv_dir = MV_DIR_BACKWARD;
4807 s->mv_type = MV_TYPE_16X16;
4809 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4810 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4811 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4812 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4814 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4815 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4816 s->mv_type = MV_TYPE_16X16;
4818 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4819 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4820 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4821 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4822 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4823 &dmin, &next_block, 0, 0);
4825 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4826 int mx= s->b_direct_mv_table[xy][0];
4827 int my= s->b_direct_mv_table[xy][1];
4829 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4832 ff_mpeg4_set_direct_mv(s, mx, my);
4834 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4835 &dmin, &next_block, mx, my);
4837 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4838 s->mv_dir = MV_DIR_FORWARD;
4839 s->mv_type = MV_TYPE_FIELD;
4842 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4843 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4844 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4846 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4847 &dmin, &next_block, 0, 0);
4849 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4850 s->mv_dir = MV_DIR_BACKWARD;
4851 s->mv_type = MV_TYPE_FIELD;
4854 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4855 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4856 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4858 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4859 &dmin, &next_block, 0, 0);
4861 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4862 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4863 s->mv_type = MV_TYPE_FIELD;
4865 for(dir=0; dir<2; dir++){
4867 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4868 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4869 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4872 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4873 &dmin, &next_block, 0, 0);
4875 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4877 s->mv_type = MV_TYPE_16X16;
4881 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4882 &dmin, &next_block, 0, 0);
4883 if(s->h263_pred || s->h263_aic){
4885 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4887 ff_clean_intra_table_entries(s); //old mode?
4891 if(s->flags & CODEC_FLAG_QP_RD){
4892 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4893 const int last_qp= backup_s.qscale;
4894 int dquant, dir, qp, dc[6];
4896 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4898 assert(backup_s.dquant == 0);
4901 s->mv_dir= best_s.mv_dir;
4902 s->mv_type = MV_TYPE_16X16;
4903 s->mb_intra= best_s.mb_intra;
4904 s->mv[0][0][0] = best_s.mv[0][0][0];
4905 s->mv[0][0][1] = best_s.mv[0][0][1];
4906 s->mv[1][0][0] = best_s.mv[1][0][0];
4907 s->mv[1][0][1] = best_s.mv[1][0][1];
4909 dir= s->pict_type == B_TYPE ? 2 : 1;
4910 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4911 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4912 qp= last_qp + dquant;
4913 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4915 backup_s.dquant= dquant;
4916 if(s->mb_intra && s->dc_val[0]){
4918 dc[i]= s->dc_val[0][ s->block_index[i] ];
4919 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4923 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4924 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4925 if(best_s.qscale != qp){
4926 if(s->mb_intra && s->dc_val[0]){
4928 s->dc_val[0][ s->block_index[i] ]= dc[i];
4929 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4932 if(dir > 0 && dquant==dir){
4940 s->current_picture.qscale_table[xy]= qp;
4944 copy_context_after_encode(s, &best_s, -1);
4946 pb_bits_count= put_bits_count(&s->pb);
4947 flush_put_bits(&s->pb);
4948 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
4951 if(s->data_partitioning){
4952 pb2_bits_count= put_bits_count(&s->pb2);
4953 flush_put_bits(&s->pb2);
4954 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
4955 s->pb2= backup_s.pb2;
4957 tex_pb_bits_count= put_bits_count(&s->tex_pb);
4958 flush_put_bits(&s->tex_pb);
4959 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
4960 s->tex_pb= backup_s.tex_pb;
4962 s->last_bits= put_bits_count(&s->pb);
4965 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4966 ff_h263_update_motion_val(s);
4969 if(next_block==0){ //FIXME 16 vs linesize16
4970 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
4971 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
4972 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
4975 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
4976 MPV_decode_mb(s, s->block);
4978 int motion_x, motion_y;
4979 s->mv_type=MV_TYPE_16X16;
4980 // only one MB-Type possible
4983 case CANDIDATE_MB_TYPE_INTRA:
4986 motion_x= s->mv[0][0][0] = 0;
4987 motion_y= s->mv[0][0][1] = 0;
4989 case CANDIDATE_MB_TYPE_INTER:
4990 s->mv_dir = MV_DIR_FORWARD;
4992 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
4993 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
4995 case CANDIDATE_MB_TYPE_INTER_I:
4996 s->mv_dir = MV_DIR_FORWARD;
4997 s->mv_type = MV_TYPE_FIELD;
5000 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5001 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5002 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5004 motion_x = motion_y = 0;
5006 case CANDIDATE_MB_TYPE_INTER4V:
5007 s->mv_dir = MV_DIR_FORWARD;
5008 s->mv_type = MV_TYPE_8X8;
5011 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5012 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5014 motion_x= motion_y= 0;
5016 case CANDIDATE_MB_TYPE_DIRECT:
5017 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5019 motion_x=s->b_direct_mv_table[xy][0];
5020 motion_y=s->b_direct_mv_table[xy][1];
5022 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5025 case CANDIDATE_MB_TYPE_BIDIR:
5026 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5030 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5031 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5032 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5033 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5035 case CANDIDATE_MB_TYPE_BACKWARD:
5036 s->mv_dir = MV_DIR_BACKWARD;
5038 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5039 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5041 case CANDIDATE_MB_TYPE_FORWARD:
5042 s->mv_dir = MV_DIR_FORWARD;
5044 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5045 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5046 // printf(" %d %d ", motion_x, motion_y);
5048 case CANDIDATE_MB_TYPE_FORWARD_I:
5049 s->mv_dir = MV_DIR_FORWARD;
5050 s->mv_type = MV_TYPE_FIELD;
5053 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5054 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5055 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5057 motion_x=motion_y=0;
5059 case CANDIDATE_MB_TYPE_BACKWARD_I:
5060 s->mv_dir = MV_DIR_BACKWARD;
5061 s->mv_type = MV_TYPE_FIELD;
5064 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5065 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5066 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5068 motion_x=motion_y=0;
5070 case CANDIDATE_MB_TYPE_BIDIR_I:
5071 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5072 s->mv_type = MV_TYPE_FIELD;
5074 for(dir=0; dir<2; dir++){
5076 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5077 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5078 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5081 motion_x=motion_y=0;
5084 motion_x=motion_y=0; //gcc warning fix
5085 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5088 encode_mb(s, motion_x, motion_y);
5090 // RAL: Update last macrobloc type
5091 s->last_mv_dir = s->mv_dir;
5094 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5095 ff_h263_update_motion_val(s);
5098 MPV_decode_mb(s, s->block);
5101 /* clean the MV table in IPS frames for direct mode in B frames */
5102 if(s->mb_intra /* && I,P,S_TYPE */){
5103 s->p_mv_table[xy][0]=0;
5104 s->p_mv_table[xy][1]=0;
5107 if(s->flags&CODEC_FLAG_PSNR){
5111 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5112 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5114 s->current_picture_ptr->error[0] += sse(
5115 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5116 s->dest[0], w, h, s->linesize);
5117 s->current_picture_ptr->error[1] += sse(
5118 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5119 s->dest[1], w>>1, h>>1, s->uvlinesize);
5120 s->current_picture_ptr->error[2] += sse(
5121 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5122 s->dest[2], w>>1, h>>1, s->uvlinesize);
5125 if(s->out_format == FMT_H263)
5126 ff_h263_loop_filter(s);
5128 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5133 //not beautifull here but we must write it before flushing so it has to be here
5134 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5135 msmpeg4_encode_ext_header(s);
5140 /* Send the last GOB if RTP */
5141 if (s->avctx->rtp_callback) {
5142 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5143 /* Call the RTP callback to send the last GOB */
5145 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, 0);
5151 #define MERGE(field) dst->field += src->field; src->field=0
5152 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5153 MERGE(me.scene_change_score);
5154 MERGE(me.mc_mb_var_sum_temp);
5155 MERGE(me.mb_var_sum_temp);
5158 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5161 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5162 MERGE(dct_count[1]);
5172 MERGE(padding_bug_score);
5174 if(dst->avctx->noise_reduction){
5175 for(i=0; i<64; i++){
5176 MERGE(dct_error_sum[0][i]);
5177 MERGE(dct_error_sum[1][i]);
5181 assert(put_bits_count(&src->pb) % 8 ==0);
5182 assert(put_bits_count(&dst->pb) % 8 ==0);
5183 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5184 flush_put_bits(&dst->pb);
5187 static void encode_picture(MpegEncContext *s, int picture_number)
5192 s->picture_number = picture_number;
5194 /* Reset the average MB variance */
5195 s->me.mb_var_sum_temp =
5196 s->me.mc_mb_var_sum_temp = 0;
5199 /* we need to initialize some time vars before we can encode b-frames */
5200 // RAL: Condition added for MPEG1VIDEO
5201 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5202 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5205 s->me.scene_change_score=0;
5207 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5209 if(s->pict_type==I_TYPE){
5210 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5211 else s->no_rounding=0;
5212 }else if(s->pict_type!=B_TYPE){
5213 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5214 s->no_rounding ^= 1;
5217 s->mb_intra=0; //for the rate distoration & bit compare functions
5218 for(i=1; i<s->avctx->thread_count; i++){
5219 ff_update_duplicate_context(s->thread_context[i], s);
5224 /* Estimate motion for every MB */
5225 if(s->pict_type != I_TYPE){
5226 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5227 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5228 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5232 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5233 }else /* if(s->pict_type == I_TYPE) */{
5235 for(i=0; i<s->mb_stride*s->mb_height; i++)
5236 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5238 if(!s->fixed_qscale){
5239 /* finding spatial complexity for I-frame rate control */
5240 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5243 for(i=1; i<s->avctx->thread_count; i++){
5244 merge_context_after_me(s, s->thread_context[i]);
5246 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5247 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5250 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5251 s->pict_type= I_TYPE;
5252 for(i=0; i<s->mb_stride*s->mb_height; i++)
5253 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5254 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5258 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5259 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5261 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5263 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5264 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5265 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5268 ff_fix_long_p_mvs(s);
5269 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5270 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5274 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5275 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5280 if(s->pict_type==B_TYPE){
5283 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5284 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5285 s->f_code = FFMAX(a, b);
5287 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5288 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5289 s->b_code = FFMAX(a, b);
5291 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5292 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5293 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5294 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5295 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5297 for(dir=0; dir<2; dir++){
5300 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5301 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5302 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5303 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5311 if (!s->fixed_qscale)
5312 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
5314 if(s->adaptive_quant){
5316 switch(s->codec_id){
5317 case CODEC_ID_MPEG4:
5318 ff_clean_mpeg4_qscales(s);
5321 case CODEC_ID_H263P:
5323 ff_clean_h263_qscales(s);
5328 s->lambda= s->lambda_table[0];
5331 s->lambda= s->current_picture.quality;
5332 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5335 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5336 s->qscale= 3; //reduce cliping problems
5338 if (s->out_format == FMT_MJPEG) {
5339 /* for mjpeg, we do include qscale in the matrix */
5340 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5342 int j= s->dsp.idct_permutation[i];
5344 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5346 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5347 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5351 //FIXME var duplication
5352 s->current_picture_ptr->key_frame=
5353 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5354 s->current_picture_ptr->pict_type=
5355 s->current_picture.pict_type= s->pict_type;
5357 if(s->current_picture.key_frame)
5358 s->picture_in_gop_number=0;
5360 s->last_bits= put_bits_count(&s->pb);
5361 switch(s->out_format) {
5363 mjpeg_picture_header(s);
5367 ff_h261_encode_picture_header(s, picture_number);
5370 if (s->codec_id == CODEC_ID_WMV2)
5371 ff_wmv2_encode_picture_header(s, picture_number);
5372 else if (s->h263_msmpeg4)
5373 msmpeg4_encode_picture_header(s, picture_number);
5374 else if (s->h263_pred)
5375 mpeg4_encode_picture_header(s, picture_number);
5376 else if (s->codec_id == CODEC_ID_RV10)
5377 rv10_encode_picture_header(s, picture_number);
5378 else if (s->codec_id == CODEC_ID_RV20)
5379 rv20_encode_picture_header(s, picture_number);
5380 else if (s->codec_id == CODEC_ID_FLV1)
5381 ff_flv_encode_picture_header(s, picture_number);
5383 h263_encode_picture_header(s, picture_number);
5387 mpeg1_encode_picture_header(s, picture_number);
5394 bits= put_bits_count(&s->pb);
5395 s->header_bits= bits - s->last_bits;
5397 for(i=1; i<s->avctx->thread_count; i++){
5398 update_duplicate_context_after_me(s->thread_context[i], s);
5400 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5401 for(i=1; i<s->avctx->thread_count; i++){
5402 merge_context_after_encode(s, s->thread_context[i]);
5407 #endif //CONFIG_ENCODERS
5409 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5410 const int intra= s->mb_intra;
5413 s->dct_count[intra]++;
5415 for(i=0; i<64; i++){
5416 int level= block[i];
5420 s->dct_error_sum[intra][i] += level;
5421 level -= s->dct_offset[intra][i];
5422 if(level<0) level=0;
5424 s->dct_error_sum[intra][i] -= level;
5425 level += s->dct_offset[intra][i];
5426 if(level>0) level=0;
5433 #ifdef CONFIG_ENCODERS
5435 static int dct_quantize_trellis_c(MpegEncContext *s,
5436 DCTELEM *block, int n,
5437 int qscale, int *overflow){
5439 const uint8_t *scantable= s->intra_scantable.scantable;
5440 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5442 unsigned int threshold1, threshold2;
5454 int coeff_count[64];
5455 int qmul, qadd, start_i, last_non_zero, i, dc;
5456 const int esc_length= s->ac_esc_length;
5458 uint8_t * last_length;
5459 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5461 s->dsp.fdct (block);
5463 if(s->dct_error_sum)
5464 s->denoise_dct(s, block);
5466 qadd= ((qscale-1)|1)*8;
5477 /* For AIC we skip quant/dequant of INTRADC */
5482 /* note: block[0] is assumed to be positive */
5483 block[0] = (block[0] + (q >> 1)) / q;
5486 qmat = s->q_intra_matrix[qscale];
5487 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5488 bias= 1<<(QMAT_SHIFT-1);
5489 length = s->intra_ac_vlc_length;
5490 last_length= s->intra_ac_vlc_last_length;
5494 qmat = s->q_inter_matrix[qscale];
5495 length = s->inter_ac_vlc_length;
5496 last_length= s->inter_ac_vlc_last_length;
5500 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5501 threshold2= (threshold1<<1);
5503 for(i=63; i>=start_i; i--) {
5504 const int j = scantable[i];
5505 int level = block[j] * qmat[j];
5507 if(((unsigned)(level+threshold1))>threshold2){
5513 for(i=start_i; i<=last_non_zero; i++) {
5514 const int j = scantable[i];
5515 int level = block[j] * qmat[j];
5517 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5518 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5519 if(((unsigned)(level+threshold1))>threshold2){
5521 level= (bias + level)>>QMAT_SHIFT;
5523 coeff[1][i]= level-1;
5524 // coeff[2][k]= level-2;
5526 level= (bias - level)>>QMAT_SHIFT;
5527 coeff[0][i]= -level;
5528 coeff[1][i]= -level+1;
5529 // coeff[2][k]= -level+2;
5531 coeff_count[i]= FFMIN(level, 2);
5532 assert(coeff_count[i]);
5535 coeff[0][i]= (level>>31)|1;
5540 *overflow= s->max_qcoeff < max; //overflow might have happend
5542 if(last_non_zero < start_i){
5543 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5544 return last_non_zero;
5547 score_tab[start_i]= 0;
5548 survivor[0]= start_i;
5551 for(i=start_i; i<=last_non_zero; i++){
5553 const int dct_coeff= ABS(block[ scantable[i] ]);
5554 const int zero_distoration= dct_coeff*dct_coeff;
5555 int best_score=256*256*256*120;
5556 for(level_index=0; level_index < coeff_count[i]; level_index++){
5558 int level= coeff[level_index][i];
5559 const int alevel= ABS(level);
5564 if(s->out_format == FMT_H263){
5565 unquant_coeff= alevel*qmul + qadd;
5567 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5569 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5570 unquant_coeff = (unquant_coeff - 1) | 1;
5572 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5573 unquant_coeff = (unquant_coeff - 1) | 1;
5578 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5580 if((level&(~127)) == 0){
5581 for(j=survivor_count-1; j>=0; j--){
5582 int run= i - survivor[j];
5583 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5584 score += score_tab[i-run];
5586 if(score < best_score){
5589 level_tab[i+1]= level-64;
5593 if(s->out_format == FMT_H263){
5594 for(j=survivor_count-1; j>=0; j--){
5595 int run= i - survivor[j];
5596 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5597 score += score_tab[i-run];
5598 if(score < last_score){
5601 last_level= level-64;
5607 distoration += esc_length*lambda;
5608 for(j=survivor_count-1; j>=0; j--){
5609 int run= i - survivor[j];
5610 int score= distoration + score_tab[i-run];
5612 if(score < best_score){
5615 level_tab[i+1]= level-64;
5619 if(s->out_format == FMT_H263){
5620 for(j=survivor_count-1; j>=0; j--){
5621 int run= i - survivor[j];
5622 int score= distoration + score_tab[i-run];
5623 if(score < last_score){
5626 last_level= level-64;
5634 score_tab[i+1]= best_score;
5636 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5637 if(last_non_zero <= 27){
5638 for(; survivor_count; survivor_count--){
5639 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5643 for(; survivor_count; survivor_count--){
5644 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5649 survivor[ survivor_count++ ]= i+1;
5652 if(s->out_format != FMT_H263){
5653 last_score= 256*256*256*120;
5654 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5655 int score= score_tab[i];
5656 if(i) score += lambda*2; //FIXME exacter?
5658 if(score < last_score){
5661 last_level= level_tab[i];
5662 last_run= run_tab[i];
5667 s->coded_score[n] = last_score;
5670 last_non_zero= last_i - 1;
5671 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5673 if(last_non_zero < start_i)
5674 return last_non_zero;
5676 if(last_non_zero == 0 && start_i == 0){
5678 int best_score= dc * dc;
5680 for(i=0; i<coeff_count[0]; i++){
5681 int level= coeff[i][0];
5682 int alevel= ABS(level);
5683 int unquant_coeff, score, distortion;
5685 if(s->out_format == FMT_H263){
5686 unquant_coeff= (alevel*qmul + qadd)>>3;
5688 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5689 unquant_coeff = (unquant_coeff - 1) | 1;
5691 unquant_coeff = (unquant_coeff + 4) >> 3;
5692 unquant_coeff<<= 3 + 3;
5694 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5696 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5697 else score= distortion + esc_length*lambda;
5699 if(score < best_score){
5701 best_level= level - 64;
5704 block[0]= best_level;
5705 s->coded_score[n] = best_score - dc*dc;
5706 if(best_level == 0) return -1;
5707 else return last_non_zero;
5713 block[ perm_scantable[last_non_zero] ]= last_level;
5716 for(; i>start_i; i -= run_tab[i] + 1){
5717 block[ perm_scantable[i-1] ]= level_tab[i];
5720 return last_non_zero;
5723 //#define REFINE_STATS 1
5724 static int16_t basis[64][64];
5726 static void build_basis(uint8_t *perm){
5733 double s= 0.25*(1<<BASIS_SHIFT);
5735 int perm_index= perm[index];
5736 if(i==0) s*= sqrt(0.5);
5737 if(j==0) s*= sqrt(0.5);
5738 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)));
5745 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5746 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5749 DCTELEM d1[64] __align16;
5751 const uint8_t *scantable= s->intra_scantable.scantable;
5752 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5753 // unsigned int threshold1, threshold2;
5758 int qmul, qadd, start_i, last_non_zero, i, dc;
5760 uint8_t * last_length;
5762 int rle_index, run, q, sum;
5765 static int after_last=0;
5766 static int to_zero=0;
5767 static int from_zero=0;
5770 static int messed_sign=0;
5773 if(basis[0][0] == 0)
5774 build_basis(s->dsp.idct_permutation);
5785 /* For AIC we skip quant/dequant of INTRADC */
5789 q <<= RECON_SHIFT-3;
5790 /* note: block[0] is assumed to be positive */
5792 // block[0] = (block[0] + (q >> 1)) / q;
5794 qmat = s->q_intra_matrix[qscale];
5795 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5796 // bias= 1<<(QMAT_SHIFT-1);
5797 length = s->intra_ac_vlc_length;
5798 last_length= s->intra_ac_vlc_last_length;
5802 qmat = s->q_inter_matrix[qscale];
5803 length = s->inter_ac_vlc_length;
5804 last_length= s->inter_ac_vlc_last_length;
5806 last_non_zero = s->block_last_index[n];
5811 dc += (1<<(RECON_SHIFT-1));
5812 for(i=0; i<64; i++){
5813 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly insteadof copying to rem[]
5816 STOP_TIMER("memset rem[]")}
5819 for(i=0; i<64; i++){
5824 w= ABS(weight[i]) + qns*one;
5825 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5828 // w=weight[i] = (63*qns + (w/2)) / w;
5834 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5840 for(i=start_i; i<=last_non_zero; i++){
5841 int j= perm_scantable[i];
5842 const int level= block[j];
5846 if(level<0) coeff= qmul*level - qadd;
5847 else coeff= qmul*level + qadd;
5848 run_tab[rle_index++]=run;
5851 s->dsp.add_8x8basis(rem, basis[j], coeff);
5857 if(last_non_zero>0){
5858 STOP_TIMER("init rem[]")
5865 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5868 int run2, best_unquant_change=0, analyze_gradient;
5872 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5874 if(analyze_gradient){
5878 for(i=0; i<64; i++){
5881 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5884 STOP_TIMER("rem*w*w")}
5894 const int level= block[0];
5895 int change, old_coeff;
5897 assert(s->mb_intra);
5901 for(change=-1; change<=1; change+=2){
5902 int new_level= level + change;
5903 int score, new_coeff;
5905 new_coeff= q*new_level;
5906 if(new_coeff >= 2048 || new_coeff < 0)
5909 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5910 if(score<best_score){
5913 best_change= change;
5914 best_unquant_change= new_coeff - old_coeff;
5921 run2= run_tab[rle_index++];
5925 for(i=start_i; i<64; i++){
5926 int j= perm_scantable[i];
5927 const int level= block[j];
5928 int change, old_coeff;
5930 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
5934 if(level<0) old_coeff= qmul*level - qadd;
5935 else old_coeff= qmul*level + qadd;
5936 run2= run_tab[rle_index++]; //FIXME ! maybe after last
5940 assert(run2>=0 || i >= last_non_zero );
5943 for(change=-1; change<=1; change+=2){
5944 int new_level= level + change;
5945 int score, new_coeff, unquant_change;
5948 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
5952 if(new_level<0) new_coeff= qmul*new_level - qadd;
5953 else new_coeff= qmul*new_level + qadd;
5954 if(new_coeff >= 2048 || new_coeff <= -2048)
5956 //FIXME check for overflow
5959 if(level < 63 && level > -63){
5960 if(i < last_non_zero)
5961 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
5962 - length[UNI_AC_ENC_INDEX(run, level+64)];
5964 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
5965 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
5968 assert(ABS(new_level)==1);
5970 if(analyze_gradient){
5971 int g= d1[ scantable[i] ];
5972 if(g && (g^new_level) >= 0)
5976 if(i < last_non_zero){
5977 int next_i= i + run2 + 1;
5978 int next_level= block[ perm_scantable[next_i] ] + 64;
5980 if(next_level&(~127))
5983 if(next_i < last_non_zero)
5984 score += length[UNI_AC_ENC_INDEX(run, 65)]
5985 + length[UNI_AC_ENC_INDEX(run2, next_level)]
5986 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5988 score += length[UNI_AC_ENC_INDEX(run, 65)]
5989 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5990 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5992 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
5994 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5995 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6001 assert(ABS(level)==1);
6003 if(i < last_non_zero){
6004 int next_i= i + run2 + 1;
6005 int next_level= block[ perm_scantable[next_i] ] + 64;
6007 if(next_level&(~127))
6010 if(next_i < last_non_zero)
6011 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6012 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6013 - length[UNI_AC_ENC_INDEX(run, 65)];
6015 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6016 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6017 - length[UNI_AC_ENC_INDEX(run, 65)];
6019 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6021 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6022 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6029 unquant_change= new_coeff - old_coeff;
6030 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6032 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6033 if(score<best_score){
6036 best_change= change;
6037 best_unquant_change= unquant_change;
6041 prev_level= level + 64;
6042 if(prev_level&(~127))
6051 STOP_TIMER("iterative step")}
6055 int j= perm_scantable[ best_coeff ];
6057 block[j] += best_change;
6059 if(best_coeff > last_non_zero){
6060 last_non_zero= best_coeff;
6068 if(block[j] - best_change){
6069 if(ABS(block[j]) > ABS(block[j] - best_change)){
6081 for(; last_non_zero>=start_i; last_non_zero--){
6082 if(block[perm_scantable[last_non_zero]])
6088 if(256*256*256*64 % count == 0){
6089 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);
6094 for(i=start_i; i<=last_non_zero; i++){
6095 int j= perm_scantable[i];
6096 const int level= block[j];
6099 run_tab[rle_index++]=run;
6106 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6112 if(last_non_zero>0){
6113 STOP_TIMER("iterative search")
6118 return last_non_zero;
6121 static int dct_quantize_c(MpegEncContext *s,
6122 DCTELEM *block, int n,
6123 int qscale, int *overflow)
6125 int i, j, level, last_non_zero, q, start_i;
6127 const uint8_t *scantable= s->intra_scantable.scantable;
6130 unsigned int threshold1, threshold2;
6132 s->dsp.fdct (block);
6134 if(s->dct_error_sum)
6135 s->denoise_dct(s, block);
6145 /* For AIC we skip quant/dequant of INTRADC */
6148 /* note: block[0] is assumed to be positive */
6149 block[0] = (block[0] + (q >> 1)) / q;
6152 qmat = s->q_intra_matrix[qscale];
6153 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6157 qmat = s->q_inter_matrix[qscale];
6158 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6160 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6161 threshold2= (threshold1<<1);
6162 for(i=63;i>=start_i;i--) {
6164 level = block[j] * qmat[j];
6166 if(((unsigned)(level+threshold1))>threshold2){
6173 for(i=start_i; i<=last_non_zero; i++) {
6175 level = block[j] * qmat[j];
6177 // if( bias+level >= (1<<QMAT_SHIFT)
6178 // || bias-level >= (1<<QMAT_SHIFT)){
6179 if(((unsigned)(level+threshold1))>threshold2){
6181 level= (bias + level)>>QMAT_SHIFT;
6184 level= (bias - level)>>QMAT_SHIFT;
6192 *overflow= s->max_qcoeff < max; //overflow might have happend
6194 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6195 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6196 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6198 return last_non_zero;
6201 #endif //CONFIG_ENCODERS
6203 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6204 DCTELEM *block, int n, int qscale)
6206 int i, level, nCoeffs;
6207 const uint16_t *quant_matrix;
6209 nCoeffs= s->block_last_index[n];
6212 block[0] = block[0] * s->y_dc_scale;
6214 block[0] = block[0] * s->c_dc_scale;
6215 /* XXX: only mpeg1 */
6216 quant_matrix = s->intra_matrix;
6217 for(i=1;i<=nCoeffs;i++) {
6218 int j= s->intra_scantable.permutated[i];
6223 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6224 level = (level - 1) | 1;
6227 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6228 level = (level - 1) | 1;
6235 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6236 DCTELEM *block, int n, int qscale)
6238 int i, level, nCoeffs;
6239 const uint16_t *quant_matrix;
6241 nCoeffs= s->block_last_index[n];
6243 quant_matrix = s->inter_matrix;
6244 for(i=0; i<=nCoeffs; i++) {
6245 int j= s->intra_scantable.permutated[i];
6250 level = (((level << 1) + 1) * qscale *
6251 ((int) (quant_matrix[j]))) >> 4;
6252 level = (level - 1) | 1;
6255 level = (((level << 1) + 1) * qscale *
6256 ((int) (quant_matrix[j]))) >> 4;
6257 level = (level - 1) | 1;
6264 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6265 DCTELEM *block, int n, int qscale)
6267 int i, level, nCoeffs;
6268 const uint16_t *quant_matrix;
6270 if(s->alternate_scan) nCoeffs= 63;
6271 else nCoeffs= s->block_last_index[n];
6274 block[0] = block[0] * s->y_dc_scale;
6276 block[0] = block[0] * s->c_dc_scale;
6277 quant_matrix = s->intra_matrix;
6278 for(i=1;i<=nCoeffs;i++) {
6279 int j= s->intra_scantable.permutated[i];
6284 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6287 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6294 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6295 DCTELEM *block, int n, int qscale)
6297 int i, level, nCoeffs;
6298 const uint16_t *quant_matrix;
6301 if(s->alternate_scan) nCoeffs= 63;
6302 else nCoeffs= s->block_last_index[n];
6304 quant_matrix = s->inter_matrix;
6305 for(i=0; i<=nCoeffs; i++) {
6306 int j= s->intra_scantable.permutated[i];
6311 level = (((level << 1) + 1) * qscale *
6312 ((int) (quant_matrix[j]))) >> 4;
6315 level = (((level << 1) + 1) * qscale *
6316 ((int) (quant_matrix[j]))) >> 4;
6325 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6326 DCTELEM *block, int n, int qscale)
6328 int i, level, qmul, qadd;
6331 assert(s->block_last_index[n]>=0);
6337 block[0] = block[0] * s->y_dc_scale;
6339 block[0] = block[0] * s->c_dc_scale;
6340 qadd = (qscale - 1) | 1;
6347 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6349 for(i=1; i<=nCoeffs; i++) {
6353 level = level * qmul - qadd;
6355 level = level * qmul + qadd;
6362 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6363 DCTELEM *block, int n, int qscale)
6365 int i, level, qmul, qadd;
6368 assert(s->block_last_index[n]>=0);
6370 qadd = (qscale - 1) | 1;
6373 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6375 for(i=0; i<=nCoeffs; i++) {
6379 level = level * qmul - qadd;
6381 level = level * qmul + qadd;
6388 static const AVOption mpeg4_options[] =
6390 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
6391 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
6392 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
6393 bit_rate_tolerance, 4, 240000000, 8000),
6394 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
6395 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
6396 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
6397 rc_eq, "tex^qComp,option1,options2", 0),
6398 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
6399 rc_min_rate, 4, 24000000, 0),
6400 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
6401 rc_max_rate, 4, 24000000, 0),
6402 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
6403 rc_buffer_aggressivity, 4, 24000000, 0),
6404 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
6405 rc_initial_cplx, 0., 9999999., 0),
6406 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
6407 i_quant_factor, 0., 0., 0),
6408 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
6409 i_quant_factor, -999999., 999999., 0),
6410 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
6411 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
6412 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
6413 lumi_masking, 0., 999999., 0),
6414 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
6415 temporal_cplx_masking, 0., 999999., 0),
6416 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
6417 spatial_cplx_masking, 0., 999999., 0),
6418 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
6419 p_masking, 0., 999999., 0),
6420 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
6421 dark_masking, 0., 999999., 0),
6422 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
6423 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
6425 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
6427 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
6430 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
6431 me_cmp, 0, 24000000, 0),
6432 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
6433 me_sub_cmp, 0, 24000000, 0),
6436 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
6437 dia_size, 0, 24000000, 0),
6438 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
6439 last_predictor_count, 0, 24000000, 0),
6441 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
6442 pre_me, 0, 24000000, 0),
6443 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
6444 me_pre_cmp, 0, 24000000, 0),
6446 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
6447 me_range, 0, 24000000, 0),
6448 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
6449 pre_dia_size, 0, 24000000, 0),
6450 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
6451 me_subpel_quality, 0, 24000000, 0),
6452 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
6453 me_range, 0, 24000000, 0),
6454 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
6455 flags, CODEC_FLAG_PSNR, 0),
6456 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
6458 AVOPTION_SUB(avoptions_common),
6462 #ifdef CONFIG_ENCODERS
6464 AVCodec h263_encoder = {
6468 sizeof(MpegEncContext),
6474 AVCodec h263p_encoder = {
6478 sizeof(MpegEncContext),
6484 AVCodec flv_encoder = {
6488 sizeof(MpegEncContext),
6494 AVCodec rv10_encoder = {
6498 sizeof(MpegEncContext),
6504 AVCodec rv20_encoder = {
6508 sizeof(MpegEncContext),
6514 AVCodec mpeg4_encoder = {
6518 sizeof(MpegEncContext),
6522 .options = mpeg4_options,
6523 .capabilities= CODEC_CAP_DELAY,
6526 AVCodec msmpeg4v1_encoder = {
6530 sizeof(MpegEncContext),
6534 .options = mpeg4_options,
6537 AVCodec msmpeg4v2_encoder = {
6541 sizeof(MpegEncContext),
6545 .options = mpeg4_options,
6548 AVCodec msmpeg4v3_encoder = {
6552 sizeof(MpegEncContext),
6556 .options = mpeg4_options,
6559 AVCodec wmv1_encoder = {
6563 sizeof(MpegEncContext),
6567 .options = mpeg4_options,
6572 AVCodec mjpeg_encoder = {
6576 sizeof(MpegEncContext),
6582 #endif //CONFIG_ENCODERS