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;
863 s->linesize= s->uvlinesize= 0;
866 av_freep(&s->visualization_buffer[i]);
868 avcodec_default_free_buffers(s->avctx);
871 #ifdef CONFIG_ENCODERS
873 /* init video encoder */
874 int MPV_encode_init(AVCodecContext *avctx)
876 MpegEncContext *s = avctx->priv_data;
878 int chroma_h_shift, chroma_v_shift;
880 MPV_encode_defaults(s);
882 avctx->pix_fmt = PIX_FMT_YUV420P; // FIXME
884 s->bit_rate = avctx->bit_rate;
885 s->width = avctx->width;
886 s->height = avctx->height;
887 if(avctx->gop_size > 600){
888 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
891 s->gop_size = avctx->gop_size;
893 s->flags= avctx->flags;
894 s->flags2= avctx->flags2;
895 s->max_b_frames= avctx->max_b_frames;
896 s->codec_id= avctx->codec->id;
897 s->luma_elim_threshold = avctx->luma_elim_threshold;
898 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
899 s->strict_std_compliance= avctx->strict_std_compliance;
900 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
901 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
902 s->mpeg_quant= avctx->mpeg_quant;
903 s->rtp_mode= !!avctx->rtp_payload_size;
904 s->intra_dc_precision= avctx->intra_dc_precision;
905 s->user_specified_pts = AV_NOPTS_VALUE;
907 if (s->gop_size <= 1) {
914 s->me_method = avctx->me_method;
917 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
919 s->adaptive_quant= ( s->avctx->lumi_masking
920 || s->avctx->dark_masking
921 || s->avctx->temporal_cplx_masking
922 || s->avctx->spatial_cplx_masking
923 || s->avctx->p_masking
924 || (s->flags&CODEC_FLAG_QP_RD))
927 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
928 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
929 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
931 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
932 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
936 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
937 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isnt recommanded!\n");
940 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
941 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
945 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
946 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
950 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
951 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
952 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
954 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");
957 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
958 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
959 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
963 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
964 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decission\n");
968 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
969 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
973 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
974 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
978 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
979 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
983 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
984 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
988 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
989 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
990 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
994 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
995 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supporetd by codec\n");
999 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1000 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1004 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1005 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1009 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1010 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1014 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1015 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1016 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1017 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1021 if(s->avctx->thread_count > 1)
1024 i= ff_gcd(avctx->frame_rate, avctx->frame_rate_base);
1026 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1027 avctx->frame_rate /= i;
1028 avctx->frame_rate_base /= i;
1032 if(s->codec_id==CODEC_ID_MJPEG){
1033 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1034 s->inter_quant_bias= 0;
1035 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1036 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1037 s->inter_quant_bias= 0;
1039 s->intra_quant_bias=0;
1040 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1043 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1044 s->intra_quant_bias= avctx->intra_quant_bias;
1045 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1046 s->inter_quant_bias= avctx->inter_quant_bias;
1048 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1050 av_reduce(&s->time_increment_resolution, &dummy, s->avctx->frame_rate, s->avctx->frame_rate_base, (1<<16)-1);
1051 s->time_increment_bits = av_log2(s->time_increment_resolution - 1) + 1;
1053 switch(avctx->codec->id) {
1054 case CODEC_ID_MPEG1VIDEO:
1055 s->out_format = FMT_MPEG1;
1056 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1057 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1059 case CODEC_ID_MPEG2VIDEO:
1060 s->out_format = FMT_MPEG1;
1061 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1062 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1065 case CODEC_ID_LJPEG:
1066 case CODEC_ID_MJPEG:
1067 s->out_format = FMT_MJPEG;
1068 s->intra_only = 1; /* force intra only for jpeg */
1069 s->mjpeg_write_tables = 1; /* write all tables */
1070 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1071 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1072 s->mjpeg_vsample[1] = 1;
1073 s->mjpeg_vsample[2] = 1;
1074 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1075 s->mjpeg_hsample[1] = 1;
1076 s->mjpeg_hsample[2] = 1;
1077 if (mjpeg_init(s) < 0)
1084 if (h263_get_picture_format(s->width, s->height) == 7) {
1085 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
1088 s->out_format = FMT_H263;
1089 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1093 case CODEC_ID_H263P:
1094 s->out_format = FMT_H263;
1097 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1098 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1099 s->modified_quant= s->h263_aic;
1100 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1101 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1102 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1103 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1104 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1107 /* These are just to be sure */
1112 s->out_format = FMT_H263;
1113 s->h263_flv = 2; /* format = 1; 11-bit codes */
1114 s->unrestricted_mv = 1;
1115 s->rtp_mode=0; /* don't allow GOB */
1120 s->out_format = FMT_H263;
1124 case CODEC_ID_MPEG4:
1125 s->out_format = FMT_H263;
1127 s->unrestricted_mv = 1;
1128 s->low_delay= s->max_b_frames ? 0 : 1;
1129 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1131 case CODEC_ID_MSMPEG4V1:
1132 s->out_format = FMT_H263;
1133 s->h263_msmpeg4 = 1;
1135 s->unrestricted_mv = 1;
1136 s->msmpeg4_version= 1;
1140 case CODEC_ID_MSMPEG4V2:
1141 s->out_format = FMT_H263;
1142 s->h263_msmpeg4 = 1;
1144 s->unrestricted_mv = 1;
1145 s->msmpeg4_version= 2;
1149 case CODEC_ID_MSMPEG4V3:
1150 s->out_format = FMT_H263;
1151 s->h263_msmpeg4 = 1;
1153 s->unrestricted_mv = 1;
1154 s->msmpeg4_version= 3;
1155 s->flipflop_rounding=1;
1160 s->out_format = FMT_H263;
1161 s->h263_msmpeg4 = 1;
1163 s->unrestricted_mv = 1;
1164 s->msmpeg4_version= 4;
1165 s->flipflop_rounding=1;
1170 s->out_format = FMT_H263;
1171 s->h263_msmpeg4 = 1;
1173 s->unrestricted_mv = 1;
1174 s->msmpeg4_version= 5;
1175 s->flipflop_rounding=1;
1184 avctx->has_b_frames= !s->low_delay;
1189 if (MPV_common_init(s) < 0)
1192 if(s->modified_quant)
1193 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1194 s->progressive_frame=
1195 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1196 s->quant_precision=5;
1198 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1200 #ifdef CONFIG_ENCODERS
1202 if (s->out_format == FMT_H263)
1203 h263_encode_init(s);
1204 if(s->msmpeg4_version)
1205 ff_msmpeg4_encode_init(s);
1207 if (s->out_format == FMT_MPEG1)
1208 ff_mpeg1_encode_init(s);
1213 int j= s->dsp.idct_permutation[i];
1215 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1216 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1217 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1218 }else if(s->out_format == FMT_H263){
1219 s->intra_matrix[j] =
1220 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1224 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1225 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1227 if(s->avctx->intra_matrix)
1228 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1229 if(s->avctx->inter_matrix)
1230 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1233 /* precompute matrix */
1234 /* for mjpeg, we do include qscale in the matrix */
1235 if (s->out_format != FMT_MJPEG) {
1236 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1237 s->intra_matrix, s->intra_quant_bias, 1, 31);
1238 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1239 s->inter_matrix, s->inter_quant_bias, 1, 31);
1242 if(ff_rate_control_init(s) < 0)
1248 int MPV_encode_end(AVCodecContext *avctx)
1250 MpegEncContext *s = avctx->priv_data;
1256 ff_rate_control_uninit(s);
1259 if (s->out_format == FMT_MJPEG)
1262 av_freep(&avctx->extradata);
1267 #endif //CONFIG_ENCODERS
1269 void init_rl(RLTable *rl)
1271 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1272 uint8_t index_run[MAX_RUN+1];
1273 int last, run, level, start, end, i;
1275 /* compute max_level[], max_run[] and index_run[] */
1276 for(last=0;last<2;last++) {
1285 memset(max_level, 0, MAX_RUN + 1);
1286 memset(max_run, 0, MAX_LEVEL + 1);
1287 memset(index_run, rl->n, MAX_RUN + 1);
1288 for(i=start;i<end;i++) {
1289 run = rl->table_run[i];
1290 level = rl->table_level[i];
1291 if (index_run[run] == rl->n)
1293 if (level > max_level[run])
1294 max_level[run] = level;
1295 if (run > max_run[level])
1296 max_run[level] = run;
1298 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1299 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1300 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1301 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1302 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1303 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1307 /* draw the edges of width 'w' of an image of size width, height */
1308 //FIXME check that this is ok for mpeg4 interlaced
1309 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1311 uint8_t *ptr, *last_line;
1314 last_line = buf + (height - 1) * wrap;
1316 /* top and bottom */
1317 memcpy(buf - (i + 1) * wrap, buf, width);
1318 memcpy(last_line + (i + 1) * wrap, last_line, width);
1320 /* left and right */
1322 for(i=0;i<height;i++) {
1323 memset(ptr - w, ptr[0], w);
1324 memset(ptr + width, ptr[width-1], w);
1329 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1330 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1331 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1332 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1336 int ff_find_unused_picture(MpegEncContext *s, int shared){
1340 for(i=0; i<MAX_PICTURE_COUNT; i++){
1341 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1344 for(i=0; i<MAX_PICTURE_COUNT; i++){
1345 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1347 for(i=0; i<MAX_PICTURE_COUNT; i++){
1348 if(s->picture[i].data[0]==NULL) return i;
1356 static void update_noise_reduction(MpegEncContext *s){
1359 for(intra=0; intra<2; intra++){
1360 if(s->dct_count[intra] > (1<<16)){
1361 for(i=0; i<64; i++){
1362 s->dct_error_sum[intra][i] >>=1;
1364 s->dct_count[intra] >>= 1;
1367 for(i=0; i<64; i++){
1368 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);
1374 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1376 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1382 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1384 /* mark&release old frames */
1385 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1386 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1388 /* release forgotten pictures */
1389 /* if(mpeg124/h263) */
1391 for(i=0; i<MAX_PICTURE_COUNT; i++){
1392 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1393 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1394 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1401 /* release non refernce frames */
1402 for(i=0; i<MAX_PICTURE_COUNT; i++){
1403 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1404 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1408 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1409 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1411 i= ff_find_unused_picture(s, 0);
1412 pic= (AVFrame*)&s->picture[i];
1415 pic->reference= s->pict_type != B_TYPE && !s->dropable ? 3 : 0;
1417 pic->coded_picture_number= s->coded_picture_number++;
1419 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1422 s->current_picture_ptr= (Picture*)pic;
1423 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1424 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1427 s->current_picture_ptr->pict_type= s->pict_type;
1428 // if(s->flags && CODEC_FLAG_QSCALE)
1429 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1430 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1432 copy_picture(&s->current_picture, s->current_picture_ptr);
1434 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1435 if (s->pict_type != B_TYPE) {
1436 s->last_picture_ptr= s->next_picture_ptr;
1438 s->next_picture_ptr= s->current_picture_ptr;
1440 /* 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,
1441 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1442 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1443 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1444 s->pict_type, s->dropable);*/
1446 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1447 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1449 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1450 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1451 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1455 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1457 if(s->picture_structure!=PICT_FRAME){
1460 if(s->picture_structure == PICT_BOTTOM_FIELD){
1461 s->current_picture.data[i] += s->current_picture.linesize[i];
1463 s->current_picture.linesize[i] *= 2;
1464 s->last_picture.linesize[i] *=2;
1465 s->next_picture.linesize[i] *=2;
1470 s->hurry_up= s->avctx->hurry_up;
1471 s->error_resilience= avctx->error_resilience;
1473 /* set dequantizer, we cant do it during init as it might change for mpeg4
1474 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1475 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1476 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1477 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1478 }else if(s->out_format == FMT_H263){
1479 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1480 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1481 }else if(s->out_format == FMT_H261){
1482 s->dct_unquantize_intra = s->dct_unquantize_h261_intra;
1483 s->dct_unquantize_inter = s->dct_unquantize_h261_inter;
1485 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1486 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1489 if(s->dct_error_sum){
1490 assert(s->avctx->noise_reduction && s->encoding);
1492 update_noise_reduction(s);
1496 if(s->avctx->xvmc_acceleration)
1497 return XVMC_field_start(s, avctx);
1502 /* generic function for encode/decode called after a frame has been coded/decoded */
1503 void MPV_frame_end(MpegEncContext *s)
1506 /* draw edge for correct motion prediction if outside */
1508 //just to make sure that all data is rendered.
1509 if(s->avctx->xvmc_acceleration){
1513 if(s->unrestricted_mv && s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1514 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1515 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1516 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1520 s->last_pict_type = s->pict_type;
1521 if(s->pict_type!=B_TYPE){
1522 s->last_non_b_pict_type= s->pict_type;
1525 /* copy back current_picture variables */
1526 for(i=0; i<MAX_PICTURE_COUNT; i++){
1527 if(s->picture[i].data[0] == s->current_picture.data[0]){
1528 s->picture[i]= s->current_picture;
1532 assert(i<MAX_PICTURE_COUNT);
1536 /* release non refernce frames */
1537 for(i=0; i<MAX_PICTURE_COUNT; i++){
1538 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1539 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1543 // clear copies, to avoid confusion
1545 memset(&s->last_picture, 0, sizeof(Picture));
1546 memset(&s->next_picture, 0, sizeof(Picture));
1547 memset(&s->current_picture, 0, sizeof(Picture));
1549 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1553 * draws an line from (ex, ey) -> (sx, sy).
1554 * @param w width of the image
1555 * @param h height of the image
1556 * @param stride stride/linesize of the image
1557 * @param color color of the arrow
1559 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1562 sx= clip(sx, 0, w-1);
1563 sy= clip(sy, 0, h-1);
1564 ex= clip(ex, 0, w-1);
1565 ey= clip(ey, 0, h-1);
1567 buf[sy*stride + sx]+= color;
1569 if(ABS(ex - sx) > ABS(ey - sy)){
1574 buf+= sx + sy*stride;
1576 f= ((ey-sy)<<16)/ex;
1577 for(x= 0; x <= ex; x++){
1580 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1581 buf[(y+1)*stride + x]+= (color* fr )>>16;
1588 buf+= sx + sy*stride;
1590 if(ey) f= ((ex-sx)<<16)/ey;
1592 for(y= 0; y <= ey; y++){
1595 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1596 buf[y*stride + x+1]+= (color* fr )>>16;;
1602 * draws an arrow from (ex, ey) -> (sx, sy).
1603 * @param w width of the image
1604 * @param h height of the image
1605 * @param stride stride/linesize of the image
1606 * @param color color of the arrow
1608 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1611 sx= clip(sx, -100, w+100);
1612 sy= clip(sy, -100, h+100);
1613 ex= clip(ex, -100, w+100);
1614 ey= clip(ey, -100, h+100);
1619 if(dx*dx + dy*dy > 3*3){
1622 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1624 //FIXME subpixel accuracy
1625 rx= ROUNDED_DIV(rx*3<<4, length);
1626 ry= ROUNDED_DIV(ry*3<<4, length);
1628 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1629 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1631 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1635 * prints debuging info for the given picture.
1637 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1639 if(!pict || !pict->mb_type) return;
1641 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1644 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1645 switch (pict->pict_type) {
1646 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1647 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1648 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1649 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1650 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1651 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1653 for(y=0; y<s->mb_height; y++){
1654 for(x=0; x<s->mb_width; x++){
1655 if(s->avctx->debug&FF_DEBUG_SKIP){
1656 int count= s->mbskip_table[x + y*s->mb_stride];
1657 if(count>9) count=9;
1658 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1660 if(s->avctx->debug&FF_DEBUG_QP){
1661 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1663 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1664 int mb_type= pict->mb_type[x + y*s->mb_stride];
1665 //Type & MV direction
1667 av_log(s->avctx, AV_LOG_DEBUG, "P");
1668 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1669 av_log(s->avctx, AV_LOG_DEBUG, "A");
1670 else if(IS_INTRA4x4(mb_type))
1671 av_log(s->avctx, AV_LOG_DEBUG, "i");
1672 else if(IS_INTRA16x16(mb_type))
1673 av_log(s->avctx, AV_LOG_DEBUG, "I");
1674 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1675 av_log(s->avctx, AV_LOG_DEBUG, "d");
1676 else if(IS_DIRECT(mb_type))
1677 av_log(s->avctx, AV_LOG_DEBUG, "D");
1678 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1679 av_log(s->avctx, AV_LOG_DEBUG, "g");
1680 else if(IS_GMC(mb_type))
1681 av_log(s->avctx, AV_LOG_DEBUG, "G");
1682 else if(IS_SKIP(mb_type))
1683 av_log(s->avctx, AV_LOG_DEBUG, "S");
1684 else if(!USES_LIST(mb_type, 1))
1685 av_log(s->avctx, AV_LOG_DEBUG, ">");
1686 else if(!USES_LIST(mb_type, 0))
1687 av_log(s->avctx, AV_LOG_DEBUG, "<");
1689 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1690 av_log(s->avctx, AV_LOG_DEBUG, "X");
1695 av_log(s->avctx, AV_LOG_DEBUG, "+");
1696 else if(IS_16X8(mb_type))
1697 av_log(s->avctx, AV_LOG_DEBUG, "-");
1698 else if(IS_8X16(mb_type))
1699 av_log(s->avctx, AV_LOG_DEBUG, "¦");
1700 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1701 av_log(s->avctx, AV_LOG_DEBUG, " ");
1703 av_log(s->avctx, AV_LOG_DEBUG, "?");
1706 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1707 av_log(s->avctx, AV_LOG_DEBUG, "=");
1709 av_log(s->avctx, AV_LOG_DEBUG, " ");
1711 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1713 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1717 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1718 const int shift= 1 + s->quarter_sample;
1722 int h_chroma_shift, v_chroma_shift;
1723 s->low_delay=0; //needed to see the vectors without trashing the buffers
1725 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1727 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*s->height:pict->linesize[i]*s->height >> v_chroma_shift);
1728 pict->data[i]= s->visualization_buffer[i];
1730 pict->type= FF_BUFFER_TYPE_COPY;
1733 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1735 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1736 const int mb_index= mb_x + mb_y*s->mb_stride;
1737 if((s->avctx->debug_mv) && pict->motion_val){
1739 for(type=0; type<3; type++){
1742 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1746 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1750 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1755 if(!USES_LIST(pict->mb_type[mb_index], direction))
1759 if(IS_8X8(pict->mb_type[mb_index])){
1762 int sx= mb_x*16 + 4 + 8*(i&1);
1763 int sy= mb_y*16 + 4 + 8*(i>>1);
1764 int xy= mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride;
1765 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1766 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1767 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1769 }else if(IS_16X8(pict->mb_type[mb_index])){
1773 int sy=mb_y*16 + 4 + 8*i;
1774 int xy= mb_x*2 + (mb_y*2 + i)*s->b8_stride;
1775 int mx=(pict->motion_val[direction][xy][0]>>shift);
1776 int my=(pict->motion_val[direction][xy][1]>>shift);
1778 if(IS_INTERLACED(pict->mb_type[mb_index]))
1781 draw_arrow(ptr, sx, sy, mx+sx, my+sy, s->width, s->height, s->linesize, 100);
1784 int sx= mb_x*16 + 8;
1785 int sy= mb_y*16 + 8;
1786 int xy= mb_x*2 + mb_y*2*s->b8_stride;
1787 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1788 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1789 draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
1793 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1794 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1797 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1798 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1801 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1802 int mb_type= pict->mb_type[mb_index];
1805 #define COLOR(theta, r)\
1806 u= (int)(128 + r*cos(theta*3.141592/180));\
1807 v= (int)(128 + r*sin(theta*3.141592/180));
1811 if(IS_PCM(mb_type)){
1813 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1815 }else if(IS_INTRA4x4(mb_type)){
1817 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1819 }else if(IS_DIRECT(mb_type)){
1821 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1823 }else if(IS_GMC(mb_type)){
1825 }else if(IS_SKIP(mb_type)){
1827 }else if(!USES_LIST(mb_type, 1)){
1829 }else if(!USES_LIST(mb_type, 0)){
1832 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1836 u*= 0x0101010101010101ULL;
1837 v*= 0x0101010101010101ULL;
1839 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1840 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1844 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1845 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1846 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1848 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1850 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1853 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1857 s->mbskip_table[mb_index]=0;
1863 #ifdef CONFIG_ENCODERS
1865 static int get_sae(uint8_t *src, int ref, int stride){
1869 for(y=0; y<16; y++){
1870 for(x=0; x<16; x++){
1871 acc+= ABS(src[x+y*stride] - ref);
1878 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1885 for(y=0; y<h; y+=16){
1886 for(x=0; x<w; x+=16){
1887 int offset= x + y*stride;
1888 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1889 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1890 int sae = get_sae(src + offset, mean, stride);
1892 acc+= sae + 500 < sad;
1899 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
1902 const int encoding_delay= s->max_b_frames;
1906 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
1907 if(pic_arg->linesize[0] != s->linesize) direct=0;
1908 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
1909 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
1911 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
1914 i= ff_find_unused_picture(s, 1);
1916 pic= (AVFrame*)&s->picture[i];
1920 pic->data[i]= pic_arg->data[i];
1921 pic->linesize[i]= pic_arg->linesize[i];
1923 alloc_picture(s, (Picture*)pic, 1);
1926 i= ff_find_unused_picture(s, 0);
1928 pic= (AVFrame*)&s->picture[i];
1931 alloc_picture(s, (Picture*)pic, 0);
1933 if( pic->data[0] + offset == pic_arg->data[0]
1934 && pic->data[1] + offset == pic_arg->data[1]
1935 && pic->data[2] + offset == pic_arg->data[2]){
1938 int h_chroma_shift, v_chroma_shift;
1939 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1942 int src_stride= pic_arg->linesize[i];
1943 int dst_stride= i ? s->uvlinesize : s->linesize;
1944 int h_shift= i ? h_chroma_shift : 0;
1945 int v_shift= i ? v_chroma_shift : 0;
1946 int w= s->width >>h_shift;
1947 int h= s->height>>v_shift;
1948 uint8_t *src= pic_arg->data[i];
1949 uint8_t *dst= pic->data[i] + offset;
1951 if(src_stride==dst_stride)
1952 memcpy(dst, src, src_stride*h);
1955 memcpy(dst, src, w);
1963 copy_picture_attributes(s, pic, pic_arg);
1965 pic->display_picture_number= s->input_picture_number++;
1967 if(pic->pts != AV_NOPTS_VALUE){
1968 if(s->user_specified_pts != AV_NOPTS_VALUE){
1969 int64_t time= av_rescale(pic->pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE);
1970 int64_t last= av_rescale(s->user_specified_pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE);
1973 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%Ld, last=%Ld\n", pic->pts, s->user_specified_pts);
1977 s->user_specified_pts= pic->pts;
1979 if(s->user_specified_pts != AV_NOPTS_VALUE){
1980 s->user_specified_pts=
1981 pic->pts= s->user_specified_pts + AV_TIME_BASE*(int64_t)s->avctx->frame_rate_base / s->avctx->frame_rate;
1982 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pic->pts);
1984 pic->pts= av_rescale(pic->display_picture_number*(int64_t)s->avctx->frame_rate_base, AV_TIME_BASE, s->avctx->frame_rate);
1989 /* shift buffer entries */
1990 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
1991 s->input_picture[i-1]= s->input_picture[i];
1993 s->input_picture[encoding_delay]= (Picture*)pic;
1998 static void select_input_picture(MpegEncContext *s){
2001 for(i=1; i<MAX_PICTURE_COUNT; i++)
2002 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2003 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2005 /* set next picture types & ordering */
2006 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2007 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2008 s->reordered_input_picture[0]= s->input_picture[0];
2009 s->reordered_input_picture[0]->pict_type= I_TYPE;
2010 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2014 if(s->flags&CODEC_FLAG_PASS2){
2015 for(i=0; i<s->max_b_frames+1; i++){
2016 int pict_num= s->input_picture[0]->display_picture_number + i;
2017 int pict_type= s->rc_context.entry[pict_num].new_pict_type;
2018 s->input_picture[i]->pict_type= pict_type;
2020 if(i + 1 >= s->rc_context.num_entries) break;
2024 if(s->input_picture[0]->pict_type){
2025 /* user selected pict_type */
2026 for(b_frames=0; b_frames<s->max_b_frames+1; b_frames++){
2027 if(s->input_picture[b_frames]->pict_type!=B_TYPE) break;
2030 if(b_frames > s->max_b_frames){
2031 av_log(s->avctx, AV_LOG_ERROR, "warning, too many bframes in a row\n");
2032 b_frames = s->max_b_frames;
2034 }else if(s->avctx->b_frame_strategy==0){
2035 b_frames= s->max_b_frames;
2036 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2037 }else if(s->avctx->b_frame_strategy==1){
2038 for(i=1; i<s->max_b_frames+1; i++){
2039 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2040 s->input_picture[i]->b_frame_score=
2041 get_intra_count(s, s->input_picture[i ]->data[0],
2042 s->input_picture[i-1]->data[0], s->linesize) + 1;
2045 for(i=0; i<s->max_b_frames; i++){
2046 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2049 b_frames= FFMAX(0, i-1);
2052 for(i=0; i<b_frames+1; i++){
2053 s->input_picture[i]->b_frame_score=0;
2056 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2061 //static int b_count=0;
2062 //b_count+= b_frames;
2063 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2064 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2065 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2067 s->input_picture[b_frames]->pict_type= I_TYPE;
2070 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2072 && s->input_picture[b_frames]->pict_type== I_TYPE)
2075 s->reordered_input_picture[0]= s->input_picture[b_frames];
2076 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2077 s->reordered_input_picture[0]->pict_type= P_TYPE;
2078 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2079 for(i=0; i<b_frames; i++){
2080 s->reordered_input_picture[i+1]= s->input_picture[i];
2081 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2082 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2087 if(s->reordered_input_picture[0]){
2088 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2090 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2092 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2093 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
2095 int i= ff_find_unused_picture(s, 0);
2096 Picture *pic= &s->picture[i];
2098 /* mark us unused / free shared pic */
2100 s->reordered_input_picture[0]->data[i]= NULL;
2101 s->reordered_input_picture[0]->type= 0;
2103 pic->reference = s->reordered_input_picture[0]->reference;
2105 alloc_picture(s, pic, 0);
2107 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2109 s->current_picture_ptr= pic;
2111 // input is not a shared pix -> reuse buffer for current_pix
2113 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2114 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2116 s->current_picture_ptr= s->reordered_input_picture[0];
2118 s->new_picture.data[i]+=16;
2121 copy_picture(&s->current_picture, s->current_picture_ptr);
2123 s->picture_number= s->new_picture.display_picture_number;
2124 //printf("dpn:%d\n", s->picture_number);
2126 memset(&s->new_picture, 0, sizeof(Picture));
2130 int MPV_encode_picture(AVCodecContext *avctx,
2131 unsigned char *buf, int buf_size, void *data)
2133 MpegEncContext *s = avctx->priv_data;
2134 AVFrame *pic_arg = data;
2135 int i, stuffing_count;
2137 if(avctx->pix_fmt != PIX_FMT_YUV420P){
2138 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2142 for(i=0; i<avctx->thread_count; i++){
2143 int start_y= s->thread_context[i]->start_mb_y;
2144 int end_y= s->thread_context[i]-> end_mb_y;
2145 int h= s->mb_height;
2146 uint8_t *start= buf + buf_size*start_y/h;
2147 uint8_t *end = buf + buf_size* end_y/h;
2149 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2152 s->picture_in_gop_number++;
2154 if(load_input_picture(s, pic_arg) < 0)
2157 select_input_picture(s);
2160 if(s->new_picture.data[0]){
2161 s->pict_type= s->new_picture.pict_type;
2163 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2164 MPV_frame_start(s, avctx);
2166 encode_picture(s, s->picture_number);
2168 avctx->real_pict_num = s->picture_number;
2169 avctx->header_bits = s->header_bits;
2170 avctx->mv_bits = s->mv_bits;
2171 avctx->misc_bits = s->misc_bits;
2172 avctx->i_tex_bits = s->i_tex_bits;
2173 avctx->p_tex_bits = s->p_tex_bits;
2174 avctx->i_count = s->i_count;
2175 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2176 avctx->skip_count = s->skip_count;
2180 if (s->out_format == FMT_MJPEG)
2181 mjpeg_picture_trailer(s);
2183 if(s->flags&CODEC_FLAG_PASS1)
2184 ff_write_pass1_stats(s);
2187 avctx->error[i] += s->current_picture_ptr->error[i];
2190 flush_put_bits(&s->pb);
2191 s->frame_bits = put_bits_count(&s->pb);
2193 stuffing_count= ff_vbv_update(s, s->frame_bits);
2195 switch(s->codec_id){
2196 case CODEC_ID_MPEG1VIDEO:
2197 case CODEC_ID_MPEG2VIDEO:
2198 while(stuffing_count--){
2199 put_bits(&s->pb, 8, 0);
2202 case CODEC_ID_MPEG4:
2203 put_bits(&s->pb, 16, 0);
2204 put_bits(&s->pb, 16, 0x1C3);
2205 stuffing_count -= 4;
2206 while(stuffing_count--){
2207 put_bits(&s->pb, 8, 0xFF);
2211 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2213 flush_put_bits(&s->pb);
2214 s->frame_bits = put_bits_count(&s->pb);
2217 /* update mpeg1/2 vbv_delay for CBR */
2218 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2219 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2222 assert(s->repeat_first_field==0);
2224 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2225 assert(vbv_delay < 0xFFFF);
2227 s->vbv_delay_ptr[0] &= 0xF8;
2228 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2229 s->vbv_delay_ptr[1] = vbv_delay>>5;
2230 s->vbv_delay_ptr[2] &= 0x07;
2231 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2233 s->total_bits += s->frame_bits;
2234 avctx->frame_bits = s->frame_bits;
2236 assert((pbBufPtr(&s->pb) == s->pb.buf));
2239 assert((s->frame_bits&7)==0);
2241 return s->frame_bits/8;
2244 #endif //CONFIG_ENCODERS
2246 static inline void gmc1_motion(MpegEncContext *s,
2247 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2248 uint8_t **ref_picture)
2251 int offset, src_x, src_y, linesize, uvlinesize;
2252 int motion_x, motion_y;
2255 motion_x= s->sprite_offset[0][0];
2256 motion_y= s->sprite_offset[0][1];
2257 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2258 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2259 motion_x<<=(3-s->sprite_warping_accuracy);
2260 motion_y<<=(3-s->sprite_warping_accuracy);
2261 src_x = clip(src_x, -16, s->width);
2262 if (src_x == s->width)
2264 src_y = clip(src_y, -16, s->height);
2265 if (src_y == s->height)
2268 linesize = s->linesize;
2269 uvlinesize = s->uvlinesize;
2271 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2273 if(s->flags&CODEC_FLAG_EMU_EDGE){
2274 if( (unsigned)src_x >= s->h_edge_pos - 17
2275 || (unsigned)src_y >= s->v_edge_pos - 17){
2276 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2277 ptr= s->edge_emu_buffer;
2281 if((motion_x|motion_y)&7){
2282 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2283 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2287 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2288 if (s->no_rounding){
2289 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2291 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2295 if(s->flags&CODEC_FLAG_GRAY) return;
2297 motion_x= s->sprite_offset[1][0];
2298 motion_y= s->sprite_offset[1][1];
2299 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2300 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2301 motion_x<<=(3-s->sprite_warping_accuracy);
2302 motion_y<<=(3-s->sprite_warping_accuracy);
2303 src_x = clip(src_x, -8, s->width>>1);
2304 if (src_x == s->width>>1)
2306 src_y = clip(src_y, -8, s->height>>1);
2307 if (src_y == s->height>>1)
2310 offset = (src_y * uvlinesize) + src_x;
2311 ptr = ref_picture[1] + offset;
2312 if(s->flags&CODEC_FLAG_EMU_EDGE){
2313 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2314 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2315 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);
2316 ptr= s->edge_emu_buffer;
2320 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2322 ptr = ref_picture[2] + offset;
2324 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);
2325 ptr= s->edge_emu_buffer;
2327 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2332 static inline void gmc_motion(MpegEncContext *s,
2333 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2334 uint8_t **ref_picture)
2337 int linesize, uvlinesize;
2338 const int a= s->sprite_warping_accuracy;
2341 linesize = s->linesize;
2342 uvlinesize = s->uvlinesize;
2344 ptr = ref_picture[0];
2346 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2347 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2349 s->dsp.gmc(dest_y, ptr, linesize, 16,
2352 s->sprite_delta[0][0], s->sprite_delta[0][1],
2353 s->sprite_delta[1][0], s->sprite_delta[1][1],
2354 a+1, (1<<(2*a+1)) - s->no_rounding,
2355 s->h_edge_pos, s->v_edge_pos);
2356 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2357 ox + s->sprite_delta[0][0]*8,
2358 oy + s->sprite_delta[1][0]*8,
2359 s->sprite_delta[0][0], s->sprite_delta[0][1],
2360 s->sprite_delta[1][0], s->sprite_delta[1][1],
2361 a+1, (1<<(2*a+1)) - s->no_rounding,
2362 s->h_edge_pos, s->v_edge_pos);
2364 if(s->flags&CODEC_FLAG_GRAY) return;
2366 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2367 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2369 ptr = ref_picture[1];
2370 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2373 s->sprite_delta[0][0], s->sprite_delta[0][1],
2374 s->sprite_delta[1][0], s->sprite_delta[1][1],
2375 a+1, (1<<(2*a+1)) - s->no_rounding,
2376 s->h_edge_pos>>1, s->v_edge_pos>>1);
2378 ptr = ref_picture[2];
2379 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2382 s->sprite_delta[0][0], s->sprite_delta[0][1],
2383 s->sprite_delta[1][0], s->sprite_delta[1][1],
2384 a+1, (1<<(2*a+1)) - s->no_rounding,
2385 s->h_edge_pos>>1, s->v_edge_pos>>1);
2389 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2390 * @param buf destination buffer
2391 * @param src source buffer
2392 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2393 * @param block_w width of block
2394 * @param block_h height of block
2395 * @param src_x x coordinate of the top left sample of the block in the source buffer
2396 * @param src_y y coordinate of the top left sample of the block in the source buffer
2397 * @param w width of the source buffer
2398 * @param h height of the source buffer
2400 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2401 int src_x, int src_y, int w, int h){
2403 int start_y, start_x, end_y, end_x;
2406 src+= (h-1-src_y)*linesize;
2408 }else if(src_y<=-block_h){
2409 src+= (1-block_h-src_y)*linesize;
2415 }else if(src_x<=-block_w){
2416 src+= (1-block_w-src_x);
2420 start_y= FFMAX(0, -src_y);
2421 start_x= FFMAX(0, -src_x);
2422 end_y= FFMIN(block_h, h-src_y);
2423 end_x= FFMIN(block_w, w-src_x);
2425 // copy existing part
2426 for(y=start_y; y<end_y; y++){
2427 for(x=start_x; x<end_x; x++){
2428 buf[x + y*linesize]= src[x + y*linesize];
2433 for(y=0; y<start_y; y++){
2434 for(x=start_x; x<end_x; x++){
2435 buf[x + y*linesize]= buf[x + start_y*linesize];
2440 for(y=end_y; y<block_h; y++){
2441 for(x=start_x; x<end_x; x++){
2442 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2446 for(y=0; y<block_h; y++){
2448 for(x=0; x<start_x; x++){
2449 buf[x + y*linesize]= buf[start_x + y*linesize];
2453 for(x=end_x; x<block_w; x++){
2454 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2459 static inline int hpel_motion(MpegEncContext *s,
2460 uint8_t *dest, uint8_t *src,
2461 int field_based, int field_select,
2462 int src_x, int src_y,
2463 int width, int height, int stride,
2464 int h_edge_pos, int v_edge_pos,
2465 int w, int h, op_pixels_func *pix_op,
2466 int motion_x, int motion_y)
2471 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2472 src_x += motion_x >> 1;
2473 src_y += motion_y >> 1;
2475 /* WARNING: do no forget half pels */
2476 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2479 src_y = clip(src_y, -16, height);
2480 if (src_y == height)
2482 src += src_y * stride + src_x;
2484 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2485 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2486 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2487 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2488 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2489 src= s->edge_emu_buffer;
2495 pix_op[dxy](dest, src, stride, h);
2499 /* apply one mpeg motion vector to the three components */
2500 static always_inline void mpeg_motion(MpegEncContext *s,
2501 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2502 int field_based, int bottom_field, int field_select,
2503 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2504 int motion_x, int motion_y, int h)
2506 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2507 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2510 if(s->quarter_sample)
2517 v_edge_pos = s->v_edge_pos >> field_based;
2518 linesize = s->current_picture.linesize[0] << field_based;
2519 uvlinesize = s->current_picture.linesize[1] << field_based;
2521 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2522 src_x = s->mb_x* 16 + (motion_x >> 1);
2523 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2525 if (s->out_format == FMT_H263) {
2526 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2527 mx = (motion_x>>1)|(motion_x&1);
2529 uvdxy = ((my & 1) << 1) | (mx & 1);
2530 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2531 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2533 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2537 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2541 uvsrc_x = s->mb_x*8 + mx;
2542 uvsrc_y = s->mb_y*8 + my;
2544 if(s->chroma_y_shift){
2547 uvdxy = ((my & 1) << 1) | (mx & 1);
2548 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2549 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2551 if(s->chroma_x_shift){
2554 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2555 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2566 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2567 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2568 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2570 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2571 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2572 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2573 s->codec_id == CODEC_ID_MPEG1VIDEO){
2574 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2577 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2578 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2579 ptr_y = s->edge_emu_buffer;
2580 if(!(s->flags&CODEC_FLAG_GRAY)){
2581 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2582 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2583 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2584 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2585 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2591 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2592 dest_y += s->linesize;
2593 dest_cb+= s->uvlinesize;
2594 dest_cr+= s->uvlinesize;
2598 ptr_y += s->linesize;
2599 ptr_cb+= s->uvlinesize;
2600 ptr_cr+= s->uvlinesize;
2603 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2605 if(!(s->flags&CODEC_FLAG_GRAY)){
2606 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2607 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2611 /* apply one mpeg motion vector to the three components */
2612 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
2613 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2614 int field_based, int bottom_field, int field_select,
2615 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
2616 int motion_x, int motion_y, int h)
2618 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2619 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
2620 const int lowres= s->avctx->lowres;
2621 const int block_s= 8>>lowres;
2622 const int s_mask= (2<<lowres)-1;
2623 const int h_edge_pos = s->h_edge_pos >> lowres;
2624 const int v_edge_pos = s->v_edge_pos >> lowres;
2625 linesize = s->current_picture.linesize[0] << field_based;
2626 uvlinesize = s->current_picture.linesize[1] << field_based;
2628 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
2634 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
2637 sx= motion_x & s_mask;
2638 sy= motion_y & s_mask;
2639 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
2640 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
2642 if (s->out_format == FMT_H263) {
2643 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
2644 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
2647 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2650 uvsx = (2*mx) & s_mask;
2651 uvsy = (2*my) & s_mask;
2652 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
2653 uvsrc_y = s->mb_y*block_s + (my >> lowres);
2659 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2660 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
2663 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2664 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2665 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2667 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
2668 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2669 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2670 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2671 ptr_y = s->edge_emu_buffer;
2672 if(!(s->flags&CODEC_FLAG_GRAY)){
2673 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2674 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2675 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2676 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2677 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2683 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2684 dest_y += s->linesize;
2685 dest_cb+= s->uvlinesize;
2686 dest_cr+= s->uvlinesize;
2690 ptr_y += s->linesize;
2691 ptr_cb+= s->uvlinesize;
2692 ptr_cr+= s->uvlinesize;
2697 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
2699 if(!(s->flags&CODEC_FLAG_GRAY)){
2700 uvsx <<= 2 - lowres;
2701 uvsy <<= 2 - lowres;
2702 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2703 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2707 //FIXME move to dsputil, avg variant, 16x16 version
2708 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2710 uint8_t * const top = src[1];
2711 uint8_t * const left = src[2];
2712 uint8_t * const mid = src[0];
2713 uint8_t * const right = src[3];
2714 uint8_t * const bottom= src[4];
2715 #define OBMC_FILTER(x, t, l, m, r, b)\
2716 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2717 #define OBMC_FILTER4(x, t, l, m, r, b)\
2718 OBMC_FILTER(x , t, l, m, r, b);\
2719 OBMC_FILTER(x+1 , t, l, m, r, b);\
2720 OBMC_FILTER(x +stride, t, l, m, r, b);\
2721 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2724 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2725 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2726 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2727 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2728 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2729 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2731 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2732 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2733 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2734 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2736 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2737 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2738 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2739 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2741 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2742 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2743 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2744 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2746 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2747 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2748 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2749 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2750 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2751 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2753 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2754 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2755 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2756 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2759 /* obmc for 1 8x8 luma block */
2760 static inline void obmc_motion(MpegEncContext *s,
2761 uint8_t *dest, uint8_t *src,
2762 int src_x, int src_y,
2763 op_pixels_func *pix_op,
2764 int16_t mv[5][2]/* mid top left right bottom*/)
2770 assert(s->quarter_sample==0);
2773 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2776 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
2777 hpel_motion(s, ptr[i], src, 0, 0,
2779 s->width, s->height, s->linesize,
2780 s->h_edge_pos, s->v_edge_pos,
2782 mv[i][0], mv[i][1]);
2786 put_obmc(dest, ptr, s->linesize);
2789 static inline void qpel_motion(MpegEncContext *s,
2790 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2791 int field_based, int bottom_field, int field_select,
2792 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2793 qpel_mc_func (*qpix_op)[16],
2794 int motion_x, int motion_y, int h)
2796 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2797 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
2799 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
2800 src_x = s->mb_x * 16 + (motion_x >> 2);
2801 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
2803 v_edge_pos = s->v_edge_pos >> field_based;
2804 linesize = s->linesize << field_based;
2805 uvlinesize = s->uvlinesize << field_based;
2810 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
2811 static const int rtab[8]= {0,0,1,1,0,0,0,1};
2812 mx= (motion_x>>1) + rtab[motion_x&7];
2813 my= (motion_y>>1) + rtab[motion_y&7];
2814 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
2815 mx= (motion_x>>1)|(motion_x&1);
2816 my= (motion_y>>1)|(motion_y&1);
2824 uvdxy= (mx&1) | ((my&1)<<1);
2828 uvsrc_x = s->mb_x * 8 + mx;
2829 uvsrc_y = s->mb_y * (8 >> field_based) + my;
2831 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2832 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2833 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2835 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
2836 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
2837 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2838 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2839 ptr_y= s->edge_emu_buffer;
2840 if(!(s->flags&CODEC_FLAG_GRAY)){
2841 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
2842 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
2843 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2844 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
2845 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2852 qpix_op[0][dxy](dest_y, ptr_y, linesize);
2855 dest_y += s->linesize;
2856 dest_cb+= s->uvlinesize;
2857 dest_cr+= s->uvlinesize;
2861 ptr_y += s->linesize;
2862 ptr_cb += s->uvlinesize;
2863 ptr_cr += s->uvlinesize;
2865 //damn interlaced mode
2866 //FIXME boundary mirroring is not exactly correct here
2867 qpix_op[1][dxy](dest_y , ptr_y , linesize);
2868 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
2870 if(!(s->flags&CODEC_FLAG_GRAY)){
2871 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
2872 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
2876 inline int ff_h263_round_chroma(int x){
2878 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2881 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
2886 * h263 chorma 4mv motion compensation.
2888 static inline void chroma_4mv_motion(MpegEncContext *s,
2889 uint8_t *dest_cb, uint8_t *dest_cr,
2890 uint8_t **ref_picture,
2891 op_pixels_func *pix_op,
2893 int dxy, emu=0, src_x, src_y, offset;
2896 /* In case of 8X8, we construct a single chroma motion vector
2897 with a special rounding */
2898 mx= ff_h263_round_chroma(mx);
2899 my= ff_h263_round_chroma(my);
2901 dxy = ((my & 1) << 1) | (mx & 1);
2905 src_x = s->mb_x * 8 + mx;
2906 src_y = s->mb_y * 8 + my;
2907 src_x = clip(src_x, -8, s->width/2);
2908 if (src_x == s->width/2)
2910 src_y = clip(src_y, -8, s->height/2);
2911 if (src_y == s->height/2)
2914 offset = (src_y * (s->uvlinesize)) + src_x;
2915 ptr = ref_picture[1] + offset;
2916 if(s->flags&CODEC_FLAG_EMU_EDGE){
2917 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
2918 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
2919 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);
2920 ptr= s->edge_emu_buffer;
2924 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
2926 ptr = ref_picture[2] + offset;
2928 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);
2929 ptr= s->edge_emu_buffer;
2931 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
2935 * motion compesation of a single macroblock
2937 * @param dest_y luma destination pointer
2938 * @param dest_cb chroma cb/u destination pointer
2939 * @param dest_cr chroma cr/v destination pointer
2940 * @param dir direction (0->forward, 1->backward)
2941 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2942 * @param pic_op halfpel motion compensation function (average or put normally)
2943 * @param pic_op qpel motion compensation function (average or put normally)
2944 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2946 static inline void MPV_motion(MpegEncContext *s,
2947 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2948 int dir, uint8_t **ref_picture,
2949 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
2951 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
2953 uint8_t *ptr, *dest;
2958 if(s->obmc && s->pict_type != B_TYPE){
2959 int16_t mv_cache[4][4][2];
2960 const int xy= s->mb_x + s->mb_y*s->mb_stride;
2961 const int mot_stride= s->b8_stride;
2962 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
2964 assert(!s->mb_skiped);
2966 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
2967 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2968 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
2970 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
2971 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
2973 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
2976 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
2977 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
2978 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
2980 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
2981 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
2984 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
2985 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
2986 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
2988 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
2989 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
2995 const int x= (i&1)+1;
2996 const int y= (i>>1)+1;
2998 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
2999 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3000 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3001 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3002 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3004 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3006 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3013 if(!(s->flags&CODEC_FLAG_GRAY))
3014 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3019 switch(s->mv_type) {
3023 if(s->real_sprite_warping_points==1){
3024 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3027 gmc_motion(s, dest_y, dest_cb, dest_cr,
3030 }else if(s->quarter_sample){
3031 qpel_motion(s, dest_y, dest_cb, dest_cr,
3033 ref_picture, pix_op, qpix_op,
3034 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3036 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3037 ref_picture, pix_op,
3038 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3042 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3044 ref_picture, pix_op,
3045 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3051 if(s->quarter_sample){
3053 motion_x = s->mv[dir][i][0];
3054 motion_y = s->mv[dir][i][1];
3056 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3057 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3058 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3060 /* WARNING: do no forget half pels */
3061 src_x = clip(src_x, -16, s->width);
3062 if (src_x == s->width)
3064 src_y = clip(src_y, -16, s->height);
3065 if (src_y == s->height)
3068 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3069 if(s->flags&CODEC_FLAG_EMU_EDGE){
3070 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3071 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3072 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);
3073 ptr= s->edge_emu_buffer;
3076 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3077 qpix_op[1][dxy](dest, ptr, s->linesize);
3079 mx += s->mv[dir][i][0]/2;
3080 my += s->mv[dir][i][1]/2;
3084 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3085 ref_picture[0], 0, 0,
3086 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3087 s->width, s->height, s->linesize,
3088 s->h_edge_pos, s->v_edge_pos,
3090 s->mv[dir][i][0], s->mv[dir][i][1]);
3092 mx += s->mv[dir][i][0];
3093 my += s->mv[dir][i][1];
3097 if(!(s->flags&CODEC_FLAG_GRAY))
3098 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3101 if (s->picture_structure == PICT_FRAME) {
3102 if(s->quarter_sample){
3104 qpel_motion(s, dest_y, dest_cb, dest_cr,
3105 1, i, s->field_select[dir][i],
3106 ref_picture, pix_op, qpix_op,
3107 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3111 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3112 1, 0, s->field_select[dir][0],
3113 ref_picture, pix_op,
3114 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3116 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3117 1, 1, s->field_select[dir][1],
3118 ref_picture, pix_op,
3119 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3122 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3123 ref_picture= s->current_picture_ptr->data;
3126 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3127 0, 0, s->field_select[dir][0],
3128 ref_picture, pix_op,
3129 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3134 uint8_t ** ref2picture;
3136 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3137 ref2picture= ref_picture;
3139 ref2picture= s->current_picture_ptr->data;
3142 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3143 0, 0, s->field_select[dir][i],
3144 ref2picture, pix_op,
3145 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3147 dest_y += 16*s->linesize;
3148 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3149 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3153 if(s->picture_structure == PICT_FRAME){
3157 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3159 ref_picture, pix_op,
3160 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3162 pix_op = s->dsp.avg_pixels_tab;
3166 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3167 0, 0, s->picture_structure != i+1,
3168 ref_picture, pix_op,
3169 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3171 // after put we make avg of the same block
3172 pix_op=s->dsp.avg_pixels_tab;
3174 //opposite parity is always in the same frame if this is second field
3175 if(!s->first_field){
3176 ref_picture = s->current_picture_ptr->data;
3186 * motion compesation of a single macroblock
3188 * @param dest_y luma destination pointer
3189 * @param dest_cb chroma cb/u destination pointer
3190 * @param dest_cr chroma cr/v destination pointer
3191 * @param dir direction (0->forward, 1->backward)
3192 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3193 * @param pic_op halfpel motion compensation function (average or put normally)
3194 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3196 static inline void MPV_motion_lowres(MpegEncContext *s,
3197 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3198 int dir, uint8_t **ref_picture,
3199 h264_chroma_mc_func *pix_op)
3201 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3203 uint8_t *ptr, *dest;
3204 const int lowres= s->avctx->lowres;
3205 const int block_s= 8>>lowres;
3210 switch(s->mv_type) {
3212 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3214 ref_picture, pix_op,
3215 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3217 /* case MV_TYPE_8X8:
3221 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3222 ref_picture[0], 0, 0,
3223 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3224 s->width, s->height, s->linesize,
3225 s->h_edge_pos, s->v_edge_pos,
3227 s->mv[dir][i][0], s->mv[dir][i][1]);
3229 mx += s->mv[dir][i][0];
3230 my += s->mv[dir][i][1];
3233 if(!(s->flags&CODEC_FLAG_GRAY))
3234 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3237 if (s->picture_structure == PICT_FRAME) {
3239 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3240 1, 0, s->field_select[dir][0],
3241 ref_picture, pix_op,
3242 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3244 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3245 1, 1, s->field_select[dir][1],
3246 ref_picture, pix_op,
3247 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3249 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3250 ref_picture= s->current_picture_ptr->data;
3253 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3254 0, 0, s->field_select[dir][0],
3255 ref_picture, pix_op,
3256 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3261 uint8_t ** ref2picture;
3263 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3264 ref2picture= ref_picture;
3266 ref2picture= s->current_picture_ptr->data;
3269 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3270 0, 0, s->field_select[dir][i],
3271 ref2picture, pix_op,
3272 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3274 dest_y += 2*block_s*s->linesize;
3275 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3276 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3280 if(s->picture_structure == PICT_FRAME){
3284 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3286 ref_picture, pix_op,
3287 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3289 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3293 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3294 0, 0, s->picture_structure != i+1,
3295 ref_picture, pix_op,
3296 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3298 // after put we make avg of the same block
3299 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3301 //opposite parity is always in the same frame if this is second field
3302 if(!s->first_field){
3303 ref_picture = s->current_picture_ptr->data;
3312 /* put block[] to dest[] */
3313 static inline void put_dct(MpegEncContext *s,
3314 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3316 s->dct_unquantize_intra(s, block, i, qscale);
3317 s->dsp.idct_put (dest, line_size, block);
3320 /* add block[] to dest[] */
3321 static inline void add_dct(MpegEncContext *s,
3322 DCTELEM *block, int i, uint8_t *dest, int line_size)
3324 if (s->block_last_index[i] >= 0) {
3325 s->dsp.idct_add (dest, line_size, block);
3329 static inline void add_dequant_dct(MpegEncContext *s,
3330 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3332 if (s->block_last_index[i] >= 0) {
3333 s->dct_unquantize_inter(s, block, i, qscale);
3335 s->dsp.idct_add (dest, line_size, block);
3340 * cleans dc, ac, coded_block for the current non intra MB
3342 void ff_clean_intra_table_entries(MpegEncContext *s)
3344 int wrap = s->b8_stride;
3345 int xy = s->block_index[0];
3348 s->dc_val[0][xy + 1 ] =
3349 s->dc_val[0][xy + wrap] =
3350 s->dc_val[0][xy + 1 + wrap] = 1024;
3352 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3353 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3354 if (s->msmpeg4_version>=3) {
3355 s->coded_block[xy ] =
3356 s->coded_block[xy + 1 ] =
3357 s->coded_block[xy + wrap] =
3358 s->coded_block[xy + 1 + wrap] = 0;
3361 wrap = s->mb_stride;
3362 xy = s->mb_x + s->mb_y * wrap;
3364 s->dc_val[2][xy] = 1024;
3366 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3367 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3369 s->mbintra_table[xy]= 0;
3372 /* generic function called after a macroblock has been parsed by the
3373 decoder or after it has been encoded by the encoder.
3375 Important variables used:
3376 s->mb_intra : true if intra macroblock
3377 s->mv_dir : motion vector direction
3378 s->mv_type : motion vector type
3379 s->mv : motion vector
3380 s->interlaced_dct : true if interlaced dct used (mpeg2)
3382 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3385 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3387 if(s->avctx->xvmc_acceleration){
3388 XVMC_decode_mb(s);//xvmc uses pblocks
3396 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3397 /* save DCT coefficients */
3399 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3402 *dct++ = block[i][s->dsp.idct_permutation[j]];
3405 s->current_picture.qscale_table[mb_xy]= s->qscale;
3407 /* update DC predictors for P macroblocks */
3409 if (s->h263_pred || s->h263_aic) {
3410 if(s->mbintra_table[mb_xy])
3411 ff_clean_intra_table_entries(s);
3415 s->last_dc[2] = 128 << s->intra_dc_precision;
3418 else if (s->h263_pred || s->h263_aic)
3419 s->mbintra_table[mb_xy]=1;
3421 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3422 uint8_t *dest_y, *dest_cb, *dest_cr;
3423 int dct_linesize, dct_offset;
3424 op_pixels_func (*op_pix)[4];
3425 qpel_mc_func (*op_qpix)[16];
3426 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3427 const int uvlinesize= s->current_picture.linesize[1];
3428 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3429 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3431 /* avoid copy if macroblock skipped in last frame too */
3432 /* skip only during decoding as we might trash the buffers during encoding a bit */
3434 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3435 const int age= s->current_picture.age;
3441 assert(s->pict_type!=I_TYPE);
3443 (*mbskip_ptr) ++; /* indicate that this time we skiped it */
3444 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3446 /* if previous was skipped too, then nothing to do ! */
3447 if (*mbskip_ptr >= age && s->current_picture.reference){
3450 } else if(!s->current_picture.reference){
3451 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3452 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3454 *mbskip_ptr = 0; /* not skipped */
3458 dct_linesize = linesize << s->interlaced_dct;
3459 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3463 dest_cb= s->dest[1];
3464 dest_cr= s->dest[2];
3466 dest_y = s->b_scratchpad;
3467 dest_cb= s->b_scratchpad+16*linesize;
3468 dest_cr= s->b_scratchpad+32*linesize;
3472 /* motion handling */
3473 /* decoding or more than one mb_type (MC was allready done otherwise) */
3476 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3478 if (s->mv_dir & MV_DIR_FORWARD) {
3479 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3480 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3482 if (s->mv_dir & MV_DIR_BACKWARD) {
3483 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3486 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3487 op_pix = s->dsp.put_pixels_tab;
3488 op_qpix= s->dsp.put_qpel_pixels_tab;
3490 op_pix = s->dsp.put_no_rnd_pixels_tab;
3491 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3493 if (s->mv_dir & MV_DIR_FORWARD) {
3494 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3495 op_pix = s->dsp.avg_pixels_tab;
3496 op_qpix= s->dsp.avg_qpel_pixels_tab;
3498 if (s->mv_dir & MV_DIR_BACKWARD) {
3499 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3504 /* skip dequant / idct if we are really late ;) */
3505 if(s->hurry_up>1) return;
3507 /* add dct residue */
3508 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3509 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3510 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3511 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3512 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3513 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3515 if(!(s->flags&CODEC_FLAG_GRAY)){
3516 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3517 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3519 } else if(s->codec_id != CODEC_ID_WMV2){
3520 add_dct(s, block[0], 0, dest_y , dct_linesize);
3521 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3522 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3523 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
3525 if(!(s->flags&CODEC_FLAG_GRAY)){
3526 if(s->chroma_y_shift){//Chroma420
3527 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3528 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3531 dct_linesize = uvlinesize << s->interlaced_dct;
3532 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3534 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3535 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3536 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3537 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3538 if(!s->chroma_x_shift){//Chroma444
3539 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3540 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3541 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3542 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3549 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3553 /* dct only in intra block */
3554 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3555 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3556 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3557 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3558 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3560 if(!(s->flags&CODEC_FLAG_GRAY)){
3561 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3562 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3565 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3566 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3567 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3568 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3570 if(!(s->flags&CODEC_FLAG_GRAY)){
3571 if(s->chroma_y_shift){
3572 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3573 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3576 dct_linesize = uvlinesize << s->interlaced_dct;
3577 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3579 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3580 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3581 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3582 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3583 if(!s->chroma_x_shift){//Chroma444
3584 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3585 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3586 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3587 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3594 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3595 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3596 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3601 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
3602 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
3603 else MPV_decode_mb_internal(s, block, 0);
3606 #ifdef CONFIG_ENCODERS
3608 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3610 static const char tab[64]=
3622 DCTELEM *block= s->block[n];
3623 const int last_index= s->block_last_index[n];
3628 threshold= -threshold;
3632 /* are all which we could set to zero are allready zero? */
3633 if(last_index<=skip_dc - 1) return;
3635 for(i=0; i<=last_index; i++){
3636 const int j = s->intra_scantable.permutated[i];
3637 const int level = ABS(block[j]);
3639 if(skip_dc && i==0) continue;
3648 if(score >= threshold) return;
3649 for(i=skip_dc; i<=last_index; i++){
3650 const int j = s->intra_scantable.permutated[i];
3653 if(block[0]) s->block_last_index[n]= 0;
3654 else s->block_last_index[n]= -1;
3657 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3660 const int maxlevel= s->max_qcoeff;
3661 const int minlevel= s->min_qcoeff;
3665 i=1; //skip clipping of intra dc
3669 for(;i<=last_index; i++){
3670 const int j= s->intra_scantable.permutated[i];
3671 int level = block[j];
3673 if (level>maxlevel){
3676 }else if(level<minlevel){
3684 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3685 av_log(s->avctx, AV_LOG_INFO, "warning, cliping %d dct coefficents to %d..%d\n", overflow, minlevel, maxlevel);
3688 #endif //CONFIG_ENCODERS
3692 * @param h is the normal height, this will be reduced automatically if needed for the last row
3694 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3695 if (s->avctx->draw_horiz_band) {
3699 if(s->picture_structure != PICT_FRAME){
3702 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3705 h= FFMIN(h, (s->height>>s->avctx->lowres) - y);
3707 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3708 src= (AVFrame*)s->current_picture_ptr;
3709 else if(s->last_picture_ptr)
3710 src= (AVFrame*)s->last_picture_ptr;
3714 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
3720 offset[0]= y * s->linesize;;
3722 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
3728 s->avctx->draw_horiz_band(s->avctx, src, offset,
3729 y, s->picture_structure, h);
3733 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
3734 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
3735 const int uvlinesize= s->current_picture.linesize[1];
3736 const int mb_size= 4 - s->avctx->lowres;
3738 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
3739 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
3740 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
3741 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
3742 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
3743 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;
3744 //block_index is not used by mpeg2, so it is not affected by chroma_format
3746 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
3747 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
3748 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
3750 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
3752 s->dest[0] += s->mb_y * linesize << mb_size;
3753 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
3754 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
3758 #ifdef CONFIG_ENCODERS
3760 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
3770 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
3771 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
3772 int v= ptr[x2 + y2*stride];
3778 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
3783 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
3785 int16_t weight[6][64];
3786 DCTELEM orig[6][64];
3787 const int mb_x= s->mb_x;
3788 const int mb_y= s->mb_y;
3791 int dct_offset = s->linesize*8; //default for progressive frames
3792 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3795 for(i=0; i<6; i++) skip_dct[i]=0;
3797 if(s->adaptive_quant){
3798 const int last_qp= s->qscale;
3799 const int mb_xy= mb_x + mb_y*s->mb_stride;
3801 s->lambda= s->lambda_table[mb_xy];
3804 if(!(s->flags&CODEC_FLAG_QP_RD)){
3805 s->dquant= s->qscale - last_qp;
3807 if(s->out_format==FMT_H263){
3808 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
3810 if(s->codec_id==CODEC_ID_MPEG4){
3812 if(s->pict_type == B_TYPE){
3814 s->dquant= (s->dquant/2)*2;
3815 if(s->mv_dir&MV_DIRECT)
3818 if(s->mv_type==MV_TYPE_8X8)
3824 ff_set_qscale(s, last_qp + s->dquant);
3825 }else if(s->flags&CODEC_FLAG_QP_RD)
3826 ff_set_qscale(s, s->qscale + s->dquant);
3828 wrap_y = s->linesize;
3829 wrap_c = s->uvlinesize;
3830 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
3831 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
3832 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
3834 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
3835 uint8_t *ebuf= s->edge_emu_buffer + 32;
3836 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
3838 ff_emulated_edge_mc(ebuf+18*wrap_y , ptr_cb, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3839 ptr_cb= ebuf+18*wrap_y;
3840 ff_emulated_edge_mc(ebuf+18*wrap_y+8, ptr_cr, wrap_c, 8, 8, mb_x*8, mb_y*8, s->width>>1, s->height>>1);
3841 ptr_cr= ebuf+18*wrap_y+8;
3845 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3846 int progressive_score, interlaced_score;
3848 s->interlaced_dct=0;
3849 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
3850 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
3852 if(progressive_score > 0){
3853 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
3854 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
3855 if(progressive_score > interlaced_score){
3856 s->interlaced_dct=1;
3864 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
3865 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
3866 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
3867 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
3869 if(s->flags&CODEC_FLAG_GRAY){
3873 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
3874 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
3877 op_pixels_func (*op_pix)[4];
3878 qpel_mc_func (*op_qpix)[16];
3879 uint8_t *dest_y, *dest_cb, *dest_cr;
3881 dest_y = s->dest[0];
3882 dest_cb = s->dest[1];
3883 dest_cr = s->dest[2];
3885 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3886 op_pix = s->dsp.put_pixels_tab;
3887 op_qpix= s->dsp.put_qpel_pixels_tab;
3889 op_pix = s->dsp.put_no_rnd_pixels_tab;
3890 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3893 if (s->mv_dir & MV_DIR_FORWARD) {
3894 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3895 op_pix = s->dsp.avg_pixels_tab;
3896 op_qpix= s->dsp.avg_qpel_pixels_tab;
3898 if (s->mv_dir & MV_DIR_BACKWARD) {
3899 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3902 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
3903 int progressive_score, interlaced_score;
3905 s->interlaced_dct=0;
3906 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
3907 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
3909 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
3911 if(progressive_score>0){
3912 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
3913 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
3915 if(progressive_score > interlaced_score){
3916 s->interlaced_dct=1;
3924 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
3925 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
3926 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
3927 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
3929 if(s->flags&CODEC_FLAG_GRAY){
3933 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
3934 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
3936 /* pre quantization */
3937 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
3939 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
3940 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
3941 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
3942 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;
3943 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
3944 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
3948 if(s->avctx->quantizer_noise_shaping){
3949 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
3950 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
3951 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
3952 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
3953 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
3954 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
3955 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
3958 /* DCT & quantize */
3959 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
3964 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
3965 // FIXME we could decide to change to quantizer instead of clipping
3966 // JS: I don't think that would be a good idea it could lower quality instead
3967 // of improve it. Just INTRADC clipping deserves changes in quantizer
3968 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
3970 s->block_last_index[i]= -1;
3972 if(s->avctx->quantizer_noise_shaping){
3975 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
3980 if(s->luma_elim_threshold && !s->mb_intra)
3982 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
3983 if(s->chroma_elim_threshold && !s->mb_intra)
3985 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
3987 if(s->flags & CODEC_FLAG_CBP_RD){
3989 if(s->block_last_index[i] == -1)
3990 s->coded_score[i]= INT_MAX/256;
3995 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
3996 s->block_last_index[4]=
3997 s->block_last_index[5]= 0;
3999 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4002 //non c quantize code returns incorrect block_last_index FIXME
4003 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4006 if(s->block_last_index[i]>0){
4007 for(j=63; j>0; j--){
4008 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4010 s->block_last_index[i]= j;
4015 /* huffman encode */
4016 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4017 case CODEC_ID_MPEG1VIDEO:
4018 case CODEC_ID_MPEG2VIDEO:
4019 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4021 case CODEC_ID_MPEG4:
4022 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4023 case CODEC_ID_MSMPEG4V2:
4024 case CODEC_ID_MSMPEG4V3:
4026 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4028 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4030 case CODEC_ID_H263P:
4033 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4035 case CODEC_ID_MJPEG:
4036 mjpeg_encode_mb(s, s->block); break;
4042 #endif //CONFIG_ENCODERS
4044 void ff_mpeg_flush(AVCodecContext *avctx){
4046 MpegEncContext *s = avctx->priv_data;
4048 if(s==NULL || s->picture==NULL)
4051 for(i=0; i<MAX_PICTURE_COUNT; i++){
4052 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4053 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4054 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4056 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4058 s->parse_context.state= -1;
4059 s->parse_context.frame_start_found= 0;
4060 s->parse_context.overread= 0;
4061 s->parse_context.overread_index= 0;
4062 s->parse_context.index= 0;
4063 s->parse_context.last_index= 0;
4064 s->bitstream_buffer_size=0;
4067 #ifdef CONFIG_ENCODERS
4068 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4070 const uint16_t *srcw= (uint16_t*)src;
4071 int words= length>>4;
4072 int bits= length&15;
4075 if(length==0) return;
4078 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4079 }else if(put_bits_count(pb)&7){
4080 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4082 for(i=0; put_bits_count(pb)&31; i++)
4083 put_bits(pb, 8, src[i]);
4085 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4086 skip_put_bytes(pb, 2*words-i);
4089 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4092 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4095 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4098 d->mb_skip_run= s->mb_skip_run;
4100 d->last_dc[i]= s->last_dc[i];
4103 d->mv_bits= s->mv_bits;
4104 d->i_tex_bits= s->i_tex_bits;
4105 d->p_tex_bits= s->p_tex_bits;
4106 d->i_count= s->i_count;
4107 d->f_count= s->f_count;
4108 d->b_count= s->b_count;
4109 d->skip_count= s->skip_count;
4110 d->misc_bits= s->misc_bits;
4114 d->qscale= s->qscale;
4115 d->dquant= s->dquant;
4118 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4121 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4122 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4125 d->mb_skip_run= s->mb_skip_run;
4127 d->last_dc[i]= s->last_dc[i];
4130 d->mv_bits= s->mv_bits;
4131 d->i_tex_bits= s->i_tex_bits;
4132 d->p_tex_bits= s->p_tex_bits;
4133 d->i_count= s->i_count;
4134 d->f_count= s->f_count;
4135 d->b_count= s->b_count;
4136 d->skip_count= s->skip_count;
4137 d->misc_bits= s->misc_bits;
4139 d->mb_intra= s->mb_intra;
4140 d->mb_skiped= s->mb_skiped;
4141 d->mv_type= s->mv_type;
4142 d->mv_dir= s->mv_dir;
4144 if(s->data_partitioning){
4146 d->tex_pb= s->tex_pb;
4150 d->block_last_index[i]= s->block_last_index[i];
4151 d->interlaced_dct= s->interlaced_dct;
4152 d->qscale= s->qscale;
4155 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4156 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4157 int *dmin, int *next_block, int motion_x, int motion_y)
4160 uint8_t *dest_backup[3];
4162 copy_context_before_encode(s, backup, type);
4164 s->block= s->blocks[*next_block];
4165 s->pb= pb[*next_block];
4166 if(s->data_partitioning){
4167 s->pb2 = pb2 [*next_block];
4168 s->tex_pb= tex_pb[*next_block];
4172 memcpy(dest_backup, s->dest, sizeof(s->dest));
4173 s->dest[0] = s->rd_scratchpad;
4174 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4175 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4176 assert(s->linesize >= 32); //FIXME
4179 encode_mb(s, motion_x, motion_y);
4181 score= put_bits_count(&s->pb);
4182 if(s->data_partitioning){
4183 score+= put_bits_count(&s->pb2);
4184 score+= put_bits_count(&s->tex_pb);
4187 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4188 MPV_decode_mb(s, s->block);
4190 score *= s->lambda2;
4191 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4195 memcpy(s->dest, dest_backup, sizeof(s->dest));
4202 copy_context_after_encode(best, s, type);
4206 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4207 uint32_t *sq = squareTbl + 256;
4212 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4213 else if(w==8 && h==8)
4214 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4218 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4227 static int sse_mb(MpegEncContext *s){
4231 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4232 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4235 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4236 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)
4237 +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)
4238 +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);
4240 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)
4241 +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)
4242 +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);
4245 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)
4246 +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)
4247 +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);
4250 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4251 MpegEncContext *s= arg;
4255 s->me.dia_size= s->avctx->pre_dia_size;
4256 s->first_slice_line=1;
4257 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4258 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4259 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4261 s->first_slice_line=0;
4269 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4270 MpegEncContext *s= arg;
4272 s->me.dia_size= s->avctx->dia_size;
4273 s->first_slice_line=1;
4274 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4275 s->mb_x=0; //for block init below
4276 ff_init_block_index(s);
4277 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4278 s->block_index[0]+=2;
4279 s->block_index[1]+=2;
4280 s->block_index[2]+=2;
4281 s->block_index[3]+=2;
4283 /* compute motion vector & mb_type and store in context */
4284 if(s->pict_type==B_TYPE)
4285 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4287 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4289 s->first_slice_line=0;
4294 static int mb_var_thread(AVCodecContext *c, void *arg){
4295 MpegEncContext *s= arg;
4298 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4299 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4302 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4304 int sum = s->dsp.pix_sum(pix, s->linesize);
4306 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4308 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4309 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4310 s->me.mb_var_sum_temp += varc;
4316 static void write_slice_end(MpegEncContext *s){
4317 if(s->codec_id==CODEC_ID_MPEG4){
4318 if(s->partitioned_frame){
4319 ff_mpeg4_merge_partitions(s);
4322 ff_mpeg4_stuffing(&s->pb);
4323 }else if(s->out_format == FMT_MJPEG){
4324 ff_mjpeg_stuffing(&s->pb);
4327 align_put_bits(&s->pb);
4328 flush_put_bits(&s->pb);
4331 static int encode_thread(AVCodecContext *c, void *arg){
4332 MpegEncContext *s= arg;
4333 int mb_x, mb_y, pdif = 0;
4335 MpegEncContext best_s, backup_s;
4336 uint8_t bit_buf[2][3000];
4337 uint8_t bit_buf2[2][3000];
4338 uint8_t bit_buf_tex[2][3000];
4339 PutBitContext pb[2], pb2[2], tex_pb[2];
4340 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4343 init_put_bits(&pb [i], bit_buf [i], 3000);
4344 init_put_bits(&pb2 [i], bit_buf2 [i], 3000);
4345 init_put_bits(&tex_pb[i], bit_buf_tex[i], 3000);
4348 s->last_bits= put_bits_count(&s->pb);
4359 /* init last dc values */
4360 /* note: quant matrix value (8) is implied here */
4361 s->last_dc[i] = 128 << s->intra_dc_precision;
4363 s->current_picture_ptr->error[i] = 0;
4366 memset(s->last_mv, 0, sizeof(s->last_mv));
4371 switch(s->codec_id){
4373 case CODEC_ID_H263P:
4375 s->gob_index = ff_h263_get_gob_height(s);
4377 case CODEC_ID_MPEG4:
4378 if(s->partitioned_frame)
4379 ff_mpeg4_init_partitions(s);
4386 s->first_slice_line = 1;
4387 s->ptr_lastgob = s->pb.buf;
4388 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4389 // printf("row %d at %X\n", s->mb_y, (int)s);
4393 ff_set_qscale(s, s->qscale);
4394 ff_init_block_index(s);
4396 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4397 const int xy= mb_y*s->mb_stride + mb_x;
4398 int mb_type= s->mb_type[xy];
4404 ff_update_block_index(s);
4406 /* write gob / video packet header */
4409 int current_packet_size, is_gob_start;
4411 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4413 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4415 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4417 switch(s->codec_id){
4419 case CODEC_ID_H263P:
4420 if(!s->h263_slice_structured)
4421 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4423 case CODEC_ID_MPEG2VIDEO:
4424 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4425 case CODEC_ID_MPEG1VIDEO:
4426 if(s->mb_skip_run) is_gob_start=0;
4431 if(s->start_mb_y != mb_y || mb_x!=0){
4434 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4435 ff_mpeg4_init_partitions(s);
4439 assert((put_bits_count(&s->pb)&7) == 0);
4440 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4442 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4443 int r= put_bits_count(&s->pb)/8 + s->picture_number + s->codec_id + s->mb_x + s->mb_y;
4444 int d= 100 / s->avctx->error_rate;
4446 current_packet_size=0;
4447 #ifndef ALT_BITSTREAM_WRITER
4448 s->pb.buf_ptr= s->ptr_lastgob;
4450 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4454 if (s->avctx->rtp_callback)
4455 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, 0);
4457 switch(s->codec_id){
4458 case CODEC_ID_MPEG4:
4459 ff_mpeg4_encode_video_packet_header(s);
4460 ff_mpeg4_clean_buffers(s);
4462 case CODEC_ID_MPEG1VIDEO:
4463 case CODEC_ID_MPEG2VIDEO:
4464 ff_mpeg1_encode_slice_header(s);
4465 ff_mpeg1_clean_buffers(s);
4468 case CODEC_ID_H263P:
4469 h263_encode_gob_header(s, mb_y);
4473 if(s->flags&CODEC_FLAG_PASS1){
4474 int bits= put_bits_count(&s->pb);
4475 s->misc_bits+= bits - s->last_bits;
4479 s->ptr_lastgob += current_packet_size;
4480 s->first_slice_line=1;
4481 s->resync_mb_x=mb_x;
4482 s->resync_mb_y=mb_y;
4487 if( (s->resync_mb_x == s->mb_x)
4488 && s->resync_mb_y+1 == s->mb_y){
4489 s->first_slice_line=0;
4493 s->dquant=0; //only for QP_RD
4495 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4497 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4499 copy_context_before_encode(&backup_s, s, -1);
4501 best_s.data_partitioning= s->data_partitioning;
4502 best_s.partitioned_frame= s->partitioned_frame;
4503 if(s->data_partitioning){
4504 backup_s.pb2= s->pb2;
4505 backup_s.tex_pb= s->tex_pb;
4508 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4509 s->mv_dir = MV_DIR_FORWARD;
4510 s->mv_type = MV_TYPE_16X16;
4512 s->mv[0][0][0] = s->p_mv_table[xy][0];
4513 s->mv[0][0][1] = s->p_mv_table[xy][1];
4514 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4515 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4517 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4518 s->mv_dir = MV_DIR_FORWARD;
4519 s->mv_type = MV_TYPE_FIELD;
4522 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4523 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4524 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4526 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4527 &dmin, &next_block, 0, 0);
4529 if(mb_type&CANDIDATE_MB_TYPE_SKIPED){
4530 s->mv_dir = MV_DIR_FORWARD;
4531 s->mv_type = MV_TYPE_16X16;
4535 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPED, pb, pb2, tex_pb,
4536 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4538 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4539 s->mv_dir = MV_DIR_FORWARD;
4540 s->mv_type = MV_TYPE_8X8;
4543 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4544 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4546 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4547 &dmin, &next_block, 0, 0);
4549 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4550 s->mv_dir = MV_DIR_FORWARD;
4551 s->mv_type = MV_TYPE_16X16;
4553 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4554 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4555 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4556 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4558 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4559 s->mv_dir = MV_DIR_BACKWARD;
4560 s->mv_type = MV_TYPE_16X16;
4562 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4563 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4564 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4565 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4567 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4568 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4569 s->mv_type = MV_TYPE_16X16;
4571 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4572 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4573 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4574 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4575 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4576 &dmin, &next_block, 0, 0);
4578 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4579 int mx= s->b_direct_mv_table[xy][0];
4580 int my= s->b_direct_mv_table[xy][1];
4582 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4585 ff_mpeg4_set_direct_mv(s, mx, my);
4587 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4588 &dmin, &next_block, mx, my);
4590 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4591 s->mv_dir = MV_DIR_FORWARD;
4592 s->mv_type = MV_TYPE_FIELD;
4595 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4596 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4597 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4599 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4600 &dmin, &next_block, 0, 0);
4602 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4603 s->mv_dir = MV_DIR_BACKWARD;
4604 s->mv_type = MV_TYPE_FIELD;
4607 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4608 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4609 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4611 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4612 &dmin, &next_block, 0, 0);
4614 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4615 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4616 s->mv_type = MV_TYPE_FIELD;
4618 for(dir=0; dir<2; dir++){
4620 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4621 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4622 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4625 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4626 &dmin, &next_block, 0, 0);
4628 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4630 s->mv_type = MV_TYPE_16X16;
4634 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4635 &dmin, &next_block, 0, 0);
4636 if(s->h263_pred || s->h263_aic){
4638 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4640 ff_clean_intra_table_entries(s); //old mode?
4644 if(s->flags & CODEC_FLAG_QP_RD){
4645 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4646 const int last_qp= backup_s.qscale;
4647 int dquant, dir, qp, dc[6];
4649 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4651 assert(backup_s.dquant == 0);
4654 s->mv_dir= best_s.mv_dir;
4655 s->mv_type = MV_TYPE_16X16;
4656 s->mb_intra= best_s.mb_intra;
4657 s->mv[0][0][0] = best_s.mv[0][0][0];
4658 s->mv[0][0][1] = best_s.mv[0][0][1];
4659 s->mv[1][0][0] = best_s.mv[1][0][0];
4660 s->mv[1][0][1] = best_s.mv[1][0][1];
4662 dir= s->pict_type == B_TYPE ? 2 : 1;
4663 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4664 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4665 qp= last_qp + dquant;
4666 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4668 backup_s.dquant= dquant;
4669 if(s->mb_intra && s->dc_val[0]){
4671 dc[i]= s->dc_val[0][ s->block_index[i] ];
4672 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4676 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4677 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4678 if(best_s.qscale != qp){
4679 if(s->mb_intra && s->dc_val[0]){
4681 s->dc_val[0][ s->block_index[i] ]= dc[i];
4682 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4685 if(dir > 0 && dquant==dir){
4693 s->current_picture.qscale_table[xy]= qp;
4697 copy_context_after_encode(s, &best_s, -1);
4699 pb_bits_count= put_bits_count(&s->pb);
4700 flush_put_bits(&s->pb);
4701 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
4704 if(s->data_partitioning){
4705 pb2_bits_count= put_bits_count(&s->pb2);
4706 flush_put_bits(&s->pb2);
4707 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
4708 s->pb2= backup_s.pb2;
4710 tex_pb_bits_count= put_bits_count(&s->tex_pb);
4711 flush_put_bits(&s->tex_pb);
4712 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
4713 s->tex_pb= backup_s.tex_pb;
4715 s->last_bits= put_bits_count(&s->pb);
4718 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4719 ff_h263_update_motion_val(s);
4722 if(next_block==0){ //FIXME 16 vs linesize16
4723 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
4724 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
4725 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
4728 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
4729 MPV_decode_mb(s, s->block);
4731 int motion_x, motion_y;
4732 s->mv_type=MV_TYPE_16X16;
4733 // only one MB-Type possible
4736 case CANDIDATE_MB_TYPE_INTRA:
4739 motion_x= s->mv[0][0][0] = 0;
4740 motion_y= s->mv[0][0][1] = 0;
4742 case CANDIDATE_MB_TYPE_INTER:
4743 s->mv_dir = MV_DIR_FORWARD;
4745 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
4746 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
4748 case CANDIDATE_MB_TYPE_INTER_I:
4749 s->mv_dir = MV_DIR_FORWARD;
4750 s->mv_type = MV_TYPE_FIELD;
4753 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4754 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4755 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4757 motion_x = motion_y = 0;
4759 case CANDIDATE_MB_TYPE_INTER4V:
4760 s->mv_dir = MV_DIR_FORWARD;
4761 s->mv_type = MV_TYPE_8X8;
4764 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4765 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4767 motion_x= motion_y= 0;
4769 case CANDIDATE_MB_TYPE_DIRECT:
4770 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4772 motion_x=s->b_direct_mv_table[xy][0];
4773 motion_y=s->b_direct_mv_table[xy][1];
4775 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
4778 case CANDIDATE_MB_TYPE_BIDIR:
4779 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4783 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4784 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4785 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4786 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4788 case CANDIDATE_MB_TYPE_BACKWARD:
4789 s->mv_dir = MV_DIR_BACKWARD;
4791 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4792 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4794 case CANDIDATE_MB_TYPE_FORWARD:
4795 s->mv_dir = MV_DIR_FORWARD;
4797 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4798 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4799 // printf(" %d %d ", motion_x, motion_y);
4801 case CANDIDATE_MB_TYPE_FORWARD_I:
4802 s->mv_dir = MV_DIR_FORWARD;
4803 s->mv_type = MV_TYPE_FIELD;
4806 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4807 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4808 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4810 motion_x=motion_y=0;
4812 case CANDIDATE_MB_TYPE_BACKWARD_I:
4813 s->mv_dir = MV_DIR_BACKWARD;
4814 s->mv_type = MV_TYPE_FIELD;
4817 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4818 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4819 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4821 motion_x=motion_y=0;
4823 case CANDIDATE_MB_TYPE_BIDIR_I:
4824 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4825 s->mv_type = MV_TYPE_FIELD;
4827 for(dir=0; dir<2; dir++){
4829 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4830 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4831 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4834 motion_x=motion_y=0;
4837 motion_x=motion_y=0; //gcc warning fix
4838 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
4841 encode_mb(s, motion_x, motion_y);
4843 // RAL: Update last macrobloc type
4844 s->last_mv_dir = s->mv_dir;
4847 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
4848 ff_h263_update_motion_val(s);
4851 MPV_decode_mb(s, s->block);
4854 /* clean the MV table in IPS frames for direct mode in B frames */
4855 if(s->mb_intra /* && I,P,S_TYPE */){
4856 s->p_mv_table[xy][0]=0;
4857 s->p_mv_table[xy][1]=0;
4860 if(s->flags&CODEC_FLAG_PSNR){
4864 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4865 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4867 s->current_picture_ptr->error[0] += sse(
4868 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
4869 s->dest[0], w, h, s->linesize);
4870 s->current_picture_ptr->error[1] += sse(
4871 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4872 s->dest[1], w>>1, h>>1, s->uvlinesize);
4873 s->current_picture_ptr->error[2] += sse(
4874 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
4875 s->dest[2], w>>1, h>>1, s->uvlinesize);
4878 ff_h263_loop_filter(s);
4879 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
4884 //not beautifull here but we must write it before flushing so it has to be here
4885 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
4886 msmpeg4_encode_ext_header(s);
4891 /* Send the last GOB if RTP */
4892 if (s->avctx->rtp_callback) {
4893 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
4894 /* Call the RTP callback to send the last GOB */
4896 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, 0);
4902 #define MERGE(field) dst->field += src->field; src->field=0
4903 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
4904 MERGE(me.scene_change_score);
4905 MERGE(me.mc_mb_var_sum_temp);
4906 MERGE(me.mb_var_sum_temp);
4909 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
4912 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
4913 MERGE(dct_count[1]);
4923 MERGE(padding_bug_score);
4925 if(dst->avctx->noise_reduction){
4926 for(i=0; i<64; i++){
4927 MERGE(dct_error_sum[0][i]);
4928 MERGE(dct_error_sum[1][i]);
4932 assert(put_bits_count(&src->pb) % 8 ==0);
4933 assert(put_bits_count(&dst->pb) % 8 ==0);
4934 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
4935 flush_put_bits(&dst->pb);
4938 static void encode_picture(MpegEncContext *s, int picture_number)
4943 s->picture_number = picture_number;
4945 /* Reset the average MB variance */
4946 s->me.mb_var_sum_temp =
4947 s->me.mc_mb_var_sum_temp = 0;
4950 /* we need to initialize some time vars before we can encode b-frames */
4951 // RAL: Condition added for MPEG1VIDEO
4952 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
4953 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
4956 s->me.scene_change_score=0;
4958 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
4960 if(s->pict_type==I_TYPE){
4961 if(s->msmpeg4_version >= 3) s->no_rounding=1;
4962 else s->no_rounding=0;
4963 }else if(s->pict_type!=B_TYPE){
4964 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
4965 s->no_rounding ^= 1;
4968 s->mb_intra=0; //for the rate distoration & bit compare functions
4969 for(i=1; i<s->avctx->thread_count; i++){
4970 ff_update_duplicate_context(s->thread_context[i], s);
4975 /* Estimate motion for every MB */
4976 if(s->pict_type != I_TYPE){
4977 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
4978 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
4979 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4983 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4984 }else /* if(s->pict_type == I_TYPE) */{
4986 for(i=0; i<s->mb_stride*s->mb_height; i++)
4987 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
4989 if(!s->fixed_qscale){
4990 /* finding spatial complexity for I-frame rate control */
4991 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
4994 for(i=1; i<s->avctx->thread_count; i++){
4995 merge_context_after_me(s, s->thread_context[i]);
4997 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
4998 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5001 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5002 s->pict_type= I_TYPE;
5003 for(i=0; i<s->mb_stride*s->mb_height; i++)
5004 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5005 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5009 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5010 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5012 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5014 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5015 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5016 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5019 ff_fix_long_p_mvs(s);
5020 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5021 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5025 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5026 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5031 if(s->pict_type==B_TYPE){
5034 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5035 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5036 s->f_code = FFMAX(a, b);
5038 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5039 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5040 s->b_code = FFMAX(a, b);
5042 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5043 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5044 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5045 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5046 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5048 for(dir=0; dir<2; dir++){
5051 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5052 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5053 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5054 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5062 if (!s->fixed_qscale)
5063 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
5065 if(s->adaptive_quant){
5067 switch(s->codec_id){
5068 case CODEC_ID_MPEG4:
5069 ff_clean_mpeg4_qscales(s);
5072 case CODEC_ID_H263P:
5074 ff_clean_h263_qscales(s);
5079 s->lambda= s->lambda_table[0];
5082 s->lambda= s->current_picture.quality;
5083 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5086 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5087 s->qscale= 3; //reduce cliping problems
5089 if (s->out_format == FMT_MJPEG) {
5090 /* for mjpeg, we do include qscale in the matrix */
5091 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5093 int j= s->dsp.idct_permutation[i];
5095 s->intra_matrix[j] = CLAMP_TO_8BIT((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5097 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5098 s->intra_matrix, s->intra_quant_bias, 8, 8);
5102 //FIXME var duplication
5103 s->current_picture_ptr->key_frame=
5104 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5105 s->current_picture_ptr->pict_type=
5106 s->current_picture.pict_type= s->pict_type;
5108 if(s->current_picture.key_frame)
5109 s->picture_in_gop_number=0;
5111 s->last_bits= put_bits_count(&s->pb);
5112 switch(s->out_format) {
5114 mjpeg_picture_header(s);
5118 if (s->codec_id == CODEC_ID_WMV2)
5119 ff_wmv2_encode_picture_header(s, picture_number);
5120 else if (s->h263_msmpeg4)
5121 msmpeg4_encode_picture_header(s, picture_number);
5122 else if (s->h263_pred)
5123 mpeg4_encode_picture_header(s, picture_number);
5124 else if (s->codec_id == CODEC_ID_RV10)
5125 rv10_encode_picture_header(s, picture_number);
5126 else if (s->codec_id == CODEC_ID_FLV1)
5127 ff_flv_encode_picture_header(s, picture_number);
5129 h263_encode_picture_header(s, picture_number);
5133 mpeg1_encode_picture_header(s, picture_number);
5140 bits= put_bits_count(&s->pb);
5141 s->header_bits= bits - s->last_bits;
5143 for(i=1; i<s->avctx->thread_count; i++){
5144 update_duplicate_context_after_me(s->thread_context[i], s);
5146 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5147 for(i=1; i<s->avctx->thread_count; i++){
5148 merge_context_after_encode(s, s->thread_context[i]);
5153 #endif //CONFIG_ENCODERS
5155 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5156 const int intra= s->mb_intra;
5159 s->dct_count[intra]++;
5161 for(i=0; i<64; i++){
5162 int level= block[i];
5166 s->dct_error_sum[intra][i] += level;
5167 level -= s->dct_offset[intra][i];
5168 if(level<0) level=0;
5170 s->dct_error_sum[intra][i] -= level;
5171 level += s->dct_offset[intra][i];
5172 if(level>0) level=0;
5179 #ifdef CONFIG_ENCODERS
5181 static int dct_quantize_trellis_c(MpegEncContext *s,
5182 DCTELEM *block, int n,
5183 int qscale, int *overflow){
5185 const uint8_t *scantable= s->intra_scantable.scantable;
5186 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5188 unsigned int threshold1, threshold2;
5200 int coeff_count[64];
5201 int qmul, qadd, start_i, last_non_zero, i, dc;
5202 const int esc_length= s->ac_esc_length;
5204 uint8_t * last_length;
5205 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5207 s->dsp.fdct (block);
5209 if(s->dct_error_sum)
5210 s->denoise_dct(s, block);
5212 qadd= ((qscale-1)|1)*8;
5223 /* For AIC we skip quant/dequant of INTRADC */
5228 /* note: block[0] is assumed to be positive */
5229 block[0] = (block[0] + (q >> 1)) / q;
5232 qmat = s->q_intra_matrix[qscale];
5233 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5234 bias= 1<<(QMAT_SHIFT-1);
5235 length = s->intra_ac_vlc_length;
5236 last_length= s->intra_ac_vlc_last_length;
5240 qmat = s->q_inter_matrix[qscale];
5241 length = s->inter_ac_vlc_length;
5242 last_length= s->inter_ac_vlc_last_length;
5246 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5247 threshold2= (threshold1<<1);
5249 for(i=63; i>=start_i; i--) {
5250 const int j = scantable[i];
5251 int level = block[j] * qmat[j];
5253 if(((unsigned)(level+threshold1))>threshold2){
5259 for(i=start_i; i<=last_non_zero; i++) {
5260 const int j = scantable[i];
5261 int level = block[j] * qmat[j];
5263 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5264 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5265 if(((unsigned)(level+threshold1))>threshold2){
5267 level= (bias + level)>>QMAT_SHIFT;
5269 coeff[1][i]= level-1;
5270 // coeff[2][k]= level-2;
5272 level= (bias - level)>>QMAT_SHIFT;
5273 coeff[0][i]= -level;
5274 coeff[1][i]= -level+1;
5275 // coeff[2][k]= -level+2;
5277 coeff_count[i]= FFMIN(level, 2);
5278 assert(coeff_count[i]);
5281 coeff[0][i]= (level>>31)|1;
5286 *overflow= s->max_qcoeff < max; //overflow might have happend
5288 if(last_non_zero < start_i){
5289 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5290 return last_non_zero;
5293 score_tab[start_i]= 0;
5294 survivor[0]= start_i;
5297 for(i=start_i; i<=last_non_zero; i++){
5299 const int dct_coeff= ABS(block[ scantable[i] ]);
5300 const int zero_distoration= dct_coeff*dct_coeff;
5301 int best_score=256*256*256*120;
5302 for(level_index=0; level_index < coeff_count[i]; level_index++){
5304 int level= coeff[level_index][i];
5305 const int alevel= ABS(level);
5310 if(s->out_format == FMT_H263){
5311 unquant_coeff= alevel*qmul + qadd;
5313 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5315 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5316 unquant_coeff = (unquant_coeff - 1) | 1;
5318 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5319 unquant_coeff = (unquant_coeff - 1) | 1;
5324 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5326 if((level&(~127)) == 0){
5327 for(j=survivor_count-1; j>=0; j--){
5328 int run= i - survivor[j];
5329 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5330 score += score_tab[i-run];
5332 if(score < best_score){
5335 level_tab[i+1]= level-64;
5339 if(s->out_format == FMT_H263){
5340 for(j=survivor_count-1; j>=0; j--){
5341 int run= i - survivor[j];
5342 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5343 score += score_tab[i-run];
5344 if(score < last_score){
5347 last_level= level-64;
5353 distoration += esc_length*lambda;
5354 for(j=survivor_count-1; j>=0; j--){
5355 int run= i - survivor[j];
5356 int score= distoration + score_tab[i-run];
5358 if(score < best_score){
5361 level_tab[i+1]= level-64;
5365 if(s->out_format == FMT_H263){
5366 for(j=survivor_count-1; j>=0; j--){
5367 int run= i - survivor[j];
5368 int score= distoration + score_tab[i-run];
5369 if(score < last_score){
5372 last_level= level-64;
5380 score_tab[i+1]= best_score;
5382 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5383 if(last_non_zero <= 27){
5384 for(; survivor_count; survivor_count--){
5385 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5389 for(; survivor_count; survivor_count--){
5390 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5395 survivor[ survivor_count++ ]= i+1;
5398 if(s->out_format != FMT_H263){
5399 last_score= 256*256*256*120;
5400 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5401 int score= score_tab[i];
5402 if(i) score += lambda*2; //FIXME exacter?
5404 if(score < last_score){
5407 last_level= level_tab[i];
5408 last_run= run_tab[i];
5413 s->coded_score[n] = last_score;
5416 last_non_zero= last_i - 1;
5417 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5419 if(last_non_zero < start_i)
5420 return last_non_zero;
5422 if(last_non_zero == 0 && start_i == 0){
5424 int best_score= dc * dc;
5426 for(i=0; i<coeff_count[0]; i++){
5427 int level= coeff[i][0];
5428 int alevel= ABS(level);
5429 int unquant_coeff, score, distortion;
5431 if(s->out_format == FMT_H263){
5432 unquant_coeff= (alevel*qmul + qadd)>>3;
5434 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5435 unquant_coeff = (unquant_coeff - 1) | 1;
5437 unquant_coeff = (unquant_coeff + 4) >> 3;
5438 unquant_coeff<<= 3 + 3;
5440 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5442 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5443 else score= distortion + esc_length*lambda;
5445 if(score < best_score){
5447 best_level= level - 64;
5450 block[0]= best_level;
5451 s->coded_score[n] = best_score - dc*dc;
5452 if(best_level == 0) return -1;
5453 else return last_non_zero;
5459 block[ perm_scantable[last_non_zero] ]= last_level;
5462 for(; i>start_i; i -= run_tab[i] + 1){
5463 block[ perm_scantable[i-1] ]= level_tab[i];
5466 return last_non_zero;
5469 //#define REFINE_STATS 1
5470 static int16_t basis[64][64];
5472 static void build_basis(uint8_t *perm){
5479 double s= 0.25*(1<<BASIS_SHIFT);
5481 int perm_index= perm[index];
5482 if(i==0) s*= sqrt(0.5);
5483 if(j==0) s*= sqrt(0.5);
5484 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)));
5491 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5492 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5497 const uint8_t *scantable= s->intra_scantable.scantable;
5498 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5499 // unsigned int threshold1, threshold2;
5504 int qmul, qadd, start_i, last_non_zero, i, dc;
5506 uint8_t * last_length;
5508 int rle_index, run, q, sum;
5511 static int after_last=0;
5512 static int to_zero=0;
5513 static int from_zero=0;
5516 static int messed_sign=0;
5519 if(basis[0][0] == 0)
5520 build_basis(s->dsp.idct_permutation);
5531 /* For AIC we skip quant/dequant of INTRADC */
5535 q <<= RECON_SHIFT-3;
5536 /* note: block[0] is assumed to be positive */
5538 // block[0] = (block[0] + (q >> 1)) / q;
5540 qmat = s->q_intra_matrix[qscale];
5541 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5542 // bias= 1<<(QMAT_SHIFT-1);
5543 length = s->intra_ac_vlc_length;
5544 last_length= s->intra_ac_vlc_last_length;
5548 qmat = s->q_inter_matrix[qscale];
5549 length = s->inter_ac_vlc_length;
5550 last_length= s->inter_ac_vlc_last_length;
5552 last_non_zero = s->block_last_index[n];
5557 dc += (1<<(RECON_SHIFT-1));
5558 for(i=0; i<64; i++){
5559 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly insteadof copying to rem[]
5562 STOP_TIMER("memset rem[]")}
5565 for(i=0; i<64; i++){
5570 w= ABS(weight[i]) + qns*one;
5571 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5574 // w=weight[i] = (63*qns + (w/2)) / w;
5580 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5586 for(i=start_i; i<=last_non_zero; i++){
5587 int j= perm_scantable[i];
5588 const int level= block[j];
5592 if(level<0) coeff= qmul*level - qadd;
5593 else coeff= qmul*level + qadd;
5594 run_tab[rle_index++]=run;
5597 s->dsp.add_8x8basis(rem, basis[j], coeff);
5603 if(last_non_zero>0){
5604 STOP_TIMER("init rem[]")
5611 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5614 int run2, best_unquant_change=0, analyze_gradient;
5618 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5620 if(analyze_gradient){
5624 for(i=0; i<64; i++){
5627 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5630 STOP_TIMER("rem*w*w")}
5640 const int level= block[0];
5641 int change, old_coeff;
5643 assert(s->mb_intra);
5647 for(change=-1; change<=1; change+=2){
5648 int new_level= level + change;
5649 int score, new_coeff;
5651 new_coeff= q*new_level;
5652 if(new_coeff >= 2048 || new_coeff < 0)
5655 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5656 if(score<best_score){
5659 best_change= change;
5660 best_unquant_change= new_coeff - old_coeff;
5667 run2= run_tab[rle_index++];
5671 for(i=start_i; i<64; i++){
5672 int j= perm_scantable[i];
5673 const int level= block[j];
5674 int change, old_coeff;
5676 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
5680 if(level<0) old_coeff= qmul*level - qadd;
5681 else old_coeff= qmul*level + qadd;
5682 run2= run_tab[rle_index++]; //FIXME ! maybe after last
5686 assert(run2>=0 || i >= last_non_zero );
5689 for(change=-1; change<=1; change+=2){
5690 int new_level= level + change;
5691 int score, new_coeff, unquant_change;
5694 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
5698 if(new_level<0) new_coeff= qmul*new_level - qadd;
5699 else new_coeff= qmul*new_level + qadd;
5700 if(new_coeff >= 2048 || new_coeff <= -2048)
5702 //FIXME check for overflow
5705 if(level < 63 && level > -63){
5706 if(i < last_non_zero)
5707 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
5708 - length[UNI_AC_ENC_INDEX(run, level+64)];
5710 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
5711 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
5714 assert(ABS(new_level)==1);
5716 if(analyze_gradient){
5717 int g= d1[ scantable[i] ];
5718 if(g && (g^new_level) >= 0)
5722 if(i < last_non_zero){
5723 int next_i= i + run2 + 1;
5724 int next_level= block[ perm_scantable[next_i] ] + 64;
5726 if(next_level&(~127))
5729 if(next_i < last_non_zero)
5730 score += length[UNI_AC_ENC_INDEX(run, 65)]
5731 + length[UNI_AC_ENC_INDEX(run2, next_level)]
5732 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5734 score += length[UNI_AC_ENC_INDEX(run, 65)]
5735 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5736 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
5738 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
5740 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5741 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5747 assert(ABS(level)==1);
5749 if(i < last_non_zero){
5750 int next_i= i + run2 + 1;
5751 int next_level= block[ perm_scantable[next_i] ] + 64;
5753 if(next_level&(~127))
5756 if(next_i < last_non_zero)
5757 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5758 - length[UNI_AC_ENC_INDEX(run2, next_level)]
5759 - length[UNI_AC_ENC_INDEX(run, 65)];
5761 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
5762 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
5763 - length[UNI_AC_ENC_INDEX(run, 65)];
5765 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
5767 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
5768 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
5775 unquant_change= new_coeff - old_coeff;
5776 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
5778 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
5779 if(score<best_score){
5782 best_change= change;
5783 best_unquant_change= unquant_change;
5787 prev_level= level + 64;
5788 if(prev_level&(~127))
5797 STOP_TIMER("iterative step")}
5801 int j= perm_scantable[ best_coeff ];
5803 block[j] += best_change;
5805 if(best_coeff > last_non_zero){
5806 last_non_zero= best_coeff;
5814 if(block[j] - best_change){
5815 if(ABS(block[j]) > ABS(block[j] - best_change)){
5827 for(; last_non_zero>=start_i; last_non_zero--){
5828 if(block[perm_scantable[last_non_zero]])
5834 if(256*256*256*64 % count == 0){
5835 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);
5840 for(i=start_i; i<=last_non_zero; i++){
5841 int j= perm_scantable[i];
5842 const int level= block[j];
5845 run_tab[rle_index++]=run;
5852 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
5858 if(last_non_zero>0){
5859 STOP_TIMER("iterative search")
5864 return last_non_zero;
5867 static int dct_quantize_c(MpegEncContext *s,
5868 DCTELEM *block, int n,
5869 int qscale, int *overflow)
5871 int i, j, level, last_non_zero, q, start_i;
5873 const uint8_t *scantable= s->intra_scantable.scantable;
5876 unsigned int threshold1, threshold2;
5878 s->dsp.fdct (block);
5880 if(s->dct_error_sum)
5881 s->denoise_dct(s, block);
5891 /* For AIC we skip quant/dequant of INTRADC */
5894 /* note: block[0] is assumed to be positive */
5895 block[0] = (block[0] + (q >> 1)) / q;
5898 qmat = s->q_intra_matrix[qscale];
5899 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5903 qmat = s->q_inter_matrix[qscale];
5904 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
5906 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5907 threshold2= (threshold1<<1);
5908 for(i=63;i>=start_i;i--) {
5910 level = block[j] * qmat[j];
5912 if(((unsigned)(level+threshold1))>threshold2){
5919 for(i=start_i; i<=last_non_zero; i++) {
5921 level = block[j] * qmat[j];
5923 // if( bias+level >= (1<<QMAT_SHIFT)
5924 // || bias-level >= (1<<QMAT_SHIFT)){
5925 if(((unsigned)(level+threshold1))>threshold2){
5927 level= (bias + level)>>QMAT_SHIFT;
5930 level= (bias - level)>>QMAT_SHIFT;
5938 *overflow= s->max_qcoeff < max; //overflow might have happend
5940 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
5941 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
5942 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
5944 return last_non_zero;
5947 #endif //CONFIG_ENCODERS
5949 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
5950 DCTELEM *block, int n, int qscale)
5952 int i, level, nCoeffs;
5953 const uint16_t *quant_matrix;
5955 nCoeffs= s->block_last_index[n];
5958 block[0] = block[0] * s->y_dc_scale;
5960 block[0] = block[0] * s->c_dc_scale;
5961 /* XXX: only mpeg1 */
5962 quant_matrix = s->intra_matrix;
5963 for(i=1;i<=nCoeffs;i++) {
5964 int j= s->intra_scantable.permutated[i];
5969 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5970 level = (level - 1) | 1;
5973 level = (int)(level * qscale * quant_matrix[j]) >> 3;
5974 level = (level - 1) | 1;
5981 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
5982 DCTELEM *block, int n, int qscale)
5984 int i, level, nCoeffs;
5985 const uint16_t *quant_matrix;
5987 nCoeffs= s->block_last_index[n];
5989 quant_matrix = s->inter_matrix;
5990 for(i=0; i<=nCoeffs; i++) {
5991 int j= s->intra_scantable.permutated[i];
5996 level = (((level << 1) + 1) * qscale *
5997 ((int) (quant_matrix[j]))) >> 4;
5998 level = (level - 1) | 1;
6001 level = (((level << 1) + 1) * qscale *
6002 ((int) (quant_matrix[j]))) >> 4;
6003 level = (level - 1) | 1;
6010 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6011 DCTELEM *block, int n, int qscale)
6013 int i, level, nCoeffs;
6014 const uint16_t *quant_matrix;
6016 if(s->alternate_scan) nCoeffs= 63;
6017 else nCoeffs= s->block_last_index[n];
6020 block[0] = block[0] * s->y_dc_scale;
6022 block[0] = block[0] * s->c_dc_scale;
6023 quant_matrix = s->intra_matrix;
6024 for(i=1;i<=nCoeffs;i++) {
6025 int j= s->intra_scantable.permutated[i];
6030 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6033 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6040 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6041 DCTELEM *block, int n, int qscale)
6043 int i, level, nCoeffs;
6044 const uint16_t *quant_matrix;
6047 if(s->alternate_scan) nCoeffs= 63;
6048 else nCoeffs= s->block_last_index[n];
6050 quant_matrix = s->inter_matrix;
6051 for(i=0; i<=nCoeffs; i++) {
6052 int j= s->intra_scantable.permutated[i];
6057 level = (((level << 1) + 1) * qscale *
6058 ((int) (quant_matrix[j]))) >> 4;
6061 level = (((level << 1) + 1) * qscale *
6062 ((int) (quant_matrix[j]))) >> 4;
6071 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6072 DCTELEM *block, int n, int qscale)
6074 int i, level, qmul, qadd;
6077 assert(s->block_last_index[n]>=0);
6083 block[0] = block[0] * s->y_dc_scale;
6085 block[0] = block[0] * s->c_dc_scale;
6086 qadd = (qscale - 1) | 1;
6093 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6095 for(i=1; i<=nCoeffs; i++) {
6099 level = level * qmul - qadd;
6101 level = level * qmul + qadd;
6108 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6109 DCTELEM *block, int n, int qscale)
6111 int i, level, qmul, qadd;
6114 assert(s->block_last_index[n]>=0);
6116 qadd = (qscale - 1) | 1;
6119 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6121 for(i=0; i<=nCoeffs; i++) {
6125 level = level * qmul - qadd;
6127 level = level * qmul + qadd;
6134 static void dct_unquantize_h261_intra_c(MpegEncContext *s,
6135 DCTELEM *block, int n, int qscale)
6140 assert(s->block_last_index[n]>=0);
6143 block[0] = block[0] * s->y_dc_scale;
6145 block[0] = block[0] * s->c_dc_scale;
6146 even = (qscale & 1)^1;
6147 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6149 for(i=1; i<=nCoeffs; i++){
6153 level = qscale * ((level << 1) - 1) + even;
6155 level = qscale * ((level << 1) + 1) - even;
6162 static void dct_unquantize_h261_inter_c(MpegEncContext *s,
6163 DCTELEM *block, int n, int qscale)
6168 assert(s->block_last_index[n]>=0);
6170 even = (qscale & 1)^1;
6172 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6174 for(i=0; i<=nCoeffs; i++){
6178 level = qscale * ((level << 1) - 1) + even;
6180 level = qscale * ((level << 1) + 1) - even;
6187 static const AVOption mpeg4_options[] =
6189 AVOPTION_CODEC_INT("bitrate", "desired video bitrate", bit_rate, 4, 240000000, 800000),
6190 AVOPTION_CODEC_INT("ratetol", "number of bits the bitstream is allowed to diverge from the reference"
6191 "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
6192 bit_rate_tolerance, 4, 240000000, 8000),
6193 AVOPTION_CODEC_INT("qmin", "minimum quantizer", qmin, 1, 31, 2),
6194 AVOPTION_CODEC_INT("qmax", "maximum quantizer", qmax, 1, 31, 31),
6195 AVOPTION_CODEC_STRING("rc_eq", "rate control equation",
6196 rc_eq, "tex^qComp,option1,options2", 0),
6197 AVOPTION_CODEC_INT("rc_minrate", "rate control minimum bitrate",
6198 rc_min_rate, 4, 24000000, 0),
6199 AVOPTION_CODEC_INT("rc_maxrate", "rate control maximum bitrate",
6200 rc_max_rate, 4, 24000000, 0),
6201 AVOPTION_CODEC_DOUBLE("rc_buf_aggresivity", "rate control buffer aggresivity",
6202 rc_buffer_aggressivity, 4, 24000000, 0),
6203 AVOPTION_CODEC_DOUBLE("rc_initial_cplx", "initial complexity for pass1 ratecontrol",
6204 rc_initial_cplx, 0., 9999999., 0),
6205 AVOPTION_CODEC_DOUBLE("i_quant_factor", "qscale factor between p and i frames",
6206 i_quant_factor, 0., 0., 0),
6207 AVOPTION_CODEC_DOUBLE("i_quant_offset", "qscale offset between p and i frames",
6208 i_quant_factor, -999999., 999999., 0),
6209 AVOPTION_CODEC_INT("dct_algo", "dct alghorithm",
6210 dct_algo, 0, 5, 0), // fixme - "Auto,FastInt,Int,MMX,MLib,Altivec"
6211 AVOPTION_CODEC_DOUBLE("lumi_masking", "luminance masking",
6212 lumi_masking, 0., 999999., 0),
6213 AVOPTION_CODEC_DOUBLE("temporal_cplx_masking", "temporary complexity masking",
6214 temporal_cplx_masking, 0., 999999., 0),
6215 AVOPTION_CODEC_DOUBLE("spatial_cplx_masking", "spatial complexity masking",
6216 spatial_cplx_masking, 0., 999999., 0),
6217 AVOPTION_CODEC_DOUBLE("p_masking", "p block masking",
6218 p_masking, 0., 999999., 0),
6219 AVOPTION_CODEC_DOUBLE("dark_masking", "darkness masking",
6220 dark_masking, 0., 999999., 0),
6221 AVOPTION_CODEC_INT("idct_algo", "idct alghorithm",
6222 idct_algo, 0, 8, 0), // fixme - "Auto,Int,Simple,SimpleMMX,LibMPEG2MMX,PS2,MLib,ARM,Altivec"
6224 AVOPTION_CODEC_INT("mb_qmin", "minimum MB quantizer",
6226 AVOPTION_CODEC_INT("mb_qmax", "maximum MB quantizer",
6229 AVOPTION_CODEC_INT("me_cmp", "ME compare function",
6230 me_cmp, 0, 24000000, 0),
6231 AVOPTION_CODEC_INT("me_sub_cmp", "subpixel ME compare function",
6232 me_sub_cmp, 0, 24000000, 0),
6235 AVOPTION_CODEC_INT("dia_size", "ME diamond size & shape",
6236 dia_size, 0, 24000000, 0),
6237 AVOPTION_CODEC_INT("last_predictor_count", "amount of previous MV predictors",
6238 last_predictor_count, 0, 24000000, 0),
6240 AVOPTION_CODEC_INT("pre_me", "pre pass for ME",
6241 pre_me, 0, 24000000, 0),
6242 AVOPTION_CODEC_INT("me_pre_cmp", "ME pre pass compare function",
6243 me_pre_cmp, 0, 24000000, 0),
6245 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
6246 me_range, 0, 24000000, 0),
6247 AVOPTION_CODEC_INT("pre_dia_size", "ME pre pass diamod size & shape",
6248 pre_dia_size, 0, 24000000, 0),
6249 AVOPTION_CODEC_INT("me_subpel_quality", "subpel ME quality",
6250 me_subpel_quality, 0, 24000000, 0),
6251 AVOPTION_CODEC_INT("me_range", "maximum ME search range",
6252 me_range, 0, 24000000, 0),
6253 AVOPTION_CODEC_FLAG("psnr", "calculate PSNR of compressed frames",
6254 flags, CODEC_FLAG_PSNR, 0),
6255 AVOPTION_CODEC_RCOVERRIDE("rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
6257 AVOPTION_SUB(avoptions_common),
6261 #ifdef CONFIG_ENCODERS
6263 AVCodec h263_encoder = {
6267 sizeof(MpegEncContext),
6273 AVCodec h263p_encoder = {
6277 sizeof(MpegEncContext),
6283 AVCodec flv_encoder = {
6287 sizeof(MpegEncContext),
6293 AVCodec rv10_encoder = {
6297 sizeof(MpegEncContext),
6303 AVCodec mpeg4_encoder = {
6307 sizeof(MpegEncContext),
6311 .options = mpeg4_options,
6312 .capabilities= CODEC_CAP_DELAY,
6315 AVCodec msmpeg4v1_encoder = {
6319 sizeof(MpegEncContext),
6323 .options = mpeg4_options,
6326 AVCodec msmpeg4v2_encoder = {
6330 sizeof(MpegEncContext),
6334 .options = mpeg4_options,
6337 AVCodec msmpeg4v3_encoder = {
6341 sizeof(MpegEncContext),
6345 .options = mpeg4_options,
6348 AVCodec wmv1_encoder = {
6352 sizeof(MpegEncContext),
6356 .options = mpeg4_options,
6361 AVCodec mjpeg_encoder = {
6365 sizeof(MpegEncContext),
6371 #endif //CONFIG_ENCODERS