2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 * The simplest mpeg encoder (well, it was the simplest!).
29 #include <math.h> //for PI
32 #include "mpegvideo.h"
36 #include "fastmemcpy.h"
42 #ifdef CONFIG_ENCODERS
43 static void encode_picture(MpegEncContext *s, int picture_number);
44 #endif //CONFIG_ENCODERS
45 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
46 DCTELEM *block, int n, int qscale);
47 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
48 DCTELEM *block, int n, int qscale);
49 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
50 DCTELEM *block, int n, int qscale);
51 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
52 DCTELEM *block, int n, int qscale);
53 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
54 DCTELEM *block, int n, int qscale);
55 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
56 DCTELEM *block, int n, int qscale);
57 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
58 #ifdef CONFIG_ENCODERS
59 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
60 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
61 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
62 static int sse_mb(MpegEncContext *s);
63 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
64 #endif //CONFIG_ENCODERS
67 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
68 extern void XVMC_field_end(MpegEncContext *s);
69 extern void XVMC_decode_mb(MpegEncContext *s);
72 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
75 /* enable all paranoid tests for rounding, overflows, etc... */
81 /* for jpeg fast DCT */
84 static const uint16_t aanscales[64] = {
85 /* precomputed values scaled up by 14 bits */
86 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
87 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
88 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
89 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
90 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
91 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
92 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
93 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
96 static const uint8_t h263_chroma_roundtab[16] = {
97 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
98 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
101 static const uint8_t ff_default_chroma_qscale_table[32]={
102 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
103 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
106 #ifdef CONFIG_ENCODERS
107 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
108 static uint8_t default_fcode_tab[MAX_MV*2+1];
110 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
112 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
113 const uint16_t *quant_matrix, int bias, int qmin, int qmax)
117 for(qscale=qmin; qscale<=qmax; qscale++){
119 if (dsp->fdct == ff_jpeg_fdct_islow
120 #ifdef FAAN_POSTSCALE
121 || dsp->fdct == ff_faandct
125 const int j= dsp->idct_permutation[i];
126 /* 16 <= qscale * quant_matrix[i] <= 7905 */
127 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
128 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
129 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
131 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
132 (qscale * quant_matrix[j]));
134 } else if (dsp->fdct == fdct_ifast
135 #ifndef FAAN_POSTSCALE
136 || dsp->fdct == ff_faandct
140 const int j= dsp->idct_permutation[i];
141 /* 16 <= qscale * quant_matrix[i] <= 7905 */
142 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
143 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
144 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
146 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
147 (aanscales[i] * qscale * quant_matrix[j]));
151 const int j= dsp->idct_permutation[i];
152 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
153 So 16 <= qscale * quant_matrix[i] <= 7905
154 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
155 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
157 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
158 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
159 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
161 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
162 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
168 static inline void update_qscale(MpegEncContext *s){
169 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
170 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
172 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
174 #endif //CONFIG_ENCODERS
176 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
180 st->scantable= src_scantable;
184 j = src_scantable[i];
185 st->permutated[i] = permutation[j];
194 j = st->permutated[i];
196 st->raster_end[i]= end;
200 #ifdef CONFIG_ENCODERS
201 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
207 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
212 #endif //CONFIG_ENCODERS
214 /* init common dct for both encoder and decoder */
215 int DCT_common_init(MpegEncContext *s)
217 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
218 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
219 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
220 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
221 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
222 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
224 #ifdef CONFIG_ENCODERS
225 s->dct_quantize= dct_quantize_c;
226 s->denoise_dct= denoise_dct_c;
230 MPV_common_init_mmx(s);
233 MPV_common_init_axp(s);
236 MPV_common_init_mlib(s);
239 MPV_common_init_mmi(s);
242 MPV_common_init_armv4l(s);
245 MPV_common_init_ppc(s);
248 #ifdef CONFIG_ENCODERS
249 s->fast_dct_quantize= s->dct_quantize;
251 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
252 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
255 #endif //CONFIG_ENCODERS
257 /* load & permutate scantables
258 note: only wmv uses differnt ones
260 if(s->alternate_scan){
261 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
262 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
264 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
265 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
267 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
268 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
270 s->picture_structure= PICT_FRAME;
275 static void copy_picture(Picture *dst, Picture *src){
277 dst->type= FF_BUFFER_TYPE_COPY;
280 static void copy_picture_attributes(AVFrame *dst, AVFrame *src){
281 dst->pict_type = src->pict_type;
282 dst->quality = src->quality;
283 dst->coded_picture_number = src->coded_picture_number;
284 dst->display_picture_number = src->display_picture_number;
285 // dst->reference = src->reference;
287 dst->interlaced_frame = src->interlaced_frame;
288 dst->top_field_first = src->top_field_first;
292 * allocates a Picture
293 * The pixels are allocated/set by calling get_buffer() if shared=0
295 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
296 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
297 const int mb_array_size= s->mb_stride*s->mb_height;
298 const int b8_array_size= s->b8_stride*s->mb_height*2;
299 const int b4_array_size= s->b4_stride*s->mb_height*4;
303 assert(pic->data[0]);
304 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
305 pic->type= FF_BUFFER_TYPE_SHARED;
309 assert(!pic->data[0]);
311 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
313 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
314 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
318 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
319 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
323 if(pic->linesize[1] != pic->linesize[2]){
324 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride missmatch)\n");
328 s->linesize = pic->linesize[0];
329 s->uvlinesize= pic->linesize[1];
332 if(pic->qscale_table==NULL){
334 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
335 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
336 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
339 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
340 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
341 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
342 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
343 if(s->out_format == FMT_H264){
345 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+1) * sizeof(int16_t))
346 pic->motion_val[i]= pic->motion_val_base[i]+1;
347 CHECKED_ALLOCZ(pic->ref_index[i] , b8_array_size * sizeof(uint8_t))
349 pic->motion_subsample_log2= 2;
350 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
352 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+1) * sizeof(int16_t)*2) //FIXME
353 pic->motion_val[i]= pic->motion_val_base[i]+1;
355 pic->motion_subsample_log2= 3;
357 pic->qstride= s->mb_stride;
358 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
361 //it might be nicer if the application would keep track of these but it would require a API change
362 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
363 s->prev_pict_types[0]= s->pict_type;
364 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
365 pic->age= INT_MAX; // skiped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
368 fail: //for the CHECKED_ALLOCZ macro
373 * deallocates a picture
375 static void free_picture(MpegEncContext *s, Picture *pic){
378 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
379 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
382 av_freep(&pic->mb_var);
383 av_freep(&pic->mc_mb_var);
384 av_freep(&pic->mb_mean);
385 av_freep(&pic->mbskip_table);
386 av_freep(&pic->qscale_table);
387 av_freep(&pic->mb_type_base);
388 av_freep(&pic->pan_scan);
391 av_freep(&pic->motion_val_base[i]);
392 av_freep(&pic->ref_index[i]);
395 if(pic->type == FF_BUFFER_TYPE_SHARED){
404 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
407 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
408 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
410 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
411 CHECKED_ALLOCZ(s->me.scratchpad, s->width*2*16*2*sizeof(uint8_t))
412 s->rd_scratchpad= s->me.scratchpad;
413 s->b_scratchpad= s->me.scratchpad;
414 s->obmc_scratchpad= s->me.scratchpad + 16;
416 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
417 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
418 if(s->avctx->noise_reduction){
419 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
422 CHECKED_ALLOCZ(s->blocks, 64*6*2 * sizeof(DCTELEM))
423 s->block= s->blocks[0];
426 s->pblocks[i] = (short *)(&s->block[i]);
430 return -1; //free() through MPV_common_end()
433 static void free_duplicate_context(MpegEncContext *s){
436 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
437 av_freep(&s->me.scratchpad);
440 s->obmc_scratchpad= NULL;
442 av_freep(&s->dct_error_sum);
443 av_freep(&s->me.map);
444 av_freep(&s->me.score_map);
445 av_freep(&s->blocks);
449 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
450 #define COPY(a) bak->a= src->a
451 COPY(allocated_edge_emu_buffer);
452 COPY(edge_emu_buffer);
456 COPY(obmc_scratchpad);
463 COPY(me.map_generation);
471 static void update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
473 //FIXME copy only needed parts
475 backup_duplicate_context(&bak, dst);
476 memcpy(dst, src, sizeof(MpegEncContext));
477 backup_duplicate_context(dst, &bak);
478 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
481 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
482 #define COPY(a) dst->a= src->a
484 COPY(current_picture);
490 COPY(picture_in_gop_number);
491 COPY(gop_picture_number);
492 COPY(frame_pred_frame_dct); //FIXME dont set in encode_header
493 COPY(progressive_frame); //FIXME dont set in encode_header
494 COPY(partitioned_frame); //FIXME dont set in encode_header
498 /* init common structure for both encoder and decoder */
499 int MPV_common_init(MpegEncContext *s)
501 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
503 dsputil_init(&s->dsp, s->avctx);
506 s->flags= s->avctx->flags;
507 s->flags2= s->avctx->flags2;
509 s->mb_width = (s->width + 15) / 16;
510 s->mb_height = (s->height + 15) / 16;
511 s->mb_stride = s->mb_width + 1;
512 s->b8_stride = s->mb_width*2 + 1;
513 s->b4_stride = s->mb_width*4 + 1;
514 mb_array_size= s->mb_height * s->mb_stride;
515 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
517 /* set default edge pos, will be overriden in decode_header if needed */
518 s->h_edge_pos= s->mb_width*16;
519 s->v_edge_pos= s->mb_height*16;
521 s->mb_num = s->mb_width * s->mb_height;
526 s->block_wrap[3]= s->mb_width*2 + 2;
528 s->block_wrap[5]= s->mb_width + 2;
531 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
532 s->chroma_qscale_table= ff_default_chroma_qscale_table;
534 s->progressive_sequence= 1;
535 s->progressive_frame= 1;
536 s->coded_picture_number = 0;
538 y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
539 c_size = (s->mb_width + 2) * (s->mb_height + 2);
540 yc_size = y_size + 2 * c_size;
542 /* convert fourcc to upper case */
543 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
544 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
545 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
546 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
548 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
549 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
550 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
551 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
553 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
555 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
556 for(y=0; y<s->mb_height; y++){
557 for(x=0; x<s->mb_width; x++){
558 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
561 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
564 /* Allocate MV tables */
565 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
566 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
567 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
568 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
569 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
570 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
571 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
572 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
573 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
574 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
575 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
576 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
578 if(s->msmpeg4_version){
579 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
581 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
583 /* Allocate MB type table */
584 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
586 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
588 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
589 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
590 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
591 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
592 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
593 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
595 if(s->avctx->noise_reduction){
596 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
599 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
601 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
603 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
604 /* interlaced direct mode decoding tables */
609 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
610 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
612 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
613 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
614 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
616 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
619 if (s->out_format == FMT_H263) {
621 CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16);
622 s->ac_val[1] = s->ac_val[0] + y_size;
623 s->ac_val[2] = s->ac_val[1] + c_size;
626 CHECKED_ALLOCZ(s->coded_block, y_size);
628 /* divx501 bitstream reorder buffer */
629 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
631 /* cbp, ac_pred, pred_dir */
632 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
633 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
636 if (s->h263_pred || s->h263_plus || !s->encoding) {
638 //MN: we need these for error resilience of intra-frames
639 CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(int16_t));
640 s->dc_val[1] = s->dc_val[0] + y_size;
641 s->dc_val[2] = s->dc_val[1] + c_size;
642 for(i=0;i<yc_size;i++)
643 s->dc_val[0][i] = 1024;
646 /* which mb is a intra block */
647 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
648 memset(s->mbintra_table, 1, mb_array_size);
650 /* default structure is frame */
651 s->picture_structure = PICT_FRAME;
653 /* init macroblock skip table */
654 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
655 //Note the +1 is for a quicker mpeg4 slice_end detection
656 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
658 s->parse_context.state= -1;
659 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
660 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
661 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
662 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
665 s->context_initialized = 1;
667 s->thread_context[0]= s;
668 for(i=1; i<s->avctx->thread_count; i++){
669 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
670 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
673 for(i=0; i<s->avctx->thread_count; i++){
674 if(init_duplicate_context(s->thread_context[i], s) < 0)
676 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
677 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
686 /* init common structure for both encoder and decoder */
687 void MPV_common_end(MpegEncContext *s)
691 for(i=0; i<s->avctx->thread_count; i++){
692 free_duplicate_context(s->thread_context[i]);
694 for(i=1; i<s->avctx->thread_count; i++){
695 av_freep(&s->thread_context[i]);
698 av_freep(&s->parse_context.buffer);
699 s->parse_context.buffer_size=0;
701 av_freep(&s->mb_type);
702 av_freep(&s->p_mv_table_base);
703 av_freep(&s->b_forw_mv_table_base);
704 av_freep(&s->b_back_mv_table_base);
705 av_freep(&s->b_bidir_forw_mv_table_base);
706 av_freep(&s->b_bidir_back_mv_table_base);
707 av_freep(&s->b_direct_mv_table_base);
709 s->b_forw_mv_table= NULL;
710 s->b_back_mv_table= NULL;
711 s->b_bidir_forw_mv_table= NULL;
712 s->b_bidir_back_mv_table= NULL;
713 s->b_direct_mv_table= NULL;
717 av_freep(&s->b_field_mv_table_base[i][j][k]);
718 s->b_field_mv_table[i][j][k]=NULL;
720 av_freep(&s->b_field_select_table[i][j]);
721 av_freep(&s->p_field_mv_table_base[i][j]);
722 s->p_field_mv_table[i][j]=NULL;
724 av_freep(&s->p_field_select_table[i]);
727 av_freep(&s->dc_val[0]);
728 av_freep(&s->ac_val[0]);
729 av_freep(&s->coded_block);
730 av_freep(&s->mbintra_table);
731 av_freep(&s->cbp_table);
732 av_freep(&s->pred_dir_table);
734 av_freep(&s->mbskip_table);
735 av_freep(&s->prev_pict_types);
736 av_freep(&s->bitstream_buffer);
737 av_freep(&s->avctx->stats_out);
738 av_freep(&s->ac_stats);
739 av_freep(&s->error_status_table);
740 av_freep(&s->mb_index2xy);
741 av_freep(&s->lambda_table);
742 av_freep(&s->q_intra_matrix);
743 av_freep(&s->q_inter_matrix);
744 av_freep(&s->q_intra_matrix16);
745 av_freep(&s->q_inter_matrix16);
746 av_freep(&s->input_picture);
747 av_freep(&s->reordered_input_picture);
748 av_freep(&s->dct_offset);
751 for(i=0; i<MAX_PICTURE_COUNT; i++){
752 free_picture(s, &s->picture[i]);
755 av_freep(&s->picture);
756 avcodec_default_free_buffers(s->avctx);
757 s->context_initialized = 0;
760 s->current_picture_ptr= NULL;
762 if (s->visualization_buffer[i])
763 av_free(s->visualization_buffer[i]);
766 #ifdef CONFIG_ENCODERS
768 /* init video encoder */
769 int MPV_encode_init(AVCodecContext *avctx)
771 MpegEncContext *s = avctx->priv_data;
773 int chroma_h_shift, chroma_v_shift;
775 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
777 s->bit_rate = avctx->bit_rate;
778 s->width = avctx->width;
779 s->height = avctx->height;
780 if(avctx->gop_size > 600){
781 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
784 s->gop_size = avctx->gop_size;
786 s->flags= avctx->flags;
787 s->flags2= avctx->flags2;
788 s->max_b_frames= avctx->max_b_frames;
789 s->codec_id= avctx->codec->id;
790 s->luma_elim_threshold = avctx->luma_elim_threshold;
791 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
792 s->strict_std_compliance= avctx->strict_std_compliance;
793 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
794 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
795 s->mpeg_quant= avctx->mpeg_quant;
796 s->rtp_mode= !!avctx->rtp_payload_size;
798 if (s->gop_size <= 1) {
805 s->me_method = avctx->me_method;
808 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
810 s->adaptive_quant= ( s->avctx->lumi_masking
811 || s->avctx->dark_masking
812 || s->avctx->temporal_cplx_masking
813 || s->avctx->spatial_cplx_masking
814 || s->avctx->p_masking
815 || (s->flags&CODEC_FLAG_QP_RD))
818 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
819 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
820 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
822 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
823 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
827 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
828 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");
831 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
832 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
833 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
837 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
838 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
842 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
843 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
847 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
848 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
852 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
853 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
857 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
858 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
862 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
863 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");
867 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
868 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
872 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
873 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
877 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
878 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
882 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
883 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
884 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
885 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
889 if(s->avctx->thread_count > MAX_THREADS || 16*s->avctx->thread_count > s->height){
890 av_log(avctx, AV_LOG_ERROR, "too many threads\n");
894 if(s->avctx->thread_count > 1)
897 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
899 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
900 avctx->frame_rate /= i;
901 avctx->frame_rate_base /= i;
905 if(s->codec_id==CODEC_ID_MJPEG){
906 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
907 s->inter_quant_bias= 0;
908 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
909 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
910 s->inter_quant_bias= 0;
912 s->intra_quant_bias=0;
913 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
916 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
917 s->intra_quant_bias= avctx->intra_quant_bias;
918 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
919 s->inter_quant_bias= avctx->inter_quant_bias;
921 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
923 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
924 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
926 switch(avctx->codec->id) {
927 case CODEC_ID_MPEG1VIDEO:
928 s->out_format = FMT_MPEG1;
929 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
930 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
932 case CODEC_ID_MPEG2VIDEO:
933 s->out_format = FMT_MPEG1;
934 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
935 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
940 s->out_format = FMT_MJPEG;
941 s->intra_only = 1; /* force intra only for jpeg */
942 s->mjpeg_write_tables = 1; /* write all tables */
943 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
944 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
945 s->mjpeg_vsample[1] = 1;
946 s->mjpeg_vsample[2] = 1;
947 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
948 s->mjpeg_hsample[1] = 1;
949 s->mjpeg_hsample[2] = 1;
950 if (mjpeg_init(s) < 0)
957 if (h263_get_picture_format(s->width, s->height) == 7) {
958 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
961 s->out_format = FMT_H263;
962 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
967 s->out_format = FMT_H263;
970 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
971 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
972 s->modified_quant= s->h263_aic;
973 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
974 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
975 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
976 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
977 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
980 /* These are just to be sure */
985 s->out_format = FMT_H263;
986 s->h263_flv = 2; /* format = 1; 11-bit codes */
987 s->unrestricted_mv = 1;
988 s->rtp_mode=0; /* don't allow GOB */
993 s->out_format = FMT_H263;
998 s->out_format = FMT_H263;
1000 s->unrestricted_mv = 1;
1001 s->low_delay= s->max_b_frames ? 0 : 1;
1002 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1004 case CODEC_ID_MSMPEG4V1:
1005 s->out_format = FMT_H263;
1006 s->h263_msmpeg4 = 1;
1008 s->unrestricted_mv = 1;
1009 s->msmpeg4_version= 1;
1013 case CODEC_ID_MSMPEG4V2:
1014 s->out_format = FMT_H263;
1015 s->h263_msmpeg4 = 1;
1017 s->unrestricted_mv = 1;
1018 s->msmpeg4_version= 2;
1022 case CODEC_ID_MSMPEG4V3:
1023 s->out_format = FMT_H263;
1024 s->h263_msmpeg4 = 1;
1026 s->unrestricted_mv = 1;
1027 s->msmpeg4_version= 3;
1028 s->flipflop_rounding=1;
1033 s->out_format = FMT_H263;
1034 s->h263_msmpeg4 = 1;
1036 s->unrestricted_mv = 1;
1037 s->msmpeg4_version= 4;
1038 s->flipflop_rounding=1;
1043 s->out_format = FMT_H263;
1044 s->h263_msmpeg4 = 1;
1046 s->unrestricted_mv = 1;
1047 s->msmpeg4_version= 5;
1048 s->flipflop_rounding=1;
1057 { /* set up some save defaults, some codecs might override them later */
1063 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
1064 memset(default_mv_penalty, 0, sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1));
1065 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
1067 for(i=-16; i<16; i++){
1068 default_fcode_tab[i + MAX_MV]= 1;
1072 s->me.mv_penalty= default_mv_penalty;
1073 s->fcode_tab= default_fcode_tab;
1075 /* dont use mv_penalty table for crap MV as it would be confused */
1076 //FIXME remove after fixing / removing old ME
1077 if (s->me_method < ME_EPZS) s->me.mv_penalty = default_mv_penalty;
1082 if (MPV_common_init(s) < 0)
1085 if(s->modified_quant)
1086 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1087 s->progressive_frame=
1088 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1089 s->quant_precision=5;
1091 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1095 #ifdef CONFIG_ENCODERS
1097 if (s->out_format == FMT_H263)
1098 h263_encode_init(s);
1099 if(s->msmpeg4_version)
1100 ff_msmpeg4_encode_init(s);
1102 if (s->out_format == FMT_MPEG1)
1103 ff_mpeg1_encode_init(s);
1106 /* init default q matrix */
1108 int j= s->dsp.idct_permutation[i];
1110 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1111 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1112 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1113 }else if(s->out_format == FMT_H263){
1114 s->intra_matrix[j] =
1115 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1119 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1120 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1122 if(s->avctx->intra_matrix)
1123 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1124 if(s->avctx->inter_matrix)
1125 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1128 /* precompute matrix */
1129 /* for mjpeg, we do include qscale in the matrix */
1130 if (s->out_format != FMT_MJPEG) {
1131 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1132 s->intra_matrix, s->intra_quant_bias, 1, 31);
1133 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1134 s->inter_matrix, s->inter_quant_bias, 1, 31);
1137 if(ff_rate_control_init(s) < 0)
1140 s->picture_number = 0;
1141 s->input_picture_number = 0;
1142 s->picture_in_gop_number = 0;
1143 /* motion detector init */
1150 int MPV_encode_end(AVCodecContext *avctx)
1152 MpegEncContext *s = avctx->priv_data;
1158 ff_rate_control_uninit(s);
1161 if (s->out_format == FMT_MJPEG)
1164 av_freep(&avctx->extradata);
1169 #endif //CONFIG_ENCODERS
1171 void init_rl(RLTable *rl)
1173 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1174 uint8_t index_run[MAX_RUN+1];
1175 int last, run, level, start, end, i;
1177 /* compute max_level[], max_run[] and index_run[] */
1178 for(last=0;last<2;last++) {
1187 memset(max_level, 0, MAX_RUN + 1);
1188 memset(max_run, 0, MAX_LEVEL + 1);
1189 memset(index_run, rl->n, MAX_RUN + 1);
1190 for(i=start;i<end;i++) {
1191 run = rl->table_run[i];
1192 level = rl->table_level[i];
1193 if (index_run[run] == rl->n)
1195 if (level > max_level[run])
1196 max_level[run] = level;
1197 if (run > max_run[level])
1198 max_run[level] = run;
1200 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1201 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1202 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1203 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1204 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1205 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1209 /* draw the edges of width 'w' of an image of size width, height */
1210 //FIXME check that this is ok for mpeg4 interlaced
1211 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1213 uint8_t *ptr, *last_line;
1216 last_line = buf + (height - 1) * wrap;
1218 /* top and bottom */
1219 memcpy(buf - (i + 1) * wrap, buf, width);
1220 memcpy(last_line + (i + 1) * wrap, last_line, width);
1222 /* left and right */
1224 for(i=0;i<height;i++) {
1225 memset(ptr - w, ptr[0], w);
1226 memset(ptr + width, ptr[width-1], w);
1231 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1232 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1233 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1234 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1238 int ff_find_unused_picture(MpegEncContext *s, int shared){
1242 for(i=0; i<MAX_PICTURE_COUNT; i++){
1243 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1246 for(i=0; i<MAX_PICTURE_COUNT; i++){
1247 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1249 for(i=0; i<MAX_PICTURE_COUNT; i++){
1250 if(s->picture[i].data[0]==NULL) return i;
1258 static void update_noise_reduction(MpegEncContext *s){
1261 for(intra=0; intra<2; intra++){
1262 if(s->dct_count[intra] > (1<<16)){
1263 for(i=0; i<64; i++){
1264 s->dct_error_sum[intra][i] >>=1;
1266 s->dct_count[intra] >>= 1;
1269 for(i=0; i<64; i++){
1270 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);
1276 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1278 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1284 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1286 /* mark&release old frames */
1287 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr->data[0]) {
1288 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1290 /* release forgotten pictures */
1291 /* if(mpeg124/h263) */
1293 for(i=0; i<MAX_PICTURE_COUNT; i++){
1294 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1295 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1296 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1303 /* release non refernce frames */
1304 for(i=0; i<MAX_PICTURE_COUNT; i++){
1305 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1306 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1310 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1311 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1313 i= ff_find_unused_picture(s, 0);
1314 pic= (AVFrame*)&s->picture[i];
1317 pic->reference= s->pict_type != B_TYPE ? 3 : 0;
1319 pic->coded_picture_number= s->coded_picture_number++;
1321 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1324 s->current_picture_ptr= (Picture*)pic;
1325 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1326 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1329 s->current_picture_ptr->pict_type= s->pict_type;
1330 // if(s->flags && CODEC_FLAG_QSCALE)
1331 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1332 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1334 copy_picture(&s->current_picture, s->current_picture_ptr);
1336 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1337 if (s->pict_type != B_TYPE) {
1338 s->last_picture_ptr= s->next_picture_ptr;
1339 s->next_picture_ptr= s->current_picture_ptr;
1342 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1343 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1345 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1346 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1347 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1351 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1353 if(s->picture_structure!=PICT_FRAME){
1356 if(s->picture_structure == PICT_BOTTOM_FIELD){
1357 s->current_picture.data[i] += s->current_picture.linesize[i];
1359 s->current_picture.linesize[i] *= 2;
1360 s->last_picture.linesize[i] *=2;
1361 s->next_picture.linesize[i] *=2;
1366 s->hurry_up= s->avctx->hurry_up;
1367 s->error_resilience= avctx->error_resilience;
1369 /* set dequantizer, we cant do it during init as it might change for mpeg4
1370 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1371 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1372 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1373 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1374 }else if(s->out_format == FMT_H263){
1375 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1376 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1378 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1379 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1382 if(s->dct_error_sum){
1383 assert(s->avctx->noise_reduction && s->encoding);
1385 update_noise_reduction(s);
1389 if(s->avctx->xvmc_acceleration)
1390 return XVMC_field_start(s, avctx);
1395 /* generic function for encode/decode called after a frame has been coded/decoded */
1396 void MPV_frame_end(MpegEncContext *s)
1399 /* draw edge for correct motion prediction if outside */
1401 //just to make sure that all data is rendered.
1402 if(s->avctx->xvmc_acceleration){
1406 if(s->unrestricted_mv && s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1407 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1408 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1409 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1413 s->last_pict_type = s->pict_type;
1414 if(s->pict_type!=B_TYPE){
1415 s->last_non_b_pict_type= s->pict_type;
1418 /* copy back current_picture variables */
1419 for(i=0; i<MAX_PICTURE_COUNT; i++){
1420 if(s->picture[i].data[0] == s->current_picture.data[0]){
1421 s->picture[i]= s->current_picture;
1425 assert(i<MAX_PICTURE_COUNT);
1429 /* release non refernce frames */
1430 for(i=0; i<MAX_PICTURE_COUNT; i++){
1431 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1432 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1436 // clear copies, to avoid confusion
1438 memset(&s->last_picture, 0, sizeof(Picture));
1439 memset(&s->next_picture, 0, sizeof(Picture));
1440 memset(&s->current_picture, 0, sizeof(Picture));
1445 * draws an line from (ex, ey) -> (sx, sy).
1446 * @param w width of the image
1447 * @param h height of the image
1448 * @param stride stride/linesize of the image
1449 * @param color color of the arrow
1451 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1454 sx= clip(sx, 0, w-1);
1455 sy= clip(sy, 0, h-1);
1456 ex= clip(ex, 0, w-1);
1457 ey= clip(ey, 0, h-1);
1459 buf[sy*stride + sx]+= color;
1461 if(ABS(ex - sx) > ABS(ey - sy)){
1466 buf+= sx + sy*stride;
1468 f= ((ey-sy)<<16)/ex;
1469 for(x= 0; x <= ex; x++){
1470 y= ((x*f) + (1<<15))>>16;
1471 buf[y*stride + x]+= color;
1478 buf+= sx + sy*stride;
1480 if(ey) f= ((ex-sx)<<16)/ey;
1482 for(y= 0; y <= ey; y++){
1483 x= ((y*f) + (1<<15))>>16;
1484 buf[y*stride + x]+= color;
1490 * draws an arrow from (ex, ey) -> (sx, sy).
1491 * @param w width of the image
1492 * @param h height of the image
1493 * @param stride stride/linesize of the image
1494 * @param color color of the arrow
1496 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1499 sx= clip(sx, -100, w+100);
1500 sy= clip(sy, -100, h+100);
1501 ex= clip(ex, -100, w+100);
1502 ey= clip(ey, -100, h+100);
1507 if(dx*dx + dy*dy > 3*3){
1510 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1512 //FIXME subpixel accuracy
1513 rx= ROUNDED_DIV(rx*3<<4, length);
1514 ry= ROUNDED_DIV(ry*3<<4, length);
1516 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1517 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1519 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1523 * prints debuging info for the given picture.
1525 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1527 if(!pict || !pict->mb_type) return;
1529 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1532 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1533 switch (pict->pict_type) {
1534 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1535 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1536 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1537 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1538 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1539 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1541 for(y=0; y<s->mb_height; y++){
1542 for(x=0; x<s->mb_width; x++){
1543 if(s->avctx->debug&FF_DEBUG_SKIP){
1544 int count= s->mbskip_table[x + y*s->mb_stride];
1545 if(count>9) count=9;
1546 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1548 if(s->avctx->debug&FF_DEBUG_QP){
1549 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1551 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1552 int mb_type= pict->mb_type[x + y*s->mb_stride];
1553 //Type & MV direction
1555 av_log(s->avctx, AV_LOG_DEBUG, "P");
1556 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1557 av_log(s->avctx, AV_LOG_DEBUG, "A");
1558 else if(IS_INTRA4x4(mb_type))
1559 av_log(s->avctx, AV_LOG_DEBUG, "i");
1560 else if(IS_INTRA16x16(mb_type))
1561 av_log(s->avctx, AV_LOG_DEBUG, "I");
1562 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1563 av_log(s->avctx, AV_LOG_DEBUG, "d");
1564 else if(IS_DIRECT(mb_type))
1565 av_log(s->avctx, AV_LOG_DEBUG, "D");
1566 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1567 av_log(s->avctx, AV_LOG_DEBUG, "g");
1568 else if(IS_GMC(mb_type))
1569 av_log(s->avctx, AV_LOG_DEBUG, "G");
1570 else if(IS_SKIP(mb_type))
1571 av_log(s->avctx, AV_LOG_DEBUG, "S");
1572 else if(!USES_LIST(mb_type, 1))
1573 av_log(s->avctx, AV_LOG_DEBUG, ">");
1574 else if(!USES_LIST(mb_type, 0))
1575 av_log(s->avctx, AV_LOG_DEBUG, "<");
1577 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1578 av_log(s->avctx, AV_LOG_DEBUG, "X");
1583 av_log(s->avctx, AV_LOG_DEBUG, "+");
1584 else if(IS_16X8(mb_type))
1585 av_log(s->avctx, AV_LOG_DEBUG, "-");
1586 else if(IS_8X16(mb_type))
1587 av_log(s->avctx, AV_LOG_DEBUG, "¦");
1588 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1589 av_log(s->avctx, AV_LOG_DEBUG, " ");
1591 av_log(s->avctx, AV_LOG_DEBUG, "?");
1594 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1595 av_log(s->avctx, AV_LOG_DEBUG, "=");
1597 av_log(s->avctx, AV_LOG_DEBUG, " ");
1599 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1601 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1605 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1606 const int shift= 1 + s->quarter_sample;
1610 int h_chroma_shift, v_chroma_shift;
1611 s->low_delay=0; //needed to see the vectors without trashing the buffers
1613 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1615 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*s->height:pict->linesize[i]*s->height >> v_chroma_shift);
1616 pict->data[i]= s->visualization_buffer[i];
1618 pict->type= FF_BUFFER_TYPE_COPY;
1621 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1623 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1624 const int mb_index= mb_x + mb_y*s->mb_stride;
1625 if((s->avctx->debug_mv) && pict->motion_val){
1627 for(type=0; type<3; type++){
1630 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1634 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1638 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1643 if(!USES_LIST(pict->mb_type[mb_index], direction))
1646 if(IS_8X8(pict->mb_type[mb_index])){
1649 int sx= mb_x*16 + 4 + 8*(i&1);
1650 int sy= mb_y*16 + 4 + 8*(i>>1);
1651 int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2);
1652 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1653 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1654 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1656 }else if(IS_16X8(pict->mb_type[mb_index])){
1660 int sy=mb_y*16 + 4 + 8*i;
1661 int xy=1 + mb_x*2 + (mb_y*2 + 1 + i)*(s->mb_width*2 + 2);
1662 int mx=(pict->motion_val[direction][xy][0]>>shift) + sx;
1663 int my=(pict->motion_val[direction][xy][1]>>shift) + sy;
1664 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1667 int sx= mb_x*16 + 8;
1668 int sy= mb_y*16 + 8;
1669 int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2);
1670 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1671 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1672 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1676 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1677 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1680 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1681 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1684 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1685 int mb_type= pict->mb_type[mb_index];
1688 #define COLOR(theta, r)\
1689 u= (int)(128 + r*cos(theta*3.141592/180));\
1690 v= (int)(128 + r*sin(theta*3.141592/180));
1694 if(IS_PCM(mb_type)){
1696 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1698 }else if(IS_INTRA4x4(mb_type)){
1700 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1702 }else if(IS_DIRECT(mb_type)){
1704 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1706 }else if(IS_GMC(mb_type)){
1708 }else if(IS_SKIP(mb_type)){
1710 }else if(!USES_LIST(mb_type, 1)){
1712 }else if(!USES_LIST(mb_type, 0)){
1715 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1719 u*= 0x0101010101010101ULL;
1720 v*= 0x0101010101010101ULL;
1722 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1723 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1727 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1728 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1729 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1731 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1733 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1736 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1740 s->mbskip_table[mb_index]=0;
1746 #ifdef CONFIG_ENCODERS
1748 static int get_sae(uint8_t *src, int ref, int stride){
1752 for(y=0; y<16; y++){
1753 for(x=0; x<16; x++){
1754 acc+= ABS(src[x+y*stride] - ref);
1761 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1768 for(y=0; y<h; y+=16){
1769 for(x=0; x<w; x+=16){
1770 int offset= x + y*stride;
1771 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1772 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1773 int sae = get_sae(src + offset, mean, stride);
1775 acc+= sae + 500 < sad;
1782 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1785 const int encoding_delay= s->max_b_frames;
1789 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1790 if(pic_arg->linesize[0] != s->linesize) direct=0;
1791 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1792 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1794 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1797 i= ff_find_unused_picture(s, 1);
1799 pic= (AVFrame*)&s->picture[i];
1803 pic->data[i]= pic_arg->data[i];
1804 pic->linesize[i]= pic_arg->linesize[i];
1806 alloc_picture(s, (Picture*)pic, 1);
1809 i= ff_find_unused_picture(s, 0);
1811 pic= (AVFrame*)&s->picture[i];
1814 alloc_picture(s, (Picture*)pic, 0);
1816 if( pic->data[0] + offset == pic_arg->data[0]
1817 && pic->data[1] + offset == pic_arg->data[1]
1818 && pic->data[2] + offset == pic_arg->data[2]){
1821 int h_chroma_shift, v_chroma_shift;
1822 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1825 int src_stride= pic_arg->linesize[i];
1826 int dst_stride= i ? s->uvlinesize : s->linesize;
1827 int h_shift= i ? h_chroma_shift : 0;
1828 int v_shift= i ? v_chroma_shift : 0;
1829 int w= s->width >>h_shift;
1830 int h= s->height>>v_shift;
1831 uint8_t *src= pic_arg->data[i];
1832 uint8_t *dst= pic->data[i] + offset;
1834 if(src_stride==dst_stride)
1835 memcpy(dst, src, src_stride*h);
1838 memcpy(dst, src, w);
1846 copy_picture_attributes(pic, pic_arg);
1848 pic->display_picture_number= s->input_picture_number++;
1851 /* shift buffer entries */
1852 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1853 s->input_picture[i-1]= s->input_picture[i];
1855 s->input_picture[encoding_delay]= (Picture*)pic;
1860 static void select_input_picture(MpegEncContext *s){
1863 for(i=1; i<MAX_PICTURE_COUNT; i++)
1864 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
1865 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
1867 /* set next picture types & ordering */
1868 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
1869 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
1870 s->reordered_input_picture[0]= s->input_picture[0];
1871 s->reordered_input_picture[0]->pict_type= I_TYPE;
1872 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
1876 if(s->flags&CODEC_FLAG_PASS2){
1877 for(i=0; i<s->max_b_frames+1; i++){
1878 int pict_num= s->input_picture[0]->display_picture_number + i;
1879 int pict_type= s->rc_context.entry[pict_num].new_pict_type;
1880 s->input_picture[i]->pict_type= pict_type;
1882 if(i + 1 >= s->rc_context.num_entries) break;
1886 if(s->input_picture[0]->pict_type){
1887 /* user selected pict_type */
1888 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
1889 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
1892 if(b_frames > s->max_b_frames){
1893 av_log(s->avctx, AV_LOG_ERROR, "warning, too many bframes in a row\n");
1894 b_frames = s->max_b_frames;
1896 }else if(s->avctx->b_frame_strategy==0){
1897 b_frames= s->max_b_frames;
1898 while(b_frames && !s->input_picture[b_frames]) b_frames--;
1899 }else if(s->avctx->b_frame_strategy==1){
1900 for(i=1; i<s->max_b_frames+1; i++){
1901 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
1902 s->input_picture[i]->b_frame_score=
1903 get_intra_count(s, s->input_picture[i ]->data[0],
1904 s->input_picture[i-1]->data[0], s->linesize) + 1;
1907 for(i=0; i<s->max_b_frames; i++){
1908 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
1911 b_frames= FFMAX(0, i-1);
1914 for(i=0; i<b_frames+1; i++){
1915 s->input_picture[i]->b_frame_score=0;
1918 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
1923 //static int b_count=0;
1924 //b_count+= b_frames;
1925 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
1926 if(s->picture_in_gop_number + b_frames >= s->gop_size){
1927 if(s->flags & CODEC_FLAG_CLOSED_GOP)
1929 s->input_picture[b_frames]->pict_type= I_TYPE;
1932 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
1934 && s->input_picture[b_frames]->pict_type== I_TYPE)
1937 s->reordered_input_picture[0]= s->input_picture[b_frames];
1938 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
1939 s->reordered_input_picture[0]->pict_type= P_TYPE;
1940 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
1941 for(i=0; i<b_frames; i++){
1942 s->reordered_input_picture[i+1]= s->input_picture[i];
1943 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
1944 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
1949 if(s->reordered_input_picture[0]){
1950 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
1952 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
1954 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
1955 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
1957 int i= ff_find_unused_picture(s, 0);
1958 Picture *pic= &s->picture[i];
1960 /* mark us unused / free shared pic */
1962 s->reordered_input_picture[0]->data[i]= NULL;
1963 s->reordered_input_picture[0]->type= 0;
1965 copy_picture_attributes((AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
1966 pic->reference = s->reordered_input_picture[0]->reference;
1968 alloc_picture(s, pic, 0);
1970 s->current_picture_ptr= pic;
1972 // input is not a shared pix -> reuse buffer for current_pix
1974 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
1975 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
1977 s->current_picture_ptr= s->reordered_input_picture[0];
1979 s->new_picture.data[i]+=16;
1982 copy_picture(&s->current_picture, s->current_picture_ptr);
1984 s->picture_number= s->new_picture.display_picture_number;
1985 //printf("dpn:%d\n", s->picture_number);
1987 memset(&s->new_picture, 0, sizeof(Picture));
1991 int MPV_encode_picture(AVCodecContext *avctx,
1992 unsigned char *buf, int buf_size, void *data)
1994 MpegEncContext *s = avctx->priv_data;
1995 AVFrame *pic_arg = data;
1996 int i, stuffing_count;
1998 if(avctx->pix_fmt != PIX_FMT_YUV420P){
1999 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2003 for(i=0; i<avctx->thread_count; i++){
2004 int y= s->thread_context[i]->start_mb_y;
2005 int h= s->mb_height;
2006 uint8_t *start= buf + buf_size* y /h;
2007 uint8_t *end = buf + buf_size*(y+1)/h;
2009 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2012 s->picture_in_gop_number++;
2014 load_input_picture(s, pic_arg);
2016 select_input_picture(s);
2019 if(s->new_picture.data[0]){
2020 s->pict_type= s->new_picture.pict_type;
2022 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2023 MPV_frame_start(s, avctx);
2025 encode_picture(s, s->picture_number);
2027 avctx->real_pict_num = s->picture_number;
2028 avctx->header_bits = s->header_bits;
2029 avctx->mv_bits = s->mv_bits;
2030 avctx->misc_bits = s->misc_bits;
2031 avctx->i_tex_bits = s->i_tex_bits;
2032 avctx->p_tex_bits = s->p_tex_bits;
2033 avctx->i_count = s->i_count;
2034 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2035 avctx->skip_count = s->skip_count;
2039 if (s->out_format == FMT_MJPEG)
2040 mjpeg_picture_trailer(s);
2042 if(s->flags&CODEC_FLAG_PASS1)
2043 ff_write_pass1_stats(s);
2046 avctx->error[i] += s->current_picture_ptr->error[i];
2049 flush_put_bits(&s->pb);
2050 s->frame_bits = put_bits_count(&s->pb);
2052 stuffing_count= ff_vbv_update(s, s->frame_bits);
2054 switch(s->codec_id){
2055 case CODEC_ID_MPEG1VIDEO:
2056 case CODEC_ID_MPEG2VIDEO:
2057 while(stuffing_count--){
2058 put_bits(&s->pb, 8, 0);
2061 case CODEC_ID_MPEG4:
2062 put_bits(&s->pb, 16, 0);
2063 put_bits(&s->pb, 16, 0x1C3);
2064 stuffing_count -= 4;
2065 while(stuffing_count--){
2066 put_bits(&s->pb, 8, 0xFF);
2070 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2072 flush_put_bits(&s->pb);
2073 s->frame_bits = put_bits_count(&s->pb);
2076 /* update mpeg1/2 vbv_delay for CBR */
2077 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate){
2080 assert(s->repeat_first_field==0);
2082 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2083 assert(vbv_delay < 0xFFFF);
2085 s->vbv_delay_ptr[0] &= 0xF8;
2086 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2087 s->vbv_delay_ptr[1] = vbv_delay>>5;
2088 s->vbv_delay_ptr[2] &= 0x07;
2089 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2091 s->total_bits += s->frame_bits;
2092 avctx->frame_bits = s->frame_bits;
2094 assert((pbBufPtr(&s->pb) == s->pb.buf));
2097 assert((s->frame_bits&7)==0);
2099 return s->frame_bits/8;
2102 #endif //CONFIG_ENCODERS
2104 static inline void gmc1_motion(MpegEncContext *s,
2105 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2107 uint8_t **ref_picture, int src_offset)
2110 int offset, src_x, src_y, linesize, uvlinesize;
2111 int motion_x, motion_y;
2114 motion_x= s->sprite_offset[0][0];
2115 motion_y= s->sprite_offset[0][1];
2116 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2117 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2118 motion_x<<=(3-s->sprite_warping_accuracy);
2119 motion_y<<=(3-s->sprite_warping_accuracy);
2120 src_x = clip(src_x, -16, s->width);
2121 if (src_x == s->width)
2123 src_y = clip(src_y, -16, s->height);
2124 if (src_y == s->height)
2127 linesize = s->linesize;
2128 uvlinesize = s->uvlinesize;
2130 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
2132 dest_y+=dest_offset;
2133 if(s->flags&CODEC_FLAG_EMU_EDGE){
2134 if( (unsigned)src_x >= s->h_edge_pos - 17
2135 || (unsigned)src_y >= s->v_edge_pos - 17){
2136 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2137 ptr= s->edge_emu_buffer;
2141 if((motion_x|motion_y)&7){
2142 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2143 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2147 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2148 if (s->no_rounding){
2149 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2151 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2155 if(s->flags&CODEC_FLAG_GRAY) return;
2157 motion_x= s->sprite_offset[1][0];
2158 motion_y= s->sprite_offset[1][1];
2159 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2160 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2161 motion_x<<=(3-s->sprite_warping_accuracy);
2162 motion_y<<=(3-s->sprite_warping_accuracy);
2163 src_x = clip(src_x, -8, s->width>>1);
2164 if (src_x == s->width>>1)
2166 src_y = clip(src_y, -8, s->height>>1);
2167 if (src_y == s->height>>1)
2170 offset = (src_y * uvlinesize) + src_x + (src_offset>>1);
2171 ptr = ref_picture[1] + offset;
2172 if(s->flags&CODEC_FLAG_EMU_EDGE){
2173 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2174 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2175 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);
2176 ptr= s->edge_emu_buffer;
2180 s->dsp.gmc1(dest_cb + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2182 ptr = ref_picture[2] + offset;
2184 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);
2185 ptr= s->edge_emu_buffer;
2187 s->dsp.gmc1(dest_cr + (dest_offset>>1), ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2192 static inline void gmc_motion(MpegEncContext *s,
2193 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2195 uint8_t **ref_picture, int src_offset)
2198 int linesize, uvlinesize;
2199 const int a= s->sprite_warping_accuracy;
2202 linesize = s->linesize;
2203 uvlinesize = s->uvlinesize;
2205 ptr = ref_picture[0] + src_offset;
2207 dest_y+=dest_offset;
2209 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2210 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2212 s->dsp.gmc(dest_y, ptr, linesize, 16,
2215 s->sprite_delta[0][0], s->sprite_delta[0][1],
2216 s->sprite_delta[1][0], s->sprite_delta[1][1],
2217 a+1, (1<<(2*a+1)) - s->no_rounding,
2218 s->h_edge_pos, s->v_edge_pos);
2219 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2220 ox + s->sprite_delta[0][0]*8,
2221 oy + s->sprite_delta[1][0]*8,
2222 s->sprite_delta[0][0], s->sprite_delta[0][1],
2223 s->sprite_delta[1][0], s->sprite_delta[1][1],
2224 a+1, (1<<(2*a+1)) - s->no_rounding,
2225 s->h_edge_pos, s->v_edge_pos);
2227 if(s->flags&CODEC_FLAG_GRAY) return;
2230 dest_cb+=dest_offset>>1;
2231 dest_cr+=dest_offset>>1;
2233 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2234 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2236 ptr = ref_picture[1] + (src_offset>>1);
2237 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2240 s->sprite_delta[0][0], s->sprite_delta[0][1],
2241 s->sprite_delta[1][0], s->sprite_delta[1][1],
2242 a+1, (1<<(2*a+1)) - s->no_rounding,
2243 s->h_edge_pos>>1, s->v_edge_pos>>1);
2245 ptr = ref_picture[2] + (src_offset>>1);
2246 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2249 s->sprite_delta[0][0], s->sprite_delta[0][1],
2250 s->sprite_delta[1][0], s->sprite_delta[1][1],
2251 a+1, (1<<(2*a+1)) - s->no_rounding,
2252 s->h_edge_pos>>1, s->v_edge_pos>>1);
2256 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2257 * @param buf destination buffer
2258 * @param src source buffer
2259 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2260 * @param block_w width of block
2261 * @param block_h height of block
2262 * @param src_x x coordinate of the top left sample of the block in the source buffer
2263 * @param src_y y coordinate of the top left sample of the block in the source buffer
2264 * @param w width of the source buffer
2265 * @param h height of the source buffer
2267 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2268 int src_x, int src_y, int w, int h){
2270 int start_y, start_x, end_y, end_x;
2273 src+= (h-1-src_y)*linesize;
2275 }else if(src_y<=-block_h){
2276 src+= (1-block_h-src_y)*linesize;
2282 }else if(src_x<=-block_w){
2283 src+= (1-block_w-src_x);
2287 start_y= FFMAX(0, -src_y);
2288 start_x= FFMAX(0, -src_x);
2289 end_y= FFMIN(block_h, h-src_y);
2290 end_x= FFMIN(block_w, w-src_x);
2292 // copy existing part
2293 for(y=start_y; y<end_y; y++){
2294 for(x=start_x; x<end_x; x++){
2295 buf[x + y*linesize]= src[x + y*linesize];
2300 for(y=0; y<start_y; y++){
2301 for(x=start_x; x<end_x; x++){
2302 buf[x + y*linesize]= buf[x + start_y*linesize];
2307 for(y=end_y; y<block_h; y++){
2308 for(x=start_x; x<end_x; x++){
2309 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2313 for(y=0; y<block_h; y++){
2315 for(x=0; x<start_x; x++){
2316 buf[x + y*linesize]= buf[start_x + y*linesize];
2320 for(x=end_x; x<block_w; x++){
2321 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2326 static inline int hpel_motion(MpegEncContext *s,
2327 uint8_t *dest, uint8_t *src,
2328 int src_x, int src_y,
2329 int width, int height, int stride,
2330 int h_edge_pos, int v_edge_pos,
2331 int w, int h, op_pixels_func *pix_op,
2332 int motion_x, int motion_y)
2337 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2338 src_x += motion_x >> 1;
2339 src_y += motion_y >> 1;
2341 /* WARNING: do no forget half pels */
2342 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2345 src_y = clip(src_y, -16, height);
2346 if (src_y == height)
2348 src += src_y * stride + src_x;
2350 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2351 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2352 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2353 ff_emulated_edge_mc(s->edge_emu_buffer, src, stride, w+1, h+1,
2354 src_x, src_y, h_edge_pos, v_edge_pos);
2355 src= s->edge_emu_buffer;
2359 pix_op[dxy](dest, src, stride, h);
2363 /* apply one mpeg motion vector to the three components */
2364 static inline void mpeg_motion(MpegEncContext *s,
2365 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2367 uint8_t **ref_picture, int src_offset,
2368 int field_based, op_pixels_func (*pix_op)[4],
2369 int motion_x, int motion_y, int h)
2372 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, uvlinesize;
2375 if(s->quarter_sample)
2382 height = s->height >> field_based;
2383 v_edge_pos = s->v_edge_pos >> field_based;
2384 uvlinesize = s->current_picture.linesize[1] << field_based;
2387 dest_y + dest_offset, ref_picture[0] + src_offset,
2388 s->mb_x * 16, s->mb_y * (16 >> field_based),
2389 s->width, height, s->current_picture.linesize[0] << field_based,
2390 s->h_edge_pos, v_edge_pos,
2392 motion_x, motion_y);
2395 if(s->flags&CODEC_FLAG_GRAY) return;
2397 if (s->out_format == FMT_H263) {
2399 if ((motion_x & 3) != 0)
2401 if ((motion_y & 3) != 0)
2408 dxy = ((my & 1) << 1) | (mx & 1);
2413 src_x = s->mb_x * 8 + mx;
2414 src_y = s->mb_y * (8 >> field_based) + my;
2415 src_x = clip(src_x, -8, s->width >> 1);
2416 if (src_x == (s->width >> 1))
2418 src_y = clip(src_y, -8, height >> 1);
2419 if (src_y == (height >> 1))
2421 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
2422 ptr = ref_picture[1] + offset;
2424 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
2425 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2426 ptr= s->edge_emu_buffer + (src_offset >> 1);
2428 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2430 ptr = ref_picture[2] + offset;
2432 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9+field_based,
2433 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2434 ptr= s->edge_emu_buffer + (src_offset >> 1);
2436 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2438 //FIXME move to dsputil, avg variant, 16x16 version
2439 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2441 uint8_t * const top = src[1];
2442 uint8_t * const left = src[2];
2443 uint8_t * const mid = src[0];
2444 uint8_t * const right = src[3];
2445 uint8_t * const bottom= src[4];
2446 #define OBMC_FILTER(x, t, l, m, r, b)\
2447 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2448 #define OBMC_FILTER4(x, t, l, m, r, b)\
2449 OBMC_FILTER(x , t, l, m, r, b);\
2450 OBMC_FILTER(x+1 , t, l, m, r, b);\
2451 OBMC_FILTER(x +stride, t, l, m, r, b);\
2452 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2455 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2456 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2457 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2458 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2459 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2460 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2462 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2463 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2464 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2465 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2467 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2468 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2469 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2470 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2472 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2473 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2474 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2475 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2477 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2478 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2479 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2480 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2481 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2482 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2484 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2485 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2486 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2487 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2490 /* obmc for 1 8x8 luma block */
2491 static inline void obmc_motion(MpegEncContext *s,
2492 uint8_t *dest, uint8_t *src,
2493 int src_x, int src_y,
2494 op_pixels_func *pix_op,
2495 int16_t mv[5][2]/* mid top left right bottom*/)
2501 assert(s->quarter_sample==0);
2504 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2507 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2508 hpel_motion(s, ptr[i], src,
2510 s->width, s->height, s->linesize,
2511 s->h_edge_pos, s->v_edge_pos,
2513 mv[i][0], mv[i][1]);
2517 put_obmc(dest, ptr, s->linesize);
2520 static inline void qpel_motion(MpegEncContext *s,
2521 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2523 uint8_t **ref_picture, int src_offset,
2524 int field_based, op_pixels_func (*pix_op)[4],
2525 qpel_mc_func (*qpix_op)[16],
2526 int motion_x, int motion_y, int h)
2529 int dxy, offset, mx, my, src_x, src_y, height, v_edge_pos, linesize, uvlinesize;
2532 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2533 src_x = s->mb_x * 16 + (motion_x >> 2);
2534 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
2536 height = s->height >> field_based;
2537 v_edge_pos = s->v_edge_pos >> field_based;
2538 src_x = clip(src_x, -16, s->width);
2539 if (src_x == s->width)
2541 src_y = clip(src_y, -16, height);
2542 if (src_y == height)
2544 linesize = s->linesize << field_based;
2545 uvlinesize = s->uvlinesize << field_based;
2546 ptr = ref_picture[0] + (src_y * linesize) + src_x + src_offset;
2547 dest_y += dest_offset;
2548 //printf("%d %d %d\n", src_x, src_y, dxy);
2550 if(s->flags&CODEC_FLAG_EMU_EDGE){
2551 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
2552 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
2553 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - src_offset, s->linesize, 17, 17+field_based,
2554 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2555 ptr= s->edge_emu_buffer + src_offset;
2560 qpix_op[0][dxy](dest_y, ptr, linesize);
2562 //damn interlaced mode
2563 //FIXME boundary mirroring is not exactly correct here
2564 qpix_op[1][dxy](dest_y , ptr , linesize);
2565 qpix_op[1][dxy](dest_y+8, ptr+8, linesize);
2568 if(s->flags&CODEC_FLAG_GRAY) return;
2573 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2574 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2575 mx= (motion_x>>1) + rtab[motion_x&7];
2576 my= (motion_y>>1) + rtab[motion_y&7];
2577 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2578 mx= (motion_x>>1)|(motion_x&1);
2579 my= (motion_y>>1)|(motion_y&1);
2587 dxy= (mx&1) | ((my&1)<<1);
2591 src_x = s->mb_x * 8 + mx;
2592 src_y = s->mb_y * (8 >> field_based) + my;
2593 src_x = clip(src_x, -8, s->width >> 1);
2594 if (src_x == (s->width >> 1))
2596 src_y = clip(src_y, -8, height >> 1);
2597 if (src_y == (height >> 1))
2600 offset = (src_y * uvlinesize) + src_x + (src_offset >> 1);
2601 ptr = ref_picture[1] + offset;
2603 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
2604 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2605 ptr= s->edge_emu_buffer + (src_offset >> 1);
2607 pix_op[1][dxy](dest_cb + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2609 ptr = ref_picture[2] + offset;
2611 ff_emulated_edge_mc(s->edge_emu_buffer, ptr - (src_offset >> 1), s->uvlinesize, 9, 9 + field_based,
2612 src_x, src_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2613 ptr= s->edge_emu_buffer + (src_offset >> 1);
2615 pix_op[1][dxy](dest_cr + (dest_offset >> 1), ptr, uvlinesize, h >> 1);
2618 inline int ff_h263_round_chroma(int x){
2620 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2623 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2628 * h263 chorma 4mv motion compensation.
2630 static inline void chroma_4mv_motion(MpegEncContext *s,
2631 uint8_t *dest_cb, uint8_t *dest_cr,
2632 uint8_t **ref_picture,
2633 op_pixels_func *pix_op,
2635 int dxy, emu=0, src_x, src_y, offset;
2638 /* In case of 8X8, we construct a single chroma motion vector
2639 with a special rounding */
2640 mx= ff_h263_round_chroma(mx);
2641 my= ff_h263_round_chroma(my);
2643 dxy = ((my & 1) << 1) | (mx & 1);
2647 src_x = s->mb_x * 8 + mx;
2648 src_y = s->mb_y * 8 + my;
2649 src_x = clip(src_x, -8, s->width/2);
2650 if (src_x == s->width/2)
2652 src_y = clip(src_y, -8, s->height/2);
2653 if (src_y == s->height/2)
2656 offset = (src_y * (s->uvlinesize)) + src_x;
2657 ptr = ref_picture[1] + offset;
2658 if(s->flags&CODEC_FLAG_EMU_EDGE){
2659 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
2660 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
2661 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);
2662 ptr= s->edge_emu_buffer;
2666 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
2668 ptr = ref_picture[2] + offset;
2670 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);
2671 ptr= s->edge_emu_buffer;
2673 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
2677 * motion compesation of a single macroblock
2679 * @param dest_y luma destination pointer
2680 * @param dest_cb chroma cb/u destination pointer
2681 * @param dest_cr chroma cr/v destination pointer
2682 * @param dir direction (0->forward, 1->backward)
2683 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2684 * @param pic_op halfpel motion compensation function (average or put normally)
2685 * @param pic_op qpel motion compensation function (average or put normally)
2686 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2688 static inline void MPV_motion(MpegEncContext *s,
2689 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2690 int dir, uint8_t **ref_picture,
2691 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
2693 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
2695 uint8_t *ptr, *dest;
2700 if(s->obmc && s->pict_type != B_TYPE){
2701 int16_t mv_cache[4][4][2];
2702 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2703 const int mot_stride= s->mb_width*2 + 2;
2704 const int mot_xy= 1 + mb_x*2 + (mb_y*2 + 1)*mot_stride;
2706 assert(!s->mb_skiped);
2708 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
2709 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2710 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2712 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
2713 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
2715 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
2718 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
2719 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
2720 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
2722 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
2723 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
2726 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
2727 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
2728 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
2730 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
2731 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
2737 const int x= (i&1)+1;
2738 const int y= (i>>1)+1;
2740 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
2741 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
2742 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
2743 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
2744 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
2746 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
2748 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
2755 if(!(s->flags&CODEC_FLAG_GRAY))
2756 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
2761 switch(s->mv_type) {
2765 if(s->real_sprite_warping_points==1){
2766 gmc1_motion(s, dest_y, dest_cb, dest_cr, 0,
2769 gmc_motion(s, dest_y, dest_cb, dest_cr, 0,
2772 }else if(s->quarter_sample){
2773 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
2776 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2778 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
2779 ref_picture, pix_op,
2780 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2784 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2787 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2793 if(s->quarter_sample){
2795 motion_x = s->mv[dir][i][0];
2796 motion_y = s->mv[dir][i][1];
2798 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2799 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
2800 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
2802 /* WARNING: do no forget half pels */
2803 src_x = clip(src_x, -16, s->width);
2804 if (src_x == s->width)
2806 src_y = clip(src_y, -16, s->height);
2807 if (src_y == s->height)
2810 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2811 if(s->flags&CODEC_FLAG_EMU_EDGE){
2812 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
2813 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
2814 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);
2815 ptr= s->edge_emu_buffer;
2818 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2819 qpix_op[1][dxy](dest, ptr, s->linesize);
2821 mx += s->mv[dir][i][0]/2;
2822 my += s->mv[dir][i][1]/2;
2826 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
2828 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
2829 s->width, s->height, s->linesize,
2830 s->h_edge_pos, s->v_edge_pos,
2832 s->mv[dir][i][0], s->mv[dir][i][1]);
2834 mx += s->mv[dir][i][0];
2835 my += s->mv[dir][i][1];
2839 if(!(s->flags&CODEC_FLAG_GRAY))
2840 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
2843 if (s->picture_structure == PICT_FRAME) {
2844 if(s->quarter_sample){
2846 qpel_motion(s, dest_y, dest_cb, dest_cr, 0,
2847 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
2849 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2851 qpel_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2852 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
2854 s->mv[dir][1][0], s->mv[dir][1][1], 8);
2857 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2858 ref_picture, s->field_select[dir][0] ? s->linesize : 0,
2860 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2862 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2863 ref_picture, s->field_select[dir][1] ? s->linesize : 0,
2865 s->mv[dir][1][0], s->mv[dir][1][1], 8);
2869 if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){
2870 offset= s->field_select[dir][0] ? s->linesize : 0;
2872 ref_picture= s->current_picture.data;
2873 offset= s->field_select[dir][0] ? s->linesize : -s->linesize;
2876 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2877 ref_picture, offset,
2879 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2884 uint8_t ** ref2picture;
2886 if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){
2887 ref2picture= ref_picture;
2888 offset= s->field_select[dir][0] ? s->linesize : 0;
2890 ref2picture= s->current_picture.data;
2891 offset= s->field_select[dir][0] ? s->linesize : -s->linesize;
2894 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2895 ref2picture, offset,
2897 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2900 if(s->picture_structure == s->field_select[dir][1] + 1 || s->pict_type == B_TYPE || s->first_field){
2901 ref2picture= ref_picture;
2902 offset= s->field_select[dir][1] ? s->linesize : 0;
2904 ref2picture= s->current_picture.data;
2905 offset= s->field_select[dir][1] ? s->linesize : -s->linesize;
2907 // I know it is ugly but this is the only way to fool emu_edge without rewrite mpeg_motion
2908 mpeg_motion(s, dest_y+16*s->linesize, dest_cb+8*s->uvlinesize, dest_cr+8*s->uvlinesize,
2910 ref2picture, offset,
2912 s->mv[dir][1][0], s->mv[dir][1][1]+16, 8);
2918 op_pixels_func (*dmv_pix_op)[4];
2921 dmv_pix_op = s->dsp.put_pixels_tab;
2923 if(s->picture_structure == PICT_FRAME){
2924 //put top field from top field
2925 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2928 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2929 //put bottom field from bottom field
2930 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2931 ref_picture, s->linesize,
2933 s->mv[dir][0][0], s->mv[dir][0][1], 8);
2935 dmv_pix_op = s->dsp.avg_pixels_tab;
2937 //avg top field from bottom field
2938 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2939 ref_picture, s->linesize,
2941 s->mv[dir][2][0], s->mv[dir][2][1], 8);
2942 //avg bottom field from top field
2943 mpeg_motion(s, dest_y, dest_cb, dest_cr, s->linesize,
2946 s->mv[dir][3][0], s->mv[dir][3][1], 8);
2949 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2952 //put field from the same parity
2953 //same parity is never in the same frame
2954 mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
2957 s->mv[dir][0][0],s->mv[dir][0][1],16);
2959 // after put we make avg of the same block
2960 dmv_pix_op=s->dsp.avg_pixels_tab;
2962 //opposite parity is always in the same frame if this is second field
2963 if(!s->first_field){
2964 ref_picture = s->current_picture.data;
2965 //top field is one linesize from frame beginig
2966 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2967 -s->linesize : s->linesize;
2969 offset=(s->picture_structure == PICT_BOTTOM_FIELD)?
2972 //avg field from the opposite parity
2973 mpeg_motion(s, dest_y, dest_cb, dest_cr,0,
2974 ref_picture, offset,
2976 s->mv[dir][2][0],s->mv[dir][2][1],16);
2985 /* put block[] to dest[] */
2986 static inline void put_dct(MpegEncContext *s,
2987 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2989 s->dct_unquantize_intra(s, block, i, qscale);
2990 s->dsp.idct_put (dest, line_size, block);
2993 /* add block[] to dest[] */
2994 static inline void add_dct(MpegEncContext *s,
2995 DCTELEM *block, int i, uint8_t *dest, int line_size)
2997 if (s->block_last_index[i] >= 0) {
2998 s->dsp.idct_add (dest, line_size, block);
3002 static inline void add_dequant_dct(MpegEncContext *s,
3003 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3005 if (s->block_last_index[i] >= 0) {
3006 s->dct_unquantize_inter(s, block, i, qscale);
3008 s->dsp.idct_add (dest, line_size, block);
3013 * cleans dc, ac, coded_block for the current non intra MB
3015 void ff_clean_intra_table_entries(MpegEncContext *s)
3017 int wrap = s->block_wrap[0];
3018 int xy = s->block_index[0];
3021 s->dc_val[0][xy + 1 ] =
3022 s->dc_val[0][xy + wrap] =
3023 s->dc_val[0][xy + 1 + wrap] = 1024;
3025 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3026 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3027 if (s->msmpeg4_version>=3) {
3028 s->coded_block[xy ] =
3029 s->coded_block[xy + 1 ] =
3030 s->coded_block[xy + wrap] =
3031 s->coded_block[xy + 1 + wrap] = 0;
3034 wrap = s->block_wrap[4];
3035 xy = s->mb_x + 1 + (s->mb_y + 1) * wrap;
3037 s->dc_val[2][xy] = 1024;
3039 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3040 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3042 s->mbintra_table[s->mb_x + s->mb_y*s->mb_stride]= 0;
3045 /* generic function called after a macroblock has been parsed by the
3046 decoder or after it has been encoded by the encoder.
3048 Important variables used:
3049 s->mb_intra : true if intra macroblock
3050 s->mv_dir : motion vector direction
3051 s->mv_type : motion vector type
3052 s->mv : motion vector
3053 s->interlaced_dct : true if interlaced dct used (mpeg2)
3055 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64])
3058 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3060 if(s->avctx->xvmc_acceleration){
3061 XVMC_decode_mb(s);//xvmc uses pblocks
3069 s->current_picture.qscale_table[mb_xy]= s->qscale;
3071 /* update DC predictors for P macroblocks */
3073 if (s->h263_pred || s->h263_aic) {
3074 if(s->mbintra_table[mb_xy])
3075 ff_clean_intra_table_entries(s);
3079 s->last_dc[2] = 128 << s->intra_dc_precision;
3082 else if (s->h263_pred || s->h263_aic)
3083 s->mbintra_table[mb_xy]=1;
3085 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3086 uint8_t *dest_y, *dest_cb, *dest_cr;
3087 int dct_linesize, dct_offset;
3088 op_pixels_func (*op_pix)[4];
3089 qpel_mc_func (*op_qpix)[16];
3090 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3091 const int uvlinesize= s->current_picture.linesize[1];
3092 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band;
3094 /* avoid copy if macroblock skipped in last frame too */
3095 /* skip only during decoding as we might trash the buffers during encoding a bit */
3097 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3098 const int age= s->current_picture.age;
3104 assert(s->pict_type!=I_TYPE);
3106 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
3107 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3109 /* if previous was skipped too, then nothing to do ! */
3110 if (*mbskip_ptr >= age && s->current_picture.reference){
3113 } else if(!s->current_picture.reference){
3114 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3115 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3117 *mbskip_ptr = 0; /* not skipped */
3121 if (s->interlaced_dct) {
3122 dct_linesize = linesize * 2;
3123 dct_offset = linesize;
3125 dct_linesize = linesize;
3126 dct_offset = linesize * 8;
3130 dest_cb= s->dest[1];
3131 dest_cr= s->dest[2];
3133 dest_y = s->b_scratchpad;
3134 dest_cb= s->b_scratchpad+16*s->linesize;
3135 dest_cr= s->b_scratchpad+16*s->linesize+8;
3138 /* motion handling */
3139 /* decoding or more than one mb_type (MC was allready done otherwise) */
3141 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3142 op_pix = s->dsp.put_pixels_tab;
3143 op_qpix= s->dsp.put_qpel_pixels_tab;
3145 op_pix = s->dsp.put_no_rnd_pixels_tab;
3146 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3149 if (s->mv_dir & MV_DIR_FORWARD) {
3150 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3151 op_pix = s->dsp.avg_pixels_tab;
3152 op_qpix= s->dsp.avg_qpel_pixels_tab;
3154 if (s->mv_dir & MV_DIR_BACKWARD) {
3155 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3159 /* skip dequant / idct if we are really late ;) */
3160 if(s->hurry_up>1) return;
3162 /* add dct residue */
3163 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3164 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3165 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
3166 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
3167 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
3168 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
3170 if(!(s->flags&CODEC_FLAG_GRAY)){
3171 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3172 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3174 } else if(s->codec_id != CODEC_ID_WMV2){
3175 add_dct(s, block[0], 0, dest_y, dct_linesize);
3176 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
3177 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
3178 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
3180 if(!(s->flags&CODEC_FLAG_GRAY)){
3181 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3182 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3187 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3191 /* dct only in intra block */
3192 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3193 put_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
3194 put_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
3195 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
3196 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
3198 if(!(s->flags&CODEC_FLAG_GRAY)){
3199 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3200 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3203 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3204 s->dsp.idct_put(dest_y + 8, dct_linesize, block[1]);
3205 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3206 s->dsp.idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]);
3208 if(!(s->flags&CODEC_FLAG_GRAY)){
3209 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3210 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3215 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3216 s->dsp.put_pixels_tab[1][0](s->dest[1], dest_cb, uvlinesize, 8);
3217 s->dsp.put_pixels_tab[1][0](s->dest[2], dest_cr, uvlinesize, 8);
3222 #ifdef CONFIG_ENCODERS
3224 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3226 static const char tab[64]=
3238 DCTELEM *block= s->block[n];
3239 const int last_index= s->block_last_index[n];
3244 threshold= -threshold;
3248 /* are all which we could set to zero are allready zero? */
3249 if(last_index<=skip_dc - 1) return;
3251 for(i=0; i<=last_index; i++){
3252 const int j = s->intra_scantable.permutated[i];
3253 const int level = ABS(block[j]);
3255 if(skip_dc && i==0) continue;
3264 if(score >= threshold) return;
3265 for(i=skip_dc; i<=last_index; i++){
3266 const int j = s->intra_scantable.permutated[i];
3269 if(block[0]) s->block_last_index[n]= 0;
3270 else s->block_last_index[n]= -1;
3273 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3276 const int maxlevel= s->max_qcoeff;
3277 const int minlevel= s->min_qcoeff;
3281 i=1; //skip clipping of intra dc
3285 for(;i<=last_index; i++){
3286 const int j= s->intra_scantable.permutated[i];
3287 int level = block[j];
3289 if (level>maxlevel){
3292 }else if(level<minlevel){
3300 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3301 av_log(s->avctx, AV_LOG_INFO, "warning, cliping %d dct coefficents to %d..%d\n", overflow, minlevel, maxlevel);
3304 #endif //CONFIG_ENCODERS
3308 * @param h is the normal height, this will be reduced automatically if needed for the last row
3310 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3311 if (s->avctx->draw_horiz_band) {
3315 if(s->picture_structure != PICT_FRAME){
3318 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3321 h= FFMIN(h, s->height - y);
3323 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3324 src= (AVFrame*)s->current_picture_ptr;
3325 else if(s->last_picture_ptr)
3326 src= (AVFrame*)s->last_picture_ptr;
3330 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
3336 offset[0]= y * s->linesize;;
3338 offset[2]= (y>>1) * s->uvlinesize;;
3344 s->avctx->draw_horiz_band(s->avctx, src, offset,
3345 y, s->picture_structure, h);
3349 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
3350 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3351 const int uvlinesize= s->current_picture.linesize[1];
3353 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
3354 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2;
3355 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2;
3356 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2;
3357 s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
3358 s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x;
3360 if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME){
3361 s->dest[0] = s->current_picture.data[0] + s->mb_x * 16 - 16;
3362 s->dest[1] = s->current_picture.data[1] + s->mb_x * 8 - 8;
3363 s->dest[2] = s->current_picture.data[2] + s->mb_x * 8 - 8;
3365 s->dest[0] = s->current_picture.data[0] + (s->mb_y * 16* linesize ) + s->mb_x * 16 - 16;
3366 s->dest[1] = s->current_picture.data[1] + (s->mb_y * 8 * uvlinesize) + s->mb_x * 8 - 8;
3367 s->dest[2] = s->current_picture.data[2] + (s->mb_y * 8 * uvlinesize) + s->mb_x * 8 - 8;
3371 #ifdef CONFIG_ENCODERS
3373 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
3383 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
3384 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
3385 int v= ptr[x2 + y2*stride];
3391 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
3396 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
3398 int16_t weight[6][64];
3399 DCTELEM orig[6][64];
3400 const int mb_x= s->mb_x;
3401 const int mb_y= s->mb_y;
3404 int dct_offset = s->linesize*8; //default for progressive frames
3405 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3409 for(i=0; i<6; i++) skip_dct[i]=0;
3411 if(s->adaptive_quant){
3412 const int last_qp= s->qscale;
3413 const int mb_xy= mb_x + mb_y*s->mb_stride;
3415 s->lambda= s->lambda_table[mb_xy];
3418 if(!(s->flags&CODEC_FLAG_QP_RD)){
3419 s->dquant= s->qscale - last_qp;
3421 if(s->out_format==FMT_H263){
3422 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
3424 if(s->codec_id==CODEC_ID_MPEG4){
3426 if(s->pict_type == B_TYPE){
3428 s->dquant= (s->dquant/2)*2;
3429 if(s->mv_dir&MV_DIRECT)
3432 if(s->mv_type==MV_TYPE_8X8)
3438 ff_set_qscale(s, last_qp + s->dquant);
3441 wrap_y = s->linesize;
3442 wrap_c = s->uvlinesize;
3443 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
3444 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
3445 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
3447 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
3448 ff_emulated_edge_mc(s->edge_emu_buffer , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
3449 ptr_y= s->edge_emu_buffer;
3450 ff_emulated_edge_mc(s->edge_emu_buffer+16*wrap_y , ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3451 ptr_cb= s->edge_emu_buffer+16*wrap_y;
3452 ff_emulated_edge_mc(s->edge_emu_buffer+16*wrap_y+8, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3453 ptr_cr= s->edge_emu_buffer+16*wrap_y+8;
3457 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3458 int progressive_score, interlaced_score;
3460 s->interlaced_dct=0;
3461 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
3462 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
3464 if(progressive_score > 0){
3465 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
3466 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
3467 if(progressive_score > interlaced_score){
3468 s->interlaced_dct=1;
3476 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
3477 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
3478 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
3479 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
3481 if(s->flags&CODEC_FLAG_GRAY){
3485 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
3486 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
3489 op_pixels_func (*op_pix)[4];
3490 qpel_mc_func (*op_qpix)[16];
3491 uint8_t *dest_y, *dest_cb, *dest_cr;
3493 dest_y = s->dest[0];
3494 dest_cb = s->dest[1];
3495 dest_cr = s->dest[2];
3497 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3498 op_pix = s->dsp.put_pixels_tab;
3499 op_qpix= s->dsp.put_qpel_pixels_tab;
3501 op_pix = s->dsp.put_no_rnd_pixels_tab;
3502 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3505 if (s->mv_dir & MV_DIR_FORWARD) {
3506 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3507 op_pix = s->dsp.avg_pixels_tab;
3508 op_qpix= s->dsp.avg_qpel_pixels_tab;
3510 if (s->mv_dir & MV_DIR_BACKWARD) {
3511 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3514 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3515 int progressive_score, interlaced_score;
3517 s->interlaced_dct=0;
3518 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
3519 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
3521 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
3523 if(progressive_score>0){
3524 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
3525 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
3527 if(progressive_score > interlaced_score){
3528 s->interlaced_dct=1;
3536 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
3537 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
3538 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
3539 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
3541 if(s->flags&CODEC_FLAG_GRAY){
3545 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
3546 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
3548 /* pre quantization */
3549 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
3551 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
3552 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
3553 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
3554 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;
3555 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
3556 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
3560 if(s->avctx->quantizer_noise_shaping){
3561 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
3562 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
3563 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
3564 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
3565 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
3566 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
3567 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
3570 /* DCT & quantize */
3571 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
3576 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
3577 // FIXME we could decide to change to quantizer instead of clipping
3578 // JS: I don't think that would be a good idea it could lower quality instead
3579 // of improve it. Just INTRADC clipping deserves changes in quantizer
3580 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3582 s->block_last_index[i]= -1;
3584 if(s->avctx->quantizer_noise_shaping){
3587 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
3592 if(s->luma_elim_threshold && !s->mb_intra)
3594 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
3595 if(s->chroma_elim_threshold && !s->mb_intra)
3597 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
3599 if(s->flags & CODEC_FLAG_CBP_RD){
3601 if(s->block_last_index[i] == -1)
3602 s->coded_score[i]= INT_MAX/256;
3607 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3608 s->block_last_index[4]=
3609 s->block_last_index[5]= 0;
3611 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
3614 //non c quantize code returns incorrect block_last_index FIXME
3615 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
3618 if(s->block_last_index[i]>0){
3619 for(j=63; j>0; j--){
3620 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
3622 s->block_last_index[i]= j;
3627 /* huffman encode */
3628 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
3629 case CODEC_ID_MPEG1VIDEO:
3630 case CODEC_ID_MPEG2VIDEO:
3631 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
3633 case CODEC_ID_MPEG4:
3634 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3635 case CODEC_ID_MSMPEG4V2:
3636 case CODEC_ID_MSMPEG4V3:
3638 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3640 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
3642 case CODEC_ID_H263P:
3645 h263_encode_mb(s, s->block, motion_x, motion_y); break;
3647 case CODEC_ID_MJPEG:
3648 mjpeg_encode_mb(s, s->block); break;
3654 #endif //CONFIG_ENCODERS
3657 * combines the (truncated) bitstream to a complete frame
3658 * @returns -1 if no complete frame could be created
3660 int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size){
3661 ParseContext *pc= &s->parse_context;
3665 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
3666 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
3670 /* copy overreaded byes from last frame into buffer */
3671 for(; pc->overread>0; pc->overread--){
3672 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
3675 pc->last_index= pc->index;
3677 /* copy into buffer end return */
3678 if(next == END_NOT_FOUND){
3679 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
3681 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
3682 pc->index += *buf_size;
3687 pc->overread_index= pc->index + next;
3689 /* append to buffer */
3691 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
3693 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
3698 /* store overread bytes */
3699 for(;next < 0; next++){
3700 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
3706 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
3707 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
3714 void ff_mpeg_flush(AVCodecContext *avctx){
3716 MpegEncContext *s = avctx->priv_data;
3718 if(s==NULL || s->picture==NULL)
3721 for(i=0; i<MAX_PICTURE_COUNT; i++){
3722 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
3723 || s->picture[i].type == FF_BUFFER_TYPE_USER))
3724 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
3726 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
3728 s->parse_context.state= -1;
3729 s->parse_context.frame_start_found= 0;
3730 s->parse_context.overread= 0;
3731 s->parse_context.overread_index= 0;
3732 s->parse_context.index= 0;
3733 s->parse_context.last_index= 0;
3736 #ifdef CONFIG_ENCODERS
3737 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
3739 const uint16_t *srcw= (uint16_t*)src;
3740 int words= length>>4;
3741 int bits= length&15;
3744 if(length==0) return;
3747 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
3748 }else if(put_bits_count(pb)&7){
3749 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
3751 for(i=0; put_bits_count(pb)&31; i++)
3752 put_bits(pb, 8, src[i]);
3754 memcpy(pbBufPtr(pb), src+i, 2*words-i);
3755 skip_put_bytes(pb, 2*words-i);
3758 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
3761 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
3764 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3767 d->mb_skip_run= s->mb_skip_run;
3769 d->last_dc[i]= s->last_dc[i];
3772 d->mv_bits= s->mv_bits;
3773 d->i_tex_bits= s->i_tex_bits;
3774 d->p_tex_bits= s->p_tex_bits;
3775 d->i_count= s->i_count;
3776 d->f_count= s->f_count;
3777 d->b_count= s->b_count;
3778 d->skip_count= s->skip_count;
3779 d->misc_bits= s->misc_bits;
3783 d->qscale= s->qscale;
3784 d->dquant= s->dquant;
3787 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
3790 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
3791 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3794 d->mb_skip_run= s->mb_skip_run;
3796 d->last_dc[i]= s->last_dc[i];
3799 d->mv_bits= s->mv_bits;
3800 d->i_tex_bits= s->i_tex_bits;
3801 d->p_tex_bits= s->p_tex_bits;
3802 d->i_count= s->i_count;
3803 d->f_count= s->f_count;
3804 d->b_count= s->b_count;
3805 d->skip_count= s->skip_count;
3806 d->misc_bits= s->misc_bits;
3808 d->mb_intra= s->mb_intra;
3809 d->mb_skiped= s->mb_skiped;
3810 d->mv_type= s->mv_type;
3811 d->mv_dir= s->mv_dir;
3813 if(s->data_partitioning){
3815 d->tex_pb= s->tex_pb;
3819 d->block_last_index[i]= s->block_last_index[i];
3820 d->interlaced_dct= s->interlaced_dct;
3821 d->qscale= s->qscale;
3824 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
3825 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
3826 int *dmin, int *next_block, int motion_x, int motion_y)
3829 uint8_t *dest_backup[3];
3831 copy_context_before_encode(s, backup, type);
3833 s->block= s->blocks[*next_block];
3834 s->pb= pb[*next_block];
3835 if(s->data_partitioning){
3836 s->pb2 = pb2 [*next_block];
3837 s->tex_pb= tex_pb[*next_block];
3841 memcpy(dest_backup, s->dest, sizeof(s->dest));
3842 s->dest[0] = s->rd_scratchpad;
3843 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
3844 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
3845 assert(s->linesize >= 32); //FIXME
3848 encode_mb(s, motion_x, motion_y);
3850 score= put_bits_count(&s->pb);
3851 if(s->data_partitioning){
3852 score+= put_bits_count(&s->pb2);
3853 score+= put_bits_count(&s->tex_pb);
3856 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
3857 MPV_decode_mb(s, s->block);
3859 score *= s->lambda2;
3860 score += sse_mb(s) << FF_LAMBDA_SHIFT;
3864 memcpy(s->dest, dest_backup, sizeof(s->dest));
3871 copy_context_after_encode(best, s, type);
3875 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
3876 uint32_t *sq = squareTbl + 256;
3881 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
3882 else if(w==8 && h==8)
3883 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
3887 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
3896 static int sse_mb(MpegEncContext *s){
3900 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3901 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3904 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)
3905 +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)
3906 +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);
3908 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)
3909 +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)
3910 +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);
3913 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
3914 MpegEncContext *s= arg;
3918 s->me.dia_size= s->avctx->pre_dia_size;
3919 s->first_slice_line=1;
3920 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
3921 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
3922 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
3924 s->first_slice_line=0;
3932 static int estimate_motion_thread(AVCodecContext *c, void *arg){
3933 MpegEncContext *s= arg;
3935 s->me.dia_size= s->avctx->dia_size;
3936 s->first_slice_line=1;
3937 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
3938 s->mb_x=0; //for block init below
3939 ff_init_block_index(s);
3940 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
3941 s->block_index[0]+=2;
3942 s->block_index[1]+=2;
3943 s->block_index[2]+=2;
3944 s->block_index[3]+=2;
3946 /* compute motion vector & mb_type and store in context */
3947 if(s->pict_type==B_TYPE)
3948 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
3950 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
3952 s->first_slice_line=0;
3957 static int mb_var_thread(AVCodecContext *c, void *arg){
3958 MpegEncContext *s= arg;
3961 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
3962 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
3965 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
3967 int sum = s->dsp.pix_sum(pix, s->linesize);
3969 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
3971 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
3972 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
3973 s->mb_var_sum_temp += varc;
3979 static void write_slice_end(MpegEncContext *s){
3980 if(s->codec_id==CODEC_ID_MPEG4){
3981 if(s->partitioned_frame){
3982 ff_mpeg4_merge_partitions(s);
3985 ff_mpeg4_stuffing(&s->pb);
3986 }else if(s->out_format == FMT_MJPEG){
3987 ff_mjpeg_stuffing(&s->pb);
3990 align_put_bits(&s->pb);
3991 flush_put_bits(&s->pb);
3994 static int encode_thread(AVCodecContext *c, void *arg){
3995 MpegEncContext *s= arg;
3996 int mb_x, mb_y, pdif = 0;
3998 MpegEncContext best_s, backup_s;
3999 uint8_t bit_buf[2][3000];
4000 uint8_t bit_buf2[2][3000];
4001 uint8_t bit_buf_tex[2][3000];
4002 PutBitContext pb[2], pb2[2], tex_pb[2];
4003 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4006 init_put_bits(&pb [i], bit_buf [i], 3000);
4007 init_put_bits(&pb2 [i], bit_buf2 [i], 3000);
4008 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000);
4011 s->last_bits= put_bits_count(&s->pb);
4022 /* init last dc values */
4023 /* note: quant matrix value (8) is implied here */
4024 s->last_dc[i] = 128;
4026 s->current_picture_ptr->error[i] = 0;
4029 memset(s->last_mv, 0, sizeof(s->last_mv));
4034 switch(s->codec_id){
4036 case CODEC_ID_H263P:
4038 s->gob_index = ff_h263_get_gob_height(s);
4040 case CODEC_ID_MPEG4:
4041 if(s->partitioned_frame)
4042 ff_mpeg4_init_partitions(s);
4049 s->first_slice_line = 1;
4050 s->ptr_lastgob = s->pb.buf;
4051 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4052 // printf("row %d at %X\n", s->mb_y, (int)s);
4056 ff_set_qscale(s, s->qscale);
4057 ff_init_block_index(s);
4059 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4060 const int xy= mb_y*s->mb_stride + mb_x;
4061 int mb_type= s->mb_type[xy];
4067 ff_update_block_index(s);
4069 /* write gob / video packet header */
4072 int current_packet_size, is_gob_start;
4074 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4076 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4078 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4080 switch(s->codec_id){
4082 case CODEC_ID_H263P:
4083 if(!s->h263_slice_structured)
4084 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4086 case CODEC_ID_MPEG2VIDEO:
4087 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4088 case CODEC_ID_MPEG1VIDEO:
4089 if(s->mb_skip_run) is_gob_start=0;
4094 if(s->start_mb_y != mb_y || mb_x!=0){
4097 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4098 ff_mpeg4_init_partitions(s);
4102 assert((put_bits_count(&s->pb)&7) == 0);
4103 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4105 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4106 int r= put_bits_count(&s->pb)/8 + s->picture_number + s->codec_id + s->mb_x + s->mb_y;
4107 int d= 100 / s->avctx->error_rate;
4109 current_packet_size=0;
4110 #ifndef ALT_BITSTREAM_WRITER
4111 s->pb.buf_ptr= s->ptr_lastgob;
4113 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4117 if (s->avctx->rtp_callback)
4118 s->avctx->rtp_callback(s->ptr_lastgob, current_packet_size, 0);
4120 switch(s->codec_id){
4121 case CODEC_ID_MPEG4:
4122 ff_mpeg4_encode_video_packet_header(s);
4123 ff_mpeg4_clean_buffers(s);
4125 case CODEC_ID_MPEG1VIDEO:
4126 case CODEC_ID_MPEG2VIDEO:
4127 ff_mpeg1_encode_slice_header(s);
4128 ff_mpeg1_clean_buffers(s);
4131 case CODEC_ID_H263P:
4132 h263_encode_gob_header(s, mb_y);
4136 if(s->flags&CODEC_FLAG_PASS1){
4137 int bits= put_bits_count(&s->pb);
4138 s->misc_bits+= bits - s->last_bits;
4142 s->ptr_lastgob += current_packet_size;
4143 s->first_slice_line=1;
4144 s->resync_mb_x=mb_x;
4145 s->resync_mb_y=mb_y;
4150 if( (s->resync_mb_x == s->mb_x)
4151 && s->resync_mb_y+1 == s->mb_y){
4152 s->first_slice_line=0;
4156 s->dquant=0; //only for QP_RD
4158 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible
4160 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4162 copy_context_before_encode(&backup_s, s, -1);
4164 best_s.data_partitioning= s->data_partitioning;
4165 best_s.partitioned_frame= s->partitioned_frame;
4166 if(s->data_partitioning){
4167 backup_s.pb2= s->pb2;
4168 backup_s.tex_pb= s->tex_pb;
4171 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4172 s->mv_dir = MV_DIR_FORWARD;
4173 s->mv_type = MV_TYPE_16X16;
4175 s->mv[0][0][0] = s->p_mv_table[xy][0];
4176 s->mv[0][0][1] = s->p_mv_table[xy][1];
4177 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4178 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4180 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4181 s->mv_dir = MV_DIR_FORWARD;
4182 s->mv_type = MV_TYPE_FIELD;
4185 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4186 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4187 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4189 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4190 &dmin, &next_block, 0, 0);
4192 if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4193 s->mv_dir = MV_DIR_FORWARD;
4194 s->mv_type = MV_TYPE_16X16;
4198 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb,
4199 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4201 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4202 s->mv_dir = MV_DIR_FORWARD;
4203 s->mv_type = MV_TYPE_8X8;
4206 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4207 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4209 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4210 &dmin, &next_block, 0, 0);
4212 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4213 s->mv_dir = MV_DIR_FORWARD;
4214 s->mv_type = MV_TYPE_16X16;
4216 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4217 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4218 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4219 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4221 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4222 s->mv_dir = MV_DIR_BACKWARD;
4223 s->mv_type = MV_TYPE_16X16;
4225 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4226 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4227 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4228 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4230 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4231 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4232 s->mv_type = MV_TYPE_16X16;
4234 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4235 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4236 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4237 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4238 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4239 &dmin, &next_block, 0, 0);
4241 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4242 int mx= s->b_direct_mv_table[xy][0];
4243 int my= s->b_direct_mv_table[xy][1];
4245 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4248 ff_mpeg4_set_direct_mv(s, mx, my);
4250 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4251 &dmin, &next_block, mx, my);
4253 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4254 s->mv_dir = MV_DIR_FORWARD;
4255 s->mv_type = MV_TYPE_FIELD;
4258 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4259 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4260 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4262 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4263 &dmin, &next_block, 0, 0);
4265 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4266 s->mv_dir = MV_DIR_BACKWARD;
4267 s->mv_type = MV_TYPE_FIELD;
4270 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4271 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4272 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4274 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4275 &dmin, &next_block, 0, 0);
4277 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4278 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4279 s->mv_type = MV_TYPE_FIELD;
4281 for(dir=0; dir<2; dir++){
4283 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4284 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4285 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4288 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4289 &dmin, &next_block, 0, 0);
4291 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4293 s->mv_type = MV_TYPE_16X16;
4297 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4298 &dmin, &next_block, 0, 0);
4299 if(s->h263_pred || s->h263_aic){
4301 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4303 ff_clean_intra_table_entries(s); //old mode?
4307 if(s->flags & CODEC_FLAG_QP_RD){
4308 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4309 const int last_qp= backup_s.qscale;
4310 int dquant, dir, qp, dc[6];
4312 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4314 assert(backup_s.dquant == 0);
4317 s->mv_dir= best_s.mv_dir;
4318 s->mv_type = MV_TYPE_16X16;
4319 s->mb_intra= best_s.mb_intra;
4320 s->mv[0][0][0] = best_s.mv[0][0][0];
4321 s->mv[0][0][1] = best_s.mv[0][0][1];
4322 s->mv[1][0][0] = best_s.mv[1][0][0];
4323 s->mv[1][0][1] = best_s.mv[1][0][1];
4325 dir= s->pict_type == B_TYPE ? 2 : 1;
4326 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4327 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4328 qp= last_qp + dquant;
4329 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4331 backup_s.dquant= dquant;
4334 dc[i]= s->dc_val[0][ s->block_index[i] ];
4335 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4339 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4340 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4341 if(best_s.qscale != qp){
4344 s->dc_val[0][ s->block_index[i] ]= dc[i];
4345 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4348 if(dir > 0 && dquant==dir){
4356 s->current_picture.qscale_table[xy]= qp;
4360 copy_context_after_encode(s, &best_s, -1);
4362 pb_bits_count= put_bits_count(&s->pb);
4363 flush_put_bits(&s->pb);
4364 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
4367 if(s->data_partitioning){
4368 pb2_bits_count= put_bits_count(&s->pb2);
4369 flush_put_bits(&s->pb2);
4370 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
4371 s->pb2= backup_s.pb2;
4373 tex_pb_bits_count= put_bits_count(&s->tex_pb);
4374 flush_put_bits(&s->tex_pb);
4375 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
4376 s->tex_pb= backup_s.tex_pb;
4378 s->last_bits= put_bits_count(&s->pb);
4381 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4382 ff_h263_update_motion_val(s);
4385 if(next_block==0){ //FIXME 16 vs linesize16
4386 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
4387 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
4388 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
4391 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
4392 MPV_decode_mb(s, s->block);
4394 int motion_x, motion_y;
4395 s->mv_type=MV_TYPE_16X16;
4396 // only one MB-Type possible
4399 case CANDIDATE_MB_TYPE_INTRA:
4402 motion_x= s->mv[0][0][0] = 0;
4403 motion_y= s->mv[0][0][1] = 0;
4405 case CANDIDATE_MB_TYPE_INTER:
4406 s->mv_dir = MV_DIR_FORWARD;
4408 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
4409 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
4411 case CANDIDATE_MB_TYPE_INTER_I:
4412 s->mv_dir = MV_DIR_FORWARD;
4413 s->mv_type = MV_TYPE_FIELD;
4416 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4417 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4418 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4420 motion_x = motion_y = 0;
4422 case CANDIDATE_MB_TYPE_INTER4V:
4423 s->mv_dir = MV_DIR_FORWARD;
4424 s->mv_type = MV_TYPE_8X8;
4427 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4428 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4430 motion_x= motion_y= 0;
4432 case CANDIDATE_MB_TYPE_DIRECT:
4433 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4435 motion_x=s->b_direct_mv_table[xy][0];
4436 motion_y=s->b_direct_mv_table[xy][1];
4438 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
4441 case CANDIDATE_MB_TYPE_BIDIR:
4442 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4446 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4447 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4448 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4449 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4451 case CANDIDATE_MB_TYPE_BACKWARD:
4452 s->mv_dir = MV_DIR_BACKWARD;
4454 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4455 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4457 case CANDIDATE_MB_TYPE_FORWARD:
4458 s->mv_dir = MV_DIR_FORWARD;
4460 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4461 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4462 // printf(" %d %d ", motion_x, motion_y);
4464 case CANDIDATE_MB_TYPE_FORWARD_I:
4465 s->mv_dir = MV_DIR_FORWARD;
4466 s->mv_type = MV_TYPE_FIELD;
4469 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4470 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4471 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4473 motion_x=motion_y=0;
4475 case CANDIDATE_MB_TYPE_BACKWARD_I:
4476 s->mv_dir = MV_DIR_BACKWARD;
4477 s->mv_type = MV_TYPE_FIELD;
4480 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4481 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4482 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4484 motion_x=motion_y=0;
4486 case CANDIDATE_MB_TYPE_BIDIR_I:
4487 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4488 s->mv_type = MV_TYPE_FIELD;
4490 for(dir=0; dir<2; dir++){
4492 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4493 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4494 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4497 motion_x=motion_y=0;
4500 motion_x=motion_y=0; //gcc warning fix
4501 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
4504 encode_mb(s, motion_x, motion_y);
4506 // RAL: Update last macrobloc type
4507 s->last_mv_dir = s->mv_dir;
4510 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4511 ff_h263_update_motion_val(s);
4514 MPV_decode_mb(s, s->block);
4517 /* clean the MV table in IPS frames for direct mode in B frames */
4518 if(s->mb_intra /* && I,P,S_TYPE */){
4519 s->p_mv_table[xy][0]=0;
4520 s->p_mv_table[xy][1]=0;
4523 if(s->flags&CODEC_FLAG_PSNR){
4527 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4528 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4530 s->current_picture_ptr->error[0] += sse(
4531 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
4532 s->dest[0], w, h, s->linesize);
4533 s->current_picture_ptr->error[1] += sse(
4534 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4535 s->dest[1], w>>1, h>>1, s->uvlinesize);
4536 s->current_picture_ptr->error[2] += sse(
4537 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4538 s->dest[2], w>>1, h>>1, s->uvlinesize);
4541 ff_h263_loop_filter(s);
4542 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
4547 //not beautifull here but we must write it before flushing so it has to be here
4548 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
4549 msmpeg4_encode_ext_header(s);
4554 /* Send the last GOB if RTP */
4555 if (s->avctx->rtp_callback) {
4556 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
4557 /* Call the RTP callback to send the last GOB */
4559 s->avctx->rtp_callback(s->ptr_lastgob, pdif, 0);
4565 #define MERGE(field) dst->field += src->field; src->field=0
4566 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
4567 MERGE(scene_change_score);
4568 MERGE(mc_mb_var_sum_temp);
4569 MERGE(mb_var_sum_temp);
4572 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
4575 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
4576 MERGE(dct_count[1]);
4587 MERGE(padding_bug_score);
4589 if(dst->avctx->noise_reduction){
4590 for(i=0; i<64; i++){
4591 MERGE(dct_error_sum[0][i]);
4592 MERGE(dct_error_sum[1][i]);
4596 assert(put_bits_count(&src->pb) % 8 ==0);
4597 assert(put_bits_count(&dst->pb) % 8 ==0);
4598 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
4599 flush_put_bits(&dst->pb);
4602 static void encode_picture(MpegEncContext *s, int picture_number)
4608 s->picture_number = picture_number;
4610 /* Reset the average MB variance */
4611 s->mb_var_sum_temp =
4612 s->mc_mb_var_sum_temp = 0;
4615 /* we need to initialize some time vars before we can encode b-frames */
4616 // RAL: Condition added for MPEG1VIDEO
4617 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
4618 ff_set_mpeg4_time(s, s->picture_number);
4621 s->scene_change_score=0;
4623 s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
4625 if(s->pict_type==I_TYPE){
4626 if(s->msmpeg4_version >= 3) s->no_rounding=1;
4627 else s->no_rounding=0;
4628 }else if(s->pict_type!=B_TYPE){
4629 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
4630 s->no_rounding ^= 1;
4633 s->mb_intra=0; //for the rate distoration & bit compare functions
4634 for(i=1; i<s->avctx->thread_count; i++){
4635 update_duplicate_context(s->thread_context[i], s);
4638 /* Estimate motion for every MB */
4639 if(s->pict_type != I_TYPE){
4640 if(s->pict_type != B_TYPE){
4641 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
4642 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4646 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4647 }else /* if(s->pict_type == I_TYPE) */{
4649 for(i=0; i<s->mb_stride*s->mb_height; i++)
4650 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4652 if(!s->fixed_qscale){
4653 /* finding spatial complexity for I-frame rate control */
4654 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4657 for(i=1; i<s->avctx->thread_count; i++){
4658 merge_context_after_me(s, s->thread_context[i]);
4660 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->mc_mb_var_sum_temp;
4661 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s-> mb_var_sum_temp;
4664 if(s->scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
4665 s->pict_type= I_TYPE;
4666 for(i=0; i<s->mb_stride*s->mb_height; i++)
4667 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4668 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
4672 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
4673 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
4675 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4677 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
4678 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
4679 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
4682 ff_fix_long_p_mvs(s);
4683 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
4684 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4687 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
4688 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
4693 if(s->pict_type==B_TYPE){
4696 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
4697 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4698 s->f_code = FFMAX(a, b);
4700 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
4701 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4702 s->b_code = FFMAX(a, b);
4704 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
4705 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
4706 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4707 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4708 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4710 for(dir=0; dir<2; dir++){
4713 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
4714 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
4715 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
4716 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
4724 if (!s->fixed_qscale)
4725 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
4727 if(s->adaptive_quant){
4729 switch(s->codec_id){
4730 case CODEC_ID_MPEG4:
4731 ff_clean_mpeg4_qscales(s);
4734 case CODEC_ID_H263P:
4736 ff_clean_h263_qscales(s);
4741 s->lambda= s->lambda_table[0];
4744 s->lambda= s->current_picture.quality;
4745 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
4748 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
4749 s->qscale= 3; //reduce cliping problems
4751 if (s->out_format == FMT_MJPEG) {
4752 /* for mjpeg, we do include qscale in the matrix */
4753 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
4755 int j= s->dsp.idct_permutation[i];
4757 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
4759 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
4760 s->intra_matrix, s->intra_quant_bias, 8, 8);
4764 //FIXME var duplication
4765 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
4766 s->current_picture.pict_type= s->pict_type;
4768 if(s->current_picture.key_frame)
4769 s->picture_in_gop_number=0;
4771 s->last_bits= put_bits_count(&s->pb);
4772 switch(s->out_format) {
4774 mjpeg_picture_header(s);
4778 if (s->codec_id == CODEC_ID_WMV2)
4779 ff_wmv2_encode_picture_header(s, picture_number);
4780 else if (s->h263_msmpeg4)
4781 msmpeg4_encode_picture_header(s, picture_number);
4782 else if (s->h263_pred)
4783 mpeg4_encode_picture_header(s, picture_number);
4784 else if (s->codec_id == CODEC_ID_RV10)
4785 rv10_encode_picture_header(s, picture_number);
4786 else if (s->codec_id == CODEC_ID_FLV1)
4787 ff_flv_encode_picture_header(s, picture_number);
4789 h263_encode_picture_header(s, picture_number);
4793 mpeg1_encode_picture_header(s, picture_number);
4800 bits= put_bits_count(&s->pb);
4801 s->header_bits= bits - s->last_bits;
4803 for(i=1; i<s->avctx->thread_count; i++){
4804 update_duplicate_context_after_me(s->thread_context[i], s);
4806 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4807 for(i=1; i<s->avctx->thread_count; i++){
4808 merge_context_after_encode(s, s->thread_context[i]);
4813 #endif //CONFIG_ENCODERS
4815 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
4816 const int intra= s->mb_intra;
4819 s->dct_count[intra]++;
4821 for(i=0; i<64; i++){
4822 int level= block[i];
4826 s->dct_error_sum[intra][i] += level;
4827 level -= s->dct_offset[intra][i];
4828 if(level<0) level=0;
4830 s->dct_error_sum[intra][i] -= level;
4831 level += s->dct_offset[intra][i];
4832 if(level>0) level=0;
4839 #ifdef CONFIG_ENCODERS
4841 static int dct_quantize_trellis_c(MpegEncContext *s,
4842 DCTELEM *block, int n,
4843 int qscale, int *overflow){
4845 const uint8_t *scantable= s->intra_scantable.scantable;
4846 const uint8_t *perm_scantable= s->intra_scantable.permutated;
4848 unsigned int threshold1, threshold2;
4860 int coeff_count[64];
4861 int qmul, qadd, start_i, last_non_zero, i, dc;
4862 const int esc_length= s->ac_esc_length;
4864 uint8_t * last_length;
4865 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
4867 s->dsp.fdct (block);
4869 if(s->dct_error_sum)
4870 s->denoise_dct(s, block);
4872 qadd= ((qscale-1)|1)*8;
4883 /* For AIC we skip quant/dequant of INTRADC */
4888 /* note: block[0] is assumed to be positive */
4889 block[0] = (block[0] + (q >> 1)) / q;
4892 qmat = s->q_intra_matrix[qscale];
4893 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4894 bias= 1<<(QMAT_SHIFT-1);
4895 length = s->intra_ac_vlc_length;
4896 last_length= s->intra_ac_vlc_last_length;
4900 qmat = s->q_inter_matrix[qscale];
4901 length = s->inter_ac_vlc_length;
4902 last_length= s->inter_ac_vlc_last_length;
4906 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4907 threshold2= (threshold1<<1);
4909 for(i=63; i>=start_i; i--) {
4910 const int j = scantable[i];
4911 int level = block[j] * qmat[j];
4913 if(((unsigned)(level+threshold1))>threshold2){
4919 for(i=start_i; i<=last_non_zero; i++) {
4920 const int j = scantable[i];
4921 int level = block[j] * qmat[j];
4923 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
4924 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
4925 if(((unsigned)(level+threshold1))>threshold2){
4927 level= (bias + level)>>QMAT_SHIFT;
4929 coeff[1][i]= level-1;
4930 // coeff[2][k]= level-2;
4932 level= (bias - level)>>QMAT_SHIFT;
4933 coeff[0][i]= -level;
4934 coeff[1][i]= -level+1;
4935 // coeff[2][k]= -level+2;
4937 coeff_count[i]= FFMIN(level, 2);
4938 assert(coeff_count[i]);
4941 coeff[0][i]= (level>>31)|1;
4946 *overflow= s->max_qcoeff < max; //overflow might have happend
4948 if(last_non_zero < start_i){
4949 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
4950 return last_non_zero;
4953 score_tab[start_i]= 0;
4954 survivor[0]= start_i;
4957 for(i=start_i; i<=last_non_zero; i++){
4959 const int dct_coeff= ABS(block[ scantable[i] ]);
4960 const int zero_distoration= dct_coeff*dct_coeff;
4961 int best_score=256*256*256*120;
4962 for(level_index=0; level_index < coeff_count[i]; level_index++){
4964 int level= coeff[level_index][i];
4965 const int alevel= ABS(level);
4970 if(s->out_format == FMT_H263){
4971 unquant_coeff= alevel*qmul + qadd;
4973 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
4975 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
4976 unquant_coeff = (unquant_coeff - 1) | 1;
4978 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
4979 unquant_coeff = (unquant_coeff - 1) | 1;
4984 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
4986 if((level&(~127)) == 0){
4987 for(j=survivor_count-1; j>=0; j--){
4988 int run= i - survivor[j];
4989 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
4990 score += score_tab[i-run];
4992 if(score < best_score){
4995 level_tab[i+1]= level-64;
4999 if(s->out_format == FMT_H263){
5000 for(j=survivor_count-1; j>=0; j--){
5001 int run= i - survivor[j];
5002 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5003 score += score_tab[i-run];
5004 if(score < last_score){
5007 last_level= level-64;
5013 distoration += esc_length*lambda;
5014 for(j=survivor_count-1; j>=0; j--){
5015 int run= i - survivor[j];
5016 int score= distoration + score_tab[i-run];
5018 if(score < best_score){
5021 level_tab[i+1]= level-64;
5025 if(s->out_format == FMT_H263){
5026 for(j=survivor_count-1; j>=0; j--){
5027 int run= i - survivor[j];
5028 int score= distoration + score_tab[i-run];
5029 if(score < last_score){
5032 last_level= level-64;
5040 score_tab[i+1]= best_score;
5042 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5043 if(last_non_zero <= 27){
5044 for(; survivor_count; survivor_count--){
5045 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5049 for(; survivor_count; survivor_count--){
5050 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5055 survivor[ survivor_count++ ]= i+1;
5058 if(s->out_format != FMT_H263){
5059 last_score= 256*256*256*120;
5060 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5061 int score= score_tab[i];
5062 if(i) score += lambda*2; //FIXME exacter?
5064 if(score < last_score){
5067 last_level= level_tab[i];
5068 last_run= run_tab[i];
5073 s->coded_score[n] = last_score;
5076 last_non_zero= last_i - 1;
5077 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5079 if(last_non_zero < start_i)
5080 return last_non_zero;
5082 if(last_non_zero == 0 && start_i == 0){
5084 int best_score= dc * dc;
5086 for(i=0; i<coeff_count[0]; i++){
5087 int level= coeff[i][0];
5088 int alevel= ABS(level);
5089 int unquant_coeff, score, distortion;
5091 if(s->out_format == FMT_H263){
5092 unquant_coeff= (alevel*qmul + qadd)>>3;
5094 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5095 unquant_coeff = (unquant_coeff - 1) | 1;
5097 unquant_coeff = (unquant_coeff + 4) >> 3;
5098 unquant_coeff<<= 3 + 3;
5100 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5102 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5103 else score= distortion + esc_length*lambda;
5105 if(score < best_score){
5107 best_level= level - 64;
5110 block[0]= best_level;
5111 s->coded_score[n] = best_score - dc*dc;
5112 if(best_level == 0) return -1;
5113 else return last_non_zero;
5119 block[ perm_scantable[last_non_zero] ]= last_level;
5122 for(; i>start_i; i -= run_tab[i] + 1){
5123 block[ perm_scantable[i-1] ]= level_tab[i];
5126 return last_non_zero;
5129 //#define REFINE_STATS 1
5130 static int16_t basis[64][64];
5132 static void build_basis(uint8_t *perm){
5139 double s= 0.25*(1<<BASIS_SHIFT);
5141 int perm_index= perm[index];
5142 if(i==0) s*= sqrt(0.5);
5143 if(j==0) s*= sqrt(0.5);
5144 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)));
5151 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5152 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5157 const uint8_t *scantable= s->intra_scantable.scantable;
5158 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5159 // unsigned int threshold1, threshold2;
5164 int qmul, qadd, start_i, last_non_zero, i, dc;
5165 const int esc_length= s->ac_esc_length;
5167 uint8_t * last_length;
5169 int rle_index, run, q, sum;
5172 static int after_last=0;
5173 static int to_zero=0;
5174 static int from_zero=0;
5177 static int messed_sign=0;
5180 if(basis[0][0] == 0)
5181 build_basis(s->dsp.idct_permutation);
5192 /* For AIC we skip quant/dequant of INTRADC */
5196 q <<= RECON_SHIFT-3;
5197 /* note: block[0] is assumed to be positive */
5199 // block[0] = (block[0] + (q >> 1)) / q;
5201 qmat = s->q_intra_matrix[qscale];
5202 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5203 // bias= 1<<(QMAT_SHIFT-1);
5204 length = s->intra_ac_vlc_length;
5205 last_length= s->intra_ac_vlc_last_length;
5209 qmat = s->q_inter_matrix[qscale];
5210 length = s->inter_ac_vlc_length;
5211 last_length= s->inter_ac_vlc_last_length;
5213 last_non_zero = s->block_last_index[n];
5218 dc += (1<<(RECON_SHIFT-1));
5219 for(i=0; i<64; i++){
5220 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly insteadof copying to rem[]
5223 STOP_TIMER("memset rem[]")}
5226 for(i=0; i<64; i++){
5231 w= ABS(weight[i]) + qns*one;
5232 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5235 // w=weight[i] = (63*qns + (w/2)) / w;
5241 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5247 for(i=start_i; i<=last_non_zero; i++){
5248 int j= perm_scantable[i];
5249 const int level= block[j];
5253 if(level<0) coeff= qmul*level - qadd;
5254 else coeff= qmul*level + qadd;
5255 run_tab[rle_index++]=run;
5258 s->dsp.add_8x8basis(rem, basis[j], coeff);
5264 if(last_non_zero>0){
5265 STOP_TIMER("init rem[]")
5272 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5273 int nochange_score= best_score;
5276 int run2, best_unquant_change, analyze_gradient;
5280 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5282 if(analyze_gradient){
5286 for(i=0; i<64; i++){
5289 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5292 STOP_TIMER("rem*w*w")}
5302 const int level= block[0];
5303 int change, old_coeff;
5305 assert(s->mb_intra);
5309 for(change=-1; change<=1; change+=2){
5310 int new_level= level + change;
5311 int score, new_coeff;
5313 new_coeff= q*new_level;
5314 if(new_coeff >= 2048 || new_coeff < 0)
5317 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5318 if(score<best_score){
5321 best_change= change;
5322 best_unquant_change= new_coeff - old_coeff;
5329 run2= run_tab[rle_index++];
5333 for(i=start_i; i<64; i++){
5334 int j= perm_scantable[i];
5335 const int level= block[j];
5336 int change, old_coeff;
5338 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
5342 if(level<0) old_coeff= qmul*level - qadd;
5343 else old_coeff= qmul*level + qadd;
5344 run2= run_tab[rle_index++]; //FIXME ! maybe after last
5348 assert(run2>=0 || i >= last_non_zero );
5351 for(change=-1; change<=1; change+=2){
5352 int new_level= level + change;
5353 int score, new_coeff, unquant_change;
5356 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
5360 if(new_level<0) new_coeff= qmul*new_level - qadd;
5361 else new_coeff= qmul*new_level + qadd;
5362 if(new_coeff >= 2048 || new_coeff <= -2048)
5364 //FIXME check for overflow
5367 if(level < 63 && level > -63){
5368 if(i < last_non_zero)
5369 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
5370 - length[UNI_AC_ENC_INDEX(run, level+64)];
5372 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
5373 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
5376 assert(ABS(new_level)==1);
5378 if(analyze_gradient){
5379 int g= d1[ scantable[i] ];
5380 if(g && (g^new_level) >= 0)
5384 if(i < last_non_zero){
5385 int next_i= i + run2 + 1;
5386 int next_level= block[ perm_scantable[next_i] ] + 64;
5388 if(next_level&(~127))
5391 if(next_i < last_non_zero)
5392 score += length[UNI_AC_ENC_INDEX(run, 65)]
5393 + length[UNI_AC_ENC_INDEX(run2, next_level)]
5394 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5396 score += length[UNI_AC_ENC_INDEX(run, 65)]
5397 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5398 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5400 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
5402 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5403 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5409 assert(ABS(level)==1);
5411 if(i < last_non_zero){
5412 int next_i= i + run2 + 1;
5413 int next_level= block[ perm_scantable[next_i] ] + 64;
5415 if(next_level&(~127))
5418 if(next_i < last_non_zero)
5419 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5420 - length[UNI_AC_ENC_INDEX(run2, next_level)]
5421 - length[UNI_AC_ENC_INDEX(run, 65)];
5423 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5424 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5425 - length[UNI_AC_ENC_INDEX(run, 65)];
5427 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
5429 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5430 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5437 unquant_change= new_coeff - old_coeff;
5438 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
5440 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
5441 if(score<best_score){
5444 best_change= change;
5445 best_unquant_change= unquant_change;
5449 prev_level= level + 64;
5450 if(prev_level&(~127))
5459 STOP_TIMER("iterative step")}
5463 int j= perm_scantable[ best_coeff ];
5465 block[j] += best_change;
5467 if(best_coeff > last_non_zero){
5468 last_non_zero= best_coeff;
5476 if(block[j] - best_change){
5477 if(ABS(block[j]) > ABS(block[j] - best_change)){
5489 for(; last_non_zero>=start_i; last_non_zero--){
5490 if(block[perm_scantable[last_non_zero]])
5496 if(256*256*256*64 % count == 0){
5497 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);
5502 for(i=start_i; i<=last_non_zero; i++){
5503 int j= perm_scantable[i];
5504 const int level= block[j];
5507 run_tab[rle_index++]=run;
5514 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
5520 if(last_non_zero>0){
5521 STOP_TIMER("iterative search")
5526 return last_non_zero;
5529 static int dct_quantize_c(MpegEncContext *s,
5530 DCTELEM *block, int n,
5531 int qscale, int *overflow)
5533 int i, j, level, last_non_zero, q, start_i;
5535 const uint8_t *scantable= s->intra_scantable.scantable;
5538 unsigned int threshold1, threshold2;
5540 s->dsp.fdct (block);
5542 if(s->dct_error_sum)
5543 s->denoise_dct(s, block);
5553 /* For AIC we skip quant/dequant of INTRADC */
5556 /* note: block[0] is assumed to be positive */
5557 block[0] = (block[0] + (q >> 1)) / q;
5560 qmat = s->q_intra_matrix[qscale];
5561 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5565 qmat = s->q_inter_matrix[qscale];
5566 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5568 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5569 threshold2= (threshold1<<1);
5570 for(i=63;i>=start_i;i--) {
5572 level = block[j] * qmat[j];
5574 if(((unsigned)(level+threshold1))>threshold2){
5581 for(i=start_i; i<=last_non_zero; i++) {
5583 level = block[j] * qmat[j];
5585 // if( bias+level >= (1<<QMAT_SHIFT)
5586 // || bias-level >= (1<<QMAT_SHIFT)){
5587 if(((unsigned)(level+threshold1))>threshold2){
5589 level= (bias + level)>>QMAT_SHIFT;
5592 level= (bias - level)>>QMAT_SHIFT;
5600 *overflow= s->max_qcoeff < max; //overflow might have happend
5602 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
5603 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
5604 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
5606 return last_non_zero;
5609 #endif //CONFIG_ENCODERS
5611 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
5612 DCTELEM *block, int n, int qscale)
5614 int i, level, nCoeffs;
5615 const uint16_t *quant_matrix;
5617 nCoeffs= s->block_last_index[n];
5620 block[0] = block[0] * s->y_dc_scale;
5622 block[0] = block[0] * s->c_dc_scale;
5623 /* XXX: only mpeg1 */
5624 quant_matrix = s->intra_matrix;
5625 for(i=1;i<=nCoeffs;i++) {
5626 int j= s->intra_scantable.permutated[i];
5631 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5632 level = (level - 1) | 1;
5635 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5636 level = (level - 1) | 1;
5643 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
5644 DCTELEM *block, int n, int qscale)
5646 int i, level, nCoeffs;
5647 const uint16_t *quant_matrix;
5649 nCoeffs= s->block_last_index[n];
5651 quant_matrix = s->inter_matrix;
5652 for(i=0; i<=nCoeffs; i++) {
5653 int j= s->intra_scantable.permutated[i];
5658 level = (((level << 1) + 1) * qscale *
5659 ((int) (quant_matrix[j]))) >> 4;
5660 level = (level - 1) | 1;
5663 level = (((level << 1) + 1) * qscale *
5664 ((int) (quant_matrix[j]))) >> 4;
5665 level = (level - 1) | 1;
5672 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
5673 DCTELEM *block, int n, int qscale)
5675 int i, level, nCoeffs;
5676 const uint16_t *quant_matrix;
5678 if(s->alternate_scan) nCoeffs= 63;
5679 else nCoeffs= s->block_last_index[n];
5682 block[0] = block[0] * s->y_dc_scale;
5684 block[0] = block[0] * s->c_dc_scale;
5685 quant_matrix = s->intra_matrix;
5686 for(i=1;i<=nCoeffs;i++) {
5687 int j= s->intra_scantable.permutated[i];
5692 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5695 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5702 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
5703 DCTELEM *block, int n, int qscale)
5705 int i, level, nCoeffs;
5706 const uint16_t *quant_matrix;
5709 if(s->alternate_scan) nCoeffs= 63;
5710 else nCoeffs= s->block_last_index[n];
5712 quant_matrix = s->inter_matrix;
5713 for(i=0; i<=nCoeffs; i++) {
5714 int j= s->intra_scantable.permutated[i];
5719 level = (((level << 1) + 1) * qscale *
5720 ((int) (quant_matrix[j]))) >> 4;
5723 level = (((level << 1) + 1) * qscale *
5724 ((int) (quant_matrix[j]))) >> 4;
5733 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
5734 DCTELEM *block, int n, int qscale)
5736 int i, level, qmul, qadd;
5739 assert(s->block_last_index[n]>=0);
5745 block[0] = block[0] * s->y_dc_scale;
5747 block[0] = block[0] * s->c_dc_scale;
5748 qadd = (qscale - 1) | 1;
5755 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5757 for(i=1; i<=nCoeffs; i++) {
5761 level = level * qmul - qadd;
5763 level = level * qmul + qadd;
5770 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
5771 DCTELEM *block, int n, int qscale)
5773 int i, level, qmul, qadd;
5776 assert(s->block_last_index[n]>=0);
5778 qadd = (qscale - 1) | 1;
5781 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5783 for(i=0; i<=nCoeffs; i++) {
5787 level = level * qmul - qadd;
5789 level = level * qmul + qadd;
5796 static const AVOption mpeg4_options[] =
5798 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
5799 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
5800 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
5801 bit_rate_tolerance, 4, 240000000, 8000),
5802 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
5803 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
5804 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
5805 rc_eq, "tex^qComp,option1,options2", 0),
5806 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
5807 rc_min_rate, 4, 24000000, 0),
5808 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
5809 rc_max_rate, 4, 24000000, 0),
5810 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
5811 rc_buffer_aggressivity, 4, 24000000, 0),
5812 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
5813 rc_initial_cplx, 0., 9999999., 0),
5814 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
5815 i_quant_factor, 0., 0., 0),
5816 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
5817 i_quant_factor, -999999., 999999., 0),
5818 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
5819 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
5820 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
5821 lumi_masking, 0., 999999., 0),
5822 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
5823 temporal_cplx_masking, 0., 999999., 0),
5824 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
5825 spatial_cplx_masking, 0., 999999., 0),
5826 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
5827 p_masking, 0., 999999., 0),
5828 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
5829 dark_masking, 0., 999999., 0),
5830 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
5831 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
5833 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
5835 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
5838 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
5839 me_cmp, 0, 24000000, 0),
5840 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
5841 me_sub_cmp, 0, 24000000, 0),
5844 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
5845 dia_size, 0, 24000000, 0),
5846 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
5847 last_predictor_count, 0, 24000000, 0),
5849 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
5850 pre_me, 0, 24000000, 0),
5851 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
5852 me_pre_cmp, 0, 24000000, 0),
5854 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
5855 me_range, 0, 24000000, 0),
5856 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
5857 pre_dia_size, 0, 24000000, 0),
5858 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
5859 me_subpel_quality, 0, 24000000, 0),
5860 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
5861 me_range, 0, 24000000, 0),
5862 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
5863 flags, CODEC_FLAG_PSNR, 0),
5864 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
5866 AVOPTION_SUB(avoptions_common),
5870 #ifdef CONFIG_ENCODERS
5872 AVCodec h263_encoder = {
5876 sizeof(MpegEncContext),
5882 AVCodec h263p_encoder = {
5886 sizeof(MpegEncContext),
5892 AVCodec flv_encoder = {
5896 sizeof(MpegEncContext),
5902 AVCodec rv10_encoder = {
5906 sizeof(MpegEncContext),
5912 AVCodec mpeg4_encoder = {
5916 sizeof(MpegEncContext),
5920 .options = mpeg4_options,
5923 AVCodec msmpeg4v1_encoder = {
5927 sizeof(MpegEncContext),
5931 .options = mpeg4_options,
5934 AVCodec msmpeg4v2_encoder = {
5938 sizeof(MpegEncContext),
5942 .options = mpeg4_options,
5945 AVCodec msmpeg4v3_encoder = {
5949 sizeof(MpegEncContext),
5953 .options = mpeg4_options,
5956 AVCodec wmv1_encoder = {
5960 sizeof(MpegEncContext),
5964 .options = mpeg4_options,
5969 AVCodec mjpeg_encoder = {
5973 sizeof(MpegEncContext),
5979 #endif //CONFIG_ENCODERS