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 file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
27 * The simplest mpeg encoder (well, it was the simplest!).
32 #include "mpegvideo.h"
37 #include "libvo/fastmemcpy.h"
43 #ifdef CONFIG_ENCODERS
44 static int encode_picture(MpegEncContext *s, int picture_number);
45 #endif //CONFIG_ENCODERS
46 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
57 DCTELEM *block, int n, int qscale);
58 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
59 DCTELEM *block, int n, int qscale);
60 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
61 #ifdef CONFIG_ENCODERS
62 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
63 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
64 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
65 static int sse_mb(MpegEncContext *s);
66 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
67 #endif //CONFIG_ENCODERS
70 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
71 extern void XVMC_field_end(MpegEncContext *s);
72 extern void XVMC_decode_mb(MpegEncContext *s);
75 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
78 /* enable all paranoid tests for rounding, overflows, etc... */
84 /* for jpeg fast DCT */
87 static const uint16_t aanscales[64] = {
88 /* precomputed values scaled up by 14 bits */
89 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
90 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
91 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
92 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
93 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
94 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
95 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
96 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
99 static const uint8_t h263_chroma_roundtab[16] = {
100 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
101 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
104 static const uint8_t ff_default_chroma_qscale_table[32]={
105 // 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
106 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
109 #ifdef CONFIG_ENCODERS
110 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
111 static uint8_t default_fcode_tab[MAX_MV*2+1];
113 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
115 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
116 const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
121 for(qscale=qmin; qscale<=qmax; qscale++){
123 if (dsp->fdct == ff_jpeg_fdct_islow
124 #ifdef FAAN_POSTSCALE
125 || dsp->fdct == ff_faandct
129 const int j= dsp->idct_permutation[i];
130 /* 16 <= qscale * quant_matrix[i] <= 7905 */
131 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
132 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
133 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
135 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
136 (qscale * quant_matrix[j]));
138 } else if (dsp->fdct == fdct_ifast
139 #ifndef FAAN_POSTSCALE
140 || dsp->fdct == ff_faandct
144 const int j= dsp->idct_permutation[i];
145 /* 16 <= qscale * quant_matrix[i] <= 7905 */
146 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
147 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
148 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
150 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
151 (aanscales[i] * qscale * quant_matrix[j]));
155 const int j= dsp->idct_permutation[i];
156 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
157 So 16 <= qscale * quant_matrix[i] <= 7905
158 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
159 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
161 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
162 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
163 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
165 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
166 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
170 for(i=intra; i<64; i++){
172 if (dsp->fdct == fdct_ifast
173 #ifndef FAAN_POSTSCALE
174 || dsp->fdct == ff_faandct
177 max= (8191LL*aanscales[i]) >> 14;
179 while(((max * qmat[qscale][i]) >> shift) > INT_MAX){
185 av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger then %d, overflows possible\n", QMAT_SHIFT - shift);
189 static inline void update_qscale(MpegEncContext *s){
190 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
191 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
193 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
195 #endif //CONFIG_ENCODERS
197 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
201 st->scantable= src_scantable;
205 j = src_scantable[i];
206 st->permutated[i] = permutation[j];
215 j = st->permutated[i];
217 st->raster_end[i]= end;
221 #ifdef CONFIG_ENCODERS
222 void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix){
228 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
233 #endif //CONFIG_ENCODERS
235 const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
243 uint32_t tmp= *state << 8;
244 *state= tmp + *(p++);
245 if(tmp == 0x100 || p==end)
250 if (p[-1] > 1 ) p+= 3;
251 else if(p[-2] ) p+= 2;
252 else if(p[-3]|(p[-1]-1)) p++;
260 *state= be2me_32(unaligned32(p));
265 /* init common dct for both encoder and decoder */
266 int DCT_common_init(MpegEncContext *s)
268 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
269 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
270 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
271 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
272 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
273 if(s->flags & CODEC_FLAG_BITEXACT)
274 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
275 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
277 #ifdef CONFIG_ENCODERS
278 s->dct_quantize= dct_quantize_c;
279 s->denoise_dct= denoise_dct_c;
280 #endif //CONFIG_ENCODERS
283 MPV_common_init_mmx(s);
286 MPV_common_init_axp(s);
289 MPV_common_init_mlib(s);
292 MPV_common_init_mmi(s);
295 MPV_common_init_armv4l(s);
298 MPV_common_init_ppc(s);
301 #ifdef CONFIG_ENCODERS
302 s->fast_dct_quantize= s->dct_quantize;
304 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
305 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
308 #endif //CONFIG_ENCODERS
310 /* load & permutate scantables
311 note: only wmv uses different ones
313 if(s->alternate_scan){
314 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
315 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
317 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
318 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
320 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
321 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
326 static void copy_picture(Picture *dst, Picture *src){
328 dst->type= FF_BUFFER_TYPE_COPY;
331 #ifdef CONFIG_ENCODERS
332 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
335 dst->pict_type = src->pict_type;
336 dst->quality = src->quality;
337 dst->coded_picture_number = src->coded_picture_number;
338 dst->display_picture_number = src->display_picture_number;
339 // dst->reference = src->reference;
341 dst->interlaced_frame = src->interlaced_frame;
342 dst->top_field_first = src->top_field_first;
344 if(s->avctx->me_threshold){
345 if(!src->motion_val[0])
346 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
348 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
349 if(!src->ref_index[0])
350 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
351 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
352 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
353 src->motion_subsample_log2, dst->motion_subsample_log2);
355 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
358 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
359 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
361 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
362 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
364 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
365 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
373 * allocates a Picture
374 * The pixels are allocated/set by calling get_buffer() if shared=0
376 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
377 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
378 const int mb_array_size= s->mb_stride*s->mb_height;
379 const int b8_array_size= s->b8_stride*s->mb_height*2;
380 const int b4_array_size= s->b4_stride*s->mb_height*4;
384 assert(pic->data[0]);
385 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
386 pic->type= FF_BUFFER_TYPE_SHARED;
390 assert(!pic->data[0]);
392 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
394 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
395 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
399 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
400 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
404 if(pic->linesize[1] != pic->linesize[2]){
405 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
409 s->linesize = pic->linesize[0];
410 s->uvlinesize= pic->linesize[1];
413 if(pic->qscale_table==NULL){
415 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
416 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
417 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
420 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
421 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
422 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
423 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
424 if(s->out_format == FMT_H264){
426 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t))
427 pic->motion_val[i]= pic->motion_val_base[i]+4;
428 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
430 pic->motion_subsample_log2= 2;
431 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
433 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
434 pic->motion_val[i]= pic->motion_val_base[i]+4;
435 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
437 pic->motion_subsample_log2= 3;
439 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
440 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
442 pic->qstride= s->mb_stride;
443 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
446 //it might be nicer if the application would keep track of these but it would require a API change
447 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
448 s->prev_pict_types[0]= s->pict_type;
449 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
450 pic->age= INT_MAX; // skipped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
453 fail: //for the CHECKED_ALLOCZ macro
458 * deallocates a picture
460 static void free_picture(MpegEncContext *s, Picture *pic){
463 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
464 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
467 av_freep(&pic->mb_var);
468 av_freep(&pic->mc_mb_var);
469 av_freep(&pic->mb_mean);
470 av_freep(&pic->mbskip_table);
471 av_freep(&pic->qscale_table);
472 av_freep(&pic->mb_type_base);
473 av_freep(&pic->dct_coeff);
474 av_freep(&pic->pan_scan);
477 av_freep(&pic->motion_val_base[i]);
478 av_freep(&pic->ref_index[i]);
481 if(pic->type == FF_BUFFER_TYPE_SHARED){
490 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
493 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
494 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*21*2); //(width + edge + align)*interlaced*MBsize*tolerance
495 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
497 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
498 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
499 s->rd_scratchpad= s->me.scratchpad;
500 s->b_scratchpad= s->me.scratchpad;
501 s->obmc_scratchpad= s->me.scratchpad + 16;
503 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
504 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
505 if(s->avctx->noise_reduction){
506 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
509 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
510 s->block= s->blocks[0];
513 s->pblocks[i] = (short *)(&s->block[i]);
517 return -1; //free() through MPV_common_end()
520 static void free_duplicate_context(MpegEncContext *s){
523 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
524 av_freep(&s->me.scratchpad);
527 s->obmc_scratchpad= NULL;
529 av_freep(&s->dct_error_sum);
530 av_freep(&s->me.map);
531 av_freep(&s->me.score_map);
532 av_freep(&s->blocks);
536 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
537 #define COPY(a) bak->a= src->a
538 COPY(allocated_edge_emu_buffer);
539 COPY(edge_emu_buffer);
543 COPY(obmc_scratchpad);
550 COPY(me.map_generation);
558 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
561 //FIXME copy only needed parts
563 backup_duplicate_context(&bak, dst);
564 memcpy(dst, src, sizeof(MpegEncContext));
565 backup_duplicate_context(dst, &bak);
567 dst->pblocks[i] = (short *)(&dst->block[i]);
569 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
572 #ifdef CONFIG_ENCODERS
573 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
574 #define COPY(a) dst->a= src->a
576 COPY(current_picture);
582 COPY(picture_in_gop_number);
583 COPY(gop_picture_number);
584 COPY(frame_pred_frame_dct); //FIXME don't set in encode_header
585 COPY(progressive_frame); //FIXME don't set in encode_header
586 COPY(partitioned_frame); //FIXME don't set in encode_header
592 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
593 * the changed fields will not depend upon the prior state of the MpegEncContext.
595 static void MPV_common_defaults(MpegEncContext *s){
597 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
598 s->chroma_qscale_table= ff_default_chroma_qscale_table;
599 s->progressive_frame= 1;
600 s->progressive_sequence= 1;
601 s->picture_structure= PICT_FRAME;
603 s->coded_picture_number = 0;
604 s->picture_number = 0;
605 s->input_picture_number = 0;
607 s->picture_in_gop_number = 0;
614 * sets the given MpegEncContext to defaults for decoding.
615 * the changed fields will not depend upon the prior state of the MpegEncContext.
617 void MPV_decode_defaults(MpegEncContext *s){
618 MPV_common_defaults(s);
622 * sets the given MpegEncContext to defaults for encoding.
623 * the changed fields will not depend upon the prior state of the MpegEncContext.
626 #ifdef CONFIG_ENCODERS
627 static void MPV_encode_defaults(MpegEncContext *s){
630 MPV_common_defaults(s);
636 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
637 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
639 for(i=-16; i<16; i++){
640 default_fcode_tab[i + MAX_MV]= 1;
643 s->me.mv_penalty= default_mv_penalty;
644 s->fcode_tab= default_fcode_tab;
646 #endif //CONFIG_ENCODERS
649 * init common structure for both encoder and decoder.
650 * this assumes that some variables like width/height are already set
652 int MPV_common_init(MpegEncContext *s)
654 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
656 s->mb_height = (s->height + 15) / 16;
658 if(s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height)){
659 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
663 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
666 dsputil_init(&s->dsp, s->avctx);
669 s->flags= s->avctx->flags;
670 s->flags2= s->avctx->flags2;
672 s->mb_width = (s->width + 15) / 16;
673 s->mb_stride = s->mb_width + 1;
674 s->b8_stride = s->mb_width*2 + 1;
675 s->b4_stride = s->mb_width*4 + 1;
676 mb_array_size= s->mb_height * s->mb_stride;
677 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
679 /* set chroma shifts */
680 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
681 &(s->chroma_y_shift) );
683 /* set default edge pos, will be overriden in decode_header if needed */
684 s->h_edge_pos= s->mb_width*16;
685 s->v_edge_pos= s->mb_height*16;
687 s->mb_num = s->mb_width * s->mb_height;
692 s->block_wrap[3]= s->b8_stride;
694 s->block_wrap[5]= s->mb_stride;
696 y_size = s->b8_stride * (2 * s->mb_height + 1);
697 c_size = s->mb_stride * (s->mb_height + 1);
698 yc_size = y_size + 2 * c_size;
700 /* convert fourcc to upper case */
701 s->codec_tag= toupper( s->avctx->codec_tag &0xFF)
702 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
703 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
704 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
706 s->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
707 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
708 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
709 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
711 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
713 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
714 for(y=0; y<s->mb_height; y++){
715 for(x=0; x<s->mb_width; x++){
716 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
719 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
722 /* Allocate MV tables */
723 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
724 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
725 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
726 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
727 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
728 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
729 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
730 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
731 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
732 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
733 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
734 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
736 if(s->msmpeg4_version){
737 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
739 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
741 /* Allocate MB type table */
742 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
744 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
746 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
747 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
748 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
749 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
750 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
751 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
753 if(s->avctx->noise_reduction){
754 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
757 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
759 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
761 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
762 /* interlaced direct mode decoding tables */
767 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
768 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
770 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
771 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
772 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
774 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
777 if (s->out_format == FMT_H263) {
779 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
780 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
781 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
782 s->ac_val[2] = s->ac_val[1] + c_size;
785 CHECKED_ALLOCZ(s->coded_block_base, y_size);
786 s->coded_block= s->coded_block_base + s->b8_stride + 1;
788 /* cbp, ac_pred, pred_dir */
789 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
790 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
793 if (s->h263_pred || s->h263_plus || !s->encoding) {
795 //MN: we need these for error resilience of intra-frames
796 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
797 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
798 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
799 s->dc_val[2] = s->dc_val[1] + c_size;
800 for(i=0;i<yc_size;i++)
801 s->dc_val_base[i] = 1024;
804 /* which mb is a intra block */
805 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
806 memset(s->mbintra_table, 1, mb_array_size);
808 /* init macroblock skip table */
809 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
810 //Note the +1 is for a quicker mpeg4 slice_end detection
811 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
813 s->parse_context.state= -1;
814 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
815 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
816 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
817 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
820 s->context_initialized = 1;
822 s->thread_context[0]= s;
823 for(i=1; i<s->avctx->thread_count; i++){
824 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
825 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
828 for(i=0; i<s->avctx->thread_count; i++){
829 if(init_duplicate_context(s->thread_context[i], s) < 0)
831 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
832 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
841 /* init common structure for both encoder and decoder */
842 void MPV_common_end(MpegEncContext *s)
846 for(i=0; i<s->avctx->thread_count; i++){
847 free_duplicate_context(s->thread_context[i]);
849 for(i=1; i<s->avctx->thread_count; i++){
850 av_freep(&s->thread_context[i]);
853 av_freep(&s->parse_context.buffer);
854 s->parse_context.buffer_size=0;
856 av_freep(&s->mb_type);
857 av_freep(&s->p_mv_table_base);
858 av_freep(&s->b_forw_mv_table_base);
859 av_freep(&s->b_back_mv_table_base);
860 av_freep(&s->b_bidir_forw_mv_table_base);
861 av_freep(&s->b_bidir_back_mv_table_base);
862 av_freep(&s->b_direct_mv_table_base);
864 s->b_forw_mv_table= NULL;
865 s->b_back_mv_table= NULL;
866 s->b_bidir_forw_mv_table= NULL;
867 s->b_bidir_back_mv_table= NULL;
868 s->b_direct_mv_table= NULL;
872 av_freep(&s->b_field_mv_table_base[i][j][k]);
873 s->b_field_mv_table[i][j][k]=NULL;
875 av_freep(&s->b_field_select_table[i][j]);
876 av_freep(&s->p_field_mv_table_base[i][j]);
877 s->p_field_mv_table[i][j]=NULL;
879 av_freep(&s->p_field_select_table[i]);
882 av_freep(&s->dc_val_base);
883 av_freep(&s->ac_val_base);
884 av_freep(&s->coded_block_base);
885 av_freep(&s->mbintra_table);
886 av_freep(&s->cbp_table);
887 av_freep(&s->pred_dir_table);
889 av_freep(&s->mbskip_table);
890 av_freep(&s->prev_pict_types);
891 av_freep(&s->bitstream_buffer);
892 s->allocated_bitstream_buffer_size=0;
894 av_freep(&s->avctx->stats_out);
895 av_freep(&s->ac_stats);
896 av_freep(&s->error_status_table);
897 av_freep(&s->mb_index2xy);
898 av_freep(&s->lambda_table);
899 av_freep(&s->q_intra_matrix);
900 av_freep(&s->q_inter_matrix);
901 av_freep(&s->q_intra_matrix16);
902 av_freep(&s->q_inter_matrix16);
903 av_freep(&s->input_picture);
904 av_freep(&s->reordered_input_picture);
905 av_freep(&s->dct_offset);
908 for(i=0; i<MAX_PICTURE_COUNT; i++){
909 free_picture(s, &s->picture[i]);
912 av_freep(&s->picture);
913 s->context_initialized = 0;
916 s->current_picture_ptr= NULL;
917 s->linesize= s->uvlinesize= 0;
920 av_freep(&s->visualization_buffer[i]);
922 avcodec_default_free_buffers(s->avctx);
925 #ifdef CONFIG_ENCODERS
927 /* init video encoder */
928 int MPV_encode_init(AVCodecContext *avctx)
930 MpegEncContext *s = avctx->priv_data;
932 int chroma_h_shift, chroma_v_shift;
934 MPV_encode_defaults(s);
936 switch (avctx->codec_id) {
937 case CODEC_ID_MPEG2VIDEO:
938 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P){
939 av_log(avctx, AV_LOG_ERROR, "only YUV420 and YUV422 are supported\n");
945 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUVJ422P &&
946 ((avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUV422P) || avctx->strict_std_compliance>FF_COMPLIANCE_INOFFICIAL)){
947 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
952 if(avctx->pix_fmt != PIX_FMT_YUV420P){
953 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
958 switch (avctx->pix_fmt) {
959 case PIX_FMT_YUVJ422P:
960 case PIX_FMT_YUV422P:
961 s->chroma_format = CHROMA_422;
963 case PIX_FMT_YUVJ420P:
964 case PIX_FMT_YUV420P:
966 s->chroma_format = CHROMA_420;
970 s->bit_rate = avctx->bit_rate;
971 s->width = avctx->width;
972 s->height = avctx->height;
973 if(avctx->gop_size > 600 && avctx->strict_std_compliance>FF_COMPLIANCE_EXPERIMENTAL){
974 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
977 s->gop_size = avctx->gop_size;
979 s->flags= avctx->flags;
980 s->flags2= avctx->flags2;
981 s->max_b_frames= avctx->max_b_frames;
982 s->codec_id= avctx->codec->id;
983 s->luma_elim_threshold = avctx->luma_elim_threshold;
984 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
985 s->strict_std_compliance= avctx->strict_std_compliance;
986 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
987 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
988 s->mpeg_quant= avctx->mpeg_quant;
989 s->rtp_mode= !!avctx->rtp_payload_size;
990 s->intra_dc_precision= avctx->intra_dc_precision;
991 s->user_specified_pts = AV_NOPTS_VALUE;
993 if (s->gop_size <= 1) {
1000 s->me_method = avctx->me_method;
1003 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
1005 s->adaptive_quant= ( s->avctx->lumi_masking
1006 || s->avctx->dark_masking
1007 || s->avctx->temporal_cplx_masking
1008 || s->avctx->spatial_cplx_masking
1009 || s->avctx->p_masking
1010 || s->avctx->border_masking
1011 || (s->flags&CODEC_FLAG_QP_RD))
1012 && !s->fixed_qscale;
1014 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
1015 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
1016 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
1017 s->intra_vlc_format= !!(s->flags2 & CODEC_FLAG2_INTRA_VLC);
1019 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
1020 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
1024 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
1025 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
1028 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
1029 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
1033 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
1034 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
1038 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
1039 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
1040 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
1042 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");
1045 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
1046 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
1047 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
1051 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
1052 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
1056 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
1057 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
1061 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1062 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1066 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1067 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1071 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1072 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1076 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1077 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1078 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1082 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1083 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
1087 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1088 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1092 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1093 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1097 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1098 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1102 if((s->flags2 & CODEC_FLAG2_INTRA_VLC) && s->codec_id != CODEC_ID_MPEG2VIDEO){
1103 av_log(avctx, AV_LOG_ERROR, "intra vlc table not supported by codec\n");
1107 if(s->flags & CODEC_FLAG_LOW_DELAY){
1108 if (s->codec_id != CODEC_ID_MPEG2VIDEO && s->codec_id != CODEC_ID_MPEG1VIDEO){
1109 av_log(avctx, AV_LOG_ERROR, "low delay forcing is only available for mpeg1/2\n");
1112 if (s->max_b_frames != 0){
1113 av_log(avctx, AV_LOG_ERROR, "b frames cannot be used with low delay\n");
1118 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1119 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1120 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1121 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1125 if(s->avctx->thread_count > 1)
1128 if(!avctx->time_base.den || !avctx->time_base.num){
1129 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
1133 i= (INT_MAX/2+128)>>8;
1134 if(avctx->me_threshold >= i){
1135 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
1138 if(avctx->mb_threshold >= i){
1139 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
1143 if(avctx->b_frame_strategy && (avctx->flags&CODEC_FLAG_PASS2)){
1144 av_log(avctx, AV_LOG_INFO, "notice: b_frame_strategy only affects the first pass\n");
1145 avctx->b_frame_strategy = 0;
1148 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
1150 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1151 avctx->time_base.den /= i;
1152 avctx->time_base.num /= i;
1156 if(s->codec_id==CODEC_ID_MJPEG){
1157 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1158 s->inter_quant_bias= 0;
1159 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1160 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1161 s->inter_quant_bias= 0;
1163 s->intra_quant_bias=0;
1164 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1167 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1168 s->intra_quant_bias= avctx->intra_quant_bias;
1169 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1170 s->inter_quant_bias= avctx->inter_quant_bias;
1172 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1174 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
1175 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
1178 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1180 switch(avctx->codec->id) {
1181 case CODEC_ID_MPEG1VIDEO:
1182 s->out_format = FMT_MPEG1;
1183 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);
1184 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1186 case CODEC_ID_MPEG2VIDEO:
1187 s->out_format = FMT_MPEG1;
1188 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY);
1189 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1192 case CODEC_ID_LJPEG:
1193 case CODEC_ID_JPEGLS:
1194 case CODEC_ID_MJPEG:
1195 s->out_format = FMT_MJPEG;
1196 s->intra_only = 1; /* force intra only for jpeg */
1197 s->mjpeg_write_tables = avctx->codec->id != CODEC_ID_JPEGLS;
1198 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1199 s->mjpeg_vsample[0] = 2;
1200 s->mjpeg_vsample[1] = 2>>chroma_v_shift;
1201 s->mjpeg_vsample[2] = 2>>chroma_v_shift;
1202 s->mjpeg_hsample[0] = 2;
1203 s->mjpeg_hsample[1] = 2>>chroma_h_shift;
1204 s->mjpeg_hsample[2] = 2>>chroma_h_shift;
1205 if (mjpeg_init(s) < 0)
1211 if (ff_h261_get_picture_format(s->width, s->height) < 0) {
1212 av_log(avctx, AV_LOG_ERROR, "The specified picture size of %dx%d is not valid for the H.261 codec.\nValid sizes are 176x144, 352x288\n", s->width, s->height);
1215 s->out_format = FMT_H261;
1220 if (h263_get_picture_format(s->width, s->height) == 7) {
1221 av_log(avctx, AV_LOG_INFO, "The specified picture size of %dx%d is not valid for the H.263 codec.\nValid sizes are 128x96, 176x144, 352x288, 704x576, and 1408x1152. Try H.263+.\n", s->width, s->height);
1224 s->out_format = FMT_H263;
1225 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1229 case CODEC_ID_H263P:
1230 s->out_format = FMT_H263;
1233 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1234 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1235 s->modified_quant= s->h263_aic;
1236 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1237 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1238 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1239 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1240 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1243 /* These are just to be sure */
1248 s->out_format = FMT_H263;
1249 s->h263_flv = 2; /* format = 1; 11-bit codes */
1250 s->unrestricted_mv = 1;
1251 s->rtp_mode=0; /* don't allow GOB */
1256 s->out_format = FMT_H263;
1261 s->out_format = FMT_H263;
1264 s->modified_quant=1;
1268 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1270 case CODEC_ID_MPEG4:
1271 s->out_format = FMT_H263;
1273 s->unrestricted_mv = 1;
1274 s->low_delay= s->max_b_frames ? 0 : 1;
1275 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1277 case CODEC_ID_MSMPEG4V1:
1278 s->out_format = FMT_H263;
1279 s->h263_msmpeg4 = 1;
1281 s->unrestricted_mv = 1;
1282 s->msmpeg4_version= 1;
1286 case CODEC_ID_MSMPEG4V2:
1287 s->out_format = FMT_H263;
1288 s->h263_msmpeg4 = 1;
1290 s->unrestricted_mv = 1;
1291 s->msmpeg4_version= 2;
1295 case CODEC_ID_MSMPEG4V3:
1296 s->out_format = FMT_H263;
1297 s->h263_msmpeg4 = 1;
1299 s->unrestricted_mv = 1;
1300 s->msmpeg4_version= 3;
1301 s->flipflop_rounding=1;
1306 s->out_format = FMT_H263;
1307 s->h263_msmpeg4 = 1;
1309 s->unrestricted_mv = 1;
1310 s->msmpeg4_version= 4;
1311 s->flipflop_rounding=1;
1316 s->out_format = FMT_H263;
1317 s->h263_msmpeg4 = 1;
1319 s->unrestricted_mv = 1;
1320 s->msmpeg4_version= 5;
1321 s->flipflop_rounding=1;
1329 avctx->has_b_frames= !s->low_delay;
1334 if (MPV_common_init(s) < 0)
1337 if(s->modified_quant)
1338 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1339 s->progressive_frame=
1340 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN));
1341 s->quant_precision=5;
1343 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1344 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1346 #ifdef CONFIG_H261_ENCODER
1347 if (s->out_format == FMT_H261)
1348 ff_h261_encode_init(s);
1350 if (s->out_format == FMT_H263)
1351 h263_encode_init(s);
1352 if(s->msmpeg4_version)
1353 ff_msmpeg4_encode_init(s);
1354 if (s->out_format == FMT_MPEG1)
1355 ff_mpeg1_encode_init(s);
1359 int j= s->dsp.idct_permutation[i];
1360 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1361 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1362 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1363 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1364 s->intra_matrix[j] =
1365 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1368 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1369 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1371 if(s->avctx->intra_matrix)
1372 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1373 if(s->avctx->inter_matrix)
1374 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1377 /* precompute matrix */
1378 /* for mjpeg, we do include qscale in the matrix */
1379 if (s->out_format != FMT_MJPEG) {
1380 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1381 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1382 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1383 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1386 if(ff_rate_control_init(s) < 0)
1392 int MPV_encode_end(AVCodecContext *avctx)
1394 MpegEncContext *s = avctx->priv_data;
1396 ff_rate_control_uninit(s);
1399 if (s->out_format == FMT_MJPEG)
1402 av_freep(&avctx->extradata);
1407 #endif //CONFIG_ENCODERS
1409 void init_rl(RLTable *rl, int use_static)
1411 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1412 uint8_t index_run[MAX_RUN+1];
1413 int last, run, level, start, end, i;
1415 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1416 if(use_static && rl->max_level[0])
1419 /* compute max_level[], max_run[] and index_run[] */
1420 for(last=0;last<2;last++) {
1429 memset(max_level, 0, MAX_RUN + 1);
1430 memset(max_run, 0, MAX_LEVEL + 1);
1431 memset(index_run, rl->n, MAX_RUN + 1);
1432 for(i=start;i<end;i++) {
1433 run = rl->table_run[i];
1434 level = rl->table_level[i];
1435 if (index_run[run] == rl->n)
1437 if (level > max_level[run])
1438 max_level[run] = level;
1439 if (run > max_run[level])
1440 max_run[level] = run;
1443 rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
1445 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1446 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1448 rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
1450 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1451 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1453 rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
1455 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1456 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1460 /* draw the edges of width 'w' of an image of size width, height */
1461 //FIXME check that this is ok for mpeg4 interlaced
1462 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1464 uint8_t *ptr, *last_line;
1467 last_line = buf + (height - 1) * wrap;
1469 /* top and bottom */
1470 memcpy(buf - (i + 1) * wrap, buf, width);
1471 memcpy(last_line + (i + 1) * wrap, last_line, width);
1473 /* left and right */
1475 for(i=0;i<height;i++) {
1476 memset(ptr - w, ptr[0], w);
1477 memset(ptr + width, ptr[width-1], w);
1482 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1483 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1484 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1485 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1489 int ff_find_unused_picture(MpegEncContext *s, int shared){
1493 for(i=0; i<MAX_PICTURE_COUNT; i++){
1494 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1497 for(i=0; i<MAX_PICTURE_COUNT; i++){
1498 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1500 for(i=0; i<MAX_PICTURE_COUNT; i++){
1501 if(s->picture[i].data[0]==NULL) return i;
1509 static void update_noise_reduction(MpegEncContext *s){
1512 for(intra=0; intra<2; intra++){
1513 if(s->dct_count[intra] > (1<<16)){
1514 for(i=0; i<64; i++){
1515 s->dct_error_sum[intra][i] >>=1;
1517 s->dct_count[intra] >>= 1;
1520 for(i=0; i<64; i++){
1521 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);
1527 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1529 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1535 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1537 /* mark&release old frames */
1538 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1539 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1541 /* release forgotten pictures */
1542 /* if(mpeg124/h263) */
1544 for(i=0; i<MAX_PICTURE_COUNT; i++){
1545 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1546 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1547 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1554 /* release non reference frames */
1555 for(i=0; i<MAX_PICTURE_COUNT; i++){
1556 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1557 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1561 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1562 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1564 i= ff_find_unused_picture(s, 0);
1565 pic= (AVFrame*)&s->picture[i];
1568 pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
1569 && !s->dropable ? 3 : 0;
1571 pic->coded_picture_number= s->coded_picture_number++;
1573 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1576 s->current_picture_ptr= (Picture*)pic;
1577 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1578 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1581 s->current_picture_ptr->pict_type= s->pict_type;
1582 // if(s->flags && CODEC_FLAG_QSCALE)
1583 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1584 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1586 copy_picture(&s->current_picture, s->current_picture_ptr);
1588 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1589 if (s->pict_type != B_TYPE) {
1590 s->last_picture_ptr= s->next_picture_ptr;
1592 s->next_picture_ptr= s->current_picture_ptr;
1594 /* 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,
1595 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1596 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1597 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1598 s->pict_type, s->dropable);*/
1600 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1601 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1603 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1604 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1605 assert(s->pict_type != B_TYPE); //these should have been dropped if we don't have a reference
1609 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1611 if(s->picture_structure!=PICT_FRAME){
1614 if(s->picture_structure == PICT_BOTTOM_FIELD){
1615 s->current_picture.data[i] += s->current_picture.linesize[i];
1617 s->current_picture.linesize[i] *= 2;
1618 s->last_picture.linesize[i] *=2;
1619 s->next_picture.linesize[i] *=2;
1624 s->hurry_up= s->avctx->hurry_up;
1625 s->error_resilience= avctx->error_resilience;
1627 /* set dequantizer, we can't do it during init as it might change for mpeg4
1628 and we can't do it in the header decode as init isnt called for mpeg4 there yet */
1629 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1630 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1631 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1632 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1633 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1634 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1636 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1637 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1640 if(s->dct_error_sum){
1641 assert(s->avctx->noise_reduction && s->encoding);
1643 update_noise_reduction(s);
1647 if(s->avctx->xvmc_acceleration)
1648 return XVMC_field_start(s, avctx);
1653 /* generic function for encode/decode called after a frame has been coded/decoded */
1654 void MPV_frame_end(MpegEncContext *s)
1657 /* draw edge for correct motion prediction if outside */
1659 //just to make sure that all data is rendered.
1660 if(s->avctx->xvmc_acceleration){
1664 if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1665 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1666 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1667 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1671 s->last_pict_type = s->pict_type;
1672 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1673 if(s->pict_type!=B_TYPE){
1674 s->last_non_b_pict_type= s->pict_type;
1677 /* copy back current_picture variables */
1678 for(i=0; i<MAX_PICTURE_COUNT; i++){
1679 if(s->picture[i].data[0] == s->current_picture.data[0]){
1680 s->picture[i]= s->current_picture;
1684 assert(i<MAX_PICTURE_COUNT);
1688 /* release non-reference frames */
1689 for(i=0; i<MAX_PICTURE_COUNT; i++){
1690 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1691 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1695 // clear copies, to avoid confusion
1697 memset(&s->last_picture, 0, sizeof(Picture));
1698 memset(&s->next_picture, 0, sizeof(Picture));
1699 memset(&s->current_picture, 0, sizeof(Picture));
1701 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1705 * draws an line from (ex, ey) -> (sx, sy).
1706 * @param w width of the image
1707 * @param h height of the image
1708 * @param stride stride/linesize of the image
1709 * @param color color of the arrow
1711 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1714 sx= clip(sx, 0, w-1);
1715 sy= clip(sy, 0, h-1);
1716 ex= clip(ex, 0, w-1);
1717 ey= clip(ey, 0, h-1);
1719 buf[sy*stride + sx]+= color;
1721 if(FFABS(ex - sx) > FFABS(ey - sy)){
1723 FFSWAP(int, sx, ex);
1724 FFSWAP(int, sy, ey);
1726 buf+= sx + sy*stride;
1728 f= ((ey-sy)<<16)/ex;
1729 for(x= 0; x <= ex; x++){
1732 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1733 buf[(y+1)*stride + x]+= (color* fr )>>16;
1737 FFSWAP(int, sx, ex);
1738 FFSWAP(int, sy, ey);
1740 buf+= sx + sy*stride;
1742 if(ey) f= ((ex-sx)<<16)/ey;
1744 for(y= 0; y <= ey; y++){
1747 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1748 buf[y*stride + x+1]+= (color* fr )>>16;;
1754 * draws an arrow from (ex, ey) -> (sx, sy).
1755 * @param w width of the image
1756 * @param h height of the image
1757 * @param stride stride/linesize of the image
1758 * @param color color of the arrow
1760 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1763 sx= clip(sx, -100, w+100);
1764 sy= clip(sy, -100, h+100);
1765 ex= clip(ex, -100, w+100);
1766 ey= clip(ey, -100, h+100);
1771 if(dx*dx + dy*dy > 3*3){
1774 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1776 //FIXME subpixel accuracy
1777 rx= ROUNDED_DIV(rx*3<<4, length);
1778 ry= ROUNDED_DIV(ry*3<<4, length);
1780 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1781 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1783 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1787 * prints debuging info for the given picture.
1789 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1791 if(!pict || !pict->mb_type) return;
1793 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1796 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1797 switch (pict->pict_type) {
1798 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1799 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1800 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1801 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1802 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1803 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1805 for(y=0; y<s->mb_height; y++){
1806 for(x=0; x<s->mb_width; x++){
1807 if(s->avctx->debug&FF_DEBUG_SKIP){
1808 int count= s->mbskip_table[x + y*s->mb_stride];
1809 if(count>9) count=9;
1810 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1812 if(s->avctx->debug&FF_DEBUG_QP){
1813 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1815 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1816 int mb_type= pict->mb_type[x + y*s->mb_stride];
1817 //Type & MV direction
1819 av_log(s->avctx, AV_LOG_DEBUG, "P");
1820 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1821 av_log(s->avctx, AV_LOG_DEBUG, "A");
1822 else if(IS_INTRA4x4(mb_type))
1823 av_log(s->avctx, AV_LOG_DEBUG, "i");
1824 else if(IS_INTRA16x16(mb_type))
1825 av_log(s->avctx, AV_LOG_DEBUG, "I");
1826 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1827 av_log(s->avctx, AV_LOG_DEBUG, "d");
1828 else if(IS_DIRECT(mb_type))
1829 av_log(s->avctx, AV_LOG_DEBUG, "D");
1830 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1831 av_log(s->avctx, AV_LOG_DEBUG, "g");
1832 else if(IS_GMC(mb_type))
1833 av_log(s->avctx, AV_LOG_DEBUG, "G");
1834 else if(IS_SKIP(mb_type))
1835 av_log(s->avctx, AV_LOG_DEBUG, "S");
1836 else if(!USES_LIST(mb_type, 1))
1837 av_log(s->avctx, AV_LOG_DEBUG, ">");
1838 else if(!USES_LIST(mb_type, 0))
1839 av_log(s->avctx, AV_LOG_DEBUG, "<");
1841 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1842 av_log(s->avctx, AV_LOG_DEBUG, "X");
1847 av_log(s->avctx, AV_LOG_DEBUG, "+");
1848 else if(IS_16X8(mb_type))
1849 av_log(s->avctx, AV_LOG_DEBUG, "-");
1850 else if(IS_8X16(mb_type))
1851 av_log(s->avctx, AV_LOG_DEBUG, "|");
1852 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1853 av_log(s->avctx, AV_LOG_DEBUG, " ");
1855 av_log(s->avctx, AV_LOG_DEBUG, "?");
1858 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1859 av_log(s->avctx, AV_LOG_DEBUG, "=");
1861 av_log(s->avctx, AV_LOG_DEBUG, " ");
1863 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1865 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1869 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1870 const int shift= 1 + s->quarter_sample;
1874 int h_chroma_shift, v_chroma_shift;
1875 const int width = s->avctx->width;
1876 const int height= s->avctx->height;
1877 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1878 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1879 s->low_delay=0; //needed to see the vectors without trashing the buffers
1881 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1883 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1884 pict->data[i]= s->visualization_buffer[i];
1886 pict->type= FF_BUFFER_TYPE_COPY;
1889 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1891 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1892 const int mb_index= mb_x + mb_y*s->mb_stride;
1893 if((s->avctx->debug_mv) && pict->motion_val){
1895 for(type=0; type<3; type++){
1898 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1902 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1906 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1911 if(!USES_LIST(pict->mb_type[mb_index], direction))
1914 if(IS_8X8(pict->mb_type[mb_index])){
1917 int sx= mb_x*16 + 4 + 8*(i&1);
1918 int sy= mb_y*16 + 4 + 8*(i>>1);
1919 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1920 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1921 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1922 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1924 }else if(IS_16X8(pict->mb_type[mb_index])){
1928 int sy=mb_y*16 + 4 + 8*i;
1929 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1930 int mx=(pict->motion_val[direction][xy][0]>>shift);
1931 int my=(pict->motion_val[direction][xy][1]>>shift);
1933 if(IS_INTERLACED(pict->mb_type[mb_index]))
1936 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1938 }else if(IS_8X16(pict->mb_type[mb_index])){
1941 int sx=mb_x*16 + 4 + 8*i;
1943 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1944 int mx=(pict->motion_val[direction][xy][0]>>shift);
1945 int my=(pict->motion_val[direction][xy][1]>>shift);
1947 if(IS_INTERLACED(pict->mb_type[mb_index]))
1950 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1953 int sx= mb_x*16 + 8;
1954 int sy= mb_y*16 + 8;
1955 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1956 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1957 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1958 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1962 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1963 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1966 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1967 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1970 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1971 int mb_type= pict->mb_type[mb_index];
1974 #define COLOR(theta, r)\
1975 u= (int)(128 + r*cos(theta*3.141592/180));\
1976 v= (int)(128 + r*sin(theta*3.141592/180));
1980 if(IS_PCM(mb_type)){
1982 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1984 }else if(IS_INTRA4x4(mb_type)){
1986 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1988 }else if(IS_DIRECT(mb_type)){
1990 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1992 }else if(IS_GMC(mb_type)){
1994 }else if(IS_SKIP(mb_type)){
1996 }else if(!USES_LIST(mb_type, 1)){
1998 }else if(!USES_LIST(mb_type, 0)){
2001 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
2005 u*= 0x0101010101010101ULL;
2006 v*= 0x0101010101010101ULL;
2008 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
2009 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
2013 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
2014 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
2015 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
2017 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
2019 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
2021 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
2022 int dm= 1 << (mv_sample_log2-2);
2024 int sx= mb_x*16 + 8*(i&1);
2025 int sy= mb_y*16 + 8*(i>>1);
2026 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
2028 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
2029 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
2031 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
2032 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
2033 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
2037 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
2041 s->mbskip_table[mb_index]=0;
2047 #ifdef CONFIG_ENCODERS
2049 static int get_sae(uint8_t *src, int ref, int stride){
2053 for(y=0; y<16; y++){
2054 for(x=0; x<16; x++){
2055 acc+= FFABS(src[x+y*stride] - ref);
2062 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
2069 for(y=0; y<h; y+=16){
2070 for(x=0; x<w; x+=16){
2071 int offset= x + y*stride;
2072 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
2073 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
2074 int sae = get_sae(src + offset, mean, stride);
2076 acc+= sae + 500 < sad;
2083 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2087 const int encoding_delay= s->max_b_frames;
2092 pic_arg->display_picture_number= s->input_picture_number++;
2094 if(pts != AV_NOPTS_VALUE){
2095 if(s->user_specified_pts != AV_NOPTS_VALUE){
2097 int64_t last= s->user_specified_pts;
2100 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%"PRId64", last=%"PRId64"\n", pts, s->user_specified_pts);
2104 s->user_specified_pts= pts;
2106 if(s->user_specified_pts != AV_NOPTS_VALUE){
2107 s->user_specified_pts=
2108 pts= s->user_specified_pts + 1;
2109 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%"PRId64")\n", pts);
2111 pts= pic_arg->display_picture_number;
2117 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2118 if(pic_arg->linesize[0] != s->linesize) direct=0;
2119 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2120 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2122 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2125 i= ff_find_unused_picture(s, 1);
2127 pic= (AVFrame*)&s->picture[i];
2131 pic->data[i]= pic_arg->data[i];
2132 pic->linesize[i]= pic_arg->linesize[i];
2134 alloc_picture(s, (Picture*)pic, 1);
2136 i= ff_find_unused_picture(s, 0);
2138 pic= (AVFrame*)&s->picture[i];
2141 alloc_picture(s, (Picture*)pic, 0);
2143 if( pic->data[0] + INPLACE_OFFSET == pic_arg->data[0]
2144 && pic->data[1] + INPLACE_OFFSET == pic_arg->data[1]
2145 && pic->data[2] + INPLACE_OFFSET == pic_arg->data[2]){
2148 int h_chroma_shift, v_chroma_shift;
2149 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2152 int src_stride= pic_arg->linesize[i];
2153 int dst_stride= i ? s->uvlinesize : s->linesize;
2154 int h_shift= i ? h_chroma_shift : 0;
2155 int v_shift= i ? v_chroma_shift : 0;
2156 int w= s->width >>h_shift;
2157 int h= s->height>>v_shift;
2158 uint8_t *src= pic_arg->data[i];
2159 uint8_t *dst= pic->data[i];
2161 if(!s->avctx->rc_buffer_size)
2162 dst +=INPLACE_OFFSET;
2164 if(src_stride==dst_stride)
2165 memcpy(dst, src, src_stride*h);
2168 memcpy(dst, src, w);
2176 copy_picture_attributes(s, pic, pic_arg);
2177 pic->pts= pts; //we set this here to avoid modifiying pic_arg
2180 /* shift buffer entries */
2181 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2182 s->input_picture[i-1]= s->input_picture[i];
2184 s->input_picture[encoding_delay]= (Picture*)pic;
2189 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2194 for(plane=0; plane<3; plane++){
2195 const int stride= p->linesize[plane];
2196 const int bw= plane ? 1 : 2;
2197 for(y=0; y<s->mb_height*bw; y++){
2198 for(x=0; x<s->mb_width*bw; x++){
2199 int off= p->type == FF_BUFFER_TYPE_SHARED ? 0: 16;
2200 int v= s->dsp.frame_skip_cmp[1](s, p->data[plane] + 8*(x + y*stride)+off, ref->data[plane] + 8*(x + y*stride), stride, 8);
2202 switch(s->avctx->frame_skip_exp){
2203 case 0: score= FFMAX(score, v); break;
2204 case 1: score+= FFABS(v);break;
2205 case 2: score+= v*v;break;
2206 case 3: score64+= FFABS(v*v*(int64_t)v);break;
2207 case 4: score64+= v*v*(int64_t)(v*v);break;
2213 if(score) score64= score;
2215 if(score64 < s->avctx->frame_skip_threshold)
2217 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2222 static int estimate_best_b_count(MpegEncContext *s){
2223 AVCodec *codec= avcodec_find_encoder(s->avctx->codec_id);
2224 AVCodecContext *c= avcodec_alloc_context();
2225 AVFrame input[FF_MAX_B_FRAMES+2];
2226 const int scale= s->avctx->brd_scale;
2227 int i, j, out_size, p_lambda, b_lambda, lambda2;
2228 int outbuf_size= s->width * s->height; //FIXME
2229 uint8_t *outbuf= av_malloc(outbuf_size);
2230 int64_t best_rd= INT64_MAX;
2231 int best_b_count= -1;
2233 assert(scale>=0 && scale <=3);
2236 p_lambda= s->last_lambda_for[P_TYPE]; //s->next_picture_ptr->quality;
2237 b_lambda= s->last_lambda_for[B_TYPE]; //p_lambda *FFABS(s->avctx->b_quant_factor) + s->avctx->b_quant_offset;
2238 if(!b_lambda) b_lambda= p_lambda; //FIXME we should do this somewhere else
2239 lambda2= (b_lambda*b_lambda + (1<<FF_LAMBDA_SHIFT)/2 ) >> FF_LAMBDA_SHIFT;
2241 c->width = s->width >> scale;
2242 c->height= s->height>> scale;
2243 c->flags= CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR | CODEC_FLAG_INPUT_PRESERVED /*| CODEC_FLAG_EMU_EDGE*/;
2244 c->flags|= s->avctx->flags & CODEC_FLAG_QPEL;
2245 c->mb_decision= s->avctx->mb_decision;
2246 c->me_cmp= s->avctx->me_cmp;
2247 c->mb_cmp= s->avctx->mb_cmp;
2248 c->me_sub_cmp= s->avctx->me_sub_cmp;
2249 c->pix_fmt = PIX_FMT_YUV420P;
2250 c->time_base= s->avctx->time_base;
2251 c->max_b_frames= s->max_b_frames;
2253 if (avcodec_open(c, codec) < 0)
2256 for(i=0; i<s->max_b_frames+2; i++){
2257 int ysize= c->width*c->height;
2258 int csize= (c->width/2)*(c->height/2);
2259 Picture pre_input, *pre_input_ptr= i ? s->input_picture[i-1] : s->next_picture_ptr;
2262 pre_input= *pre_input_ptr;
2264 if(pre_input.type != FF_BUFFER_TYPE_SHARED && i){
2265 pre_input.data[0]+=INPLACE_OFFSET;
2266 pre_input.data[1]+=INPLACE_OFFSET;
2267 pre_input.data[2]+=INPLACE_OFFSET;
2270 avcodec_get_frame_defaults(&input[i]);
2271 input[i].data[0]= av_malloc(ysize + 2*csize);
2272 input[i].data[1]= input[i].data[0] + ysize;
2273 input[i].data[2]= input[i].data[1] + csize;
2274 input[i].linesize[0]= c->width;
2275 input[i].linesize[1]=
2276 input[i].linesize[2]= c->width/2;
2278 if(!i || s->input_picture[i-1]){
2279 s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0], pre_input.data[0], pre_input.linesize[0], c->width, c->height);
2280 s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1], pre_input.data[1], pre_input.linesize[1], c->width>>1, c->height>>1);
2281 s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2], pre_input.data[2], pre_input.linesize[2], c->width>>1, c->height>>1);
2285 for(j=0; j<s->max_b_frames+1; j++){
2288 if(!s->input_picture[j])
2291 c->error[0]= c->error[1]= c->error[2]= 0;
2293 input[0].pict_type= I_TYPE;
2294 input[0].quality= 1 * FF_QP2LAMBDA;
2295 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[0]);
2296 // rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
2298 for(i=0; i<s->max_b_frames+1; i++){
2299 int is_p= i % (j+1) == j || i==s->max_b_frames;
2301 input[i+1].pict_type= is_p ? P_TYPE : B_TYPE;
2302 input[i+1].quality= is_p ? p_lambda : b_lambda;
2303 out_size = avcodec_encode_video(c, outbuf, outbuf_size, &input[i+1]);
2304 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2307 /* get the delayed frames */
2309 out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
2310 rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
2313 rd += c->error[0] + c->error[1] + c->error[2];
2325 for(i=0; i<s->max_b_frames+2; i++){
2326 av_freep(&input[i].data[0]);
2329 return best_b_count;
2332 static void select_input_picture(MpegEncContext *s){
2335 for(i=1; i<MAX_PICTURE_COUNT; i++)
2336 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2337 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2339 /* set next picture type & ordering */
2340 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2341 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2342 s->reordered_input_picture[0]= s->input_picture[0];
2343 s->reordered_input_picture[0]->pict_type= I_TYPE;
2344 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2348 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2349 if(s->picture_in_gop_number < s->gop_size && skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2350 //FIXME check that te gop check above is +-1 correct
2351 //av_log(NULL, AV_LOG_DEBUG, "skip %p %"PRId64"\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2353 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2355 s->input_picture[0]->data[i]= NULL;
2356 s->input_picture[0]->type= 0;
2358 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2359 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2361 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2365 ff_vbv_update(s, 0);
2371 if(s->flags&CODEC_FLAG_PASS2){
2372 for(i=0; i<s->max_b_frames+1; i++){
2373 int pict_num= s->input_picture[0]->display_picture_number + i;
2375 if(pict_num >= s->rc_context.num_entries)
2377 if(!s->input_picture[i]){
2378 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2382 s->input_picture[i]->pict_type=
2383 s->rc_context.entry[pict_num].new_pict_type;
2387 if(s->avctx->b_frame_strategy==0){
2388 b_frames= s->max_b_frames;
2389 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2390 }else if(s->avctx->b_frame_strategy==1){
2391 for(i=1; i<s->max_b_frames+1; i++){
2392 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2393 s->input_picture[i]->b_frame_score=
2394 get_intra_count(s, s->input_picture[i ]->data[0],
2395 s->input_picture[i-1]->data[0], s->linesize) + 1;
2398 for(i=0; i<s->max_b_frames+1; i++){
2399 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/s->avctx->b_sensitivity) break;
2402 b_frames= FFMAX(0, i-1);
2405 for(i=0; i<b_frames+1; i++){
2406 s->input_picture[i]->b_frame_score=0;
2408 }else if(s->avctx->b_frame_strategy==2){
2409 b_frames= estimate_best_b_count(s);
2411 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2416 //static int b_count=0;
2417 //b_count+= b_frames;
2418 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2420 for(i= b_frames - 1; i>=0; i--){
2421 int type= s->input_picture[i]->pict_type;
2422 if(type && type != B_TYPE)
2425 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2426 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2429 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2430 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2431 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2433 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2435 s->input_picture[b_frames]->pict_type= I_TYPE;
2439 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2441 && s->input_picture[b_frames]->pict_type== I_TYPE)
2444 s->reordered_input_picture[0]= s->input_picture[b_frames];
2445 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2446 s->reordered_input_picture[0]->pict_type= P_TYPE;
2447 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2448 for(i=0; i<b_frames; i++){
2449 s->reordered_input_picture[i+1]= s->input_picture[i];
2450 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2451 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2456 if(s->reordered_input_picture[0]){
2457 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2459 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2461 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED || s->avctx->rc_buffer_size){
2462 // input is a shared pix, so we can't modifiy it -> alloc a new one & ensure that the shared one is reuseable
2464 int i= ff_find_unused_picture(s, 0);
2465 Picture *pic= &s->picture[i];
2467 pic->reference = s->reordered_input_picture[0]->reference;
2468 alloc_picture(s, pic, 0);
2470 /* mark us unused / free shared pic */
2471 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_INTERNAL)
2472 s->avctx->release_buffer(s->avctx, (AVFrame*)s->reordered_input_picture[0]);
2474 s->reordered_input_picture[0]->data[i]= NULL;
2475 s->reordered_input_picture[0]->type= 0;
2477 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2479 s->current_picture_ptr= pic;
2481 // input is not a shared pix -> reuse buffer for current_pix
2483 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2484 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2486 s->current_picture_ptr= s->reordered_input_picture[0];
2488 s->new_picture.data[i]+= INPLACE_OFFSET;
2491 copy_picture(&s->current_picture, s->current_picture_ptr);
2493 s->picture_number= s->new_picture.display_picture_number;
2494 //printf("dpn:%d\n", s->picture_number);
2496 memset(&s->new_picture, 0, sizeof(Picture));
2500 int MPV_encode_picture(AVCodecContext *avctx,
2501 unsigned char *buf, int buf_size, void *data)
2503 MpegEncContext *s = avctx->priv_data;
2504 AVFrame *pic_arg = data;
2505 int i, stuffing_count;
2507 for(i=0; i<avctx->thread_count; i++){
2508 int start_y= s->thread_context[i]->start_mb_y;
2509 int end_y= s->thread_context[i]-> end_mb_y;
2510 int h= s->mb_height;
2511 uint8_t *start= buf + (size_t)(((int64_t) buf_size)*start_y/h);
2512 uint8_t *end = buf + (size_t)(((int64_t) buf_size)* end_y/h);
2514 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2517 s->picture_in_gop_number++;
2519 if(load_input_picture(s, pic_arg) < 0)
2522 select_input_picture(s);
2525 if(s->new_picture.data[0]){
2526 s->pict_type= s->new_picture.pict_type;
2528 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2529 MPV_frame_start(s, avctx);
2531 if (encode_picture(s, s->picture_number) < 0)
2534 avctx->real_pict_num = s->picture_number;
2535 avctx->header_bits = s->header_bits;
2536 avctx->mv_bits = s->mv_bits;
2537 avctx->misc_bits = s->misc_bits;
2538 avctx->i_tex_bits = s->i_tex_bits;
2539 avctx->p_tex_bits = s->p_tex_bits;
2540 avctx->i_count = s->i_count;
2541 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2542 avctx->skip_count = s->skip_count;
2546 if (s->out_format == FMT_MJPEG)
2547 mjpeg_picture_trailer(s);
2549 if(avctx->rc_buffer_size){
2550 RateControlContext *rcc= &s->rc_context;
2551 int max_size= rcc->buffer_index/3;
2553 if(put_bits_count(&s->pb) > max_size && s->lambda < s->avctx->lmax){
2554 s->next_lambda= FFMAX(s->lambda+1, s->lambda*(s->qscale+1) / s->qscale);
2555 s->mb_skipped = 0; //done in MPV_frame_start()
2556 if(s->pict_type==P_TYPE){ //done in encode_picture() so we must undo it
2557 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
2558 s->no_rounding ^= 1;
2560 if(s->pict_type!=B_TYPE){
2561 s->time_base= s->last_time_base;
2562 s->last_non_b_time= s->time - s->pp_time;
2564 // av_log(NULL, AV_LOG_ERROR, "R:%d ", s->next_lambda);
2565 for(i=0; i<avctx->thread_count; i++){
2566 PutBitContext *pb= &s->thread_context[i]->pb;
2567 init_put_bits(pb, pb->buf, pb->buf_end - pb->buf);
2572 assert(s->avctx->rc_max_rate);
2575 if(s->flags&CODEC_FLAG_PASS1)
2576 ff_write_pass1_stats(s);
2579 s->current_picture_ptr->error[i]= s->current_picture.error[i];
2580 avctx->error[i] += s->current_picture_ptr->error[i];
2583 if(s->flags&CODEC_FLAG_PASS1)
2584 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2585 flush_put_bits(&s->pb);
2586 s->frame_bits = put_bits_count(&s->pb);
2588 stuffing_count= ff_vbv_update(s, s->frame_bits);
2590 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2591 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2595 switch(s->codec_id){
2596 case CODEC_ID_MPEG1VIDEO:
2597 case CODEC_ID_MPEG2VIDEO:
2598 while(stuffing_count--){
2599 put_bits(&s->pb, 8, 0);
2602 case CODEC_ID_MPEG4:
2603 put_bits(&s->pb, 16, 0);
2604 put_bits(&s->pb, 16, 0x1C3);
2605 stuffing_count -= 4;
2606 while(stuffing_count--){
2607 put_bits(&s->pb, 8, 0xFF);
2611 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2613 flush_put_bits(&s->pb);
2614 s->frame_bits = put_bits_count(&s->pb);
2617 /* update mpeg1/2 vbv_delay for CBR */
2618 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2619 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2622 assert(s->repeat_first_field==0);
2624 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2625 assert(vbv_delay < 0xFFFF);
2627 s->vbv_delay_ptr[0] &= 0xF8;
2628 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2629 s->vbv_delay_ptr[1] = vbv_delay>>5;
2630 s->vbv_delay_ptr[2] &= 0x07;
2631 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2633 s->total_bits += s->frame_bits;
2634 avctx->frame_bits = s->frame_bits;
2636 assert((pbBufPtr(&s->pb) == s->pb.buf));
2639 assert((s->frame_bits&7)==0);
2641 return s->frame_bits/8;
2644 #endif //CONFIG_ENCODERS
2646 static inline void gmc1_motion(MpegEncContext *s,
2647 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2648 uint8_t **ref_picture)
2651 int offset, src_x, src_y, linesize, uvlinesize;
2652 int motion_x, motion_y;
2655 motion_x= s->sprite_offset[0][0];
2656 motion_y= s->sprite_offset[0][1];
2657 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2658 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2659 motion_x<<=(3-s->sprite_warping_accuracy);
2660 motion_y<<=(3-s->sprite_warping_accuracy);
2661 src_x = clip(src_x, -16, s->width);
2662 if (src_x == s->width)
2664 src_y = clip(src_y, -16, s->height);
2665 if (src_y == s->height)
2668 linesize = s->linesize;
2669 uvlinesize = s->uvlinesize;
2671 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2673 if(s->flags&CODEC_FLAG_EMU_EDGE){
2674 if( (unsigned)src_x >= s->h_edge_pos - 17
2675 || (unsigned)src_y >= s->v_edge_pos - 17){
2676 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2677 ptr= s->edge_emu_buffer;
2681 if((motion_x|motion_y)&7){
2682 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2683 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2687 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2688 if (s->no_rounding){
2689 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2691 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2695 if(s->flags&CODEC_FLAG_GRAY) return;
2697 motion_x= s->sprite_offset[1][0];
2698 motion_y= s->sprite_offset[1][1];
2699 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2700 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2701 motion_x<<=(3-s->sprite_warping_accuracy);
2702 motion_y<<=(3-s->sprite_warping_accuracy);
2703 src_x = clip(src_x, -8, s->width>>1);
2704 if (src_x == s->width>>1)
2706 src_y = clip(src_y, -8, s->height>>1);
2707 if (src_y == s->height>>1)
2710 offset = (src_y * uvlinesize) + src_x;
2711 ptr = ref_picture[1] + offset;
2712 if(s->flags&CODEC_FLAG_EMU_EDGE){
2713 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2714 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2715 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);
2716 ptr= s->edge_emu_buffer;
2720 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2722 ptr = ref_picture[2] + offset;
2724 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);
2725 ptr= s->edge_emu_buffer;
2727 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2732 static inline void gmc_motion(MpegEncContext *s,
2733 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2734 uint8_t **ref_picture)
2737 int linesize, uvlinesize;
2738 const int a= s->sprite_warping_accuracy;
2741 linesize = s->linesize;
2742 uvlinesize = s->uvlinesize;
2744 ptr = ref_picture[0];
2746 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2747 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2749 s->dsp.gmc(dest_y, ptr, linesize, 16,
2752 s->sprite_delta[0][0], s->sprite_delta[0][1],
2753 s->sprite_delta[1][0], s->sprite_delta[1][1],
2754 a+1, (1<<(2*a+1)) - s->no_rounding,
2755 s->h_edge_pos, s->v_edge_pos);
2756 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2757 ox + s->sprite_delta[0][0]*8,
2758 oy + s->sprite_delta[1][0]*8,
2759 s->sprite_delta[0][0], s->sprite_delta[0][1],
2760 s->sprite_delta[1][0], s->sprite_delta[1][1],
2761 a+1, (1<<(2*a+1)) - s->no_rounding,
2762 s->h_edge_pos, s->v_edge_pos);
2764 if(s->flags&CODEC_FLAG_GRAY) return;
2766 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2767 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2769 ptr = ref_picture[1];
2770 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2773 s->sprite_delta[0][0], s->sprite_delta[0][1],
2774 s->sprite_delta[1][0], s->sprite_delta[1][1],
2775 a+1, (1<<(2*a+1)) - s->no_rounding,
2776 s->h_edge_pos>>1, s->v_edge_pos>>1);
2778 ptr = ref_picture[2];
2779 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2782 s->sprite_delta[0][0], s->sprite_delta[0][1],
2783 s->sprite_delta[1][0], s->sprite_delta[1][1],
2784 a+1, (1<<(2*a+1)) - s->no_rounding,
2785 s->h_edge_pos>>1, s->v_edge_pos>>1);
2789 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2790 * @param buf destination buffer
2791 * @param src source buffer
2792 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2793 * @param block_w width of block
2794 * @param block_h height of block
2795 * @param src_x x coordinate of the top left sample of the block in the source buffer
2796 * @param src_y y coordinate of the top left sample of the block in the source buffer
2797 * @param w width of the source buffer
2798 * @param h height of the source buffer
2800 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2801 int src_x, int src_y, int w, int h){
2803 int start_y, start_x, end_y, end_x;
2806 src+= (h-1-src_y)*linesize;
2808 }else if(src_y<=-block_h){
2809 src+= (1-block_h-src_y)*linesize;
2815 }else if(src_x<=-block_w){
2816 src+= (1-block_w-src_x);
2820 start_y= FFMAX(0, -src_y);
2821 start_x= FFMAX(0, -src_x);
2822 end_y= FFMIN(block_h, h-src_y);
2823 end_x= FFMIN(block_w, w-src_x);
2825 // copy existing part
2826 for(y=start_y; y<end_y; y++){
2827 for(x=start_x; x<end_x; x++){
2828 buf[x + y*linesize]= src[x + y*linesize];
2833 for(y=0; y<start_y; y++){
2834 for(x=start_x; x<end_x; x++){
2835 buf[x + y*linesize]= buf[x + start_y*linesize];
2840 for(y=end_y; y<block_h; y++){
2841 for(x=start_x; x<end_x; x++){
2842 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2846 for(y=0; y<block_h; y++){
2848 for(x=0; x<start_x; x++){
2849 buf[x + y*linesize]= buf[start_x + y*linesize];
2853 for(x=end_x; x<block_w; x++){
2854 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2859 static inline int hpel_motion(MpegEncContext *s,
2860 uint8_t *dest, uint8_t *src,
2861 int field_based, int field_select,
2862 int src_x, int src_y,
2863 int width, int height, int stride,
2864 int h_edge_pos, int v_edge_pos,
2865 int w, int h, op_pixels_func *pix_op,
2866 int motion_x, int motion_y)
2871 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2872 src_x += motion_x >> 1;
2873 src_y += motion_y >> 1;
2875 /* WARNING: do no forget half pels */
2876 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2879 src_y = clip(src_y, -16, height);
2880 if (src_y == height)
2882 src += src_y * stride + src_x;
2884 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2885 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2886 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2887 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2888 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2889 src= s->edge_emu_buffer;
2895 pix_op[dxy](dest, src, stride, h);
2899 static inline int hpel_motion_lowres(MpegEncContext *s,
2900 uint8_t *dest, uint8_t *src,
2901 int field_based, int field_select,
2902 int src_x, int src_y,
2903 int width, int height, int stride,
2904 int h_edge_pos, int v_edge_pos,
2905 int w, int h, h264_chroma_mc_func *pix_op,
2906 int motion_x, int motion_y)
2908 const int lowres= s->avctx->lowres;
2909 const int s_mask= (2<<lowres)-1;
2913 if(s->quarter_sample){
2918 sx= motion_x & s_mask;
2919 sy= motion_y & s_mask;
2920 src_x += motion_x >> (lowres+1);
2921 src_y += motion_y >> (lowres+1);
2923 src += src_y * stride + src_x;
2925 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2926 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2927 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2928 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2929 src= s->edge_emu_buffer;
2937 pix_op[lowres](dest, src, stride, h, sx, sy);
2941 /* apply one mpeg motion vector to the three components */
2942 static always_inline void mpeg_motion(MpegEncContext *s,
2943 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2944 int field_based, int bottom_field, int field_select,
2945 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2946 int motion_x, int motion_y, int h)
2948 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2949 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2952 if(s->quarter_sample)
2959 v_edge_pos = s->v_edge_pos >> field_based;
2960 linesize = s->current_picture.linesize[0] << field_based;
2961 uvlinesize = s->current_picture.linesize[1] << field_based;
2963 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2964 src_x = s->mb_x* 16 + (motion_x >> 1);
2965 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2967 if (s->out_format == FMT_H263) {
2968 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2969 mx = (motion_x>>1)|(motion_x&1);
2971 uvdxy = ((my & 1) << 1) | (mx & 1);
2972 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2973 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2975 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2979 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2983 uvsrc_x = s->mb_x*8 + mx;
2984 uvsrc_y = s->mb_y*8 + my;
2986 if(s->chroma_y_shift){
2989 uvdxy = ((my & 1) << 1) | (mx & 1);
2990 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2991 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2993 if(s->chroma_x_shift){
2996 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2997 uvsrc_x = s->mb_x* 8 + (mx >> 1);
3008 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3009 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3010 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3012 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
3013 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
3014 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
3015 s->codec_id == CODEC_ID_MPEG1VIDEO){
3016 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
3019 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3020 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3021 ptr_y = s->edge_emu_buffer;
3022 if(!(s->flags&CODEC_FLAG_GRAY)){
3023 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3024 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3025 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3026 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3027 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3033 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3034 dest_y += s->linesize;
3035 dest_cb+= s->uvlinesize;
3036 dest_cr+= s->uvlinesize;
3040 ptr_y += s->linesize;
3041 ptr_cb+= s->uvlinesize;
3042 ptr_cr+= s->uvlinesize;
3045 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
3047 if(!(s->flags&CODEC_FLAG_GRAY)){
3048 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
3049 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
3051 #if defined(CONFIG_H261_ENCODER) || defined(CONFIG_H261_DECODER)
3052 if(s->out_format == FMT_H261){
3053 ff_h261_loop_filter(s);
3058 /* apply one mpeg motion vector to the three components */
3059 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
3060 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3061 int field_based, int bottom_field, int field_select,
3062 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
3063 int motion_x, int motion_y, int h)
3065 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3066 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
3067 const int lowres= s->avctx->lowres;
3068 const int block_s= 8>>lowres;
3069 const int s_mask= (2<<lowres)-1;
3070 const int h_edge_pos = s->h_edge_pos >> lowres;
3071 const int v_edge_pos = s->v_edge_pos >> lowres;
3072 linesize = s->current_picture.linesize[0] << field_based;
3073 uvlinesize = s->current_picture.linesize[1] << field_based;
3075 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
3081 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
3084 sx= motion_x & s_mask;
3085 sy= motion_y & s_mask;
3086 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
3087 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
3089 if (s->out_format == FMT_H263) {
3090 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
3091 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
3094 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
3097 uvsx = (2*mx) & s_mask;
3098 uvsy = (2*my) & s_mask;
3099 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
3100 uvsrc_y = s->mb_y*block_s + (my >> lowres);
3106 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
3107 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
3110 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3111 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3112 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3114 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
3115 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
3116 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3117 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
3118 ptr_y = s->edge_emu_buffer;
3119 if(!(s->flags&CODEC_FLAG_GRAY)){
3120 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
3121 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
3122 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3123 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
3124 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
3130 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
3131 dest_y += s->linesize;
3132 dest_cb+= s->uvlinesize;
3133 dest_cr+= s->uvlinesize;
3137 ptr_y += s->linesize;
3138 ptr_cb+= s->uvlinesize;
3139 ptr_cr+= s->uvlinesize;
3144 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
3146 if(!(s->flags&CODEC_FLAG_GRAY)){
3147 uvsx <<= 2 - lowres;
3148 uvsy <<= 2 - lowres;
3149 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3150 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
3152 //FIXME h261 lowres loop filter
3155 //FIXME move to dsputil, avg variant, 16x16 version
3156 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
3158 uint8_t * const top = src[1];
3159 uint8_t * const left = src[2];
3160 uint8_t * const mid = src[0];
3161 uint8_t * const right = src[3];
3162 uint8_t * const bottom= src[4];
3163 #define OBMC_FILTER(x, t, l, m, r, b)\
3164 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
3165 #define OBMC_FILTER4(x, t, l, m, r, b)\
3166 OBMC_FILTER(x , t, l, m, r, b);\
3167 OBMC_FILTER(x+1 , t, l, m, r, b);\
3168 OBMC_FILTER(x +stride, t, l, m, r, b);\
3169 OBMC_FILTER(x+1+stride, t, l, m, r, b);
3172 OBMC_FILTER (x , 2, 2, 4, 0, 0);
3173 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
3174 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
3175 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
3176 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
3177 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
3179 OBMC_FILTER (x , 1, 2, 5, 0, 0);
3180 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
3181 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
3182 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
3184 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
3185 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
3186 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
3187 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
3189 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
3190 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
3191 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
3192 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
3194 OBMC_FILTER (x , 0, 2, 5, 0, 1);
3195 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
3196 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
3197 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
3198 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
3199 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
3201 OBMC_FILTER (x , 0, 2, 4, 0, 2);
3202 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
3203 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
3204 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
3207 /* obmc for 1 8x8 luma block */
3208 static inline void obmc_motion(MpegEncContext *s,
3209 uint8_t *dest, uint8_t *src,
3210 int src_x, int src_y,
3211 op_pixels_func *pix_op,
3212 int16_t mv[5][2]/* mid top left right bottom*/)
3218 assert(s->quarter_sample==0);
3221 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
3224 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3225 hpel_motion(s, ptr[i], src, 0, 0,
3227 s->width, s->height, s->linesize,
3228 s->h_edge_pos, s->v_edge_pos,
3230 mv[i][0], mv[i][1]);
3234 put_obmc(dest, ptr, s->linesize);
3237 static inline void qpel_motion(MpegEncContext *s,
3238 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3239 int field_based, int bottom_field, int field_select,
3240 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3241 qpel_mc_func (*qpix_op)[16],
3242 int motion_x, int motion_y, int h)
3244 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3245 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3247 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3248 src_x = s->mb_x * 16 + (motion_x >> 2);
3249 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3251 v_edge_pos = s->v_edge_pos >> field_based;
3252 linesize = s->linesize << field_based;
3253 uvlinesize = s->uvlinesize << field_based;
3258 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3259 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3260 mx= (motion_x>>1) + rtab[motion_x&7];
3261 my= (motion_y>>1) + rtab[motion_y&7];
3262 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3263 mx= (motion_x>>1)|(motion_x&1);
3264 my= (motion_y>>1)|(motion_y&1);
3272 uvdxy= (mx&1) | ((my&1)<<1);
3276 uvsrc_x = s->mb_x * 8 + mx;
3277 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3279 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3280 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3281 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3283 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3284 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3285 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3286 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3287 ptr_y= s->edge_emu_buffer;
3288 if(!(s->flags&CODEC_FLAG_GRAY)){
3289 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3290 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3291 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3292 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3293 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3300 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3303 dest_y += s->linesize;
3304 dest_cb+= s->uvlinesize;
3305 dest_cr+= s->uvlinesize;
3309 ptr_y += s->linesize;
3310 ptr_cb += s->uvlinesize;
3311 ptr_cr += s->uvlinesize;
3313 //damn interlaced mode
3314 //FIXME boundary mirroring is not exactly correct here
3315 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3316 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3318 if(!(s->flags&CODEC_FLAG_GRAY)){
3319 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3320 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3324 inline int ff_h263_round_chroma(int x){
3326 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3329 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3334 * h263 chorma 4mv motion compensation.
3336 static inline void chroma_4mv_motion(MpegEncContext *s,
3337 uint8_t *dest_cb, uint8_t *dest_cr,
3338 uint8_t **ref_picture,
3339 op_pixels_func *pix_op,
3341 int dxy, emu=0, src_x, src_y, offset;
3344 /* In case of 8X8, we construct a single chroma motion vector
3345 with a special rounding */
3346 mx= ff_h263_round_chroma(mx);
3347 my= ff_h263_round_chroma(my);
3349 dxy = ((my & 1) << 1) | (mx & 1);
3353 src_x = s->mb_x * 8 + mx;
3354 src_y = s->mb_y * 8 + my;
3355 src_x = clip(src_x, -8, s->width/2);
3356 if (src_x == s->width/2)
3358 src_y = clip(src_y, -8, s->height/2);
3359 if (src_y == s->height/2)
3362 offset = (src_y * (s->uvlinesize)) + src_x;
3363 ptr = ref_picture[1] + offset;
3364 if(s->flags&CODEC_FLAG_EMU_EDGE){
3365 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3366 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3367 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);
3368 ptr= s->edge_emu_buffer;
3372 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3374 ptr = ref_picture[2] + offset;
3376 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);
3377 ptr= s->edge_emu_buffer;
3379 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3382 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3383 uint8_t *dest_cb, uint8_t *dest_cr,
3384 uint8_t **ref_picture,
3385 h264_chroma_mc_func *pix_op,
3387 const int lowres= s->avctx->lowres;
3388 const int block_s= 8>>lowres;
3389 const int s_mask= (2<<lowres)-1;
3390 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3391 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3392 int emu=0, src_x, src_y, offset, sx, sy;
3395 if(s->quarter_sample){
3400 /* In case of 8X8, we construct a single chroma motion vector
3401 with a special rounding */
3402 mx= ff_h263_round_chroma(mx);
3403 my= ff_h263_round_chroma(my);
3407 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3408 src_y = s->mb_y*block_s + (my >> (lowres+1));
3410 offset = src_y * s->uvlinesize + src_x;
3411 ptr = ref_picture[1] + offset;
3412 if(s->flags&CODEC_FLAG_EMU_EDGE){
3413 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3414 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3415 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3416 ptr= s->edge_emu_buffer;
3422 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3424 ptr = ref_picture[2] + offset;
3426 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3427 ptr= s->edge_emu_buffer;
3429 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3432 static inline void prefetch_motion(MpegEncContext *s, uint8_t **pix, int dir){
3433 /* fetch pixels for estimated mv 4 macroblocks ahead
3434 * optimized for 64byte cache lines */
3435 const int shift = s->quarter_sample ? 2 : 1;
3436 const int mx= (s->mv[dir][0][0]>>shift) + 16*s->mb_x + 8;
3437 const int my= (s->mv[dir][0][1]>>shift) + 16*s->mb_y;
3438 int off= mx + (my + (s->mb_x&3)*4)*s->linesize + 64;
3439 s->dsp.prefetch(pix[0]+off, s->linesize, 4);
3440 off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
3441 s->dsp.prefetch(pix[1]+off, pix[2]-pix[1], 2);
3445 * motion compensation of a single macroblock
3447 * @param dest_y luma destination pointer
3448 * @param dest_cb chroma cb/u destination pointer
3449 * @param dest_cr chroma cr/v destination pointer
3450 * @param dir direction (0->forward, 1->backward)
3451 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3452 * @param pic_op halfpel motion compensation function (average or put normally)
3453 * @param pic_op qpel motion compensation function (average or put normally)
3454 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3456 static inline void MPV_motion(MpegEncContext *s,
3457 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3458 int dir, uint8_t **ref_picture,
3459 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3461 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3463 uint8_t *ptr, *dest;
3468 prefetch_motion(s, ref_picture, dir);
3470 if(s->obmc && s->pict_type != B_TYPE){
3471 int16_t mv_cache[4][4][2];
3472 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3473 const int mot_stride= s->b8_stride;
3474 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3476 assert(!s->mb_skipped);
3478 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3479 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3480 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3482 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3483 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3485 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3488 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3489 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3490 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3492 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3493 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3496 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3497 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3498 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3500 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3501 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3507 const int x= (i&1)+1;
3508 const int y= (i>>1)+1;
3510 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3511 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3512 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3513 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3514 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3516 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3518 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3525 if(!(s->flags&CODEC_FLAG_GRAY))
3526 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3531 switch(s->mv_type) {
3534 if(s->real_sprite_warping_points==1){
3535 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3538 gmc_motion(s, dest_y, dest_cb, dest_cr,
3541 }else if(s->quarter_sample){
3542 qpel_motion(s, dest_y, dest_cb, dest_cr,
3544 ref_picture, pix_op, qpix_op,
3545 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3547 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3548 ref_picture, pix_op,
3549 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3552 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3554 ref_picture, pix_op,
3555 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3561 if(s->quarter_sample){
3563 motion_x = s->mv[dir][i][0];
3564 motion_y = s->mv[dir][i][1];
3566 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3567 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3568 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3570 /* WARNING: do no forget half pels */
3571 src_x = clip(src_x, -16, s->width);
3572 if (src_x == s->width)
3574 src_y = clip(src_y, -16, s->height);
3575 if (src_y == s->height)
3578 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3579 if(s->flags&CODEC_FLAG_EMU_EDGE){
3580 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3581 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3582 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);
3583 ptr= s->edge_emu_buffer;
3586 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3587 qpix_op[1][dxy](dest, ptr, s->linesize);
3589 mx += s->mv[dir][i][0]/2;
3590 my += s->mv[dir][i][1]/2;
3594 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3595 ref_picture[0], 0, 0,
3596 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3597 s->width, s->height, s->linesize,
3598 s->h_edge_pos, s->v_edge_pos,
3600 s->mv[dir][i][0], s->mv[dir][i][1]);
3602 mx += s->mv[dir][i][0];
3603 my += s->mv[dir][i][1];
3607 if(!(s->flags&CODEC_FLAG_GRAY))
3608 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3611 if (s->picture_structure == PICT_FRAME) {
3612 if(s->quarter_sample){
3614 qpel_motion(s, dest_y, dest_cb, dest_cr,
3615 1, i, s->field_select[dir][i],
3616 ref_picture, pix_op, qpix_op,
3617 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3621 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3622 1, 0, s->field_select[dir][0],
3623 ref_picture, pix_op,
3624 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3626 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3627 1, 1, s->field_select[dir][1],
3628 ref_picture, pix_op,
3629 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3632 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3633 ref_picture= s->current_picture_ptr->data;
3636 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3637 0, 0, s->field_select[dir][0],
3638 ref_picture, pix_op,
3639 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3644 uint8_t ** ref2picture;
3646 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3647 ref2picture= ref_picture;
3649 ref2picture= s->current_picture_ptr->data;
3652 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3653 0, 0, s->field_select[dir][i],
3654 ref2picture, pix_op,
3655 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3657 dest_y += 16*s->linesize;
3658 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3659 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3663 if(s->picture_structure == PICT_FRAME){
3667 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3669 ref_picture, pix_op,
3670 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3672 pix_op = s->dsp.avg_pixels_tab;
3676 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3677 0, 0, s->picture_structure != i+1,
3678 ref_picture, pix_op,
3679 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3681 // after put we make avg of the same block
3682 pix_op=s->dsp.avg_pixels_tab;
3684 //opposite parity is always in the same frame if this is second field
3685 if(!s->first_field){
3686 ref_picture = s->current_picture_ptr->data;
3696 * motion compensation of a single macroblock
3698 * @param dest_y luma destination pointer
3699 * @param dest_cb chroma cb/u destination pointer
3700 * @param dest_cr chroma cr/v destination pointer
3701 * @param dir direction (0->forward, 1->backward)
3702 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3703 * @param pic_op halfpel motion compensation function (average or put normally)
3704 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3706 static inline void MPV_motion_lowres(MpegEncContext *s,
3707 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3708 int dir, uint8_t **ref_picture,
3709 h264_chroma_mc_func *pix_op)
3713 const int lowres= s->avctx->lowres;
3714 const int block_s= 8>>lowres;
3719 switch(s->mv_type) {
3721 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3723 ref_picture, pix_op,
3724 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3730 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3731 ref_picture[0], 0, 0,
3732 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3733 s->width, s->height, s->linesize,
3734 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3735 block_s, block_s, pix_op,
3736 s->mv[dir][i][0], s->mv[dir][i][1]);
3738 mx += s->mv[dir][i][0];
3739 my += s->mv[dir][i][1];
3742 if(!(s->flags&CODEC_FLAG_GRAY))
3743 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3746 if (s->picture_structure == PICT_FRAME) {
3748 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3749 1, 0, s->field_select[dir][0],
3750 ref_picture, pix_op,
3751 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3753 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3754 1, 1, s->field_select[dir][1],
3755 ref_picture, pix_op,
3756 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3758 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3759 ref_picture= s->current_picture_ptr->data;
3762 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3763 0, 0, s->field_select[dir][0],
3764 ref_picture, pix_op,
3765 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3770 uint8_t ** ref2picture;
3772 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3773 ref2picture= ref_picture;
3775 ref2picture= s->current_picture_ptr->data;
3778 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3779 0, 0, s->field_select[dir][i],
3780 ref2picture, pix_op,
3781 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3783 dest_y += 2*block_s*s->linesize;
3784 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3785 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3789 if(s->picture_structure == PICT_FRAME){
3793 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3795 ref_picture, pix_op,
3796 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3798 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3802 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3803 0, 0, s->picture_structure != i+1,
3804 ref_picture, pix_op,
3805 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3807 // after put we make avg of the same block
3808 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3810 //opposite parity is always in the same frame if this is second field
3811 if(!s->first_field){
3812 ref_picture = s->current_picture_ptr->data;
3821 /* put block[] to dest[] */
3822 static inline void put_dct(MpegEncContext *s,
3823 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3825 s->dct_unquantize_intra(s, block, i, qscale);
3826 s->dsp.idct_put (dest, line_size, block);
3829 /* add block[] to dest[] */
3830 static inline void add_dct(MpegEncContext *s,
3831 DCTELEM *block, int i, uint8_t *dest, int line_size)
3833 if (s->block_last_index[i] >= 0) {
3834 s->dsp.idct_add (dest, line_size, block);
3838 static inline void add_dequant_dct(MpegEncContext *s,
3839 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3841 if (s->block_last_index[i] >= 0) {
3842 s->dct_unquantize_inter(s, block, i, qscale);
3844 s->dsp.idct_add (dest, line_size, block);
3849 * cleans dc, ac, coded_block for the current non intra MB
3851 void ff_clean_intra_table_entries(MpegEncContext *s)
3853 int wrap = s->b8_stride;
3854 int xy = s->block_index[0];
3857 s->dc_val[0][xy + 1 ] =
3858 s->dc_val[0][xy + wrap] =
3859 s->dc_val[0][xy + 1 + wrap] = 1024;
3861 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3862 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3863 if (s->msmpeg4_version>=3) {
3864 s->coded_block[xy ] =
3865 s->coded_block[xy + 1 ] =
3866 s->coded_block[xy + wrap] =
3867 s->coded_block[xy + 1 + wrap] = 0;
3870 wrap = s->mb_stride;
3871 xy = s->mb_x + s->mb_y * wrap;
3873 s->dc_val[2][xy] = 1024;
3875 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3876 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3878 s->mbintra_table[xy]= 0;
3881 /* generic function called after a macroblock has been parsed by the
3882 decoder or after it has been encoded by the encoder.
3884 Important variables used:
3885 s->mb_intra : true if intra macroblock
3886 s->mv_dir : motion vector direction
3887 s->mv_type : motion vector type
3888 s->mv : motion vector
3889 s->interlaced_dct : true if interlaced dct used (mpeg2)
3891 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3894 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3896 if(s->avctx->xvmc_acceleration){
3897 XVMC_decode_mb(s);//xvmc uses pblocks
3905 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3906 /* save DCT coefficients */
3908 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3911 *dct++ = block[i][s->dsp.idct_permutation[j]];
3914 s->current_picture.qscale_table[mb_xy]= s->qscale;
3916 /* update DC predictors for P macroblocks */
3918 if (s->h263_pred || s->h263_aic) {
3919 if(s->mbintra_table[mb_xy])
3920 ff_clean_intra_table_entries(s);
3924 s->last_dc[2] = 128 << s->intra_dc_precision;
3927 else if (s->h263_pred || s->h263_aic)
3928 s->mbintra_table[mb_xy]=1;
3930 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3931 uint8_t *dest_y, *dest_cb, *dest_cr;
3932 int dct_linesize, dct_offset;
3933 op_pixels_func (*op_pix)[4];
3934 qpel_mc_func (*op_qpix)[16];
3935 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3936 const int uvlinesize= s->current_picture.linesize[1];
3937 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3938 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3940 /* avoid copy if macroblock skipped in last frame too */
3941 /* skip only during decoding as we might trash the buffers during encoding a bit */
3943 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3944 const int age= s->current_picture.age;
3948 if (s->mb_skipped) {
3950 assert(s->pict_type!=I_TYPE);
3952 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3953 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3955 /* if previous was skipped too, then nothing to do ! */
3956 if (*mbskip_ptr >= age && s->current_picture.reference){
3959 } else if(!s->current_picture.reference){
3960 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3961 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3963 *mbskip_ptr = 0; /* not skipped */
3967 dct_linesize = linesize << s->interlaced_dct;
3968 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3972 dest_cb= s->dest[1];
3973 dest_cr= s->dest[2];
3975 dest_y = s->b_scratchpad;
3976 dest_cb= s->b_scratchpad+16*linesize;
3977 dest_cr= s->b_scratchpad+32*linesize;
3981 /* motion handling */
3982 /* decoding or more than one mb_type (MC was already done otherwise) */
3985 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3987 if (s->mv_dir & MV_DIR_FORWARD) {
3988 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3989 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3991 if (s->mv_dir & MV_DIR_BACKWARD) {
3992 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3995 op_qpix= s->me.qpel_put;
3996 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3997 op_pix = s->dsp.put_pixels_tab;
3999 op_pix = s->dsp.put_no_rnd_pixels_tab;
4001 if (s->mv_dir & MV_DIR_FORWARD) {
4002 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4003 op_pix = s->dsp.avg_pixels_tab;
4004 op_qpix= s->me.qpel_avg;
4006 if (s->mv_dir & MV_DIR_BACKWARD) {
4007 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4012 /* skip dequant / idct if we are really late ;) */
4013 if(s->hurry_up>1) goto skip_idct;
4014 if(s->avctx->skip_idct){
4015 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == B_TYPE)
4016 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != I_TYPE)
4017 || s->avctx->skip_idct >= AVDISCARD_ALL)
4021 /* add dct residue */
4022 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
4023 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
4024 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4025 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4026 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4027 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4029 if(!(s->flags&CODEC_FLAG_GRAY)){
4030 if (s->chroma_y_shift){
4031 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4032 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4036 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4037 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4038 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4039 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4042 } else if(s->codec_id != CODEC_ID_WMV2){
4043 add_dct(s, block[0], 0, dest_y , dct_linesize);
4044 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
4045 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
4046 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
4048 if(!(s->flags&CODEC_FLAG_GRAY)){
4049 if(s->chroma_y_shift){//Chroma420
4050 add_dct(s, block[4], 4, dest_cb, uvlinesize);
4051 add_dct(s, block[5], 5, dest_cr, uvlinesize);
4054 dct_linesize = uvlinesize << s->interlaced_dct;
4055 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4057 add_dct(s, block[4], 4, dest_cb, dct_linesize);
4058 add_dct(s, block[5], 5, dest_cr, dct_linesize);
4059 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
4060 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
4061 if(!s->chroma_x_shift){//Chroma444
4062 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
4063 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
4064 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
4065 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
4071 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
4074 /* dct only in intra block */
4075 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
4076 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
4077 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
4078 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
4079 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
4081 if(!(s->flags&CODEC_FLAG_GRAY)){
4082 if(s->chroma_y_shift){
4083 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
4084 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
4088 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
4089 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
4090 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
4091 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
4095 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
4096 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
4097 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
4098 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
4100 if(!(s->flags&CODEC_FLAG_GRAY)){
4101 if(s->chroma_y_shift){
4102 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
4103 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
4106 dct_linesize = uvlinesize << s->interlaced_dct;
4107 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
4109 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
4110 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
4111 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
4112 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
4113 if(!s->chroma_x_shift){//Chroma444
4114 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
4115 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
4116 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
4117 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
4125 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
4126 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
4127 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
4132 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
4133 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
4134 else MPV_decode_mb_internal(s, block, 0);
4137 #ifdef CONFIG_ENCODERS
4139 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
4141 static const char tab[64]=
4153 DCTELEM *block= s->block[n];
4154 const int last_index= s->block_last_index[n];
4159 threshold= -threshold;
4163 /* are all which we could set to zero are allready zero? */
4164 if(last_index<=skip_dc - 1) return;
4166 for(i=0; i<=last_index; i++){
4167 const int j = s->intra_scantable.permutated[i];
4168 const int level = FFABS(block[j]);
4170 if(skip_dc && i==0) continue;
4179 if(score >= threshold) return;
4180 for(i=skip_dc; i<=last_index; i++){
4181 const int j = s->intra_scantable.permutated[i];
4184 if(block[0]) s->block_last_index[n]= 0;
4185 else s->block_last_index[n]= -1;
4188 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
4191 const int maxlevel= s->max_qcoeff;
4192 const int minlevel= s->min_qcoeff;
4196 i=1; //skip clipping of intra dc
4200 for(;i<=last_index; i++){
4201 const int j= s->intra_scantable.permutated[i];
4202 int level = block[j];
4204 if (level>maxlevel){
4207 }else if(level<minlevel){
4215 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
4216 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
4219 #endif //CONFIG_ENCODERS
4223 * @param h is the normal height, this will be reduced automatically if needed for the last row
4225 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
4226 if (s->avctx->draw_horiz_band) {
4230 if(s->picture_structure != PICT_FRAME){
4233 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
4236 h= FFMIN(h, s->avctx->height - y);
4238 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
4239 src= (AVFrame*)s->current_picture_ptr;
4240 else if(s->last_picture_ptr)
4241 src= (AVFrame*)s->last_picture_ptr;
4245 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
4251 offset[0]= y * s->linesize;;
4253 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
4259 s->avctx->draw_horiz_band(s->avctx, src, offset,
4260 y, s->picture_structure, h);
4264 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4265 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
4266 const int uvlinesize= s->current_picture.linesize[1];
4267 const int mb_size= 4 - s->avctx->lowres;
4269 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4270 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4271 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4272 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4273 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4274 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;
4275 //block_index is not used by mpeg2, so it is not affected by chroma_format
4277 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4278 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4279 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4281 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4283 s->dest[0] += s->mb_y * linesize << mb_size;
4284 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4285 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4289 #ifdef CONFIG_ENCODERS
4291 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4301 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4302 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4303 int v= ptr[x2 + y2*stride];
4309 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4314 static always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_count)
4316 int16_t weight[8][64];
4317 DCTELEM orig[8][64];
4318 const int mb_x= s->mb_x;
4319 const int mb_y= s->mb_y;
4322 int dct_offset = s->linesize*8; //default for progressive frames
4323 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4326 for(i=0; i<mb_block_count; i++) skip_dct[i]=0;
4328 if(s->adaptive_quant){
4329 const int last_qp= s->qscale;
4330 const int mb_xy= mb_x + mb_y*s->mb_stride;
4332 s->lambda= s->lambda_table[mb_xy];
4335 if(!(s->flags&CODEC_FLAG_QP_RD)){
4336 s->dquant= s->qscale - last_qp;
4338 if(s->out_format==FMT_H263){
4339 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4341 if(s->codec_id==CODEC_ID_MPEG4){
4343 if(s->pict_type == B_TYPE){
4345 s->dquant= (s->dquant/2)*2;
4346 if(s->mv_dir&MV_DIRECT)
4349 if(s->mv_type==MV_TYPE_8X8)
4355 ff_set_qscale(s, last_qp + s->dquant);
4356 }else if(s->flags&CODEC_FLAG_QP_RD)
4357 ff_set_qscale(s, s->qscale + s->dquant);
4359 wrap_y = s->linesize;
4360 wrap_c = s->uvlinesize;
4361 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4362 ptr_cb = s->new_picture.data[1] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4363 ptr_cr = s->new_picture.data[2] + (mb_y * mb_block_height * wrap_c) + mb_x * 8;
4365 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4366 uint8_t *ebuf= s->edge_emu_buffer + 32;
4367 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4369 ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
4370 ptr_cb= ebuf+18*wrap_y;
4371 ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, mb_block_height, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
4372 ptr_cr= ebuf+18*wrap_y+8;
4376 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4377 int progressive_score, interlaced_score;
4379 s->interlaced_dct=0;
4380 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4381 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4383 if(progressive_score > 0){
4384 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4385 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4386 if(progressive_score > interlaced_score){
4387 s->interlaced_dct=1;
4391 if (s->chroma_format == CHROMA_422)
4397 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4398 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4399 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4400 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4402 if(s->flags&CODEC_FLAG_GRAY){
4406 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4407 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4408 if(!s->chroma_y_shift){ /* 422 */
4409 s->dsp.get_pixels(s->block[6], ptr_cb + (dct_offset>>1), wrap_c);
4410 s->dsp.get_pixels(s->block[7], ptr_cr + (dct_offset>>1), wrap_c);
4414 op_pixels_func (*op_pix)[4];
4415 qpel_mc_func (*op_qpix)[16];
4416 uint8_t *dest_y, *dest_cb, *dest_cr;
4418 dest_y = s->dest[0];
4419 dest_cb = s->dest[1];
4420 dest_cr = s->dest[2];
4422 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4423 op_pix = s->dsp.put_pixels_tab;
4424 op_qpix= s->dsp.put_qpel_pixels_tab;
4426 op_pix = s->dsp.put_no_rnd_pixels_tab;
4427 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4430 if (s->mv_dir & MV_DIR_FORWARD) {
4431 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4432 op_pix = s->dsp.avg_pixels_tab;
4433 op_qpix= s->dsp.avg_qpel_pixels_tab;
4435 if (s->mv_dir & MV_DIR_BACKWARD) {
4436 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4439 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4440 int progressive_score, interlaced_score;
4442 s->interlaced_dct=0;
4443 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4444 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4446 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4448 if(progressive_score>0){
4449 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4450 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4452 if(progressive_score > interlaced_score){
4453 s->interlaced_dct=1;
4457 if (s->chroma_format == CHROMA_422)
4463 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4464 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4465 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4466 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4468 if(s->flags&CODEC_FLAG_GRAY){
4472 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4473 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4474 if(!s->chroma_y_shift){ /* 422 */
4475 s->dsp.diff_pixels(s->block[6], ptr_cb + (dct_offset>>1), dest_cb + (dct_offset>>1), wrap_c);
4476 s->dsp.diff_pixels(s->block[7], ptr_cr + (dct_offset>>1), dest_cr + (dct_offset>>1), wrap_c);
4479 /* pre quantization */
4480 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4482 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4483 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4484 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4485 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;
4486 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4487 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4488 if(!s->chroma_y_shift){ /* 422 */
4489 if(s->dsp.sad[1](NULL, ptr_cb +(dct_offset>>1), dest_cb +(dct_offset>>1), wrap_c, 8) < 20*s->qscale) skip_dct[6]= 1;
4490 if(s->dsp.sad[1](NULL, ptr_cr +(dct_offset>>1), dest_cr +(dct_offset>>1), wrap_c, 8) < 20*s->qscale) skip_dct[7]= 1;
4495 if(s->avctx->quantizer_noise_shaping){
4496 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4497 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4498 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4499 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4500 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4501 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4502 if(!s->chroma_y_shift){ /* 422 */
4503 if(!skip_dct[6]) get_vissual_weight(weight[6], ptr_cb + (dct_offset>>1), wrap_c);
4504 if(!skip_dct[7]) get_vissual_weight(weight[7], ptr_cr + (dct_offset>>1), wrap_c);
4506 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*mb_block_count);
4509 /* DCT & quantize */
4510 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4512 for(i=0;i<mb_block_count;i++) {
4515 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4516 // FIXME we could decide to change to quantizer instead of clipping
4517 // JS: I don't think that would be a good idea it could lower quality instead
4518 // of improve it. Just INTRADC clipping deserves changes in quantizer
4519 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4521 s->block_last_index[i]= -1;
4523 if(s->avctx->quantizer_noise_shaping){
4524 for(i=0;i<mb_block_count;i++) {
4526 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4531 if(s->luma_elim_threshold && !s->mb_intra)
4533 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4534 if(s->chroma_elim_threshold && !s->mb_intra)
4535 for(i=4; i<mb_block_count; i++)
4536 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4538 if(s->flags & CODEC_FLAG_CBP_RD){
4539 for(i=0;i<mb_block_count;i++) {
4540 if(s->block_last_index[i] == -1)
4541 s->coded_score[i]= INT_MAX/256;
4546 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4547 s->block_last_index[4]=
4548 s->block_last_index[5]= 0;
4550 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4553 //non c quantize code returns incorrect block_last_index FIXME
4554 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4555 for(i=0; i<mb_block_count; i++){
4557 if(s->block_last_index[i]>0){
4558 for(j=63; j>0; j--){
4559 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4561 s->block_last_index[i]= j;
4566 /* huffman encode */
4567 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4568 case CODEC_ID_MPEG1VIDEO:
4569 case CODEC_ID_MPEG2VIDEO:
4570 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4571 case CODEC_ID_MPEG4:
4572 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4573 case CODEC_ID_MSMPEG4V2:
4574 case CODEC_ID_MSMPEG4V3:
4576 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4578 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4579 #ifdef CONFIG_H261_ENCODER
4581 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4584 case CODEC_ID_H263P:
4588 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4589 case CODEC_ID_MJPEG:
4590 mjpeg_encode_mb(s, s->block); break;
4596 static always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4598 if (s->chroma_format == CHROMA_420) encode_mb_internal(s, motion_x, motion_y, 8, 6);
4599 else encode_mb_internal(s, motion_x, motion_y, 16, 8);
4602 #endif //CONFIG_ENCODERS
4604 void ff_mpeg_flush(AVCodecContext *avctx){
4606 MpegEncContext *s = avctx->priv_data;
4608 if(s==NULL || s->picture==NULL)
4611 for(i=0; i<MAX_PICTURE_COUNT; i++){
4612 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4613 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4614 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4616 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4618 s->mb_x= s->mb_y= 0;
4620 s->parse_context.state= -1;
4621 s->parse_context.frame_start_found= 0;
4622 s->parse_context.overread= 0;
4623 s->parse_context.overread_index= 0;
4624 s->parse_context.index= 0;
4625 s->parse_context.last_index= 0;
4626 s->bitstream_buffer_size=0;
4629 #ifdef CONFIG_ENCODERS
4630 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4632 const uint16_t *srcw= (uint16_t*)src;
4633 int words= length>>4;
4634 int bits= length&15;
4637 if(length==0) return;
4640 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4641 }else if(put_bits_count(pb)&7){
4642 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4644 for(i=0; put_bits_count(pb)&31; i++)
4645 put_bits(pb, 8, src[i]);
4647 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4648 skip_put_bytes(pb, 2*words-i);
4651 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4654 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4657 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4660 d->mb_skip_run= s->mb_skip_run;
4662 d->last_dc[i]= s->last_dc[i];
4665 d->mv_bits= s->mv_bits;
4666 d->i_tex_bits= s->i_tex_bits;
4667 d->p_tex_bits= s->p_tex_bits;
4668 d->i_count= s->i_count;
4669 d->f_count= s->f_count;
4670 d->b_count= s->b_count;
4671 d->skip_count= s->skip_count;
4672 d->misc_bits= s->misc_bits;
4676 d->qscale= s->qscale;
4677 d->dquant= s->dquant;
4680 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4683 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4684 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4687 d->mb_skip_run= s->mb_skip_run;
4689 d->last_dc[i]= s->last_dc[i];
4692 d->mv_bits= s->mv_bits;
4693 d->i_tex_bits= s->i_tex_bits;
4694 d->p_tex_bits= s->p_tex_bits;
4695 d->i_count= s->i_count;
4696 d->f_count= s->f_count;
4697 d->b_count= s->b_count;
4698 d->skip_count= s->skip_count;
4699 d->misc_bits= s->misc_bits;
4701 d->mb_intra= s->mb_intra;
4702 d->mb_skipped= s->mb_skipped;
4703 d->mv_type= s->mv_type;
4704 d->mv_dir= s->mv_dir;
4706 if(s->data_partitioning){
4708 d->tex_pb= s->tex_pb;
4712 d->block_last_index[i]= s->block_last_index[i];
4713 d->interlaced_dct= s->interlaced_dct;
4714 d->qscale= s->qscale;
4717 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4718 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4719 int *dmin, int *next_block, int motion_x, int motion_y)
4722 uint8_t *dest_backup[3];
4724 copy_context_before_encode(s, backup, type);
4726 s->block= s->blocks[*next_block];
4727 s->pb= pb[*next_block];
4728 if(s->data_partitioning){
4729 s->pb2 = pb2 [*next_block];
4730 s->tex_pb= tex_pb[*next_block];
4734 memcpy(dest_backup, s->dest, sizeof(s->dest));
4735 s->dest[0] = s->rd_scratchpad;
4736 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4737 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4738 assert(s->linesize >= 32); //FIXME
4741 encode_mb(s, motion_x, motion_y);
4743 score= put_bits_count(&s->pb);
4744 if(s->data_partitioning){
4745 score+= put_bits_count(&s->pb2);
4746 score+= put_bits_count(&s->tex_pb);
4749 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4750 MPV_decode_mb(s, s->block);
4752 score *= s->lambda2;
4753 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4757 memcpy(s->dest, dest_backup, sizeof(s->dest));
4764 copy_context_after_encode(best, s, type);
4768 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4769 uint32_t *sq = ff_squareTbl + 256;
4774 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4775 else if(w==8 && h==8)
4776 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4780 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4789 static int sse_mb(MpegEncContext *s){
4793 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4794 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4797 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4798 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)
4799 +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)
4800 +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);
4802 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)
4803 +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)
4804 +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);
4807 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)
4808 +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)
4809 +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);
4812 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4813 MpegEncContext *s= arg;
4817 s->me.dia_size= s->avctx->pre_dia_size;
4818 s->first_slice_line=1;
4819 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4820 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4821 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4823 s->first_slice_line=0;
4831 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4832 MpegEncContext *s= arg;
4834 s->me.dia_size= s->avctx->dia_size;
4835 s->first_slice_line=1;
4836 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4837 s->mb_x=0; //for block init below
4838 ff_init_block_index(s);
4839 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4840 s->block_index[0]+=2;
4841 s->block_index[1]+=2;
4842 s->block_index[2]+=2;
4843 s->block_index[3]+=2;
4845 /* compute motion vector & mb_type and store in context */
4846 if(s->pict_type==B_TYPE)
4847 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4849 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4851 s->first_slice_line=0;
4856 static int mb_var_thread(AVCodecContext *c, void *arg){
4857 MpegEncContext *s= arg;
4860 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4861 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4864 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4866 int sum = s->dsp.pix_sum(pix, s->linesize);
4868 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4870 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4871 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4872 s->me.mb_var_sum_temp += varc;
4878 static void write_slice_end(MpegEncContext *s){
4879 if(s->codec_id==CODEC_ID_MPEG4){
4880 if(s->partitioned_frame){
4881 ff_mpeg4_merge_partitions(s);
4884 ff_mpeg4_stuffing(&s->pb);
4885 }else if(s->out_format == FMT_MJPEG){
4886 ff_mjpeg_stuffing(&s->pb);
4889 align_put_bits(&s->pb);
4890 flush_put_bits(&s->pb);
4892 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4893 s->misc_bits+= get_bits_diff(s);
4896 static int encode_thread(AVCodecContext *c, void *arg){
4897 MpegEncContext *s= arg;
4898 int mb_x, mb_y, pdif = 0;
4900 MpegEncContext best_s, backup_s;
4901 uint8_t bit_buf[2][MAX_MB_BYTES];
4902 uint8_t bit_buf2[2][MAX_MB_BYTES];
4903 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4904 PutBitContext pb[2], pb2[2], tex_pb[2];
4905 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4908 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4909 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4910 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4913 s->last_bits= put_bits_count(&s->pb);
4924 /* init last dc values */
4925 /* note: quant matrix value (8) is implied here */
4926 s->last_dc[i] = 128 << s->intra_dc_precision;
4928 s->current_picture.error[i] = 0;
4931 memset(s->last_mv, 0, sizeof(s->last_mv));
4935 switch(s->codec_id){
4937 case CODEC_ID_H263P:
4939 s->gob_index = ff_h263_get_gob_height(s);
4941 case CODEC_ID_MPEG4:
4942 if(s->partitioned_frame)
4943 ff_mpeg4_init_partitions(s);
4949 s->first_slice_line = 1;
4950 s->ptr_lastgob = s->pb.buf;
4951 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4952 // printf("row %d at %X\n", s->mb_y, (int)s);
4956 ff_set_qscale(s, s->qscale);
4957 ff_init_block_index(s);
4959 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4960 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4961 int mb_type= s->mb_type[xy];
4966 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4967 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4970 if(s->data_partitioning){
4971 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4972 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4973 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4979 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4980 ff_update_block_index(s);
4982 #ifdef CONFIG_H261_ENCODER
4983 if(s->codec_id == CODEC_ID_H261){
4984 ff_h261_reorder_mb_index(s);
4985 xy= s->mb_y*s->mb_stride + s->mb_x;
4986 mb_type= s->mb_type[xy];
4990 /* write gob / video packet header */
4992 int current_packet_size, is_gob_start;
4994 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4996 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4998 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
5000 switch(s->codec_id){
5002 case CODEC_ID_H263P:
5003 if(!s->h263_slice_structured)
5004 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
5006 case CODEC_ID_MPEG2VIDEO:
5007 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
5008 case CODEC_ID_MPEG1VIDEO:
5009 if(s->mb_skip_run) is_gob_start=0;
5014 if(s->start_mb_y != mb_y || mb_x!=0){
5017 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
5018 ff_mpeg4_init_partitions(s);
5022 assert((put_bits_count(&s->pb)&7) == 0);
5023 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
5025 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
5026 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
5027 int d= 100 / s->avctx->error_rate;
5029 current_packet_size=0;
5030 #ifndef ALT_BITSTREAM_WRITER
5031 s->pb.buf_ptr= s->ptr_lastgob;
5033 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
5037 if (s->avctx->rtp_callback){
5038 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
5039 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
5042 switch(s->codec_id){
5043 case CODEC_ID_MPEG4:
5044 ff_mpeg4_encode_video_packet_header(s);
5045 ff_mpeg4_clean_buffers(s);
5047 case CODEC_ID_MPEG1VIDEO:
5048 case CODEC_ID_MPEG2VIDEO:
5049 ff_mpeg1_encode_slice_header(s);
5050 ff_mpeg1_clean_buffers(s);
5053 case CODEC_ID_H263P:
5054 h263_encode_gob_header(s, mb_y);
5058 if(s->flags&CODEC_FLAG_PASS1){
5059 int bits= put_bits_count(&s->pb);
5060 s->misc_bits+= bits - s->last_bits;
5064 s->ptr_lastgob += current_packet_size;
5065 s->first_slice_line=1;
5066 s->resync_mb_x=mb_x;
5067 s->resync_mb_y=mb_y;
5071 if( (s->resync_mb_x == s->mb_x)
5072 && s->resync_mb_y+1 == s->mb_y){
5073 s->first_slice_line=0;
5077 s->dquant=0; //only for QP_RD
5079 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
5081 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
5083 copy_context_before_encode(&backup_s, s, -1);
5085 best_s.data_partitioning= s->data_partitioning;
5086 best_s.partitioned_frame= s->partitioned_frame;
5087 if(s->data_partitioning){
5088 backup_s.pb2= s->pb2;
5089 backup_s.tex_pb= s->tex_pb;
5092 if(mb_type&CANDIDATE_MB_TYPE_INTER){
5093 s->mv_dir = MV_DIR_FORWARD;
5094 s->mv_type = MV_TYPE_16X16;
5096 s->mv[0][0][0] = s->p_mv_table[xy][0];
5097 s->mv[0][0][1] = s->p_mv_table[xy][1];
5098 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
5099 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5101 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
5102 s->mv_dir = MV_DIR_FORWARD;
5103 s->mv_type = MV_TYPE_FIELD;
5106 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5107 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5108 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5110 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
5111 &dmin, &next_block, 0, 0);
5113 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
5114 s->mv_dir = MV_DIR_FORWARD;
5115 s->mv_type = MV_TYPE_16X16;
5119 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
5120 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5122 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
5123 s->mv_dir = MV_DIR_FORWARD;
5124 s->mv_type = MV_TYPE_8X8;
5127 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5128 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5130 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
5131 &dmin, &next_block, 0, 0);
5133 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
5134 s->mv_dir = MV_DIR_FORWARD;
5135 s->mv_type = MV_TYPE_16X16;
5137 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5138 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5139 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
5140 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
5142 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
5143 s->mv_dir = MV_DIR_BACKWARD;
5144 s->mv_type = MV_TYPE_16X16;
5146 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5147 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5148 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
5149 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
5151 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
5152 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5153 s->mv_type = MV_TYPE_16X16;
5155 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5156 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5157 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5158 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5159 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
5160 &dmin, &next_block, 0, 0);
5162 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
5163 int mx= s->b_direct_mv_table[xy][0];
5164 int my= s->b_direct_mv_table[xy][1];
5166 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5168 ff_mpeg4_set_direct_mv(s, mx, my);
5169 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
5170 &dmin, &next_block, mx, my);
5172 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
5173 s->mv_dir = MV_DIR_FORWARD;
5174 s->mv_type = MV_TYPE_FIELD;
5177 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5178 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5179 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5181 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
5182 &dmin, &next_block, 0, 0);
5184 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
5185 s->mv_dir = MV_DIR_BACKWARD;
5186 s->mv_type = MV_TYPE_FIELD;
5189 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5190 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5191 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5193 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
5194 &dmin, &next_block, 0, 0);
5196 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
5197 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5198 s->mv_type = MV_TYPE_FIELD;
5200 for(dir=0; dir<2; dir++){
5202 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5203 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5204 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5207 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
5208 &dmin, &next_block, 0, 0);
5210 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
5212 s->mv_type = MV_TYPE_16X16;
5216 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
5217 &dmin, &next_block, 0, 0);
5218 if(s->h263_pred || s->h263_aic){
5220 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
5222 ff_clean_intra_table_entries(s); //old mode?
5226 if(s->flags & CODEC_FLAG_QP_RD){
5227 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
5228 const int last_qp= backup_s.qscale;
5231 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
5232 static const int dquant_tab[4]={-1,1,-2,2};
5234 assert(backup_s.dquant == 0);
5237 s->mv_dir= best_s.mv_dir;
5238 s->mv_type = MV_TYPE_16X16;
5239 s->mb_intra= best_s.mb_intra;
5240 s->mv[0][0][0] = best_s.mv[0][0][0];
5241 s->mv[0][0][1] = best_s.mv[0][0][1];
5242 s->mv[1][0][0] = best_s.mv[1][0][0];
5243 s->mv[1][0][1] = best_s.mv[1][0][1];
5245 qpi = s->pict_type == B_TYPE ? 2 : 0;
5246 for(; qpi<4; qpi++){
5247 int dquant= dquant_tab[qpi];
5248 qp= last_qp + dquant;
5249 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
5251 backup_s.dquant= dquant;
5252 if(s->mb_intra && s->dc_val[0]){
5254 dc[i]= s->dc_val[0][ s->block_index[i] ];
5255 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
5259 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
5260 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
5261 if(best_s.qscale != qp){
5262 if(s->mb_intra && s->dc_val[0]){
5264 s->dc_val[0][ s->block_index[i] ]= dc[i];
5265 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
5271 s->current_picture.qscale_table[xy]= qp;
5275 copy_context_after_encode(s, &best_s, -1);
5277 pb_bits_count= put_bits_count(&s->pb);
5278 flush_put_bits(&s->pb);
5279 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
5282 if(s->data_partitioning){
5283 pb2_bits_count= put_bits_count(&s->pb2);
5284 flush_put_bits(&s->pb2);
5285 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5286 s->pb2= backup_s.pb2;
5288 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5289 flush_put_bits(&s->tex_pb);
5290 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5291 s->tex_pb= backup_s.tex_pb;
5293 s->last_bits= put_bits_count(&s->pb);
5295 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5296 ff_h263_update_motion_val(s);
5298 if(next_block==0){ //FIXME 16 vs linesize16
5299 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5300 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5301 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5304 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5305 MPV_decode_mb(s, s->block);
5307 int motion_x, motion_y;
5308 s->mv_type=MV_TYPE_16X16;
5309 // only one MB-Type possible
5312 case CANDIDATE_MB_TYPE_INTRA:
5315 motion_x= s->mv[0][0][0] = 0;
5316 motion_y= s->mv[0][0][1] = 0;
5318 case CANDIDATE_MB_TYPE_INTER:
5319 s->mv_dir = MV_DIR_FORWARD;
5321 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5322 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5324 case CANDIDATE_MB_TYPE_INTER_I:
5325 s->mv_dir = MV_DIR_FORWARD;
5326 s->mv_type = MV_TYPE_FIELD;
5329 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5330 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5331 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5333 motion_x = motion_y = 0;
5335 case CANDIDATE_MB_TYPE_INTER4V:
5336 s->mv_dir = MV_DIR_FORWARD;
5337 s->mv_type = MV_TYPE_8X8;
5340 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5341 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5343 motion_x= motion_y= 0;
5345 case CANDIDATE_MB_TYPE_DIRECT:
5346 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5348 motion_x=s->b_direct_mv_table[xy][0];
5349 motion_y=s->b_direct_mv_table[xy][1];
5350 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5352 case CANDIDATE_MB_TYPE_BIDIR:
5353 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5357 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5358 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5359 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5360 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5362 case CANDIDATE_MB_TYPE_BACKWARD:
5363 s->mv_dir = MV_DIR_BACKWARD;
5365 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5366 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5368 case CANDIDATE_MB_TYPE_FORWARD:
5369 s->mv_dir = MV_DIR_FORWARD;
5371 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5372 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5373 // printf(" %d %d ", motion_x, motion_y);
5375 case CANDIDATE_MB_TYPE_FORWARD_I:
5376 s->mv_dir = MV_DIR_FORWARD;
5377 s->mv_type = MV_TYPE_FIELD;
5380 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5381 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5382 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5384 motion_x=motion_y=0;
5386 case CANDIDATE_MB_TYPE_BACKWARD_I:
5387 s->mv_dir = MV_DIR_BACKWARD;
5388 s->mv_type = MV_TYPE_FIELD;
5391 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5392 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5393 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5395 motion_x=motion_y=0;
5397 case CANDIDATE_MB_TYPE_BIDIR_I:
5398 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5399 s->mv_type = MV_TYPE_FIELD;
5401 for(dir=0; dir<2; dir++){
5403 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5404 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5405 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5408 motion_x=motion_y=0;
5411 motion_x=motion_y=0; //gcc warning fix
5412 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5415 encode_mb(s, motion_x, motion_y);
5417 // RAL: Update last macroblock type
5418 s->last_mv_dir = s->mv_dir;
5420 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5421 ff_h263_update_motion_val(s);
5423 MPV_decode_mb(s, s->block);
5426 /* clean the MV table in IPS frames for direct mode in B frames */
5427 if(s->mb_intra /* && I,P,S_TYPE */){
5428 s->p_mv_table[xy][0]=0;
5429 s->p_mv_table[xy][1]=0;
5432 if(s->flags&CODEC_FLAG_PSNR){
5436 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5437 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5439 s->current_picture.error[0] += sse(
5440 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5441 s->dest[0], w, h, s->linesize);
5442 s->current_picture.error[1] += sse(
5443 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5444 s->dest[1], w>>1, h>>1, s->uvlinesize);
5445 s->current_picture.error[2] += sse(
5446 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5447 s->dest[2], w>>1, h>>1, s->uvlinesize);
5450 if(s->out_format == FMT_H263)
5451 ff_h263_loop_filter(s);
5453 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5457 //not beautiful here but we must write it before flushing so it has to be here
5458 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5459 msmpeg4_encode_ext_header(s);
5463 /* Send the last GOB if RTP */
5464 if (s->avctx->rtp_callback) {
5465 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5466 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5467 /* Call the RTP callback to send the last GOB */
5469 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5475 #define MERGE(field) dst->field += src->field; src->field=0
5476 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5477 MERGE(me.scene_change_score);
5478 MERGE(me.mc_mb_var_sum_temp);
5479 MERGE(me.mb_var_sum_temp);
5482 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5485 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5486 MERGE(dct_count[1]);
5496 MERGE(padding_bug_score);
5497 MERGE(current_picture.error[0]);
5498 MERGE(current_picture.error[1]);
5499 MERGE(current_picture.error[2]);
5501 if(dst->avctx->noise_reduction){
5502 for(i=0; i<64; i++){
5503 MERGE(dct_error_sum[0][i]);
5504 MERGE(dct_error_sum[1][i]);
5508 assert(put_bits_count(&src->pb) % 8 ==0);
5509 assert(put_bits_count(&dst->pb) % 8 ==0);
5510 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5511 flush_put_bits(&dst->pb);
5514 static int estimate_qp(MpegEncContext *s, int dry_run){
5515 if (s->next_lambda){
5516 s->current_picture_ptr->quality=
5517 s->current_picture.quality = s->next_lambda;
5518 if(!dry_run) s->next_lambda= 0;
5519 } else if (!s->fixed_qscale) {
5520 s->current_picture_ptr->quality=
5521 s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
5522 if (s->current_picture.quality < 0)
5526 if(s->adaptive_quant){
5527 switch(s->codec_id){
5528 case CODEC_ID_MPEG4:
5529 ff_clean_mpeg4_qscales(s);
5532 case CODEC_ID_H263P:
5534 ff_clean_h263_qscales(s);
5538 s->lambda= s->lambda_table[0];
5541 s->lambda= s->current_picture.quality;
5542 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5547 static int encode_picture(MpegEncContext *s, int picture_number)
5552 s->picture_number = picture_number;
5554 /* Reset the average MB variance */
5555 s->me.mb_var_sum_temp =
5556 s->me.mc_mb_var_sum_temp = 0;
5558 /* we need to initialize some time vars before we can encode b-frames */
5559 // RAL: Condition added for MPEG1VIDEO
5560 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5561 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5563 s->me.scene_change_score=0;
5565 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5567 if(s->pict_type==I_TYPE){
5568 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5569 else s->no_rounding=0;
5570 }else if(s->pict_type!=B_TYPE){
5571 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5572 s->no_rounding ^= 1;
5575 if(s->flags & CODEC_FLAG_PASS2){
5576 if (estimate_qp(s,1) < 0)
5578 ff_get_2pass_fcode(s);
5579 }else if(!(s->flags & CODEC_FLAG_QSCALE)){
5580 if(s->pict_type==B_TYPE)
5581 s->lambda= s->last_lambda_for[s->pict_type];
5583 s->lambda= s->last_lambda_for[s->last_non_b_pict_type];
5587 s->mb_intra=0; //for the rate distortion & bit compare functions
5588 for(i=1; i<s->avctx->thread_count; i++){
5589 ff_update_duplicate_context(s->thread_context[i], s);
5594 /* Estimate motion for every MB */
5595 if(s->pict_type != I_TYPE){
5596 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5597 s->lambda2= (s->lambda2* (int64_t)s->avctx->me_penalty_compensation + 128)>>8;
5598 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5599 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5600 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5604 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5605 }else /* if(s->pict_type == I_TYPE) */{
5607 for(i=0; i<s->mb_stride*s->mb_height; i++)
5608 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5610 if(!s->fixed_qscale){
5611 /* finding spatial complexity for I-frame rate control */
5612 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5615 for(i=1; i<s->avctx->thread_count; i++){
5616 merge_context_after_me(s, s->thread_context[i]);
5618 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5619 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5622 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5623 s->pict_type= I_TYPE;
5624 for(i=0; i<s->mb_stride*s->mb_height; i++)
5625 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5626 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5630 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5631 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5633 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5635 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5636 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5637 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5640 ff_fix_long_p_mvs(s);
5641 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5642 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5646 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5647 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5652 if(s->pict_type==B_TYPE){
5655 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5656 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5657 s->f_code = FFMAX(a, b);
5659 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5660 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5661 s->b_code = FFMAX(a, b);
5663 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5664 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5665 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5666 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5667 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5669 for(dir=0; dir<2; dir++){
5672 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5673 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5674 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5675 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5683 if (estimate_qp(s, 0) < 0)
5686 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5687 s->qscale= 3; //reduce clipping problems
5689 if (s->out_format == FMT_MJPEG) {
5690 /* for mjpeg, we do include qscale in the matrix */
5691 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5693 int j= s->dsp.idct_permutation[i];
5695 s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5697 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5698 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5702 //FIXME var duplication
5703 s->current_picture_ptr->key_frame=
5704 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5705 s->current_picture_ptr->pict_type=
5706 s->current_picture.pict_type= s->pict_type;
5708 if(s->current_picture.key_frame)
5709 s->picture_in_gop_number=0;
5711 s->last_bits= put_bits_count(&s->pb);
5712 switch(s->out_format) {
5714 mjpeg_picture_header(s);
5716 #ifdef CONFIG_H261_ENCODER
5718 ff_h261_encode_picture_header(s, picture_number);
5722 if (s->codec_id == CODEC_ID_WMV2)
5723 ff_wmv2_encode_picture_header(s, picture_number);
5724 else if (s->h263_msmpeg4)
5725 msmpeg4_encode_picture_header(s, picture_number);
5726 else if (s->h263_pred)
5727 mpeg4_encode_picture_header(s, picture_number);
5728 #ifdef CONFIG_RV10_ENCODER
5729 else if (s->codec_id == CODEC_ID_RV10)
5730 rv10_encode_picture_header(s, picture_number);
5732 #ifdef CONFIG_RV20_ENCODER
5733 else if (s->codec_id == CODEC_ID_RV20)
5734 rv20_encode_picture_header(s, picture_number);
5736 else if (s->codec_id == CODEC_ID_FLV1)
5737 ff_flv_encode_picture_header(s, picture_number);
5739 h263_encode_picture_header(s, picture_number);
5742 mpeg1_encode_picture_header(s, picture_number);
5749 bits= put_bits_count(&s->pb);
5750 s->header_bits= bits - s->last_bits;
5752 for(i=1; i<s->avctx->thread_count; i++){
5753 update_duplicate_context_after_me(s->thread_context[i], s);
5755 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5756 for(i=1; i<s->avctx->thread_count; i++){
5757 merge_context_after_encode(s, s->thread_context[i]);
5763 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5764 const int intra= s->mb_intra;
5767 s->dct_count[intra]++;
5769 for(i=0; i<64; i++){
5770 int level= block[i];
5774 s->dct_error_sum[intra][i] += level;
5775 level -= s->dct_offset[intra][i];
5776 if(level<0) level=0;
5778 s->dct_error_sum[intra][i] -= level;
5779 level += s->dct_offset[intra][i];
5780 if(level>0) level=0;
5787 static int dct_quantize_trellis_c(MpegEncContext *s,
5788 DCTELEM *block, int n,
5789 int qscale, int *overflow){
5791 const uint8_t *scantable= s->intra_scantable.scantable;
5792 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5794 unsigned int threshold1, threshold2;
5806 int coeff_count[64];
5807 int qmul, qadd, start_i, last_non_zero, i, dc;
5808 const int esc_length= s->ac_esc_length;
5810 uint8_t * last_length;
5811 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5813 s->dsp.fdct (block);
5815 if(s->dct_error_sum)
5816 s->denoise_dct(s, block);
5818 qadd= ((qscale-1)|1)*8;
5829 /* For AIC we skip quant/dequant of INTRADC */
5834 /* note: block[0] is assumed to be positive */
5835 block[0] = (block[0] + (q >> 1)) / q;
5838 qmat = s->q_intra_matrix[qscale];
5839 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5840 bias= 1<<(QMAT_SHIFT-1);
5841 length = s->intra_ac_vlc_length;
5842 last_length= s->intra_ac_vlc_last_length;
5846 qmat = s->q_inter_matrix[qscale];
5847 length = s->inter_ac_vlc_length;
5848 last_length= s->inter_ac_vlc_last_length;
5852 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5853 threshold2= (threshold1<<1);
5855 for(i=63; i>=start_i; i--) {
5856 const int j = scantable[i];
5857 int level = block[j] * qmat[j];
5859 if(((unsigned)(level+threshold1))>threshold2){
5865 for(i=start_i; i<=last_non_zero; i++) {
5866 const int j = scantable[i];
5867 int level = block[j] * qmat[j];
5869 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5870 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5871 if(((unsigned)(level+threshold1))>threshold2){
5873 level= (bias + level)>>QMAT_SHIFT;
5875 coeff[1][i]= level-1;
5876 // coeff[2][k]= level-2;
5878 level= (bias - level)>>QMAT_SHIFT;
5879 coeff[0][i]= -level;
5880 coeff[1][i]= -level+1;
5881 // coeff[2][k]= -level+2;
5883 coeff_count[i]= FFMIN(level, 2);
5884 assert(coeff_count[i]);
5887 coeff[0][i]= (level>>31)|1;
5892 *overflow= s->max_qcoeff < max; //overflow might have happened
5894 if(last_non_zero < start_i){
5895 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5896 return last_non_zero;
5899 score_tab[start_i]= 0;
5900 survivor[0]= start_i;
5903 for(i=start_i; i<=last_non_zero; i++){
5905 const int dct_coeff= FFABS(block[ scantable[i] ]);
5906 const int zero_distoration= dct_coeff*dct_coeff;
5907 int best_score=256*256*256*120;
5908 for(level_index=0; level_index < coeff_count[i]; level_index++){
5910 int level= coeff[level_index][i];
5911 const int alevel= FFABS(level);
5916 if(s->out_format == FMT_H263){
5917 unquant_coeff= alevel*qmul + qadd;
5919 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5921 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5922 unquant_coeff = (unquant_coeff - 1) | 1;
5924 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5925 unquant_coeff = (unquant_coeff - 1) | 1;
5930 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5932 if((level&(~127)) == 0){
5933 for(j=survivor_count-1; j>=0; j--){
5934 int run= i - survivor[j];
5935 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5936 score += score_tab[i-run];
5938 if(score < best_score){
5941 level_tab[i+1]= level-64;
5945 if(s->out_format == FMT_H263){
5946 for(j=survivor_count-1; j>=0; j--){
5947 int run= i - survivor[j];
5948 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5949 score += score_tab[i-run];
5950 if(score < last_score){
5953 last_level= level-64;
5959 distoration += esc_length*lambda;
5960 for(j=survivor_count-1; j>=0; j--){
5961 int run= i - survivor[j];
5962 int score= distoration + score_tab[i-run];
5964 if(score < best_score){
5967 level_tab[i+1]= level-64;
5971 if(s->out_format == FMT_H263){
5972 for(j=survivor_count-1; j>=0; j--){
5973 int run= i - survivor[j];
5974 int score= distoration + score_tab[i-run];
5975 if(score < last_score){
5978 last_level= level-64;
5986 score_tab[i+1]= best_score;
5988 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5989 if(last_non_zero <= 27){
5990 for(; survivor_count; survivor_count--){
5991 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5995 for(; survivor_count; survivor_count--){
5996 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
6001 survivor[ survivor_count++ ]= i+1;
6004 if(s->out_format != FMT_H263){
6005 last_score= 256*256*256*120;
6006 for(i= survivor[0]; i<=last_non_zero + 1; i++){
6007 int score= score_tab[i];
6008 if(i) score += lambda*2; //FIXME exacter?
6010 if(score < last_score){
6013 last_level= level_tab[i];
6014 last_run= run_tab[i];
6019 s->coded_score[n] = last_score;
6021 dc= FFABS(block[0]);
6022 last_non_zero= last_i - 1;
6023 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
6025 if(last_non_zero < start_i)
6026 return last_non_zero;
6028 if(last_non_zero == 0 && start_i == 0){
6030 int best_score= dc * dc;
6032 for(i=0; i<coeff_count[0]; i++){
6033 int level= coeff[i][0];
6034 int alevel= FFABS(level);
6035 int unquant_coeff, score, distortion;
6037 if(s->out_format == FMT_H263){
6038 unquant_coeff= (alevel*qmul + qadd)>>3;
6040 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
6041 unquant_coeff = (unquant_coeff - 1) | 1;
6043 unquant_coeff = (unquant_coeff + 4) >> 3;
6044 unquant_coeff<<= 3 + 3;
6046 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
6048 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
6049 else score= distortion + esc_length*lambda;
6051 if(score < best_score){
6053 best_level= level - 64;
6056 block[0]= best_level;
6057 s->coded_score[n] = best_score - dc*dc;
6058 if(best_level == 0) return -1;
6059 else return last_non_zero;
6065 block[ perm_scantable[last_non_zero] ]= last_level;
6068 for(; i>start_i; i -= run_tab[i] + 1){
6069 block[ perm_scantable[i-1] ]= level_tab[i];
6072 return last_non_zero;
6075 //#define REFINE_STATS 1
6076 static int16_t basis[64][64];
6078 static void build_basis(uint8_t *perm){
6085 double s= 0.25*(1<<BASIS_SHIFT);
6087 int perm_index= perm[index];
6088 if(i==0) s*= sqrt(0.5);
6089 if(j==0) s*= sqrt(0.5);
6090 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)));
6097 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
6098 DCTELEM *block, int16_t *weight, DCTELEM *orig,
6101 DECLARE_ALIGNED_16(DCTELEM, d1[64]);
6103 const uint8_t *scantable= s->intra_scantable.scantable;
6104 const uint8_t *perm_scantable= s->intra_scantable.permutated;
6105 // unsigned int threshold1, threshold2;
6110 int qmul, qadd, start_i, last_non_zero, i, dc;
6112 uint8_t * last_length;
6114 int rle_index, run, q, sum;
6117 static int after_last=0;
6118 static int to_zero=0;
6119 static int from_zero=0;
6122 static int messed_sign=0;
6125 if(basis[0][0] == 0)
6126 build_basis(s->dsp.idct_permutation);
6137 /* For AIC we skip quant/dequant of INTRADC */
6141 q <<= RECON_SHIFT-3;
6142 /* note: block[0] is assumed to be positive */
6144 // block[0] = (block[0] + (q >> 1)) / q;
6146 qmat = s->q_intra_matrix[qscale];
6147 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
6148 // bias= 1<<(QMAT_SHIFT-1);
6149 length = s->intra_ac_vlc_length;
6150 last_length= s->intra_ac_vlc_last_length;
6154 qmat = s->q_inter_matrix[qscale];
6155 length = s->inter_ac_vlc_length;
6156 last_length= s->inter_ac_vlc_last_length;
6158 last_non_zero = s->block_last_index[n];
6163 dc += (1<<(RECON_SHIFT-1));
6164 for(i=0; i<64; i++){
6165 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
6168 STOP_TIMER("memset rem[]")}
6171 for(i=0; i<64; i++){
6176 w= FFABS(weight[i]) + qns*one;
6177 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
6180 // w=weight[i] = (63*qns + (w/2)) / w;
6186 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
6192 for(i=start_i; i<=last_non_zero; i++){
6193 int j= perm_scantable[i];
6194 const int level= block[j];
6198 if(level<0) coeff= qmul*level - qadd;
6199 else coeff= qmul*level + qadd;
6200 run_tab[rle_index++]=run;
6203 s->dsp.add_8x8basis(rem, basis[j], coeff);
6209 if(last_non_zero>0){
6210 STOP_TIMER("init rem[]")
6217 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
6220 int run2, best_unquant_change=0, analyze_gradient;
6224 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
6226 if(analyze_gradient){
6230 for(i=0; i<64; i++){
6233 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
6236 STOP_TIMER("rem*w*w")}
6246 const int level= block[0];
6247 int change, old_coeff;
6249 assert(s->mb_intra);
6253 for(change=-1; change<=1; change+=2){
6254 int new_level= level + change;
6255 int score, new_coeff;
6257 new_coeff= q*new_level;
6258 if(new_coeff >= 2048 || new_coeff < 0)
6261 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
6262 if(score<best_score){
6265 best_change= change;
6266 best_unquant_change= new_coeff - old_coeff;
6273 run2= run_tab[rle_index++];
6277 for(i=start_i; i<64; i++){
6278 int j= perm_scantable[i];
6279 const int level= block[j];
6280 int change, old_coeff;
6282 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
6286 if(level<0) old_coeff= qmul*level - qadd;
6287 else old_coeff= qmul*level + qadd;
6288 run2= run_tab[rle_index++]; //FIXME ! maybe after last
6292 assert(run2>=0 || i >= last_non_zero );
6295 for(change=-1; change<=1; change+=2){
6296 int new_level= level + change;
6297 int score, new_coeff, unquant_change;
6300 if(s->avctx->quantizer_noise_shaping < 2 && FFABS(new_level) > FFABS(level))
6304 if(new_level<0) new_coeff= qmul*new_level - qadd;
6305 else new_coeff= qmul*new_level + qadd;
6306 if(new_coeff >= 2048 || new_coeff <= -2048)
6308 //FIXME check for overflow
6311 if(level < 63 && level > -63){
6312 if(i < last_non_zero)
6313 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6314 - length[UNI_AC_ENC_INDEX(run, level+64)];
6316 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6317 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6320 assert(FFABS(new_level)==1);
6322 if(analyze_gradient){
6323 int g= d1[ scantable[i] ];
6324 if(g && (g^new_level) >= 0)
6328 if(i < last_non_zero){
6329 int next_i= i + run2 + 1;
6330 int next_level= block[ perm_scantable[next_i] ] + 64;
6332 if(next_level&(~127))
6335 if(next_i < last_non_zero)
6336 score += length[UNI_AC_ENC_INDEX(run, 65)]
6337 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6338 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6340 score += length[UNI_AC_ENC_INDEX(run, 65)]
6341 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6342 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6344 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6346 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6347 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6353 assert(FFABS(level)==1);
6355 if(i < last_non_zero){
6356 int next_i= i + run2 + 1;
6357 int next_level= block[ perm_scantable[next_i] ] + 64;
6359 if(next_level&(~127))
6362 if(next_i < last_non_zero)
6363 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6364 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6365 - length[UNI_AC_ENC_INDEX(run, 65)];
6367 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6368 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6369 - length[UNI_AC_ENC_INDEX(run, 65)];
6371 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6373 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6374 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6381 unquant_change= new_coeff - old_coeff;
6382 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6384 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6385 if(score<best_score){
6388 best_change= change;
6389 best_unquant_change= unquant_change;
6393 prev_level= level + 64;
6394 if(prev_level&(~127))
6403 STOP_TIMER("iterative step")}
6407 int j= perm_scantable[ best_coeff ];
6409 block[j] += best_change;
6411 if(best_coeff > last_non_zero){
6412 last_non_zero= best_coeff;
6420 if(block[j] - best_change){
6421 if(FFABS(block[j]) > FFABS(block[j] - best_change)){
6433 for(; last_non_zero>=start_i; last_non_zero--){
6434 if(block[perm_scantable[last_non_zero]])
6440 if(256*256*256*64 % count == 0){
6441 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);
6446 for(i=start_i; i<=last_non_zero; i++){
6447 int j= perm_scantable[i];
6448 const int level= block[j];
6451 run_tab[rle_index++]=run;
6458 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6464 if(last_non_zero>0){
6465 STOP_TIMER("iterative search")
6470 return last_non_zero;
6473 static int dct_quantize_c(MpegEncContext *s,
6474 DCTELEM *block, int n,
6475 int qscale, int *overflow)
6477 int i, j, level, last_non_zero, q, start_i;
6479 const uint8_t *scantable= s->intra_scantable.scantable;
6482 unsigned int threshold1, threshold2;
6484 s->dsp.fdct (block);
6486 if(s->dct_error_sum)
6487 s->denoise_dct(s, block);
6497 /* For AIC we skip quant/dequant of INTRADC */
6500 /* note: block[0] is assumed to be positive */
6501 block[0] = (block[0] + (q >> 1)) / q;
6504 qmat = s->q_intra_matrix[qscale];
6505 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6509 qmat = s->q_inter_matrix[qscale];
6510 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6512 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6513 threshold2= (threshold1<<1);
6514 for(i=63;i>=start_i;i--) {
6516 level = block[j] * qmat[j];
6518 if(((unsigned)(level+threshold1))>threshold2){
6525 for(i=start_i; i<=last_non_zero; i++) {
6527 level = block[j] * qmat[j];
6529 // if( bias+level >= (1<<QMAT_SHIFT)
6530 // || bias-level >= (1<<QMAT_SHIFT)){
6531 if(((unsigned)(level+threshold1))>threshold2){
6533 level= (bias + level)>>QMAT_SHIFT;
6536 level= (bias - level)>>QMAT_SHIFT;
6544 *overflow= s->max_qcoeff < max; //overflow might have happened
6546 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6547 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6548 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6550 return last_non_zero;
6553 #endif //CONFIG_ENCODERS
6555 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6556 DCTELEM *block, int n, int qscale)
6558 int i, level, nCoeffs;
6559 const uint16_t *quant_matrix;
6561 nCoeffs= s->block_last_index[n];
6564 block[0] = block[0] * s->y_dc_scale;
6566 block[0] = block[0] * s->c_dc_scale;
6567 /* XXX: only mpeg1 */
6568 quant_matrix = s->intra_matrix;
6569 for(i=1;i<=nCoeffs;i++) {
6570 int j= s->intra_scantable.permutated[i];
6575 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6576 level = (level - 1) | 1;
6579 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6580 level = (level - 1) | 1;
6587 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6588 DCTELEM *block, int n, int qscale)
6590 int i, level, nCoeffs;
6591 const uint16_t *quant_matrix;
6593 nCoeffs= s->block_last_index[n];
6595 quant_matrix = s->inter_matrix;
6596 for(i=0; i<=nCoeffs; i++) {
6597 int j= s->intra_scantable.permutated[i];
6602 level = (((level << 1) + 1) * qscale *
6603 ((int) (quant_matrix[j]))) >> 4;
6604 level = (level - 1) | 1;
6607 level = (((level << 1) + 1) * qscale *
6608 ((int) (quant_matrix[j]))) >> 4;
6609 level = (level - 1) | 1;
6616 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6617 DCTELEM *block, int n, int qscale)
6619 int i, level, nCoeffs;
6620 const uint16_t *quant_matrix;
6622 if(s->alternate_scan) nCoeffs= 63;
6623 else nCoeffs= s->block_last_index[n];
6626 block[0] = block[0] * s->y_dc_scale;
6628 block[0] = block[0] * s->c_dc_scale;
6629 quant_matrix = s->intra_matrix;
6630 for(i=1;i<=nCoeffs;i++) {
6631 int j= s->intra_scantable.permutated[i];
6636 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6639 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6646 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
6647 DCTELEM *block, int n, int qscale)
6649 int i, level, nCoeffs;
6650 const uint16_t *quant_matrix;
6653 if(s->alternate_scan) nCoeffs= 63;
6654 else nCoeffs= s->block_last_index[n];
6657 block[0] = block[0] * s->y_dc_scale;
6659 block[0] = block[0] * s->c_dc_scale;
6660 quant_matrix = s->intra_matrix;
6661 for(i=1;i<=nCoeffs;i++) {
6662 int j= s->intra_scantable.permutated[i];
6667 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6670 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6679 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6680 DCTELEM *block, int n, int qscale)
6682 int i, level, nCoeffs;
6683 const uint16_t *quant_matrix;
6686 if(s->alternate_scan) nCoeffs= 63;
6687 else nCoeffs= s->block_last_index[n];
6689 quant_matrix = s->inter_matrix;
6690 for(i=0; i<=nCoeffs; i++) {
6691 int j= s->intra_scantable.permutated[i];
6696 level = (((level << 1) + 1) * qscale *
6697 ((int) (quant_matrix[j]))) >> 4;
6700 level = (((level << 1) + 1) * qscale *
6701 ((int) (quant_matrix[j]))) >> 4;
6710 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6711 DCTELEM *block, int n, int qscale)
6713 int i, level, qmul, qadd;
6716 assert(s->block_last_index[n]>=0);
6722 block[0] = block[0] * s->y_dc_scale;
6724 block[0] = block[0] * s->c_dc_scale;
6725 qadd = (qscale - 1) | 1;
6732 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6734 for(i=1; i<=nCoeffs; i++) {
6738 level = level * qmul - qadd;
6740 level = level * qmul + qadd;
6747 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6748 DCTELEM *block, int n, int qscale)
6750 int i, level, qmul, qadd;
6753 assert(s->block_last_index[n]>=0);
6755 qadd = (qscale - 1) | 1;
6758 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6760 for(i=0; i<=nCoeffs; i++) {
6764 level = level * qmul - qadd;
6766 level = level * qmul + qadd;
6773 #ifdef CONFIG_ENCODERS
6774 AVCodec h263_encoder = {
6778 sizeof(MpegEncContext),
6782 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6785 AVCodec h263p_encoder = {
6789 sizeof(MpegEncContext),
6793 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6796 AVCodec flv_encoder = {
6800 sizeof(MpegEncContext),
6804 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6807 AVCodec rv10_encoder = {
6811 sizeof(MpegEncContext),
6815 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6818 AVCodec rv20_encoder = {
6822 sizeof(MpegEncContext),
6826 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6829 AVCodec mpeg4_encoder = {
6833 sizeof(MpegEncContext),
6837 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6838 .capabilities= CODEC_CAP_DELAY,
6841 AVCodec msmpeg4v1_encoder = {
6845 sizeof(MpegEncContext),
6849 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6852 AVCodec msmpeg4v2_encoder = {
6856 sizeof(MpegEncContext),
6860 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6863 AVCodec msmpeg4v3_encoder = {
6867 sizeof(MpegEncContext),
6871 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6874 AVCodec wmv1_encoder = {
6878 sizeof(MpegEncContext),
6882 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6885 AVCodec mjpeg_encoder = {
6889 sizeof(MpegEncContext),
6893 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, -1},
6896 #endif //CONFIG_ENCODERS