2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
35 #include "fastmemcpy.h"
41 #ifdef CONFIG_ENCODERS
42 static void encode_picture(MpegEncContext *s, int picture_number);
43 #endif //CONFIG_ENCODERS
44 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void dct_unquantize_h261_intra_c(MpegEncContext *s,
57 DCTELEM *block, int n, int qscale);
58 static void dct_unquantize_h261_inter_c(MpegEncContext *s,
59 DCTELEM *block, int n, int qscale);
60 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
61 #ifdef CONFIG_ENCODERS
62 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
63 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
64 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
65 static int sse_mb(MpegEncContext *s);
66 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
67 #endif //CONFIG_ENCODERS
70 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
71 extern void XVMC_field_end(MpegEncContext *s);
72 extern void XVMC_decode_mb(MpegEncContext *s);
75 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
78 /* enable all paranoid tests for rounding, overflows, etc... */
84 /* for jpeg fast DCT */
87 static const uint16_t aanscales[64] = {
88 /* precomputed values scaled up by 14 bits */
89 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
90 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
91 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
92 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
93 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
94 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
95 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
96 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
99 static const uint8_t h263_chroma_roundtab[16] = {
100 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
101 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
104 static const uint8_t ff_default_chroma_qscale_table[32]={
105 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
106 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
109 #ifdef CONFIG_ENCODERS
110 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
111 static uint8_t default_fcode_tab[MAX_MV*2+1];
113 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
115 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
116 const uint16_t *quant_matrix, int bias, int qmin, int qmax)
120 for(qscale=qmin; qscale<=qmax; qscale++){
122 if (dsp->fdct == ff_jpeg_fdct_islow
123 #ifdef FAAN_POSTSCALE
124 || dsp->fdct == ff_faandct
128 const int j= dsp->idct_permutation[i];
129 /* 16 <= qscale * quant_matrix[i] <= 7905 */
130 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
131 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
132 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
134 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
135 (qscale * quant_matrix[j]));
137 } else if (dsp->fdct == fdct_ifast
138 #ifndef FAAN_POSTSCALE
139 || dsp->fdct == ff_faandct
143 const int j= dsp->idct_permutation[i];
144 /* 16 <= qscale * quant_matrix[i] <= 7905 */
145 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
146 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
147 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
149 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
150 (aanscales[i] * qscale * quant_matrix[j]));
154 const int j= dsp->idct_permutation[i];
155 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
156 So 16 <= qscale * quant_matrix[i] <= 7905
157 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
158 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
160 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
161 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
162 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
164 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
165 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
171 static inline void update_qscale(MpegEncContext *s){
172 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
173 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
175 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
177 #endif //CONFIG_ENCODERS
179 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
183 st->scantable= src_scantable;
187 j = src_scantable[i];
188 st->permutated[i] = permutation[j];
197 j = st->permutated[i];
199 st->raster_end[i]= end;
203 #ifdef CONFIG_ENCODERS
204 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
210 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
215 #endif //CONFIG_ENCODERS
217 /* init common dct for both encoder and decoder */
218 int DCT_common_init(MpegEncContext *s)
220 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
221 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
222 s->dct_unquantize_h261_intra = dct_unquantize_h261_intra_c;
223 s->dct_unquantize_h261_inter = dct_unquantize_h261_inter_c;
224 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
225 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
226 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
227 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
229 #ifdef CONFIG_ENCODERS
230 s->dct_quantize= dct_quantize_c;
231 s->denoise_dct= denoise_dct_c;
235 MPV_common_init_mmx(s);
238 MPV_common_init_axp(s);
241 MPV_common_init_mlib(s);
244 MPV_common_init_mmi(s);
247 MPV_common_init_armv4l(s);
250 MPV_common_init_ppc(s);
253 #ifdef CONFIG_ENCODERS
254 s->fast_dct_quantize= s->dct_quantize;
256 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
257 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
260 #endif //CONFIG_ENCODERS
262 /* load & permutate scantables
263 note: only wmv uses differnt ones
265 if(s->alternate_scan){
266 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
267 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
269 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
270 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
272 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
273 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
278 static void copy_picture(Picture *dst, Picture *src){
280 dst->type= FF_BUFFER_TYPE_COPY;
283 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
286 dst->pict_type = src->pict_type;
287 dst->quality = src->quality;
288 dst->coded_picture_number = src->coded_picture_number;
289 dst->display_picture_number = src->display_picture_number;
290 // dst->reference = src->reference;
292 dst->interlaced_frame = src->interlaced_frame;
293 dst->top_field_first = src->top_field_first;
295 if(s->avctx->me_threshold){
296 if(!src->motion_val[0])
297 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
299 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
300 if(!src->ref_index[0])
301 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
302 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
303 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesnt match! (%d!=%d)\n",
304 src->motion_subsample_log2, dst->motion_subsample_log2);
306 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
309 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
310 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
312 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
313 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
315 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
316 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
323 * allocates a Picture
324 * The pixels are allocated/set by calling get_buffer() if shared=0
326 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
327 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
328 const int mb_array_size= s->mb_stride*s->mb_height;
329 const int b8_array_size= s->b8_stride*s->mb_height*2;
330 const int b4_array_size= s->b4_stride*s->mb_height*4;
334 assert(pic->data[0]);
335 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
336 pic->type= FF_BUFFER_TYPE_SHARED;
340 assert(!pic->data[0]);
342 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
344 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
345 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
349 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
350 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
354 if(pic->linesize[1] != pic->linesize[2]){
355 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride missmatch)\n");
359 s->linesize = pic->linesize[0];
360 s->uvlinesize= pic->linesize[1];
363 if(pic->qscale_table==NULL){
365 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
366 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
367 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
370 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
371 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
372 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
373 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
374 if(s->out_format == FMT_H264){
376 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+2) * sizeof(int16_t))
377 pic->motion_val[i]= pic->motion_val_base[i]+2;
378 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
380 pic->motion_subsample_log2= 2;
381 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
383 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+2) * sizeof(int16_t))
384 pic->motion_val[i]= pic->motion_val_base[i]+2;
385 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
387 pic->motion_subsample_log2= 3;
389 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
390 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
392 pic->qstride= s->mb_stride;
393 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
396 //it might be nicer if the application would keep track of these but it would require a API change
397 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
398 s->prev_pict_types[0]= s->pict_type;
399 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
400 pic->age= INT_MAX; // skiped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
403 fail: //for the CHECKED_ALLOCZ macro
408 * deallocates a picture
410 static void free_picture(MpegEncContext *s, Picture *pic){
413 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
414 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
417 av_freep(&pic->mb_var);
418 av_freep(&pic->mc_mb_var);
419 av_freep(&pic->mb_mean);
420 av_freep(&pic->mbskip_table);
421 av_freep(&pic->qscale_table);
422 av_freep(&pic->mb_type_base);
423 av_freep(&pic->dct_coeff);
424 av_freep(&pic->pan_scan);
427 av_freep(&pic->motion_val_base[i]);
428 av_freep(&pic->ref_index[i]);
431 if(pic->type == FF_BUFFER_TYPE_SHARED){
440 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
443 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
444 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
445 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
447 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
448 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
449 s->rd_scratchpad= s->me.scratchpad;
450 s->b_scratchpad= s->me.scratchpad;
451 s->obmc_scratchpad= s->me.scratchpad + 16;
453 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
454 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
455 if(s->avctx->noise_reduction){
456 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
459 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
460 s->block= s->blocks[0];
463 s->pblocks[i] = (short *)(&s->block[i]);
467 return -1; //free() through MPV_common_end()
470 static void free_duplicate_context(MpegEncContext *s){
473 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
474 av_freep(&s->me.scratchpad);
477 s->obmc_scratchpad= NULL;
479 av_freep(&s->dct_error_sum);
480 av_freep(&s->me.map);
481 av_freep(&s->me.score_map);
482 av_freep(&s->blocks);
486 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
487 #define COPY(a) bak->a= src->a
488 COPY(allocated_edge_emu_buffer);
489 COPY(edge_emu_buffer);
493 COPY(obmc_scratchpad);
500 COPY(me.map_generation);
508 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
511 //FIXME copy only needed parts
513 backup_duplicate_context(&bak, dst);
514 memcpy(dst, src, sizeof(MpegEncContext));
515 backup_duplicate_context(dst, &bak);
517 dst->pblocks[i] = (short *)(&dst->block[i]);
519 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
522 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
523 #define COPY(a) dst->a= src->a
525 COPY(current_picture);
531 COPY(picture_in_gop_number);
532 COPY(gop_picture_number);
533 COPY(frame_pred_frame_dct); //FIXME dont set in encode_header
534 COPY(progressive_frame); //FIXME dont set in encode_header
535 COPY(partitioned_frame); //FIXME dont set in encode_header
540 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
541 * the changed fields will not depend upon the prior state of the MpegEncContext.
543 static void MPV_common_defaults(MpegEncContext *s){
545 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
546 s->chroma_qscale_table= ff_default_chroma_qscale_table;
547 s->progressive_frame= 1;
548 s->progressive_sequence= 1;
549 s->picture_structure= PICT_FRAME;
551 s->coded_picture_number = 0;
552 s->picture_number = 0;
553 s->input_picture_number = 0;
555 s->picture_in_gop_number = 0;
562 * sets the given MpegEncContext to defaults for decoding.
563 * the changed fields will not depend upon the prior state of the MpegEncContext.
565 void MPV_decode_defaults(MpegEncContext *s){
566 MPV_common_defaults(s);
570 * sets the given MpegEncContext to defaults for encoding.
571 * the changed fields will not depend upon the prior state of the MpegEncContext.
574 #ifdef CONFIG_ENCODERS
575 static void MPV_encode_defaults(MpegEncContext *s){
578 MPV_common_defaults(s);
584 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
585 memset(default_mv_penalty, 0, sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1));
586 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
588 for(i=-16; i<16; i++){
589 default_fcode_tab[i + MAX_MV]= 1;
592 s->me.mv_penalty= default_mv_penalty;
593 s->fcode_tab= default_fcode_tab;
595 #endif //CONFIG_ENCODERS
598 * init common structure for both encoder and decoder.
599 * this assumes that some variables like width/height are already set
601 int MPV_common_init(MpegEncContext *s)
603 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
605 if(s->avctx->thread_count > MAX_THREADS || (16*s->avctx->thread_count > s->height && s->height)){
606 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
610 dsputil_init(&s->dsp, s->avctx);
613 s->flags= s->avctx->flags;
614 s->flags2= s->avctx->flags2;
616 s->mb_width = (s->width + 15) / 16;
617 s->mb_height = (s->height + 15) / 16;
618 s->mb_stride = s->mb_width + 1;
619 s->b8_stride = s->mb_width*2 + 1;
620 s->b4_stride = s->mb_width*4 + 1;
621 mb_array_size= s->mb_height * s->mb_stride;
622 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
624 /* set chroma shifts */
625 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
626 &(s->chroma_y_shift) );
628 /* set default edge pos, will be overriden in decode_header if needed */
629 s->h_edge_pos= s->mb_width*16;
630 s->v_edge_pos= s->mb_height*16;
632 s->mb_num = s->mb_width * s->mb_height;
637 s->block_wrap[3]= s->b8_stride;
639 s->block_wrap[5]= s->mb_stride;
641 y_size = s->b8_stride * (2 * s->mb_height + 1);
642 c_size = s->mb_stride * (s->mb_height + 1);
643 yc_size = y_size + 2 * c_size;
645 /* convert fourcc to upper case */
646 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
647 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
648 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
649 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
651 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
652 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
653 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
654 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
656 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
658 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
659 for(y=0; y<s->mb_height; y++){
660 for(x=0; x<s->mb_width; x++){
661 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
664 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
667 /* Allocate MV tables */
668 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
669 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
670 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
671 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
672 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
673 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
674 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
675 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
676 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
677 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
678 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
679 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
681 if(s->msmpeg4_version){
682 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
684 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
686 /* Allocate MB type table */
687 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
689 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
691 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
692 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
693 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
694 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
695 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
696 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
698 if(s->avctx->noise_reduction){
699 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
702 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
704 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
706 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
707 /* interlaced direct mode decoding tables */
712 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
713 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
715 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
716 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
717 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
719 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
722 if (s->out_format == FMT_H263) {
724 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
725 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
726 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
727 s->ac_val[2] = s->ac_val[1] + c_size;
730 CHECKED_ALLOCZ(s->coded_block_base, y_size);
731 s->coded_block= s->coded_block_base + s->b8_stride + 1;
733 /* divx501 bitstream reorder buffer */
734 CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE);
736 /* cbp, ac_pred, pred_dir */
737 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
738 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
741 if (s->h263_pred || s->h263_plus || !s->encoding) {
743 //MN: we need these for error resilience of intra-frames
744 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
745 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
746 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
747 s->dc_val[2] = s->dc_val[1] + c_size;
748 for(i=0;i<yc_size;i++)
749 s->dc_val_base[i] = 1024;
752 /* which mb is a intra block */
753 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
754 memset(s->mbintra_table, 1, mb_array_size);
756 /* init macroblock skip table */
757 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
758 //Note the +1 is for a quicker mpeg4 slice_end detection
759 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
761 s->parse_context.state= -1;
762 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
763 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
764 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
765 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
768 s->context_initialized = 1;
770 s->thread_context[0]= s;
771 for(i=1; i<s->avctx->thread_count; i++){
772 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
773 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
776 for(i=0; i<s->avctx->thread_count; i++){
777 if(init_duplicate_context(s->thread_context[i], s) < 0)
779 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
780 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
789 /* init common structure for both encoder and decoder */
790 void MPV_common_end(MpegEncContext *s)
794 for(i=0; i<s->avctx->thread_count; i++){
795 free_duplicate_context(s->thread_context[i]);
797 for(i=1; i<s->avctx->thread_count; i++){
798 av_freep(&s->thread_context[i]);
801 av_freep(&s->parse_context.buffer);
802 s->parse_context.buffer_size=0;
804 av_freep(&s->mb_type);
805 av_freep(&s->p_mv_table_base);
806 av_freep(&s->b_forw_mv_table_base);
807 av_freep(&s->b_back_mv_table_base);
808 av_freep(&s->b_bidir_forw_mv_table_base);
809 av_freep(&s->b_bidir_back_mv_table_base);
810 av_freep(&s->b_direct_mv_table_base);
812 s->b_forw_mv_table= NULL;
813 s->b_back_mv_table= NULL;
814 s->b_bidir_forw_mv_table= NULL;
815 s->b_bidir_back_mv_table= NULL;
816 s->b_direct_mv_table= NULL;
820 av_freep(&s->b_field_mv_table_base[i][j][k]);
821 s->b_field_mv_table[i][j][k]=NULL;
823 av_freep(&s->b_field_select_table[i][j]);
824 av_freep(&s->p_field_mv_table_base[i][j]);
825 s->p_field_mv_table[i][j]=NULL;
827 av_freep(&s->p_field_select_table[i]);
830 av_freep(&s->dc_val_base);
831 av_freep(&s->ac_val_base);
832 av_freep(&s->coded_block_base);
833 av_freep(&s->mbintra_table);
834 av_freep(&s->cbp_table);
835 av_freep(&s->pred_dir_table);
837 av_freep(&s->mbskip_table);
838 av_freep(&s->prev_pict_types);
839 av_freep(&s->bitstream_buffer);
840 av_freep(&s->avctx->stats_out);
841 av_freep(&s->ac_stats);
842 av_freep(&s->error_status_table);
843 av_freep(&s->mb_index2xy);
844 av_freep(&s->lambda_table);
845 av_freep(&s->q_intra_matrix);
846 av_freep(&s->q_inter_matrix);
847 av_freep(&s->q_intra_matrix16);
848 av_freep(&s->q_inter_matrix16);
849 av_freep(&s->input_picture);
850 av_freep(&s->reordered_input_picture);
851 av_freep(&s->dct_offset);
854 for(i=0; i<MAX_PICTURE_COUNT; i++){
855 free_picture(s, &s->picture[i]);
858 av_freep(&s->picture);
859 s->context_initialized = 0;
862 s->current_picture_ptr= NULL;
865 av_freep(&s->visualization_buffer[i]);
868 #ifdef CONFIG_ENCODERS
870 /* init video encoder */
871 int MPV_encode_init(AVCodecContext *avctx)
873 MpegEncContext *s = avctx->priv_data;
875 int chroma_h_shift, chroma_v_shift;
877 MPV_encode_defaults(s);
879 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
881 s->bit_rate = avctx->bit_rate;
882 s->width = avctx->width;
883 s->height = avctx->height;
884 if(avctx->gop_size > 600){
885 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
888 s->gop_size = avctx->gop_size;
890 s->flags= avctx->flags;
891 s->flags2= avctx->flags2;
892 s->max_b_frames= avctx->max_b_frames;
893 s->codec_id= avctx->codec->id;
894 s->luma_elim_threshold = avctx->luma_elim_threshold;
895 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
896 s->strict_std_compliance= avctx->strict_std_compliance;
897 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
898 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
899 s->mpeg_quant= avctx->mpeg_quant;
900 s->rtp_mode= !!avctx->rtp_payload_size;
901 s->intra_dc_precision= avctx->intra_dc_precision;
903 if (s->gop_size <= 1) {
910 s->me_method = avctx->me_method;
913 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
915 s->adaptive_quant= ( s->avctx->lumi_masking
916 || s->avctx->dark_masking
917 || s->avctx->temporal_cplx_masking
918 || s->avctx->spatial_cplx_masking
919 || s->avctx->p_masking
920 || (s->flags&CODEC_FLAG_QP_RD))
923 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
924 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
925 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
927 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
928 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
932 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
933 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");
936 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
937 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
941 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
942 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
946 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
947 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
948 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
950 av_log(avctx, AV_LOG_INFO, "Warning vbv_delay will be set to 0xFFFF (=VBR) as the specified vbv buffer is too large for the given bitrate!\n");
953 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
954 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
955 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
959 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
960 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
964 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
965 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
969 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
970 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
974 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
975 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
979 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
980 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
984 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
985 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
986 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
990 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
991 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");
995 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
996 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1000 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1001 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1005 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1006 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1010 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1011 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1012 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1013 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1017 if(s->avctx->thread_count > 1)
1020 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
1022 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1023 avctx->frame_rate /= i;
1024 avctx->frame_rate_base /= i;
1028 if(s->codec_id==CODEC_ID_MJPEG){
1029 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1030 s->inter_quant_bias= 0;
1031 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1032 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1033 s->inter_quant_bias= 0;
1035 s->intra_quant_bias=0;
1036 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1039 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1040 s->intra_quant_bias= avctx->intra_quant_bias;
1041 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1042 s->inter_quant_bias= avctx->inter_quant_bias;
1044 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1046 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
1047 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1049 switch(avctx->codec->id) {
1050 case CODEC_ID_MPEG1VIDEO:
1051 s->out_format = FMT_MPEG1;
1052 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1053 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1055 case CODEC_ID_MPEG2VIDEO:
1056 s->out_format = FMT_MPEG1;
1057 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1058 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1061 case CODEC_ID_LJPEG:
1062 case CODEC_ID_MJPEG:
1063 s->out_format = FMT_MJPEG;
1064 s->intra_only = 1; /* force intra only for jpeg */
1065 s->mjpeg_write_tables = 1; /* write all tables */
1066 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1067 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1068 s->mjpeg_vsample[1] = 1;
1069 s->mjpeg_vsample[2] = 1;
1070 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1071 s->mjpeg_hsample[1] = 1;
1072 s->mjpeg_hsample[2] = 1;
1073 if (mjpeg_init(s) < 0)
1080 if (h263_get_picture_format(s->width, s->height) == 7) {
1081 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
1084 s->out_format = FMT_H263;
1085 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1089 case CODEC_ID_H263P:
1090 s->out_format = FMT_H263;
1093 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1094 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1095 s->modified_quant= s->h263_aic;
1096 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1097 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1098 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1099 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1100 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1103 /* These are just to be sure */
1108 s->out_format = FMT_H263;
1109 s->h263_flv = 2; /* format = 1; 11-bit codes */
1110 s->unrestricted_mv = 1;
1111 s->rtp_mode=0; /* don't allow GOB */
1116 s->out_format = FMT_H263;
1120 case CODEC_ID_MPEG4:
1121 s->out_format = FMT_H263;
1123 s->unrestricted_mv = 1;
1124 s->low_delay= s->max_b_frames ? 0 : 1;
1125 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1127 case CODEC_ID_MSMPEG4V1:
1128 s->out_format = FMT_H263;
1129 s->h263_msmpeg4 = 1;
1131 s->unrestricted_mv = 1;
1132 s->msmpeg4_version= 1;
1136 case CODEC_ID_MSMPEG4V2:
1137 s->out_format = FMT_H263;
1138 s->h263_msmpeg4 = 1;
1140 s->unrestricted_mv = 1;
1141 s->msmpeg4_version= 2;
1145 case CODEC_ID_MSMPEG4V3:
1146 s->out_format = FMT_H263;
1147 s->h263_msmpeg4 = 1;
1149 s->unrestricted_mv = 1;
1150 s->msmpeg4_version= 3;
1151 s->flipflop_rounding=1;
1156 s->out_format = FMT_H263;
1157 s->h263_msmpeg4 = 1;
1159 s->unrestricted_mv = 1;
1160 s->msmpeg4_version= 4;
1161 s->flipflop_rounding=1;
1166 s->out_format = FMT_H263;
1167 s->h263_msmpeg4 = 1;
1169 s->unrestricted_mv = 1;
1170 s->msmpeg4_version= 5;
1171 s->flipflop_rounding=1;
1180 avctx->has_b_frames= !s->low_delay;
1185 if (MPV_common_init(s) < 0)
1188 if(s->modified_quant)
1189 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1190 s->progressive_frame=
1191 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1192 s->quant_precision=5;
1194 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1196 #ifdef CONFIG_ENCODERS
1198 if (s->out_format == FMT_H263)
1199 h263_encode_init(s);
1200 if(s->msmpeg4_version)
1201 ff_msmpeg4_encode_init(s);
1203 if (s->out_format == FMT_MPEG1)
1204 ff_mpeg1_encode_init(s);
1209 int j= s->dsp.idct_permutation[i];
1211 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1212 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1213 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1214 }else if(s->out_format == FMT_H263){
1215 s->intra_matrix[j] =
1216 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1220 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1221 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1223 if(s->avctx->intra_matrix)
1224 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1225 if(s->avctx->inter_matrix)
1226 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1229 /* precompute matrix */
1230 /* for mjpeg, we do include qscale in the matrix */
1231 if (s->out_format != FMT_MJPEG) {
1232 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1233 s->intra_matrix, s->intra_quant_bias, 1, 31);
1234 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1235 s->inter_matrix, s->inter_quant_bias, 1, 31);
1238 if(ff_rate_control_init(s) < 0)
1244 int MPV_encode_end(AVCodecContext *avctx)
1246 MpegEncContext *s = avctx->priv_data;
1252 ff_rate_control_uninit(s);
1255 if (s->out_format == FMT_MJPEG)
1258 av_freep(&avctx->extradata);
1263 #endif //CONFIG_ENCODERS
1265 void init_rl(RLTable *rl)
1267 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1268 uint8_t index_run[MAX_RUN+1];
1269 int last, run, level, start, end, i;
1271 /* compute max_level[], max_run[] and index_run[] */
1272 for(last=0;last<2;last++) {
1281 memset(max_level, 0, MAX_RUN + 1);
1282 memset(max_run, 0, MAX_LEVEL + 1);
1283 memset(index_run, rl->n, MAX_RUN + 1);
1284 for(i=start;i<end;i++) {
1285 run = rl->table_run[i];
1286 level = rl->table_level[i];
1287 if (index_run[run] == rl->n)
1289 if (level > max_level[run])
1290 max_level[run] = level;
1291 if (run > max_run[level])
1292 max_run[level] = run;
1294 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1295 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1296 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1297 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1298 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1299 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1303 /* draw the edges of width 'w' of an image of size width, height */
1304 //FIXME check that this is ok for mpeg4 interlaced
1305 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1307 uint8_t *ptr, *last_line;
1310 last_line = buf + (height - 1) * wrap;
1312 /* top and bottom */
1313 memcpy(buf - (i + 1) * wrap, buf, width);
1314 memcpy(last_line + (i + 1) * wrap, last_line, width);
1316 /* left and right */
1318 for(i=0;i<height;i++) {
1319 memset(ptr - w, ptr[0], w);
1320 memset(ptr + width, ptr[width-1], w);
1325 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1326 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1327 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1328 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1332 int ff_find_unused_picture(MpegEncContext *s, int shared){
1336 for(i=0; i<MAX_PICTURE_COUNT; i++){
1337 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1340 for(i=0; i<MAX_PICTURE_COUNT; i++){
1341 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1343 for(i=0; i<MAX_PICTURE_COUNT; i++){
1344 if(s->picture[i].data[0]==NULL) return i;
1352 static void update_noise_reduction(MpegEncContext *s){
1355 for(intra=0; intra<2; intra++){
1356 if(s->dct_count[intra] > (1<<16)){
1357 for(i=0; i<64; i++){
1358 s->dct_error_sum[intra][i] >>=1;
1360 s->dct_count[intra] >>= 1;
1363 for(i=0; i<64; i++){
1364 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);
1370 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1372 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1378 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1380 /* mark&release old frames */
1381 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1382 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1384 /* release forgotten pictures */
1385 /* if(mpeg124/h263) */
1387 for(i=0; i<MAX_PICTURE_COUNT; i++){
1388 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1389 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1390 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1397 /* release non refernce frames */
1398 for(i=0; i<MAX_PICTURE_COUNT; i++){
1399 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1400 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1404 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1405 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1407 i= ff_find_unused_picture(s, 0);
1408 pic= (AVFrame*)&s->picture[i];
1411 pic->reference= s->pict_type != B_TYPE && !s->dropable ? 3 : 0;
1413 pic->coded_picture_number= s->coded_picture_number++;
1415 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1418 s->current_picture_ptr= (Picture*)pic;
1419 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1420 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1423 s->current_picture_ptr->pict_type= s->pict_type;
1424 // if(s->flags && CODEC_FLAG_QSCALE)
1425 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1426 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1428 copy_picture(&s->current_picture, s->current_picture_ptr);
1430 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1431 if (s->pict_type != B_TYPE) {
1432 s->last_picture_ptr= s->next_picture_ptr;
1434 s->next_picture_ptr= s->current_picture_ptr;
1436 /* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1437 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1438 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1439 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1440 s->pict_type, s->dropable);*/
1442 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1443 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1445 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1446 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1447 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1451 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1453 if(s->picture_structure!=PICT_FRAME){
1456 if(s->picture_structure == PICT_BOTTOM_FIELD){
1457 s->current_picture.data[i] += s->current_picture.linesize[i];
1459 s->current_picture.linesize[i] *= 2;
1460 s->last_picture.linesize[i] *=2;
1461 s->next_picture.linesize[i] *=2;
1466 s->hurry_up= s->avctx->hurry_up;
1467 s->error_resilience= avctx->error_resilience;
1469 /* set dequantizer, we cant do it during init as it might change for mpeg4
1470 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1471 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1472 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1473 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1474 }else if(s->out_format == FMT_H263){
1475 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1476 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1477 }else if(s->out_format == FMT_H261){
1478 s->dct_unquantize_intra = s->dct_unquantize_h261_intra;
1479 s->dct_unquantize_inter = s->dct_unquantize_h261_inter;
1481 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1482 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1485 if(s->dct_error_sum){
1486 assert(s->avctx->noise_reduction && s->encoding);
1488 update_noise_reduction(s);
1492 if(s->avctx->xvmc_acceleration)
1493 return XVMC_field_start(s, avctx);
1498 /* generic function for encode/decode called after a frame has been coded/decoded */
1499 void MPV_frame_end(MpegEncContext *s)
1502 /* draw edge for correct motion prediction if outside */
1504 //just to make sure that all data is rendered.
1505 if(s->avctx->xvmc_acceleration){
1509 if(s->unrestricted_mv && s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1510 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1511 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1512 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1516 s->last_pict_type = s->pict_type;
1517 if(s->pict_type!=B_TYPE){
1518 s->last_non_b_pict_type= s->pict_type;
1521 /* copy back current_picture variables */
1522 for(i=0; i<MAX_PICTURE_COUNT; i++){
1523 if(s->picture[i].data[0] == s->current_picture.data[0]){
1524 s->picture[i]= s->current_picture;
1528 assert(i<MAX_PICTURE_COUNT);
1532 /* release non refernce frames */
1533 for(i=0; i<MAX_PICTURE_COUNT; i++){
1534 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1535 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1539 // clear copies, to avoid confusion
1541 memset(&s->last_picture, 0, sizeof(Picture));
1542 memset(&s->next_picture, 0, sizeof(Picture));
1543 memset(&s->current_picture, 0, sizeof(Picture));
1548 * draws an line from (ex, ey) -> (sx, sy).
1549 * @param w width of the image
1550 * @param h height of the image
1551 * @param stride stride/linesize of the image
1552 * @param color color of the arrow
1554 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1557 sx= clip(sx, 0, w-1);
1558 sy= clip(sy, 0, h-1);
1559 ex= clip(ex, 0, w-1);
1560 ey= clip(ey, 0, h-1);
1562 buf[sy*stride + sx]+= color;
1564 if(ABS(ex - sx) > ABS(ey - sy)){
1569 buf+= sx + sy*stride;
1571 f= ((ey-sy)<<16)/ex;
1572 for(x= 0; x <= ex; x++){
1575 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1576 buf[(y+1)*stride + x]+= (color* fr )>>16;
1583 buf+= sx + sy*stride;
1585 if(ey) f= ((ex-sx)<<16)/ey;
1587 for(y= 0; y <= ey; y++){
1590 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1591 buf[y*stride + x+1]+= (color* fr )>>16;;
1597 * draws an arrow from (ex, ey) -> (sx, sy).
1598 * @param w width of the image
1599 * @param h height of the image
1600 * @param stride stride/linesize of the image
1601 * @param color color of the arrow
1603 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1606 sx= clip(sx, -100, w+100);
1607 sy= clip(sy, -100, h+100);
1608 ex= clip(ex, -100, w+100);
1609 ey= clip(ey, -100, h+100);
1614 if(dx*dx + dy*dy > 3*3){
1617 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1619 //FIXME subpixel accuracy
1620 rx= ROUNDED_DIV(rx*3<<4, length);
1621 ry= ROUNDED_DIV(ry*3<<4, length);
1623 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1624 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1626 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1630 * prints debuging info for the given picture.
1632 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1634 if(!pict || !pict->mb_type) return;
1636 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1639 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1640 switch (pict->pict_type) {
1641 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1642 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1643 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1644 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1645 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1646 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1648 for(y=0; y<s->mb_height; y++){
1649 for(x=0; x<s->mb_width; x++){
1650 if(s->avctx->debug&FF_DEBUG_SKIP){
1651 int count= s->mbskip_table[x + y*s->mb_stride];
1652 if(count>9) count=9;
1653 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1655 if(s->avctx->debug&FF_DEBUG_QP){
1656 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1658 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1659 int mb_type= pict->mb_type[x + y*s->mb_stride];
1660 //Type & MV direction
1662 av_log(s->avctx, AV_LOG_DEBUG, "P");
1663 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1664 av_log(s->avctx, AV_LOG_DEBUG, "A");
1665 else if(IS_INTRA4x4(mb_type))
1666 av_log(s->avctx, AV_LOG_DEBUG, "i");
1667 else if(IS_INTRA16x16(mb_type))
1668 av_log(s->avctx, AV_LOG_DEBUG, "I");
1669 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1670 av_log(s->avctx, AV_LOG_DEBUG, "d");
1671 else if(IS_DIRECT(mb_type))
1672 av_log(s->avctx, AV_LOG_DEBUG, "D");
1673 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1674 av_log(s->avctx, AV_LOG_DEBUG, "g");
1675 else if(IS_GMC(mb_type))
1676 av_log(s->avctx, AV_LOG_DEBUG, "G");
1677 else if(IS_SKIP(mb_type))
1678 av_log(s->avctx, AV_LOG_DEBUG, "S");
1679 else if(!USES_LIST(mb_type, 1))
1680 av_log(s->avctx, AV_LOG_DEBUG, ">");
1681 else if(!USES_LIST(mb_type, 0))
1682 av_log(s->avctx, AV_LOG_DEBUG, "<");
1684 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1685 av_log(s->avctx, AV_LOG_DEBUG, "X");
1690 av_log(s->avctx, AV_LOG_DEBUG, "+");
1691 else if(IS_16X8(mb_type))
1692 av_log(s->avctx, AV_LOG_DEBUG, "-");
1693 else if(IS_8X16(mb_type))
1694 av_log(s->avctx, AV_LOG_DEBUG, "¦");
1695 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1696 av_log(s->avctx, AV_LOG_DEBUG, " ");
1698 av_log(s->avctx, AV_LOG_DEBUG, "?");
1701 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1702 av_log(s->avctx, AV_LOG_DEBUG, "=");
1704 av_log(s->avctx, AV_LOG_DEBUG, " ");
1706 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1708 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1712 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1713 const int shift= 1 + s->quarter_sample;
1717 int h_chroma_shift, v_chroma_shift;
1718 s->low_delay=0; //needed to see the vectors without trashing the buffers
1720 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1722 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*s->height:pict->linesize[i]*s->height >> v_chroma_shift);
1723 pict->data[i]= s->visualization_buffer[i];
1725 pict->type= FF_BUFFER_TYPE_COPY;
1728 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1730 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1731 const int mb_index= mb_x + mb_y*s->mb_stride;
1732 if((s->avctx->debug_mv) && pict->motion_val){
1734 for(type=0; type<3; type++){
1737 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1741 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1745 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1750 if(!USES_LIST(pict->mb_type[mb_index], direction))
1754 if(IS_8X8(pict->mb_type[mb_index])){
1757 int sx= mb_x*16 + 4 + 8*(i&1);
1758 int sy= mb_y*16 + 4 + 8*(i>>1);
1759 int xy= mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride;
1760 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1761 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1762 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1764 }else if(IS_16X8(pict->mb_type[mb_index])){
1768 int sy=mb_y*16 + 4 + 8*i;
1769 int xy= mb_x*2 + (mb_y*2 + i)*s->b8_stride;
1770 int mx=(pict->motion_val[direction][xy][0]>>shift);
1771 int my=(pict->motion_val[direction][xy][1]>>shift);
1773 if(IS_INTERLACED(pict->mb_type[mb_index]))
1776 draw_arrow(ptr, sx, sy, mx+sx, my+sy, s->width, s->height, s->linesize, 100);
1779 int sx= mb_x*16 + 8;
1780 int sy= mb_y*16 + 8;
1781 int xy= mb_x*2 + mb_y*2*s->b8_stride;
1782 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1783 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1784 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1788 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1789 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1792 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1793 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1796 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1797 int mb_type= pict->mb_type[mb_index];
1800 #define COLOR(theta, r)\
1801 u= (int)(128 + r*cos(theta*3.141592/180));\
1802 v= (int)(128 + r*sin(theta*3.141592/180));
1806 if(IS_PCM(mb_type)){
1808 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1810 }else if(IS_INTRA4x4(mb_type)){
1812 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1814 }else if(IS_DIRECT(mb_type)){
1816 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1818 }else if(IS_GMC(mb_type)){
1820 }else if(IS_SKIP(mb_type)){
1822 }else if(!USES_LIST(mb_type, 1)){
1824 }else if(!USES_LIST(mb_type, 0)){
1827 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1831 u*= 0x0101010101010101ULL;
1832 v*= 0x0101010101010101ULL;
1834 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1835 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1839 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1840 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1841 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1843 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1845 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1848 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1852 s->mbskip_table[mb_index]=0;
1858 #ifdef CONFIG_ENCODERS
1860 static int get_sae(uint8_t *src, int ref, int stride){
1864 for(y=0; y<16; y++){
1865 for(x=0; x<16; x++){
1866 acc+= ABS(src[x+y*stride] - ref);
1873 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1880 for(y=0; y<h; y+=16){
1881 for(x=0; x<w; x+=16){
1882 int offset= x + y*stride;
1883 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1884 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1885 int sae = get_sae(src + offset, mean, stride);
1887 acc+= sae + 500 < sad;
1894 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1897 const int encoding_delay= s->max_b_frames;
1901 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1902 if(pic_arg->linesize[0] != s->linesize) direct=0;
1903 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1904 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1906 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1909 i= ff_find_unused_picture(s, 1);
1911 pic= (AVFrame*)&s->picture[i];
1915 pic->data[i]= pic_arg->data[i];
1916 pic->linesize[i]= pic_arg->linesize[i];
1918 alloc_picture(s, (Picture*)pic, 1);
1921 i= ff_find_unused_picture(s, 0);
1923 pic= (AVFrame*)&s->picture[i];
1926 alloc_picture(s, (Picture*)pic, 0);
1928 if( pic->data[0] + offset == pic_arg->data[0]
1929 && pic->data[1] + offset == pic_arg->data[1]
1930 && pic->data[2] + offset == pic_arg->data[2]){
1933 int h_chroma_shift, v_chroma_shift;
1934 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1937 int src_stride= pic_arg->linesize[i];
1938 int dst_stride= i ? s->uvlinesize : s->linesize;
1939 int h_shift= i ? h_chroma_shift : 0;
1940 int v_shift= i ? v_chroma_shift : 0;
1941 int w= s->width >>h_shift;
1942 int h= s->height>>v_shift;
1943 uint8_t *src= pic_arg->data[i];
1944 uint8_t *dst= pic->data[i] + offset;
1946 if(src_stride==dst_stride)
1947 memcpy(dst, src, src_stride*h);
1950 memcpy(dst, src, w);
1958 copy_picture_attributes(s, pic, pic_arg);
1960 pic->display_picture_number= s->input_picture_number++;
1961 if(pic->pts != AV_NOPTS_VALUE){
1962 s->user_specified_pts= pic->pts;
1964 if(s->user_specified_pts){
1965 pic->pts= s->user_specified_pts + AV_TIME_BASE*(int64_t)s->avctx->frame_rate_base / s->avctx->frame_rate;
1966 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pic->pts);
1968 pic->pts= av_rescale(pic->display_picture_number*(int64_t)s->avctx->frame_rate_base, AV_TIME_BASE, s->avctx->frame_rate);
1973 /* shift buffer entries */
1974 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1975 s->input_picture[i-1]= s->input_picture[i];
1977 s->input_picture[encoding_delay]= (Picture*)pic;
1982 static void select_input_picture(MpegEncContext *s){
1985 for(i=1; i<MAX_PICTURE_COUNT; i++)
1986 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
1987 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
1989 /* set next picture types & ordering */
1990 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
1991 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
1992 s->reordered_input_picture[0]= s->input_picture[0];
1993 s->reordered_input_picture[0]->pict_type= I_TYPE;
1994 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
1998 if(s->flags&CODEC_FLAG_PASS2){
1999 for(i=0; i<s->max_b_frames+1; i++){
2000 int pict_num= s->input_picture[0]->display_picture_number + i;
2001 int pict_type= s->rc_context.entry[pict_num].new_pict_type;
2002 s->input_picture[i]->pict_type= pict_type;
2004 if(i + 1 >= s->rc_context.num_entries) break;
2008 if(s->input_picture[0]->pict_type){
2009 /* user selected pict_type */
2010 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
2011 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
2014 if(b_frames > s->max_b_frames){
2015 av_log(s->avctx, AV_LOG_ERROR, "warning, too many bframes in a row\n");
2016 b_frames = s->max_b_frames;
2018 }else if(s->avctx->b_frame_strategy==0){
2019 b_frames= s->max_b_frames;
2020 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2021 }else if(s->avctx->b_frame_strategy==1){
2022 for(i=1; i<s->max_b_frames+1; i++){
2023 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2024 s->input_picture[i]->b_frame_score=
2025 get_intra_count(s, s->input_picture[i ]->data[0],
2026 s->input_picture[i-1]->data[0], s->linesize) + 1;
2029 for(i=0; i<s->max_b_frames; i++){
2030 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2033 b_frames= FFMAX(0, i-1);
2036 for(i=0; i<b_frames+1; i++){
2037 s->input_picture[i]->b_frame_score=0;
2040 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2045 //static int b_count=0;
2046 //b_count+= b_frames;
2047 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2048 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2049 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2051 s->input_picture[b_frames]->pict_type= I_TYPE;
2054 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2056 && s->input_picture[b_frames]->pict_type== I_TYPE)
2059 s->reordered_input_picture[0]= s->input_picture[b_frames];
2060 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2061 s->reordered_input_picture[0]->pict_type= P_TYPE;
2062 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2063 for(i=0; i<b_frames; i++){
2064 s->reordered_input_picture[i+1]= s->input_picture[i];
2065 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2066 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2071 if(s->reordered_input_picture[0]){
2072 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2074 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2076 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2077 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
2079 int i= ff_find_unused_picture(s, 0);
2080 Picture *pic= &s->picture[i];
2082 /* mark us unused / free shared pic */
2084 s->reordered_input_picture[0]->data[i]= NULL;
2085 s->reordered_input_picture[0]->type= 0;
2087 pic->reference = s->reordered_input_picture[0]->reference;
2089 alloc_picture(s, pic, 0);
2091 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2093 s->current_picture_ptr= pic;
2095 // input is not a shared pix -> reuse buffer for current_pix
2097 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2098 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2100 s->current_picture_ptr= s->reordered_input_picture[0];
2102 s->new_picture.data[i]+=16;
2105 copy_picture(&s->current_picture, s->current_picture_ptr);
2107 s->picture_number= s->new_picture.display_picture_number;
2108 //printf("dpn:%d\n", s->picture_number);
2110 memset(&s->new_picture, 0, sizeof(Picture));
2114 int MPV_encode_picture(AVCodecContext *avctx,
2115 unsigned char *buf, int buf_size, void *data)
2117 MpegEncContext *s = avctx->priv_data;
2118 AVFrame *pic_arg = data;
2119 int i, stuffing_count;
2121 if(avctx->pix_fmt != PIX_FMT_YUV420P){
2122 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2126 for(i=0; i<avctx->thread_count; i++){
2127 int start_y= s->thread_context[i]->start_mb_y;
2128 int end_y= s->thread_context[i]-> end_mb_y;
2129 int h= s->mb_height;
2130 uint8_t *start= buf + buf_size*start_y/h;
2131 uint8_t *end = buf + buf_size* end_y/h;
2133 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2136 s->picture_in_gop_number++;
2138 load_input_picture(s, pic_arg);
2140 select_input_picture(s);
2143 if(s->new_picture.data[0]){
2144 s->pict_type= s->new_picture.pict_type;
2146 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2147 MPV_frame_start(s, avctx);
2149 encode_picture(s, s->picture_number);
2151 avctx->real_pict_num = s->picture_number;
2152 avctx->header_bits = s->header_bits;
2153 avctx->mv_bits = s->mv_bits;
2154 avctx->misc_bits = s->misc_bits;
2155 avctx->i_tex_bits = s->i_tex_bits;
2156 avctx->p_tex_bits = s->p_tex_bits;
2157 avctx->i_count = s->i_count;
2158 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2159 avctx->skip_count = s->skip_count;
2163 if (s->out_format == FMT_MJPEG)
2164 mjpeg_picture_trailer(s);
2166 if(s->flags&CODEC_FLAG_PASS1)
2167 ff_write_pass1_stats(s);
2170 avctx->error[i] += s->current_picture_ptr->error[i];
2173 flush_put_bits(&s->pb);
2174 s->frame_bits = put_bits_count(&s->pb);
2176 stuffing_count= ff_vbv_update(s, s->frame_bits);
2178 switch(s->codec_id){
2179 case CODEC_ID_MPEG1VIDEO:
2180 case CODEC_ID_MPEG2VIDEO:
2181 while(stuffing_count--){
2182 put_bits(&s->pb, 8, 0);
2185 case CODEC_ID_MPEG4:
2186 put_bits(&s->pb, 16, 0);
2187 put_bits(&s->pb, 16, 0x1C3);
2188 stuffing_count -= 4;
2189 while(stuffing_count--){
2190 put_bits(&s->pb, 8, 0xFF);
2194 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2196 flush_put_bits(&s->pb);
2197 s->frame_bits = put_bits_count(&s->pb);
2200 /* update mpeg1/2 vbv_delay for CBR */
2201 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2202 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2205 assert(s->repeat_first_field==0);
2207 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2208 assert(vbv_delay < 0xFFFF);
2210 s->vbv_delay_ptr[0] &= 0xF8;
2211 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2212 s->vbv_delay_ptr[1] = vbv_delay>>5;
2213 s->vbv_delay_ptr[2] &= 0x07;
2214 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2216 s->total_bits += s->frame_bits;
2217 avctx->frame_bits = s->frame_bits;
2219 assert((pbBufPtr(&s->pb) == s->pb.buf));
2222 assert((s->frame_bits&7)==0);
2224 return s->frame_bits/8;
2227 #endif //CONFIG_ENCODERS
2229 static inline void gmc1_motion(MpegEncContext *s,
2230 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2231 uint8_t **ref_picture)
2234 int offset, src_x, src_y, linesize, uvlinesize;
2235 int motion_x, motion_y;
2238 motion_x= s->sprite_offset[0][0];
2239 motion_y= s->sprite_offset[0][1];
2240 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2241 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2242 motion_x<<=(3-s->sprite_warping_accuracy);
2243 motion_y<<=(3-s->sprite_warping_accuracy);
2244 src_x = clip(src_x, -16, s->width);
2245 if (src_x == s->width)
2247 src_y = clip(src_y, -16, s->height);
2248 if (src_y == s->height)
2251 linesize = s->linesize;
2252 uvlinesize = s->uvlinesize;
2254 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2256 if(s->flags&CODEC_FLAG_EMU_EDGE){
2257 if( (unsigned)src_x >= s->h_edge_pos - 17
2258 || (unsigned)src_y >= s->v_edge_pos - 17){
2259 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2260 ptr= s->edge_emu_buffer;
2264 if((motion_x|motion_y)&7){
2265 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2266 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2270 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2271 if (s->no_rounding){
2272 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2274 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2278 if(s->flags&CODEC_FLAG_GRAY) return;
2280 motion_x= s->sprite_offset[1][0];
2281 motion_y= s->sprite_offset[1][1];
2282 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2283 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2284 motion_x<<=(3-s->sprite_warping_accuracy);
2285 motion_y<<=(3-s->sprite_warping_accuracy);
2286 src_x = clip(src_x, -8, s->width>>1);
2287 if (src_x == s->width>>1)
2289 src_y = clip(src_y, -8, s->height>>1);
2290 if (src_y == s->height>>1)
2293 offset = (src_y * uvlinesize) + src_x;
2294 ptr = ref_picture[1] + offset;
2295 if(s->flags&CODEC_FLAG_EMU_EDGE){
2296 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2297 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2298 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);
2299 ptr= s->edge_emu_buffer;
2303 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2305 ptr = ref_picture[2] + offset;
2307 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);
2308 ptr= s->edge_emu_buffer;
2310 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2315 static inline void gmc_motion(MpegEncContext *s,
2316 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2317 uint8_t **ref_picture)
2320 int linesize, uvlinesize;
2321 const int a= s->sprite_warping_accuracy;
2324 linesize = s->linesize;
2325 uvlinesize = s->uvlinesize;
2327 ptr = ref_picture[0];
2329 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2330 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2332 s->dsp.gmc(dest_y, ptr, linesize, 16,
2335 s->sprite_delta[0][0], s->sprite_delta[0][1],
2336 s->sprite_delta[1][0], s->sprite_delta[1][1],
2337 a+1, (1<<(2*a+1)) - s->no_rounding,
2338 s->h_edge_pos, s->v_edge_pos);
2339 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2340 ox + s->sprite_delta[0][0]*8,
2341 oy + s->sprite_delta[1][0]*8,
2342 s->sprite_delta[0][0], s->sprite_delta[0][1],
2343 s->sprite_delta[1][0], s->sprite_delta[1][1],
2344 a+1, (1<<(2*a+1)) - s->no_rounding,
2345 s->h_edge_pos, s->v_edge_pos);
2347 if(s->flags&CODEC_FLAG_GRAY) return;
2349 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2350 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2352 ptr = ref_picture[1];
2353 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2356 s->sprite_delta[0][0], s->sprite_delta[0][1],
2357 s->sprite_delta[1][0], s->sprite_delta[1][1],
2358 a+1, (1<<(2*a+1)) - s->no_rounding,
2359 s->h_edge_pos>>1, s->v_edge_pos>>1);
2361 ptr = ref_picture[2];
2362 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2365 s->sprite_delta[0][0], s->sprite_delta[0][1],
2366 s->sprite_delta[1][0], s->sprite_delta[1][1],
2367 a+1, (1<<(2*a+1)) - s->no_rounding,
2368 s->h_edge_pos>>1, s->v_edge_pos>>1);
2372 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2373 * @param buf destination buffer
2374 * @param src source buffer
2375 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2376 * @param block_w width of block
2377 * @param block_h height of block
2378 * @param src_x x coordinate of the top left sample of the block in the source buffer
2379 * @param src_y y coordinate of the top left sample of the block in the source buffer
2380 * @param w width of the source buffer
2381 * @param h height of the source buffer
2383 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2384 int src_x, int src_y, int w, int h){
2386 int start_y, start_x, end_y, end_x;
2389 src+= (h-1-src_y)*linesize;
2391 }else if(src_y<=-block_h){
2392 src+= (1-block_h-src_y)*linesize;
2398 }else if(src_x<=-block_w){
2399 src+= (1-block_w-src_x);
2403 start_y= FFMAX(0, -src_y);
2404 start_x= FFMAX(0, -src_x);
2405 end_y= FFMIN(block_h, h-src_y);
2406 end_x= FFMIN(block_w, w-src_x);
2408 // copy existing part
2409 for(y=start_y; y<end_y; y++){
2410 for(x=start_x; x<end_x; x++){
2411 buf[x + y*linesize]= src[x + y*linesize];
2416 for(y=0; y<start_y; y++){
2417 for(x=start_x; x<end_x; x++){
2418 buf[x + y*linesize]= buf[x + start_y*linesize];
2423 for(y=end_y; y<block_h; y++){
2424 for(x=start_x; x<end_x; x++){
2425 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2429 for(y=0; y<block_h; y++){
2431 for(x=0; x<start_x; x++){
2432 buf[x + y*linesize]= buf[start_x + y*linesize];
2436 for(x=end_x; x<block_w; x++){
2437 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2442 static inline int hpel_motion(MpegEncContext *s,
2443 uint8_t *dest, uint8_t *src,
2444 int field_based, int field_select,
2445 int src_x, int src_y,
2446 int width, int height, int stride,
2447 int h_edge_pos, int v_edge_pos,
2448 int w, int h, op_pixels_func *pix_op,
2449 int motion_x, int motion_y)
2454 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2455 src_x += motion_x >> 1;
2456 src_y += motion_y >> 1;
2458 /* WARNING: do no forget half pels */
2459 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2462 src_y = clip(src_y, -16, height);
2463 if (src_y == height)
2465 src += src_y * stride + src_x;
2467 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2468 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2469 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2470 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2471 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2472 src= s->edge_emu_buffer;
2478 pix_op[dxy](dest, src, stride, h);
2482 /* apply one mpeg motion vector to the three components */
2483 static always_inline void mpeg_motion(MpegEncContext *s,
2484 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2485 int field_based, int bottom_field, int field_select,
2486 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2487 int motion_x, int motion_y, int h)
2489 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2490 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2493 if(s->quarter_sample)
2500 v_edge_pos = s->v_edge_pos >> field_based;
2501 linesize = s->current_picture.linesize[0] << field_based;
2502 uvlinesize = s->current_picture.linesize[1] << field_based;
2504 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2505 src_x = s->mb_x* 16 + (motion_x >> 1);
2506 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2508 if (s->out_format == FMT_H263) {
2509 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2510 mx = (motion_x>>1)|(motion_x&1);
2512 uvdxy = ((my & 1) << 1) | (mx & 1);
2513 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2514 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2516 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2520 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2524 uvsrc_x = s->mb_x*8 + mx;
2525 uvsrc_y = s->mb_y*8 + my;
2527 if(s->chroma_y_shift){
2530 uvdxy = ((my & 1) << 1) | (mx & 1);
2531 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2532 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2534 if(s->chroma_x_shift){
2537 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2538 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2549 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2550 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2551 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2553 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2554 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2555 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2556 s->codec_id == CODEC_ID_MPEG1VIDEO){
2557 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2560 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2561 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2562 ptr_y = s->edge_emu_buffer;
2563 if(!(s->flags&CODEC_FLAG_GRAY)){
2564 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2565 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2566 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2567 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2568 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2574 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2575 dest_y += s->linesize;
2576 dest_cb+= s->uvlinesize;
2577 dest_cr+= s->uvlinesize;
2581 ptr_y += s->linesize;
2582 ptr_cb+= s->uvlinesize;
2583 ptr_cr+= s->uvlinesize;
2586 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2588 if(!(s->flags&CODEC_FLAG_GRAY)){
2589 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2590 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2593 //FIXME move to dsputil, avg variant, 16x16 version
2594 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2596 uint8_t * const top = src[1];
2597 uint8_t * const left = src[2];
2598 uint8_t * const mid = src[0];
2599 uint8_t * const right = src[3];
2600 uint8_t * const bottom= src[4];
2601 #define OBMC_FILTER(x, t, l, m, r, b)\
2602 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2603 #define OBMC_FILTER4(x, t, l, m, r, b)\
2604 OBMC_FILTER(x , t, l, m, r, b);\
2605 OBMC_FILTER(x+1 , t, l, m, r, b);\
2606 OBMC_FILTER(x +stride, t, l, m, r, b);\
2607 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2610 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2611 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2612 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2613 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2614 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2615 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2617 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2618 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2619 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2620 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2622 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2623 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2624 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2625 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2627 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2628 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2629 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2630 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2632 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2633 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2634 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2635 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2636 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2637 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2639 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2640 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2641 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2642 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2645 /* obmc for 1 8x8 luma block */
2646 static inline void obmc_motion(MpegEncContext *s,
2647 uint8_t *dest, uint8_t *src,
2648 int src_x, int src_y,
2649 op_pixels_func *pix_op,
2650 int16_t mv[5][2]/* mid top left right bottom*/)
2656 assert(s->quarter_sample==0);
2659 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2662 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2663 hpel_motion(s, ptr[i], src, 0, 0,
2665 s->width, s->height, s->linesize,
2666 s->h_edge_pos, s->v_edge_pos,
2668 mv[i][0], mv[i][1]);
2672 put_obmc(dest, ptr, s->linesize);
2675 static inline void qpel_motion(MpegEncContext *s,
2676 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2677 int field_based, int bottom_field, int field_select,
2678 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2679 qpel_mc_func (*qpix_op)[16],
2680 int motion_x, int motion_y, int h)
2682 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2683 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
2685 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2686 src_x = s->mb_x * 16 + (motion_x >> 2);
2687 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
2689 v_edge_pos = s->v_edge_pos >> field_based;
2690 linesize = s->linesize << field_based;
2691 uvlinesize = s->uvlinesize << field_based;
2696 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2697 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2698 mx= (motion_x>>1) + rtab[motion_x&7];
2699 my= (motion_y>>1) + rtab[motion_y&7];
2700 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2701 mx= (motion_x>>1)|(motion_x&1);
2702 my= (motion_y>>1)|(motion_y&1);
2710 uvdxy= (mx&1) | ((my&1)<<1);
2714 uvsrc_x = s->mb_x * 8 + mx;
2715 uvsrc_y = s->mb_y * (8 >> field_based) + my;
2717 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2718 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2719 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2721 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
2722 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
2723 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2724 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2725 ptr_y= s->edge_emu_buffer;
2726 if(!(s->flags&CODEC_FLAG_GRAY)){
2727 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
2728 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
2729 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2730 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
2731 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2738 qpix_op[0][dxy](dest_y, ptr_y, linesize);
2741 dest_y += s->linesize;
2742 dest_cb+= s->uvlinesize;
2743 dest_cr+= s->uvlinesize;
2747 ptr_y += s->linesize;
2748 ptr_cb += s->uvlinesize;
2749 ptr_cr += s->uvlinesize;
2751 //damn interlaced mode
2752 //FIXME boundary mirroring is not exactly correct here
2753 qpix_op[1][dxy](dest_y , ptr_y , linesize);
2754 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
2756 if(!(s->flags&CODEC_FLAG_GRAY)){
2757 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
2758 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
2762 inline int ff_h263_round_chroma(int x){
2764 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2767 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2772 * h263 chorma 4mv motion compensation.
2774 static inline void chroma_4mv_motion(MpegEncContext *s,
2775 uint8_t *dest_cb, uint8_t *dest_cr,
2776 uint8_t **ref_picture,
2777 op_pixels_func *pix_op,
2779 int dxy, emu=0, src_x, src_y, offset;
2782 /* In case of 8X8, we construct a single chroma motion vector
2783 with a special rounding */
2784 mx= ff_h263_round_chroma(mx);
2785 my= ff_h263_round_chroma(my);
2787 dxy = ((my & 1) << 1) | (mx & 1);
2791 src_x = s->mb_x * 8 + mx;
2792 src_y = s->mb_y * 8 + my;
2793 src_x = clip(src_x, -8, s->width/2);
2794 if (src_x == s->width/2)
2796 src_y = clip(src_y, -8, s->height/2);
2797 if (src_y == s->height/2)
2800 offset = (src_y * (s->uvlinesize)) + src_x;
2801 ptr = ref_picture[1] + offset;
2802 if(s->flags&CODEC_FLAG_EMU_EDGE){
2803 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
2804 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
2805 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);
2806 ptr= s->edge_emu_buffer;
2810 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
2812 ptr = ref_picture[2] + offset;
2814 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);
2815 ptr= s->edge_emu_buffer;
2817 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
2821 * motion compesation of a single macroblock
2823 * @param dest_y luma destination pointer
2824 * @param dest_cb chroma cb/u destination pointer
2825 * @param dest_cr chroma cr/v destination pointer
2826 * @param dir direction (0->forward, 1->backward)
2827 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2828 * @param pic_op halfpel motion compensation function (average or put normally)
2829 * @param pic_op qpel motion compensation function (average or put normally)
2830 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2832 static inline void MPV_motion(MpegEncContext *s,
2833 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2834 int dir, uint8_t **ref_picture,
2835 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
2837 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
2839 uint8_t *ptr, *dest;
2844 if(s->obmc && s->pict_type != B_TYPE){
2845 int16_t mv_cache[4][4][2];
2846 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2847 const int mot_stride= s->b8_stride;
2848 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
2850 assert(!s->mb_skiped);
2852 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
2853 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2854 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2856 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
2857 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
2859 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
2862 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
2863 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
2864 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
2866 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
2867 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
2870 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
2871 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
2872 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
2874 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
2875 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
2881 const int x= (i&1)+1;
2882 const int y= (i>>1)+1;
2884 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
2885 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
2886 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
2887 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
2888 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
2890 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
2892 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
2899 if(!(s->flags&CODEC_FLAG_GRAY))
2900 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
2905 switch(s->mv_type) {
2909 if(s->real_sprite_warping_points==1){
2910 gmc1_motion(s, dest_y, dest_cb, dest_cr,
2913 gmc_motion(s, dest_y, dest_cb, dest_cr,
2916 }else if(s->quarter_sample){
2917 qpel_motion(s, dest_y, dest_cb, dest_cr,
2919 ref_picture, pix_op, qpix_op,
2920 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2922 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
2923 ref_picture, pix_op,
2924 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2928 mpeg_motion(s, dest_y, dest_cb, dest_cr,
2930 ref_picture, pix_op,
2931 s->mv[dir][0][0], s->mv[dir][0][1], 16);
2937 if(s->quarter_sample){
2939 motion_x = s->mv[dir][i][0];
2940 motion_y = s->mv[dir][i][1];
2942 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2943 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
2944 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
2946 /* WARNING: do no forget half pels */
2947 src_x = clip(src_x, -16, s->width);
2948 if (src_x == s->width)
2950 src_y = clip(src_y, -16, s->height);
2951 if (src_y == s->height)
2954 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
2955 if(s->flags&CODEC_FLAG_EMU_EDGE){
2956 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
2957 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
2958 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);
2959 ptr= s->edge_emu_buffer;
2962 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
2963 qpix_op[1][dxy](dest, ptr, s->linesize);
2965 mx += s->mv[dir][i][0]/2;
2966 my += s->mv[dir][i][1]/2;
2970 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
2971 ref_picture[0], 0, 0,
2972 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
2973 s->width, s->height, s->linesize,
2974 s->h_edge_pos, s->v_edge_pos,
2976 s->mv[dir][i][0], s->mv[dir][i][1]);
2978 mx += s->mv[dir][i][0];
2979 my += s->mv[dir][i][1];
2983 if(!(s->flags&CODEC_FLAG_GRAY))
2984 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
2987 if (s->picture_structure == PICT_FRAME) {
2988 if(s->quarter_sample){
2990 qpel_motion(s, dest_y, dest_cb, dest_cr,
2991 1, i, s->field_select[dir][i],
2992 ref_picture, pix_op, qpix_op,
2993 s->mv[dir][i][0], s->mv[dir][i][1], 8);
2997 mpeg_motion(s, dest_y, dest_cb, dest_cr,
2998 1, 0, s->field_select[dir][0],
2999 ref_picture, pix_op,
3000 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3002 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3003 1, 1, s->field_select[dir][1],
3004 ref_picture, pix_op,
3005 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3008 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3009 ref_picture= s->current_picture_ptr->data;
3012 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3013 0, 0, s->field_select[dir][0],
3014 ref_picture, pix_op,
3015 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3020 uint8_t ** ref2picture;
3022 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3023 ref2picture= ref_picture;
3025 ref2picture= s->current_picture_ptr->data;
3028 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3029 0, 0, s->field_select[dir][i],
3030 ref2picture, pix_op,
3031 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3033 dest_y += 16*s->linesize;
3034 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3035 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3039 if(s->picture_structure == PICT_FRAME){
3043 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3045 ref_picture, pix_op,
3046 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3048 pix_op = s->dsp.avg_pixels_tab;
3052 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3053 0, 0, s->picture_structure != i+1,
3054 ref_picture, pix_op,
3055 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3057 // after put we make avg of the same block
3058 pix_op=s->dsp.avg_pixels_tab;
3060 //opposite parity is always in the same frame if this is second field
3061 if(!s->first_field){
3062 ref_picture = s->current_picture_ptr->data;
3072 /* put block[] to dest[] */
3073 static inline void put_dct(MpegEncContext *s,
3074 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3076 s->dct_unquantize_intra(s, block, i, qscale);
3077 s->dsp.idct_put (dest, line_size, block);
3080 /* add block[] to dest[] */
3081 static inline void add_dct(MpegEncContext *s,
3082 DCTELEM *block, int i, uint8_t *dest, int line_size)
3084 if (s->block_last_index[i] >= 0) {
3085 s->dsp.idct_add (dest, line_size, block);
3089 static inline void add_dequant_dct(MpegEncContext *s,
3090 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3092 if (s->block_last_index[i] >= 0) {
3093 s->dct_unquantize_inter(s, block, i, qscale);
3095 s->dsp.idct_add (dest, line_size, block);
3100 * cleans dc, ac, coded_block for the current non intra MB
3102 void ff_clean_intra_table_entries(MpegEncContext *s)
3104 int wrap = s->b8_stride;
3105 int xy = s->block_index[0];
3108 s->dc_val[0][xy + 1 ] =
3109 s->dc_val[0][xy + wrap] =
3110 s->dc_val[0][xy + 1 + wrap] = 1024;
3112 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3113 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3114 if (s->msmpeg4_version>=3) {
3115 s->coded_block[xy ] =
3116 s->coded_block[xy + 1 ] =
3117 s->coded_block[xy + wrap] =
3118 s->coded_block[xy + 1 + wrap] = 0;
3121 wrap = s->mb_stride;
3122 xy = s->mb_x + s->mb_y * wrap;
3124 s->dc_val[2][xy] = 1024;
3126 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3127 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3129 s->mbintra_table[xy]= 0;
3132 /* generic function called after a macroblock has been parsed by the
3133 decoder or after it has been encoded by the encoder.
3135 Important variables used:
3136 s->mb_intra : true if intra macroblock
3137 s->mv_dir : motion vector direction
3138 s->mv_type : motion vector type
3139 s->mv : motion vector
3140 s->interlaced_dct : true if interlaced dct used (mpeg2)
3142 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
3145 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3147 if(s->avctx->xvmc_acceleration){
3148 XVMC_decode_mb(s);//xvmc uses pblocks
3156 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3157 /* save DCT coefficients */
3159 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3162 *dct++ = block[i][s->dsp.idct_permutation[j]];
3165 s->current_picture.qscale_table[mb_xy]= s->qscale;
3167 /* update DC predictors for P macroblocks */
3169 if (s->h263_pred || s->h263_aic) {
3170 if(s->mbintra_table[mb_xy])
3171 ff_clean_intra_table_entries(s);
3175 s->last_dc[2] = 128 << s->intra_dc_precision;
3178 else if (s->h263_pred || s->h263_aic)
3179 s->mbintra_table[mb_xy]=1;
3181 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3182 uint8_t *dest_y, *dest_cb, *dest_cr;
3183 int dct_linesize, dct_offset;
3184 op_pixels_func (*op_pix)[4];
3185 qpel_mc_func (*op_qpix)[16];
3186 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3187 const int uvlinesize= s->current_picture.linesize[1];
3188 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band;
3190 /* avoid copy if macroblock skipped in last frame too */
3191 /* skip only during decoding as we might trash the buffers during encoding a bit */
3193 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3194 const int age= s->current_picture.age;
3200 assert(s->pict_type!=I_TYPE);
3202 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
3203 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3205 /* if previous was skipped too, then nothing to do ! */
3206 if (*mbskip_ptr >= age && s->current_picture.reference){
3209 } else if(!s->current_picture.reference){
3210 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3211 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3213 *mbskip_ptr = 0; /* not skipped */
3217 dct_linesize = linesize << s->interlaced_dct;
3218 dct_offset =(s->interlaced_dct)? linesize : linesize*8;
3222 dest_cb= s->dest[1];
3223 dest_cr= s->dest[2];
3225 dest_y = s->b_scratchpad;
3226 dest_cb= s->b_scratchpad+16*linesize;
3227 dest_cr= s->b_scratchpad+32*linesize;
3230 /* motion handling */
3231 /* decoding or more than one mb_type (MC was allready done otherwise) */
3233 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3234 op_pix = s->dsp.put_pixels_tab;
3235 op_qpix= s->dsp.put_qpel_pixels_tab;
3237 op_pix = s->dsp.put_no_rnd_pixels_tab;
3238 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3241 if (s->mv_dir & MV_DIR_FORWARD) {
3242 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3243 op_pix = s->dsp.avg_pixels_tab;
3244 op_qpix= s->dsp.avg_qpel_pixels_tab;
3246 if (s->mv_dir & MV_DIR_BACKWARD) {
3247 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3251 /* skip dequant / idct if we are really late ;) */
3252 if(s->hurry_up>1) return;
3254 /* add dct residue */
3255 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3256 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3257 add_dequant_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
3258 add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
3259 add_dequant_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
3260 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
3262 if(!(s->flags&CODEC_FLAG_GRAY)){
3263 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3264 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3266 } else if(s->codec_id != CODEC_ID_WMV2){
3267 add_dct(s, block[0], 0, dest_y, dct_linesize);
3268 add_dct(s, block[1], 1, dest_y + 8, dct_linesize);
3269 add_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize);
3270 add_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize);
3272 if(!(s->flags&CODEC_FLAG_GRAY)){
3273 if(s->chroma_y_shift){//Chroma420
3274 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3275 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3278 dct_linesize = uvlinesize << s->interlaced_dct;
3279 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3281 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3282 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3283 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3284 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3285 if(!s->chroma_x_shift){//Chroma444
3286 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3287 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3288 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3289 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3296 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3300 /* dct only in intra block */
3301 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3302 put_dct(s, block[0], 0, dest_y, dct_linesize, s->qscale);
3303 put_dct(s, block[1], 1, dest_y + 8, dct_linesize, s->qscale);
3304 put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize, s->qscale);
3305 put_dct(s, block[3], 3, dest_y + dct_offset + 8, dct_linesize, s->qscale);
3307 if(!(s->flags&CODEC_FLAG_GRAY)){
3308 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3309 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3312 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3313 s->dsp.idct_put(dest_y + 8, dct_linesize, block[1]);
3314 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3315 s->dsp.idct_put(dest_y + dct_offset + 8, dct_linesize, block[3]);
3317 if(!(s->flags&CODEC_FLAG_GRAY)){
3318 if(s->chroma_y_shift){
3319 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3320 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3323 dct_linesize = uvlinesize << s->interlaced_dct;
3324 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3326 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3327 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3328 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3329 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3330 if(!s->chroma_x_shift){//Chroma444
3331 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3332 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3333 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3334 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3341 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3342 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3343 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3348 #ifdef CONFIG_ENCODERS
3350 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3352 static const char tab[64]=
3364 DCTELEM *block= s->block[n];
3365 const int last_index= s->block_last_index[n];
3370 threshold= -threshold;
3374 /* are all which we could set to zero are allready zero? */
3375 if(last_index<=skip_dc - 1) return;
3377 for(i=0; i<=last_index; i++){
3378 const int j = s->intra_scantable.permutated[i];
3379 const int level = ABS(block[j]);
3381 if(skip_dc && i==0) continue;
3390 if(score >= threshold) return;
3391 for(i=skip_dc; i<=last_index; i++){
3392 const int j = s->intra_scantable.permutated[i];
3395 if(block[0]) s->block_last_index[n]= 0;
3396 else s->block_last_index[n]= -1;
3399 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3402 const int maxlevel= s->max_qcoeff;
3403 const int minlevel= s->min_qcoeff;
3407 i=1; //skip clipping of intra dc
3411 for(;i<=last_index; i++){
3412 const int j= s->intra_scantable.permutated[i];
3413 int level = block[j];
3415 if (level>maxlevel){
3418 }else if(level<minlevel){
3426 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3427 av_log(s->avctx, AV_LOG_INFO, "warning, cliping %d dct coefficents to %d..%d\n", overflow, minlevel, maxlevel);
3430 #endif //CONFIG_ENCODERS
3434 * @param h is the normal height, this will be reduced automatically if needed for the last row
3436 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3437 if (s->avctx->draw_horiz_band) {
3441 if(s->picture_structure != PICT_FRAME){
3444 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3447 h= FFMIN(h, s->height - y);
3449 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3450 src= (AVFrame*)s->current_picture_ptr;
3451 else if(s->last_picture_ptr)
3452 src= (AVFrame*)s->last_picture_ptr;
3456 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
3462 offset[0]= y * s->linesize;;
3464 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
3470 s->avctx->draw_horiz_band(s->avctx, src, offset,
3471 y, s->picture_structure, h);
3475 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
3476 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3477 const int uvlinesize= s->current_picture.linesize[1];
3479 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
3480 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
3481 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
3482 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
3483 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3484 s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3485 //block_index is not used by mpeg2, so it is not affected by chroma_format
3487 s->dest[0] = s->current_picture.data[0] + (s->mb_x - 1)*16;
3488 s->dest[1] = s->current_picture.data[1] + (s->mb_x - 1)*(16 >> s->chroma_x_shift);
3489 s->dest[2] = s->current_picture.data[2] + (s->mb_x - 1)*(16 >> s->chroma_x_shift);
3491 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
3493 s->dest[0] += s->mb_y * linesize * 16;
3494 s->dest[1] += s->mb_y * uvlinesize * (16 >> s->chroma_y_shift);
3495 s->dest[2] += s->mb_y * uvlinesize * (16 >> s->chroma_y_shift);
3499 #ifdef CONFIG_ENCODERS
3501 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
3511 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
3512 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
3513 int v= ptr[x2 + y2*stride];
3519 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
3524 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
3526 int16_t weight[6][64];
3527 DCTELEM orig[6][64];
3528 const int mb_x= s->mb_x;
3529 const int mb_y= s->mb_y;
3532 int dct_offset = s->linesize*8; //default for progressive frames
3533 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3536 for(i=0; i<6; i++) skip_dct[i]=0;
3538 if(s->adaptive_quant){
3539 const int last_qp= s->qscale;
3540 const int mb_xy= mb_x + mb_y*s->mb_stride;
3542 s->lambda= s->lambda_table[mb_xy];
3545 if(!(s->flags&CODEC_FLAG_QP_RD)){
3546 s->dquant= s->qscale - last_qp;
3548 if(s->out_format==FMT_H263){
3549 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
3551 if(s->codec_id==CODEC_ID_MPEG4){
3553 if(s->pict_type == B_TYPE){
3555 s->dquant= (s->dquant/2)*2;
3556 if(s->mv_dir&MV_DIRECT)
3559 if(s->mv_type==MV_TYPE_8X8)
3565 ff_set_qscale(s, last_qp + s->dquant);
3566 }else if(s->flags&CODEC_FLAG_QP_RD)
3567 ff_set_qscale(s, s->qscale + s->dquant);
3569 wrap_y = s->linesize;
3570 wrap_c = s->uvlinesize;
3571 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
3572 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
3573 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
3575 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
3576 ff_emulated_edge_mc(s->edge_emu_buffer , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
3577 ptr_y= s->edge_emu_buffer;
3578 ff_emulated_edge_mc(s->edge_emu_buffer+18*wrap_y , ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3579 ptr_cb= s->edge_emu_buffer+18*wrap_y;
3580 ff_emulated_edge_mc(s->edge_emu_buffer+18*wrap_y+9, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3581 ptr_cr= s->edge_emu_buffer+18*wrap_y+9;
3585 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3586 int progressive_score, interlaced_score;
3588 s->interlaced_dct=0;
3589 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
3590 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
3592 if(progressive_score > 0){
3593 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
3594 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
3595 if(progressive_score > interlaced_score){
3596 s->interlaced_dct=1;
3604 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
3605 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
3606 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
3607 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
3609 if(s->flags&CODEC_FLAG_GRAY){
3613 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
3614 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
3617 op_pixels_func (*op_pix)[4];
3618 qpel_mc_func (*op_qpix)[16];
3619 uint8_t *dest_y, *dest_cb, *dest_cr;
3621 dest_y = s->dest[0];
3622 dest_cb = s->dest[1];
3623 dest_cr = s->dest[2];
3625 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3626 op_pix = s->dsp.put_pixels_tab;
3627 op_qpix= s->dsp.put_qpel_pixels_tab;
3629 op_pix = s->dsp.put_no_rnd_pixels_tab;
3630 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3633 if (s->mv_dir & MV_DIR_FORWARD) {
3634 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3635 op_pix = s->dsp.avg_pixels_tab;
3636 op_qpix= s->dsp.avg_qpel_pixels_tab;
3638 if (s->mv_dir & MV_DIR_BACKWARD) {
3639 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3642 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3643 int progressive_score, interlaced_score;
3645 s->interlaced_dct=0;
3646 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
3647 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
3649 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
3651 if(progressive_score>0){
3652 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
3653 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
3655 if(progressive_score > interlaced_score){
3656 s->interlaced_dct=1;
3664 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
3665 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
3666 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
3667 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
3669 if(s->flags&CODEC_FLAG_GRAY){
3673 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
3674 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
3676 /* pre quantization */
3677 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
3679 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
3680 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
3681 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
3682 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;
3683 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
3684 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
3688 if(s->avctx->quantizer_noise_shaping){
3689 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
3690 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
3691 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
3692 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
3693 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
3694 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
3695 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
3698 /* DCT & quantize */
3699 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
3704 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
3705 // FIXME we could decide to change to quantizer instead of clipping
3706 // JS: I don't think that would be a good idea it could lower quality instead
3707 // of improve it. Just INTRADC clipping deserves changes in quantizer
3708 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3710 s->block_last_index[i]= -1;
3712 if(s->avctx->quantizer_noise_shaping){
3715 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
3720 if(s->luma_elim_threshold && !s->mb_intra)
3722 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
3723 if(s->chroma_elim_threshold && !s->mb_intra)
3725 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
3727 if(s->flags & CODEC_FLAG_CBP_RD){
3729 if(s->block_last_index[i] == -1)
3730 s->coded_score[i]= INT_MAX/256;
3735 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3736 s->block_last_index[4]=
3737 s->block_last_index[5]= 0;
3739 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
3742 //non c quantize code returns incorrect block_last_index FIXME
3743 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
3746 if(s->block_last_index[i]>0){
3747 for(j=63; j>0; j--){
3748 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
3750 s->block_last_index[i]= j;
3755 /* huffman encode */
3756 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
3757 case CODEC_ID_MPEG1VIDEO:
3758 case CODEC_ID_MPEG2VIDEO:
3759 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
3761 case CODEC_ID_MPEG4:
3762 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3763 case CODEC_ID_MSMPEG4V2:
3764 case CODEC_ID_MSMPEG4V3:
3766 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
3768 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
3770 case CODEC_ID_H263P:
3773 h263_encode_mb(s, s->block, motion_x, motion_y); break;
3775 case CODEC_ID_MJPEG:
3776 mjpeg_encode_mb(s, s->block); break;
3782 #endif //CONFIG_ENCODERS
3784 void ff_mpeg_flush(AVCodecContext *avctx){
3786 MpegEncContext *s = avctx->priv_data;
3788 if(s==NULL || s->picture==NULL)
3791 for(i=0; i<MAX_PICTURE_COUNT; i++){
3792 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
3793 || s->picture[i].type == FF_BUFFER_TYPE_USER))
3794 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
3796 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
3798 s->parse_context.state= -1;
3799 s->parse_context.frame_start_found= 0;
3800 s->parse_context.overread= 0;
3801 s->parse_context.overread_index= 0;
3802 s->parse_context.index= 0;
3803 s->parse_context.last_index= 0;
3804 s->bitstream_buffer_size=0;
3807 #ifdef CONFIG_ENCODERS
3808 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
3810 const uint16_t *srcw= (uint16_t*)src;
3811 int words= length>>4;
3812 int bits= length&15;
3815 if(length==0) return;
3818 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
3819 }else if(put_bits_count(pb)&7){
3820 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
3822 for(i=0; put_bits_count(pb)&31; i++)
3823 put_bits(pb, 8, src[i]);
3825 memcpy(pbBufPtr(pb), src+i, 2*words-i);
3826 skip_put_bytes(pb, 2*words-i);
3829 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
3832 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
3835 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3838 d->mb_skip_run= s->mb_skip_run;
3840 d->last_dc[i]= s->last_dc[i];
3843 d->mv_bits= s->mv_bits;
3844 d->i_tex_bits= s->i_tex_bits;
3845 d->p_tex_bits= s->p_tex_bits;
3846 d->i_count= s->i_count;
3847 d->f_count= s->f_count;
3848 d->b_count= s->b_count;
3849 d->skip_count= s->skip_count;
3850 d->misc_bits= s->misc_bits;
3854 d->qscale= s->qscale;
3855 d->dquant= s->dquant;
3858 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
3861 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
3862 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
3865 d->mb_skip_run= s->mb_skip_run;
3867 d->last_dc[i]= s->last_dc[i];
3870 d->mv_bits= s->mv_bits;
3871 d->i_tex_bits= s->i_tex_bits;
3872 d->p_tex_bits= s->p_tex_bits;
3873 d->i_count= s->i_count;
3874 d->f_count= s->f_count;
3875 d->b_count= s->b_count;
3876 d->skip_count= s->skip_count;
3877 d->misc_bits= s->misc_bits;
3879 d->mb_intra= s->mb_intra;
3880 d->mb_skiped= s->mb_skiped;
3881 d->mv_type= s->mv_type;
3882 d->mv_dir= s->mv_dir;
3884 if(s->data_partitioning){
3886 d->tex_pb= s->tex_pb;
3890 d->block_last_index[i]= s->block_last_index[i];
3891 d->interlaced_dct= s->interlaced_dct;
3892 d->qscale= s->qscale;
3895 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
3896 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
3897 int *dmin, int *next_block, int motion_x, int motion_y)
3900 uint8_t *dest_backup[3];
3902 copy_context_before_encode(s, backup, type);
3904 s->block= s->blocks[*next_block];
3905 s->pb= pb[*next_block];
3906 if(s->data_partitioning){
3907 s->pb2 = pb2 [*next_block];
3908 s->tex_pb= tex_pb[*next_block];
3912 memcpy(dest_backup, s->dest, sizeof(s->dest));
3913 s->dest[0] = s->rd_scratchpad;
3914 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
3915 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
3916 assert(s->linesize >= 32); //FIXME
3919 encode_mb(s, motion_x, motion_y);
3921 score= put_bits_count(&s->pb);
3922 if(s->data_partitioning){
3923 score+= put_bits_count(&s->pb2);
3924 score+= put_bits_count(&s->tex_pb);
3927 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
3928 MPV_decode_mb(s, s->block);
3930 score *= s->lambda2;
3931 score += sse_mb(s) << FF_LAMBDA_SHIFT;
3935 memcpy(s->dest, dest_backup, sizeof(s->dest));
3942 copy_context_after_encode(best, s, type);
3946 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
3947 uint32_t *sq = squareTbl + 256;
3952 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
3953 else if(w==8 && h==8)
3954 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
3958 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
3967 static int sse_mb(MpegEncContext *s){
3971 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
3972 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
3975 if(s->avctx->mb_cmp == FF_CMP_NSSE){
3976 return s->dsp.nsse[0](s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16, s->dest[0], s->linesize, 16)
3977 +s->dsp.nsse[1](s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[1], s->uvlinesize, 8)
3978 +s->dsp.nsse[1](s, s->new_picture.data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,s->dest[2], s->uvlinesize, 8);
3980 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)
3981 +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)
3982 +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);
3985 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)
3986 +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)
3987 +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);
3990 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
3991 MpegEncContext *s= arg;
3995 s->me.dia_size= s->avctx->pre_dia_size;
3996 s->first_slice_line=1;
3997 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
3998 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
3999 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4001 s->first_slice_line=0;
4009 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4010 MpegEncContext *s= arg;
4012 s->me.dia_size= s->avctx->dia_size;
4013 s->first_slice_line=1;
4014 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4015 s->mb_x=0; //for block init below
4016 ff_init_block_index(s);
4017 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4018 s->block_index[0]+=2;
4019 s->block_index[1]+=2;
4020 s->block_index[2]+=2;
4021 s->block_index[3]+=2;
4023 /* compute motion vector & mb_type and store in context */
4024 if(s->pict_type==B_TYPE)
4025 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4027 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4029 s->first_slice_line=0;
4034 static int mb_var_thread(AVCodecContext *c, void *arg){
4035 MpegEncContext *s= arg;
4038 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4039 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4042 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4044 int sum = s->dsp.pix_sum(pix, s->linesize);
4046 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4048 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4049 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4050 s->me.mb_var_sum_temp += varc;
4056 static void write_slice_end(MpegEncContext *s){
4057 if(s->codec_id==CODEC_ID_MPEG4){
4058 if(s->partitioned_frame){
4059 ff_mpeg4_merge_partitions(s);
4062 ff_mpeg4_stuffing(&s->pb);
4063 }else if(s->out_format == FMT_MJPEG){
4064 ff_mjpeg_stuffing(&s->pb);
4067 align_put_bits(&s->pb);
4068 flush_put_bits(&s->pb);
4071 static int encode_thread(AVCodecContext *c, void *arg){
4072 MpegEncContext *s= arg;
4073 int mb_x, mb_y, pdif = 0;
4075 MpegEncContext best_s, backup_s;
4076 uint8_t bit_buf[2][3000];
4077 uint8_t bit_buf2[2][3000];
4078 uint8_t bit_buf_tex[2][3000];
4079 PutBitContext pb[2], pb2[2], tex_pb[2];
4080 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4083 init_put_bits(&pb [i], bit_buf [i], 3000);
4084 init_put_bits(&pb2 [i], bit_buf2 [i], 3000);
4085 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000);
4088 s->last_bits= put_bits_count(&s->pb);
4099 /* init last dc values */
4100 /* note: quant matrix value (8) is implied here */
4101 s->last_dc[i] = 128 << s->intra_dc_precision;
4103 s->current_picture_ptr->error[i] = 0;
4106 memset(s->last_mv, 0, sizeof(s->last_mv));
4111 switch(s->codec_id){
4113 case CODEC_ID_H263P:
4115 s->gob_index = ff_h263_get_gob_height(s);
4117 case CODEC_ID_MPEG4:
4118 if(s->partitioned_frame)
4119 ff_mpeg4_init_partitions(s);
4126 s->first_slice_line = 1;
4127 s->ptr_lastgob = s->pb.buf;
4128 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4129 // printf("row %d at %X\n", s->mb_y, (int)s);
4133 ff_set_qscale(s, s->qscale);
4134 ff_init_block_index(s);
4136 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4137 const int xy= mb_y*s->mb_stride + mb_x;
4138 int mb_type= s->mb_type[xy];
4144 ff_update_block_index(s);
4146 /* write gob / video packet header */
4149 int current_packet_size, is_gob_start;
4151 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4153 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4155 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4157 switch(s->codec_id){
4159 case CODEC_ID_H263P:
4160 if(!s->h263_slice_structured)
4161 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4163 case CODEC_ID_MPEG2VIDEO:
4164 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4165 case CODEC_ID_MPEG1VIDEO:
4166 if(s->mb_skip_run) is_gob_start=0;
4171 if(s->start_mb_y != mb_y || mb_x!=0){
4174 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4175 ff_mpeg4_init_partitions(s);
4179 assert((put_bits_count(&s->pb)&7) == 0);
4180 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4182 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4183 int r= put_bits_count(&s->pb)/8 + s->picture_number + s->codec_id + s->mb_x + s->mb_y;
4184 int d= 100 / s->avctx->error_rate;
4186 current_packet_size=0;
4187 #ifndef ALT_BITSTREAM_WRITER
4188 s->pb.buf_ptr= s->ptr_lastgob;
4190 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4194 if (s->avctx->rtp_callback)
4195 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, 0);
4197 switch(s->codec_id){
4198 case CODEC_ID_MPEG4:
4199 ff_mpeg4_encode_video_packet_header(s);
4200 ff_mpeg4_clean_buffers(s);
4202 case CODEC_ID_MPEG1VIDEO:
4203 case CODEC_ID_MPEG2VIDEO:
4204 ff_mpeg1_encode_slice_header(s);
4205 ff_mpeg1_clean_buffers(s);
4208 case CODEC_ID_H263P:
4209 h263_encode_gob_header(s, mb_y);
4213 if(s->flags&CODEC_FLAG_PASS1){
4214 int bits= put_bits_count(&s->pb);
4215 s->misc_bits+= bits - s->last_bits;
4219 s->ptr_lastgob += current_packet_size;
4220 s->first_slice_line=1;
4221 s->resync_mb_x=mb_x;
4222 s->resync_mb_y=mb_y;
4227 if( (s->resync_mb_x == s->mb_x)
4228 && s->resync_mb_y+1 == s->mb_y){
4229 s->first_slice_line=0;
4233 s->dquant=0; //only for QP_RD
4235 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible
4237 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4239 copy_context_before_encode(&backup_s, s, -1);
4241 best_s.data_partitioning= s->data_partitioning;
4242 best_s.partitioned_frame= s->partitioned_frame;
4243 if(s->data_partitioning){
4244 backup_s.pb2= s->pb2;
4245 backup_s.tex_pb= s->tex_pb;
4248 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4249 s->mv_dir = MV_DIR_FORWARD;
4250 s->mv_type = MV_TYPE_16X16;
4252 s->mv[0][0][0] = s->p_mv_table[xy][0];
4253 s->mv[0][0][1] = s->p_mv_table[xy][1];
4254 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4255 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4257 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4258 s->mv_dir = MV_DIR_FORWARD;
4259 s->mv_type = MV_TYPE_FIELD;
4262 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4263 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4264 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4266 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4267 &dmin, &next_block, 0, 0);
4269 if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4270 s->mv_dir = MV_DIR_FORWARD;
4271 s->mv_type = MV_TYPE_16X16;
4275 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb,
4276 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4278 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4279 s->mv_dir = MV_DIR_FORWARD;
4280 s->mv_type = MV_TYPE_8X8;
4283 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4284 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4286 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4287 &dmin, &next_block, 0, 0);
4289 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4290 s->mv_dir = MV_DIR_FORWARD;
4291 s->mv_type = MV_TYPE_16X16;
4293 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4294 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4295 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4296 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4298 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4299 s->mv_dir = MV_DIR_BACKWARD;
4300 s->mv_type = MV_TYPE_16X16;
4302 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4303 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4304 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4305 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4307 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4308 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4309 s->mv_type = MV_TYPE_16X16;
4311 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4312 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4313 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4314 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4315 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4316 &dmin, &next_block, 0, 0);
4318 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4319 int mx= s->b_direct_mv_table[xy][0];
4320 int my= s->b_direct_mv_table[xy][1];
4322 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4325 ff_mpeg4_set_direct_mv(s, mx, my);
4327 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4328 &dmin, &next_block, mx, my);
4330 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4331 s->mv_dir = MV_DIR_FORWARD;
4332 s->mv_type = MV_TYPE_FIELD;
4335 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4336 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4337 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4339 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4340 &dmin, &next_block, 0, 0);
4342 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4343 s->mv_dir = MV_DIR_BACKWARD;
4344 s->mv_type = MV_TYPE_FIELD;
4347 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4348 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4349 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4351 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4352 &dmin, &next_block, 0, 0);
4354 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4355 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4356 s->mv_type = MV_TYPE_FIELD;
4358 for(dir=0; dir<2; dir++){
4360 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4361 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4362 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4365 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4366 &dmin, &next_block, 0, 0);
4368 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4370 s->mv_type = MV_TYPE_16X16;
4374 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4375 &dmin, &next_block, 0, 0);
4376 if(s->h263_pred || s->h263_aic){
4378 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4380 ff_clean_intra_table_entries(s); //old mode?
4384 if(s->flags & CODEC_FLAG_QP_RD){
4385 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4386 const int last_qp= backup_s.qscale;
4387 int dquant, dir, qp, dc[6];
4389 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4391 assert(backup_s.dquant == 0);
4394 s->mv_dir= best_s.mv_dir;
4395 s->mv_type = MV_TYPE_16X16;
4396 s->mb_intra= best_s.mb_intra;
4397 s->mv[0][0][0] = best_s.mv[0][0][0];
4398 s->mv[0][0][1] = best_s.mv[0][0][1];
4399 s->mv[1][0][0] = best_s.mv[1][0][0];
4400 s->mv[1][0][1] = best_s.mv[1][0][1];
4402 dir= s->pict_type == B_TYPE ? 2 : 1;
4403 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4404 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4405 qp= last_qp + dquant;
4406 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4408 backup_s.dquant= dquant;
4411 dc[i]= s->dc_val[0][ s->block_index[i] ];
4412 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4416 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4417 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4418 if(best_s.qscale != qp){
4421 s->dc_val[0][ s->block_index[i] ]= dc[i];
4422 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4425 if(dir > 0 && dquant==dir){
4433 s->current_picture.qscale_table[xy]= qp;
4437 copy_context_after_encode(s, &best_s, -1);
4439 pb_bits_count= put_bits_count(&s->pb);
4440 flush_put_bits(&s->pb);
4441 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
4444 if(s->data_partitioning){
4445 pb2_bits_count= put_bits_count(&s->pb2);
4446 flush_put_bits(&s->pb2);
4447 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
4448 s->pb2= backup_s.pb2;
4450 tex_pb_bits_count= put_bits_count(&s->tex_pb);
4451 flush_put_bits(&s->tex_pb);
4452 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
4453 s->tex_pb= backup_s.tex_pb;
4455 s->last_bits= put_bits_count(&s->pb);
4458 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4459 ff_h263_update_motion_val(s);
4462 if(next_block==0){ //FIXME 16 vs linesize16
4463 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
4464 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
4465 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
4468 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
4469 MPV_decode_mb(s, s->block);
4471 int motion_x, motion_y;
4472 s->mv_type=MV_TYPE_16X16;
4473 // only one MB-Type possible
4476 case CANDIDATE_MB_TYPE_INTRA:
4479 motion_x= s->mv[0][0][0] = 0;
4480 motion_y= s->mv[0][0][1] = 0;
4482 case CANDIDATE_MB_TYPE_INTER:
4483 s->mv_dir = MV_DIR_FORWARD;
4485 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
4486 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
4488 case CANDIDATE_MB_TYPE_INTER_I:
4489 s->mv_dir = MV_DIR_FORWARD;
4490 s->mv_type = MV_TYPE_FIELD;
4493 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4494 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4495 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4497 motion_x = motion_y = 0;
4499 case CANDIDATE_MB_TYPE_INTER4V:
4500 s->mv_dir = MV_DIR_FORWARD;
4501 s->mv_type = MV_TYPE_8X8;
4504 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4505 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4507 motion_x= motion_y= 0;
4509 case CANDIDATE_MB_TYPE_DIRECT:
4510 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4512 motion_x=s->b_direct_mv_table[xy][0];
4513 motion_y=s->b_direct_mv_table[xy][1];
4515 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
4518 case CANDIDATE_MB_TYPE_BIDIR:
4519 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4523 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4524 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4525 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4526 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4528 case CANDIDATE_MB_TYPE_BACKWARD:
4529 s->mv_dir = MV_DIR_BACKWARD;
4531 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4532 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4534 case CANDIDATE_MB_TYPE_FORWARD:
4535 s->mv_dir = MV_DIR_FORWARD;
4537 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4538 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4539 // printf(" %d %d ", motion_x, motion_y);
4541 case CANDIDATE_MB_TYPE_FORWARD_I:
4542 s->mv_dir = MV_DIR_FORWARD;
4543 s->mv_type = MV_TYPE_FIELD;
4546 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4547 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4548 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4550 motion_x=motion_y=0;
4552 case CANDIDATE_MB_TYPE_BACKWARD_I:
4553 s->mv_dir = MV_DIR_BACKWARD;
4554 s->mv_type = MV_TYPE_FIELD;
4557 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4558 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4559 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4561 motion_x=motion_y=0;
4563 case CANDIDATE_MB_TYPE_BIDIR_I:
4564 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4565 s->mv_type = MV_TYPE_FIELD;
4567 for(dir=0; dir<2; dir++){
4569 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4570 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4571 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4574 motion_x=motion_y=0;
4577 motion_x=motion_y=0; //gcc warning fix
4578 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
4581 encode_mb(s, motion_x, motion_y);
4583 // RAL: Update last macrobloc type
4584 s->last_mv_dir = s->mv_dir;
4587 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4588 ff_h263_update_motion_val(s);
4591 MPV_decode_mb(s, s->block);
4594 /* clean the MV table in IPS frames for direct mode in B frames */
4595 if(s->mb_intra /* && I,P,S_TYPE */){
4596 s->p_mv_table[xy][0]=0;
4597 s->p_mv_table[xy][1]=0;
4600 if(s->flags&CODEC_FLAG_PSNR){
4604 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4605 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4607 s->current_picture_ptr->error[0] += sse(
4608 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
4609 s->dest[0], w, h, s->linesize);
4610 s->current_picture_ptr->error[1] += sse(
4611 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4612 s->dest[1], w>>1, h>>1, s->uvlinesize);
4613 s->current_picture_ptr->error[2] += sse(
4614 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4615 s->dest[2], w>>1, h>>1, s->uvlinesize);
4618 ff_h263_loop_filter(s);
4619 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
4624 //not beautifull here but we must write it before flushing so it has to be here
4625 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
4626 msmpeg4_encode_ext_header(s);
4631 /* Send the last GOB if RTP */
4632 if (s->avctx->rtp_callback) {
4633 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
4634 /* Call the RTP callback to send the last GOB */
4636 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, 0);
4642 #define MERGE(field) dst->field += src->field; src->field=0
4643 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
4644 MERGE(me.scene_change_score);
4645 MERGE(me.mc_mb_var_sum_temp);
4646 MERGE(me.mb_var_sum_temp);
4649 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
4652 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
4653 MERGE(dct_count[1]);
4663 MERGE(padding_bug_score);
4665 if(dst->avctx->noise_reduction){
4666 for(i=0; i<64; i++){
4667 MERGE(dct_error_sum[0][i]);
4668 MERGE(dct_error_sum[1][i]);
4672 assert(put_bits_count(&src->pb) % 8 ==0);
4673 assert(put_bits_count(&dst->pb) % 8 ==0);
4674 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
4675 flush_put_bits(&dst->pb);
4678 static void encode_picture(MpegEncContext *s, int picture_number)
4683 s->picture_number = picture_number;
4685 /* Reset the average MB variance */
4686 s->me.mb_var_sum_temp =
4687 s->me.mc_mb_var_sum_temp = 0;
4690 /* we need to initialize some time vars before we can encode b-frames */
4691 // RAL: Condition added for MPEG1VIDEO
4692 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
4693 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
4696 s->me.scene_change_score=0;
4698 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
4700 if(s->pict_type==I_TYPE){
4701 if(s->msmpeg4_version >= 3) s->no_rounding=1;
4702 else s->no_rounding=0;
4703 }else if(s->pict_type!=B_TYPE){
4704 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
4705 s->no_rounding ^= 1;
4708 s->mb_intra=0; //for the rate distoration & bit compare functions
4709 for(i=1; i<s->avctx->thread_count; i++){
4710 ff_update_duplicate_context(s->thread_context[i], s);
4715 /* Estimate motion for every MB */
4716 if(s->pict_type != I_TYPE){
4717 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
4718 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
4719 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4723 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4724 }else /* if(s->pict_type == I_TYPE) */{
4726 for(i=0; i<s->mb_stride*s->mb_height; i++)
4727 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4729 if(!s->fixed_qscale){
4730 /* finding spatial complexity for I-frame rate control */
4731 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4734 for(i=1; i<s->avctx->thread_count; i++){
4735 merge_context_after_me(s, s->thread_context[i]);
4737 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
4738 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
4741 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
4742 s->pict_type= I_TYPE;
4743 for(i=0; i<s->mb_stride*s->mb_height; i++)
4744 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4745 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
4749 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
4750 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
4752 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4754 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
4755 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
4756 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
4759 ff_fix_long_p_mvs(s);
4760 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
4761 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4765 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
4766 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
4771 if(s->pict_type==B_TYPE){
4774 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
4775 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4776 s->f_code = FFMAX(a, b);
4778 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
4779 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
4780 s->b_code = FFMAX(a, b);
4782 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
4783 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
4784 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4785 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
4786 if(s->flags & CODEC_FLAG_INTERLACED_ME){
4788 for(dir=0; dir<2; dir++){
4791 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
4792 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
4793 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
4794 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
4802 if (!s->fixed_qscale)
4803 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
4805 if(s->adaptive_quant){
4807 switch(s->codec_id){
4808 case CODEC_ID_MPEG4:
4809 ff_clean_mpeg4_qscales(s);
4812 case CODEC_ID_H263P:
4814 ff_clean_h263_qscales(s);
4819 s->lambda= s->lambda_table[0];
4822 s->lambda= s->current_picture.quality;
4823 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
4826 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
4827 s->qscale= 3; //reduce cliping problems
4829 if (s->out_format == FMT_MJPEG) {
4830 /* for mjpeg, we do include qscale in the matrix */
4831 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
4833 int j= s->dsp.idct_permutation[i];
4835 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
4837 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
4838 s->intra_matrix, s->intra_quant_bias, 8, 8);
4842 //FIXME var duplication
4843 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
4844 s->current_picture.pict_type= s->pict_type;
4846 if(s->current_picture.key_frame)
4847 s->picture_in_gop_number=0;
4849 s->last_bits= put_bits_count(&s->pb);
4850 switch(s->out_format) {
4852 mjpeg_picture_header(s);
4856 if (s->codec_id == CODEC_ID_WMV2)
4857 ff_wmv2_encode_picture_header(s, picture_number);
4858 else if (s->h263_msmpeg4)
4859 msmpeg4_encode_picture_header(s, picture_number);
4860 else if (s->h263_pred)
4861 mpeg4_encode_picture_header(s, picture_number);
4862 else if (s->codec_id == CODEC_ID_RV10)
4863 rv10_encode_picture_header(s, picture_number);
4864 else if (s->codec_id == CODEC_ID_FLV1)
4865 ff_flv_encode_picture_header(s, picture_number);
4867 h263_encode_picture_header(s, picture_number);
4871 mpeg1_encode_picture_header(s, picture_number);
4878 bits= put_bits_count(&s->pb);
4879 s->header_bits= bits - s->last_bits;
4881 for(i=1; i<s->avctx->thread_count; i++){
4882 update_duplicate_context_after_me(s->thread_context[i], s);
4884 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4885 for(i=1; i<s->avctx->thread_count; i++){
4886 merge_context_after_encode(s, s->thread_context[i]);
4891 #endif //CONFIG_ENCODERS
4893 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
4894 const int intra= s->mb_intra;
4897 s->dct_count[intra]++;
4899 for(i=0; i<64; i++){
4900 int level= block[i];
4904 s->dct_error_sum[intra][i] += level;
4905 level -= s->dct_offset[intra][i];
4906 if(level<0) level=0;
4908 s->dct_error_sum[intra][i] -= level;
4909 level += s->dct_offset[intra][i];
4910 if(level>0) level=0;
4917 #ifdef CONFIG_ENCODERS
4919 static int dct_quantize_trellis_c(MpegEncContext *s,
4920 DCTELEM *block, int n,
4921 int qscale, int *overflow){
4923 const uint8_t *scantable= s->intra_scantable.scantable;
4924 const uint8_t *perm_scantable= s->intra_scantable.permutated;
4926 unsigned int threshold1, threshold2;
4938 int coeff_count[64];
4939 int qmul, qadd, start_i, last_non_zero, i, dc;
4940 const int esc_length= s->ac_esc_length;
4942 uint8_t * last_length;
4943 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
4945 s->dsp.fdct (block);
4947 if(s->dct_error_sum)
4948 s->denoise_dct(s, block);
4950 qadd= ((qscale-1)|1)*8;
4961 /* For AIC we skip quant/dequant of INTRADC */
4966 /* note: block[0] is assumed to be positive */
4967 block[0] = (block[0] + (q >> 1)) / q;
4970 qmat = s->q_intra_matrix[qscale];
4971 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
4972 bias= 1<<(QMAT_SHIFT-1);
4973 length = s->intra_ac_vlc_length;
4974 last_length= s->intra_ac_vlc_last_length;
4978 qmat = s->q_inter_matrix[qscale];
4979 length = s->inter_ac_vlc_length;
4980 last_length= s->inter_ac_vlc_last_length;
4984 threshold1= (1<<QMAT_SHIFT) - bias - 1;
4985 threshold2= (threshold1<<1);
4987 for(i=63; i>=start_i; i--) {
4988 const int j = scantable[i];
4989 int level = block[j] * qmat[j];
4991 if(((unsigned)(level+threshold1))>threshold2){
4997 for(i=start_i; i<=last_non_zero; i++) {
4998 const int j = scantable[i];
4999 int level = block[j] * qmat[j];
5001 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5002 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5003 if(((unsigned)(level+threshold1))>threshold2){
5005 level= (bias + level)>>QMAT_SHIFT;
5007 coeff[1][i]= level-1;
5008 // coeff[2][k]= level-2;
5010 level= (bias - level)>>QMAT_SHIFT;
5011 coeff[0][i]= -level;
5012 coeff[1][i]= -level+1;
5013 // coeff[2][k]= -level+2;
5015 coeff_count[i]= FFMIN(level, 2);
5016 assert(coeff_count[i]);
5019 coeff[0][i]= (level>>31)|1;
5024 *overflow= s->max_qcoeff < max; //overflow might have happend
5026 if(last_non_zero < start_i){
5027 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5028 return last_non_zero;
5031 score_tab[start_i]= 0;
5032 survivor[0]= start_i;
5035 for(i=start_i; i<=last_non_zero; i++){
5037 const int dct_coeff= ABS(block[ scantable[i] ]);
5038 const int zero_distoration= dct_coeff*dct_coeff;
5039 int best_score=256*256*256*120;
5040 for(level_index=0; level_index < coeff_count[i]; level_index++){
5042 int level= coeff[level_index][i];
5043 const int alevel= ABS(level);
5048 if(s->out_format == FMT_H263){
5049 unquant_coeff= alevel*qmul + qadd;
5051 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5053 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5054 unquant_coeff = (unquant_coeff - 1) | 1;
5056 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5057 unquant_coeff = (unquant_coeff - 1) | 1;
5062 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5064 if((level&(~127)) == 0){
5065 for(j=survivor_count-1; j>=0; j--){
5066 int run= i - survivor[j];
5067 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5068 score += score_tab[i-run];
5070 if(score < best_score){
5073 level_tab[i+1]= level-64;
5077 if(s->out_format == FMT_H263){
5078 for(j=survivor_count-1; j>=0; j--){
5079 int run= i - survivor[j];
5080 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5081 score += score_tab[i-run];
5082 if(score < last_score){
5085 last_level= level-64;
5091 distoration += esc_length*lambda;
5092 for(j=survivor_count-1; j>=0; j--){
5093 int run= i - survivor[j];
5094 int score= distoration + score_tab[i-run];
5096 if(score < best_score){
5099 level_tab[i+1]= level-64;
5103 if(s->out_format == FMT_H263){
5104 for(j=survivor_count-1; j>=0; j--){
5105 int run= i - survivor[j];
5106 int score= distoration + score_tab[i-run];
5107 if(score < last_score){
5110 last_level= level-64;
5118 score_tab[i+1]= best_score;
5120 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5121 if(last_non_zero <= 27){
5122 for(; survivor_count; survivor_count--){
5123 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5127 for(; survivor_count; survivor_count--){
5128 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5133 survivor[ survivor_count++ ]= i+1;
5136 if(s->out_format != FMT_H263){
5137 last_score= 256*256*256*120;
5138 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5139 int score= score_tab[i];
5140 if(i) score += lambda*2; //FIXME exacter?
5142 if(score < last_score){
5145 last_level= level_tab[i];
5146 last_run= run_tab[i];
5151 s->coded_score[n] = last_score;
5154 last_non_zero= last_i - 1;
5155 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5157 if(last_non_zero < start_i)
5158 return last_non_zero;
5160 if(last_non_zero == 0 && start_i == 0){
5162 int best_score= dc * dc;
5164 for(i=0; i<coeff_count[0]; i++){
5165 int level= coeff[i][0];
5166 int alevel= ABS(level);
5167 int unquant_coeff, score, distortion;
5169 if(s->out_format == FMT_H263){
5170 unquant_coeff= (alevel*qmul + qadd)>>3;
5172 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5173 unquant_coeff = (unquant_coeff - 1) | 1;
5175 unquant_coeff = (unquant_coeff + 4) >> 3;
5176 unquant_coeff<<= 3 + 3;
5178 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5180 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5181 else score= distortion + esc_length*lambda;
5183 if(score < best_score){
5185 best_level= level - 64;
5188 block[0]= best_level;
5189 s->coded_score[n] = best_score - dc*dc;
5190 if(best_level == 0) return -1;
5191 else return last_non_zero;
5197 block[ perm_scantable[last_non_zero] ]= last_level;
5200 for(; i>start_i; i -= run_tab[i] + 1){
5201 block[ perm_scantable[i-1] ]= level_tab[i];
5204 return last_non_zero;
5207 //#define REFINE_STATS 1
5208 static int16_t basis[64][64];
5210 static void build_basis(uint8_t *perm){
5217 double s= 0.25*(1<<BASIS_SHIFT);
5219 int perm_index= perm[index];
5220 if(i==0) s*= sqrt(0.5);
5221 if(j==0) s*= sqrt(0.5);
5222 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)));
5229 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5230 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5235 const uint8_t *scantable= s->intra_scantable.scantable;
5236 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5237 // unsigned int threshold1, threshold2;
5242 int qmul, qadd, start_i, last_non_zero, i, dc;
5244 uint8_t * last_length;
5246 int rle_index, run, q, sum;
5249 static int after_last=0;
5250 static int to_zero=0;
5251 static int from_zero=0;
5254 static int messed_sign=0;
5257 if(basis[0][0] == 0)
5258 build_basis(s->dsp.idct_permutation);
5269 /* For AIC we skip quant/dequant of INTRADC */
5273 q <<= RECON_SHIFT-3;
5274 /* note: block[0] is assumed to be positive */
5276 // block[0] = (block[0] + (q >> 1)) / q;
5278 qmat = s->q_intra_matrix[qscale];
5279 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5280 // bias= 1<<(QMAT_SHIFT-1);
5281 length = s->intra_ac_vlc_length;
5282 last_length= s->intra_ac_vlc_last_length;
5286 qmat = s->q_inter_matrix[qscale];
5287 length = s->inter_ac_vlc_length;
5288 last_length= s->inter_ac_vlc_last_length;
5290 last_non_zero = s->block_last_index[n];
5295 dc += (1<<(RECON_SHIFT-1));
5296 for(i=0; i<64; i++){
5297 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly insteadof copying to rem[]
5300 STOP_TIMER("memset rem[]")}
5303 for(i=0; i<64; i++){
5308 w= ABS(weight[i]) + qns*one;
5309 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5312 // w=weight[i] = (63*qns + (w/2)) / w;
5318 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5324 for(i=start_i; i<=last_non_zero; i++){
5325 int j= perm_scantable[i];
5326 const int level= block[j];
5330 if(level<0) coeff= qmul*level - qadd;
5331 else coeff= qmul*level + qadd;
5332 run_tab[rle_index++]=run;
5335 s->dsp.add_8x8basis(rem, basis[j], coeff);
5341 if(last_non_zero>0){
5342 STOP_TIMER("init rem[]")
5349 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5352 int run2, best_unquant_change=0, analyze_gradient;
5356 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5358 if(analyze_gradient){
5362 for(i=0; i<64; i++){
5365 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5368 STOP_TIMER("rem*w*w")}
5378 const int level= block[0];
5379 int change, old_coeff;
5381 assert(s->mb_intra);
5385 for(change=-1; change<=1; change+=2){
5386 int new_level= level + change;
5387 int score, new_coeff;
5389 new_coeff= q*new_level;
5390 if(new_coeff >= 2048 || new_coeff < 0)
5393 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5394 if(score<best_score){
5397 best_change= change;
5398 best_unquant_change= new_coeff - old_coeff;
5405 run2= run_tab[rle_index++];
5409 for(i=start_i; i<64; i++){
5410 int j= perm_scantable[i];
5411 const int level= block[j];
5412 int change, old_coeff;
5414 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
5418 if(level<0) old_coeff= qmul*level - qadd;
5419 else old_coeff= qmul*level + qadd;
5420 run2= run_tab[rle_index++]; //FIXME ! maybe after last
5424 assert(run2>=0 || i >= last_non_zero );
5427 for(change=-1; change<=1; change+=2){
5428 int new_level= level + change;
5429 int score, new_coeff, unquant_change;
5432 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
5436 if(new_level<0) new_coeff= qmul*new_level - qadd;
5437 else new_coeff= qmul*new_level + qadd;
5438 if(new_coeff >= 2048 || new_coeff <= -2048)
5440 //FIXME check for overflow
5443 if(level < 63 && level > -63){
5444 if(i < last_non_zero)
5445 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
5446 - length[UNI_AC_ENC_INDEX(run, level+64)];
5448 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
5449 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
5452 assert(ABS(new_level)==1);
5454 if(analyze_gradient){
5455 int g= d1[ scantable[i] ];
5456 if(g && (g^new_level) >= 0)
5460 if(i < last_non_zero){
5461 int next_i= i + run2 + 1;
5462 int next_level= block[ perm_scantable[next_i] ] + 64;
5464 if(next_level&(~127))
5467 if(next_i < last_non_zero)
5468 score += length[UNI_AC_ENC_INDEX(run, 65)]
5469 + length[UNI_AC_ENC_INDEX(run2, next_level)]
5470 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5472 score += length[UNI_AC_ENC_INDEX(run, 65)]
5473 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5474 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5476 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
5478 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5479 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5485 assert(ABS(level)==1);
5487 if(i < last_non_zero){
5488 int next_i= i + run2 + 1;
5489 int next_level= block[ perm_scantable[next_i] ] + 64;
5491 if(next_level&(~127))
5494 if(next_i < last_non_zero)
5495 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5496 - length[UNI_AC_ENC_INDEX(run2, next_level)]
5497 - length[UNI_AC_ENC_INDEX(run, 65)];
5499 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5500 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5501 - length[UNI_AC_ENC_INDEX(run, 65)];
5503 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
5505 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5506 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5513 unquant_change= new_coeff - old_coeff;
5514 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
5516 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
5517 if(score<best_score){
5520 best_change= change;
5521 best_unquant_change= unquant_change;
5525 prev_level= level + 64;
5526 if(prev_level&(~127))
5535 STOP_TIMER("iterative step")}
5539 int j= perm_scantable[ best_coeff ];
5541 block[j] += best_change;
5543 if(best_coeff > last_non_zero){
5544 last_non_zero= best_coeff;
5552 if(block[j] - best_change){
5553 if(ABS(block[j]) > ABS(block[j] - best_change)){
5565 for(; last_non_zero>=start_i; last_non_zero--){
5566 if(block[perm_scantable[last_non_zero]])
5572 if(256*256*256*64 % count == 0){
5573 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);
5578 for(i=start_i; i<=last_non_zero; i++){
5579 int j= perm_scantable[i];
5580 const int level= block[j];
5583 run_tab[rle_index++]=run;
5590 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
5596 if(last_non_zero>0){
5597 STOP_TIMER("iterative search")
5602 return last_non_zero;
5605 static int dct_quantize_c(MpegEncContext *s,
5606 DCTELEM *block, int n,
5607 int qscale, int *overflow)
5609 int i, j, level, last_non_zero, q, start_i;
5611 const uint8_t *scantable= s->intra_scantable.scantable;
5614 unsigned int threshold1, threshold2;
5616 s->dsp.fdct (block);
5618 if(s->dct_error_sum)
5619 s->denoise_dct(s, block);
5629 /* For AIC we skip quant/dequant of INTRADC */
5632 /* note: block[0] is assumed to be positive */
5633 block[0] = (block[0] + (q >> 1)) / q;
5636 qmat = s->q_intra_matrix[qscale];
5637 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5641 qmat = s->q_inter_matrix[qscale];
5642 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5644 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5645 threshold2= (threshold1<<1);
5646 for(i=63;i>=start_i;i--) {
5648 level = block[j] * qmat[j];
5650 if(((unsigned)(level+threshold1))>threshold2){
5657 for(i=start_i; i<=last_non_zero; i++) {
5659 level = block[j] * qmat[j];
5661 // if( bias+level >= (1<<QMAT_SHIFT)
5662 // || bias-level >= (1<<QMAT_SHIFT)){
5663 if(((unsigned)(level+threshold1))>threshold2){
5665 level= (bias + level)>>QMAT_SHIFT;
5668 level= (bias - level)>>QMAT_SHIFT;
5676 *overflow= s->max_qcoeff < max; //overflow might have happend
5678 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
5679 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
5680 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
5682 return last_non_zero;
5685 #endif //CONFIG_ENCODERS
5687 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
5688 DCTELEM *block, int n, int qscale)
5690 int i, level, nCoeffs;
5691 const uint16_t *quant_matrix;
5693 nCoeffs= s->block_last_index[n];
5696 block[0] = block[0] * s->y_dc_scale;
5698 block[0] = block[0] * s->c_dc_scale;
5699 /* XXX: only mpeg1 */
5700 quant_matrix = s->intra_matrix;
5701 for(i=1;i<=nCoeffs;i++) {
5702 int j= s->intra_scantable.permutated[i];
5707 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5708 level = (level - 1) | 1;
5711 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5712 level = (level - 1) | 1;
5719 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
5720 DCTELEM *block, int n, int qscale)
5722 int i, level, nCoeffs;
5723 const uint16_t *quant_matrix;
5725 nCoeffs= s->block_last_index[n];
5727 quant_matrix = s->inter_matrix;
5728 for(i=0; i<=nCoeffs; i++) {
5729 int j= s->intra_scantable.permutated[i];
5734 level = (((level << 1) + 1) * qscale *
5735 ((int) (quant_matrix[j]))) >> 4;
5736 level = (level - 1) | 1;
5739 level = (((level << 1) + 1) * qscale *
5740 ((int) (quant_matrix[j]))) >> 4;
5741 level = (level - 1) | 1;
5748 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
5749 DCTELEM *block, int n, int qscale)
5751 int i, level, nCoeffs;
5752 const uint16_t *quant_matrix;
5754 if(s->alternate_scan) nCoeffs= 63;
5755 else nCoeffs= s->block_last_index[n];
5758 block[0] = block[0] * s->y_dc_scale;
5760 block[0] = block[0] * s->c_dc_scale;
5761 quant_matrix = s->intra_matrix;
5762 for(i=1;i<=nCoeffs;i++) {
5763 int j= s->intra_scantable.permutated[i];
5768 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5771 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5778 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
5779 DCTELEM *block, int n, int qscale)
5781 int i, level, nCoeffs;
5782 const uint16_t *quant_matrix;
5785 if(s->alternate_scan) nCoeffs= 63;
5786 else nCoeffs= s->block_last_index[n];
5788 quant_matrix = s->inter_matrix;
5789 for(i=0; i<=nCoeffs; i++) {
5790 int j= s->intra_scantable.permutated[i];
5795 level = (((level << 1) + 1) * qscale *
5796 ((int) (quant_matrix[j]))) >> 4;
5799 level = (((level << 1) + 1) * qscale *
5800 ((int) (quant_matrix[j]))) >> 4;
5809 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
5810 DCTELEM *block, int n, int qscale)
5812 int i, level, qmul, qadd;
5815 assert(s->block_last_index[n]>=0);
5821 block[0] = block[0] * s->y_dc_scale;
5823 block[0] = block[0] * s->c_dc_scale;
5824 qadd = (qscale - 1) | 1;
5831 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5833 for(i=1; i<=nCoeffs; i++) {
5837 level = level * qmul - qadd;
5839 level = level * qmul + qadd;
5846 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
5847 DCTELEM *block, int n, int qscale)
5849 int i, level, qmul, qadd;
5852 assert(s->block_last_index[n]>=0);
5854 qadd = (qscale - 1) | 1;
5857 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5859 for(i=0; i<=nCoeffs; i++) {
5863 level = level * qmul - qadd;
5865 level = level * qmul + qadd;
5872 static void dct_unquantize_h261_intra_c(MpegEncContext *s,
5873 DCTELEM *block, int n, int qscale)
5878 assert(s->block_last_index[n]>=0);
5881 block[0] = block[0] * s->y_dc_scale;
5883 block[0] = block[0] * s->c_dc_scale;
5884 even = (qscale & 1)^1;
5885 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5887 for(i=1; i<=nCoeffs; i++){
5891 level = qscale * ((level << 1) - 1) + even;
5893 level = qscale * ((level << 1) + 1) - even;
5900 static void dct_unquantize_h261_inter_c(MpegEncContext *s,
5901 DCTELEM *block, int n, int qscale)
5906 assert(s->block_last_index[n]>=0);
5908 even = (qscale & 1)^1;
5910 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
5912 for(i=0; i<=nCoeffs; i++){
5916 level = qscale * ((level << 1) - 1) + even;
5918 level = qscale * ((level << 1) + 1) - even;
5925 static const AVOption mpeg4_options[] =
5927 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
5928 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
5929 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
5930 bit_rate_tolerance, 4, 240000000, 8000),
5931 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
5932 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
5933 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
5934 rc_eq, "tex^qComp,option1,options2", 0),
5935 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
5936 rc_min_rate, 4, 24000000, 0),
5937 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
5938 rc_max_rate, 4, 24000000, 0),
5939 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
5940 rc_buffer_aggressivity, 4, 24000000, 0),
5941 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
5942 rc_initial_cplx, 0., 9999999., 0),
5943 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
5944 i_quant_factor, 0., 0., 0),
5945 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
5946 i_quant_factor, -999999., 999999., 0),
5947 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
5948 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
5949 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
5950 lumi_masking, 0., 999999., 0),
5951 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
5952 temporal_cplx_masking, 0., 999999., 0),
5953 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
5954 spatial_cplx_masking, 0., 999999., 0),
5955 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
5956 p_masking, 0., 999999., 0),
5957 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
5958 dark_masking, 0., 999999., 0),
5959 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
5960 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
5962 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
5964 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
5967 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
5968 me_cmp, 0, 24000000, 0),
5969 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
5970 me_sub_cmp, 0, 24000000, 0),
5973 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
5974 dia_size, 0, 24000000, 0),
5975 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
5976 last_predictor_count, 0, 24000000, 0),
5978 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
5979 pre_me, 0, 24000000, 0),
5980 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
5981 me_pre_cmp, 0, 24000000, 0),
5983 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
5984 me_range, 0, 24000000, 0),
5985 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
5986 pre_dia_size, 0, 24000000, 0),
5987 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
5988 me_subpel_quality, 0, 24000000, 0),
5989 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
5990 me_range, 0, 24000000, 0),
5991 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
5992 flags, CODEC_FLAG_PSNR, 0),
5993 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
5995 AVOPTION_SUB(avoptions_common),
5999 #ifdef CONFIG_ENCODERS
6001 AVCodec h263_encoder = {
6005 sizeof(MpegEncContext),
6011 AVCodec h263p_encoder = {
6015 sizeof(MpegEncContext),
6021 AVCodec flv_encoder = {
6025 sizeof(MpegEncContext),
6031 AVCodec rv10_encoder = {
6035 sizeof(MpegEncContext),
6041 AVCodec mpeg4_encoder = {
6045 sizeof(MpegEncContext),
6049 .options = mpeg4_options,
6050 .capabilities= CODEC_CAP_DELAY,
6053 AVCodec msmpeg4v1_encoder = {
6057 sizeof(MpegEncContext),
6061 .options = mpeg4_options,
6064 AVCodec msmpeg4v2_encoder = {
6068 sizeof(MpegEncContext),
6072 .options = mpeg4_options,
6075 AVCodec msmpeg4v3_encoder = {
6079 sizeof(MpegEncContext),
6083 .options = mpeg4_options,
6086 AVCodec wmv1_encoder = {
6090 sizeof(MpegEncContext),
6094 .options = mpeg4_options,
6099 AVCodec mjpeg_encoder = {
6103 sizeof(MpegEncContext),
6109 #endif //CONFIG_ENCODERS