2 * The simplest mpeg encoder (well, it was the simplest!)
3 * Copyright (c) 2000,2001 Fabrice Bellard.
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * 4MV & hq & b-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
25 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "mpegvideo.h"
35 #include "fastmemcpy.h"
41 #ifdef CONFIG_ENCODERS
42 static void encode_picture(MpegEncContext *s, int picture_number);
43 #endif //CONFIG_ENCODERS
44 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
45 DCTELEM *block, int n, int qscale);
46 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
47 DCTELEM *block, int n, int qscale);
48 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
49 DCTELEM *block, int n, int qscale);
50 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
51 DCTELEM *block, int n, int qscale);
52 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
53 DCTELEM *block, int n, int qscale);
54 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
55 DCTELEM *block, int n, int qscale);
56 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w);
57 #ifdef CONFIG_ENCODERS
58 static int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
59 static int dct_quantize_trellis_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
60 static int dct_quantize_refine(MpegEncContext *s, DCTELEM *block, int16_t *weight, DCTELEM *orig, int n, int qscale);
61 static int sse_mb(MpegEncContext *s);
62 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block);
63 #endif //CONFIG_ENCODERS
66 extern int XVMC_field_start(MpegEncContext*s, AVCodecContext *avctx);
67 extern void XVMC_field_end(MpegEncContext *s);
68 extern void XVMC_decode_mb(MpegEncContext *s);
71 void (*draw_edges)(uint8_t *buf, int wrap, int width, int height, int w)= draw_edges_c;
74 /* enable all paranoid tests for rounding, overflows, etc... */
80 /* for jpeg fast DCT */
83 static const uint16_t aanscales[64] = {
84 /* precomputed values scaled up by 14 bits */
85 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
86 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
87 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
88 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
89 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
90 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
91 8867 , 12299, 11585, 10426, 8867, 6967, 4799, 2446,
92 4520 , 6270, 5906, 5315, 4520, 3552, 2446, 1247
95 static const uint8_t h263_chroma_roundtab[16] = {
96 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
97 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
100 static const uint8_t ff_default_chroma_qscale_table[32]={
101 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
102 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
105 #ifdef CONFIG_ENCODERS
106 static uint8_t (*default_mv_penalty)[MAX_MV*2+1]=NULL;
107 static uint8_t default_fcode_tab[MAX_MV*2+1];
109 enum PixelFormat ff_yuv420p_list[2]= {PIX_FMT_YUV420P, -1};
111 static void convert_matrix(DSPContext *dsp, int (*qmat)[64], uint16_t (*qmat16)[2][64],
112 const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
117 for(qscale=qmin; qscale<=qmax; qscale++){
119 if (dsp->fdct == ff_jpeg_fdct_islow
120 #ifdef FAAN_POSTSCALE
121 || dsp->fdct == ff_faandct
125 const int j= dsp->idct_permutation[i];
126 /* 16 <= qscale * quant_matrix[i] <= 7905 */
127 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
128 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
129 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
131 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) /
132 (qscale * quant_matrix[j]));
134 } else if (dsp->fdct == fdct_ifast
135 #ifndef FAAN_POSTSCALE
136 || dsp->fdct == ff_faandct
140 const int j= dsp->idct_permutation[i];
141 /* 16 <= qscale * quant_matrix[i] <= 7905 */
142 /* 19952 <= aanscales[i] * qscale * quant_matrix[i] <= 249205026 */
143 /* (1<<36)/19952 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= (1<<36)/249205026 */
144 /* 3444240 >= (1<<36)/(aanscales[i] * qscale * quant_matrix[i]) >= 275 */
146 qmat[qscale][i] = (int)((uint64_t_C(1) << (QMAT_SHIFT + 14)) /
147 (aanscales[i] * qscale * quant_matrix[j]));
151 const int j= dsp->idct_permutation[i];
152 /* We can safely suppose that 16 <= quant_matrix[i] <= 255
153 So 16 <= qscale * quant_matrix[i] <= 7905
154 so (1<<19) / 16 >= (1<<19) / (qscale * quant_matrix[i]) >= (1<<19) / 7905
155 so 32768 >= (1<<19) / (qscale * quant_matrix[i]) >= 67
157 qmat[qscale][i] = (int)((uint64_t_C(1) << QMAT_SHIFT) / (qscale * quant_matrix[j]));
158 // qmat [qscale][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[i]);
159 qmat16[qscale][0][i] = (1 << QMAT_SHIFT_MMX) / (qscale * quant_matrix[j]);
161 if(qmat16[qscale][0][i]==0 || qmat16[qscale][0][i]==128*256) qmat16[qscale][0][i]=128*256-1;
162 qmat16[qscale][1][i]= ROUNDED_DIV(bias<<(16-QUANT_BIAS_SHIFT), qmat16[qscale][0][i]);
166 for(i=intra; i<64; i++){
168 if (dsp->fdct == fdct_ifast
169 #ifndef FAAN_POSTSCALE
170 || dsp->fdct == ff_faandct
173 max= (8191LL*aanscales[i]) >> 14;
175 while(((max * qmat[qscale][i]) >> shift) > INT_MAX){
181 av_log(NULL, AV_LOG_INFO, "Warning, QMAT_SHIFT is larger then %d, overflows possible\n", QMAT_SHIFT - shift);
185 static inline void update_qscale(MpegEncContext *s){
186 s->qscale= (s->lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
187 s->qscale= clip(s->qscale, s->avctx->qmin, s->avctx->qmax);
189 s->lambda2= (s->lambda*s->lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
191 #endif //CONFIG_ENCODERS
193 void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable){
197 st->scantable= src_scantable;
201 j = src_scantable[i];
202 st->permutated[i] = permutation[j];
211 j = st->permutated[i];
213 st->raster_end[i]= end;
217 #ifdef CONFIG_ENCODERS
218 void ff_write_quant_matrix(PutBitContext *pb, int16_t *matrix){
224 put_bits(pb, 8, matrix[ ff_zigzag_direct[i] ]);
229 #endif //CONFIG_ENCODERS
231 /* init common dct for both encoder and decoder */
232 int DCT_common_init(MpegEncContext *s)
234 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
235 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
236 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
237 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
238 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
239 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
241 #ifdef CONFIG_ENCODERS
242 s->dct_quantize= dct_quantize_c;
243 s->denoise_dct= denoise_dct_c;
244 #endif //CONFIG_ENCODERS
247 MPV_common_init_mmx(s);
250 MPV_common_init_axp(s);
253 MPV_common_init_mlib(s);
256 MPV_common_init_mmi(s);
259 MPV_common_init_armv4l(s);
262 MPV_common_init_ppc(s);
265 #ifdef CONFIG_ENCODERS
266 s->fast_dct_quantize= s->dct_quantize;
268 if(s->flags&CODEC_FLAG_TRELLIS_QUANT){
269 s->dct_quantize= dct_quantize_trellis_c; //move before MPV_common_init_*
272 #endif //CONFIG_ENCODERS
274 /* load & permutate scantables
275 note: only wmv uses different ones
277 if(s->alternate_scan){
278 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
279 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
281 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
282 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
284 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
285 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
290 static void copy_picture(Picture *dst, Picture *src){
292 dst->type= FF_BUFFER_TYPE_COPY;
295 static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){
298 dst->pict_type = src->pict_type;
299 dst->quality = src->quality;
300 dst->coded_picture_number = src->coded_picture_number;
301 dst->display_picture_number = src->display_picture_number;
302 // dst->reference = src->reference;
304 dst->interlaced_frame = src->interlaced_frame;
305 dst->top_field_first = src->top_field_first;
307 if(s->avctx->me_threshold){
308 if(!src->motion_val[0])
309 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_val not set!\n");
311 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.mb_type not set!\n");
312 if(!src->ref_index[0])
313 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.ref_index not set!\n");
314 if(src->motion_subsample_log2 != dst->motion_subsample_log2)
315 av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesn't match! (%d!=%d)\n",
316 src->motion_subsample_log2, dst->motion_subsample_log2);
318 memcpy(dst->mb_type, src->mb_type, s->mb_stride * s->mb_height * sizeof(dst->mb_type[0]));
321 int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1;
322 int height= ((16*s->mb_height)>>src->motion_subsample_log2);
324 if(src->motion_val[i] && src->motion_val[i] != dst->motion_val[i]){
325 memcpy(dst->motion_val[i], src->motion_val[i], 2*stride*height*sizeof(int16_t));
327 if(src->ref_index[i] && src->ref_index[i] != dst->ref_index[i]){
328 memcpy(dst->ref_index[i], src->ref_index[i], s->b8_stride*2*s->mb_height*sizeof(int8_t));
335 * allocates a Picture
336 * The pixels are allocated/set by calling get_buffer() if shared=0
338 static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){
339 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) doesnt sig11
340 const int mb_array_size= s->mb_stride*s->mb_height;
341 const int b8_array_size= s->b8_stride*s->mb_height*2;
342 const int b4_array_size= s->b4_stride*s->mb_height*4;
346 assert(pic->data[0]);
347 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
348 pic->type= FF_BUFFER_TYPE_SHARED;
352 assert(!pic->data[0]);
354 r= s->avctx->get_buffer(s->avctx, (AVFrame*)pic);
356 if(r<0 || !pic->age || !pic->type || !pic->data[0]){
357 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
361 if(s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])){
362 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
366 if(pic->linesize[1] != pic->linesize[2]){
367 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride missmatch)\n");
371 s->linesize = pic->linesize[0];
372 s->uvlinesize= pic->linesize[1];
375 if(pic->qscale_table==NULL){
377 CHECKED_ALLOCZ(pic->mb_var , mb_array_size * sizeof(int16_t))
378 CHECKED_ALLOCZ(pic->mc_mb_var, mb_array_size * sizeof(int16_t))
379 CHECKED_ALLOCZ(pic->mb_mean , mb_array_size * sizeof(int8_t))
382 CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check
383 CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t))
384 CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(uint32_t))
385 pic->mb_type= pic->mb_type_base + s->mb_stride+1;
386 if(s->out_format == FMT_H264){
388 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t))
389 pic->motion_val[i]= pic->motion_val_base[i]+4;
390 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
392 pic->motion_subsample_log2= 2;
393 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
395 CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t))
396 pic->motion_val[i]= pic->motion_val_base[i]+4;
397 CHECKED_ALLOCZ(pic->ref_index[i], b8_array_size * sizeof(uint8_t))
399 pic->motion_subsample_log2= 3;
401 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
402 CHECKED_ALLOCZ(pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6)
404 pic->qstride= s->mb_stride;
405 CHECKED_ALLOCZ(pic->pan_scan , 1 * sizeof(AVPanScan))
408 //it might be nicer if the application would keep track of these but it would require a API change
409 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
410 s->prev_pict_types[0]= s->pict_type;
411 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == B_TYPE)
412 pic->age= INT_MAX; // skipped MBs in b frames are quite rare in mpeg1/2 and its a bit tricky to skip them anyway
415 fail: //for the CHECKED_ALLOCZ macro
420 * deallocates a picture
422 static void free_picture(MpegEncContext *s, Picture *pic){
425 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
426 s->avctx->release_buffer(s->avctx, (AVFrame*)pic);
429 av_freep(&pic->mb_var);
430 av_freep(&pic->mc_mb_var);
431 av_freep(&pic->mb_mean);
432 av_freep(&pic->mbskip_table);
433 av_freep(&pic->qscale_table);
434 av_freep(&pic->mb_type_base);
435 av_freep(&pic->dct_coeff);
436 av_freep(&pic->pan_scan);
439 av_freep(&pic->motion_val_base[i]);
440 av_freep(&pic->ref_index[i]);
443 if(pic->type == FF_BUFFER_TYPE_SHARED){
452 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
455 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
456 CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, (s->width+64)*2*17*2); //(width + edge + align)*interlaced*MBsize*tolerance
457 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*17;
459 //FIXME should be linesize instead of s->width*2 but that isnt known before get_buffer()
460 CHECKED_ALLOCZ(s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t))
461 s->rd_scratchpad= s->me.scratchpad;
462 s->b_scratchpad= s->me.scratchpad;
463 s->obmc_scratchpad= s->me.scratchpad + 16;
465 CHECKED_ALLOCZ(s->me.map , ME_MAP_SIZE*sizeof(uint32_t))
466 CHECKED_ALLOCZ(s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t))
467 if(s->avctx->noise_reduction){
468 CHECKED_ALLOCZ(s->dct_error_sum, 2 * 64 * sizeof(int))
471 CHECKED_ALLOCZ(s->blocks, 64*12*2 * sizeof(DCTELEM))
472 s->block= s->blocks[0];
475 s->pblocks[i] = (short *)(&s->block[i]);
479 return -1; //free() through MPV_common_end()
482 static void free_duplicate_context(MpegEncContext *s){
485 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
486 av_freep(&s->me.scratchpad);
489 s->obmc_scratchpad= NULL;
491 av_freep(&s->dct_error_sum);
492 av_freep(&s->me.map);
493 av_freep(&s->me.score_map);
494 av_freep(&s->blocks);
498 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
499 #define COPY(a) bak->a= src->a
500 COPY(allocated_edge_emu_buffer);
501 COPY(edge_emu_buffer);
505 COPY(obmc_scratchpad);
512 COPY(me.map_generation);
520 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
523 //FIXME copy only needed parts
525 backup_duplicate_context(&bak, dst);
526 memcpy(dst, src, sizeof(MpegEncContext));
527 backup_duplicate_context(dst, &bak);
529 dst->pblocks[i] = (short *)(&dst->block[i]);
531 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
534 static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src){
535 #define COPY(a) dst->a= src->a
537 COPY(current_picture);
543 COPY(picture_in_gop_number);
544 COPY(gop_picture_number);
545 COPY(frame_pred_frame_dct); //FIXME dont set in encode_header
546 COPY(progressive_frame); //FIXME dont set in encode_header
547 COPY(partitioned_frame); //FIXME dont set in encode_header
552 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
553 * the changed fields will not depend upon the prior state of the MpegEncContext.
555 static void MPV_common_defaults(MpegEncContext *s){
557 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
558 s->chroma_qscale_table= ff_default_chroma_qscale_table;
559 s->progressive_frame= 1;
560 s->progressive_sequence= 1;
561 s->picture_structure= PICT_FRAME;
563 s->coded_picture_number = 0;
564 s->picture_number = 0;
565 s->input_picture_number = 0;
567 s->picture_in_gop_number = 0;
574 * sets the given MpegEncContext to defaults for decoding.
575 * the changed fields will not depend upon the prior state of the MpegEncContext.
577 void MPV_decode_defaults(MpegEncContext *s){
578 MPV_common_defaults(s);
582 * sets the given MpegEncContext to defaults for encoding.
583 * the changed fields will not depend upon the prior state of the MpegEncContext.
586 #ifdef CONFIG_ENCODERS
587 static void MPV_encode_defaults(MpegEncContext *s){
590 MPV_common_defaults(s);
596 default_mv_penalty= av_mallocz( sizeof(uint8_t)*(MAX_FCODE+1)*(2*MAX_MV+1) );
597 memset(default_fcode_tab , 0, sizeof(uint8_t)*(2*MAX_MV+1));
599 for(i=-16; i<16; i++){
600 default_fcode_tab[i + MAX_MV]= 1;
603 s->me.mv_penalty= default_mv_penalty;
604 s->fcode_tab= default_fcode_tab;
606 #endif //CONFIG_ENCODERS
609 * init common structure for both encoder and decoder.
610 * this assumes that some variables like width/height are already set
612 int MPV_common_init(MpegEncContext *s)
614 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
616 if(s->avctx->thread_count > MAX_THREADS || (16*s->avctx->thread_count > s->height && s->height)){
617 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
621 if((s->width || s->height) && avcodec_check_dimensions(s->avctx, s->width, s->height))
624 dsputil_init(&s->dsp, s->avctx);
627 s->flags= s->avctx->flags;
628 s->flags2= s->avctx->flags2;
630 s->mb_width = (s->width + 15) / 16;
631 s->mb_height = (s->height + 15) / 16;
632 s->mb_stride = s->mb_width + 1;
633 s->b8_stride = s->mb_width*2 + 1;
634 s->b4_stride = s->mb_width*4 + 1;
635 mb_array_size= s->mb_height * s->mb_stride;
636 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
638 /* set chroma shifts */
639 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
640 &(s->chroma_y_shift) );
642 /* set default edge pos, will be overriden in decode_header if needed */
643 s->h_edge_pos= s->mb_width*16;
644 s->v_edge_pos= s->mb_height*16;
646 s->mb_num = s->mb_width * s->mb_height;
651 s->block_wrap[3]= s->b8_stride;
653 s->block_wrap[5]= s->mb_stride;
655 y_size = s->b8_stride * (2 * s->mb_height + 1);
656 c_size = s->mb_stride * (s->mb_height + 1);
657 yc_size = y_size + 2 * c_size;
659 /* convert fourcc to upper case */
660 s->avctx->codec_tag= toupper( s->avctx->codec_tag &0xFF)
661 + (toupper((s->avctx->codec_tag>>8 )&0xFF)<<8 )
662 + (toupper((s->avctx->codec_tag>>16)&0xFF)<<16)
663 + (toupper((s->avctx->codec_tag>>24)&0xFF)<<24);
665 s->avctx->stream_codec_tag= toupper( s->avctx->stream_codec_tag &0xFF)
666 + (toupper((s->avctx->stream_codec_tag>>8 )&0xFF)<<8 )
667 + (toupper((s->avctx->stream_codec_tag>>16)&0xFF)<<16)
668 + (toupper((s->avctx->stream_codec_tag>>24)&0xFF)<<24);
670 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
672 CHECKED_ALLOCZ(s->mb_index2xy, (s->mb_num+1)*sizeof(int)) //error ressilience code looks cleaner with this
673 for(y=0; y<s->mb_height; y++){
674 for(x=0; x<s->mb_width; x++){
675 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
678 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
681 /* Allocate MV tables */
682 CHECKED_ALLOCZ(s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
683 CHECKED_ALLOCZ(s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
684 CHECKED_ALLOCZ(s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
685 CHECKED_ALLOCZ(s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
686 CHECKED_ALLOCZ(s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
687 CHECKED_ALLOCZ(s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t))
688 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
689 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
690 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
691 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
692 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
693 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
695 if(s->msmpeg4_version){
696 CHECKED_ALLOCZ(s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int));
698 CHECKED_ALLOCZ(s->avctx->stats_out, 256);
700 /* Allocate MB type table */
701 CHECKED_ALLOCZ(s->mb_type , mb_array_size * sizeof(uint16_t)) //needed for encoding
703 CHECKED_ALLOCZ(s->lambda_table, mb_array_size * sizeof(int))
705 CHECKED_ALLOCZ(s->q_intra_matrix, 64*32 * sizeof(int))
706 CHECKED_ALLOCZ(s->q_inter_matrix, 64*32 * sizeof(int))
707 CHECKED_ALLOCZ(s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t))
708 CHECKED_ALLOCZ(s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t))
709 CHECKED_ALLOCZ(s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
710 CHECKED_ALLOCZ(s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*))
712 if(s->avctx->noise_reduction){
713 CHECKED_ALLOCZ(s->dct_offset, 2 * 64 * sizeof(uint16_t))
716 CHECKED_ALLOCZ(s->picture, MAX_PICTURE_COUNT * sizeof(Picture))
718 CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t))
720 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
721 /* interlaced direct mode decoding tables */
726 CHECKED_ALLOCZ(s->b_field_mv_table_base[i][j][k] , mv_table_size * 2 * sizeof(int16_t))
727 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
729 CHECKED_ALLOCZ(s->b_field_select_table[i][j] , mb_array_size * 2 * sizeof(uint8_t))
730 CHECKED_ALLOCZ(s->p_field_mv_table_base[i][j] , mv_table_size * 2 * sizeof(int16_t))
731 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
733 CHECKED_ALLOCZ(s->p_field_select_table[i] , mb_array_size * 2 * sizeof(uint8_t))
736 if (s->out_format == FMT_H263) {
738 CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16);
739 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
740 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
741 s->ac_val[2] = s->ac_val[1] + c_size;
744 CHECKED_ALLOCZ(s->coded_block_base, y_size);
745 s->coded_block= s->coded_block_base + s->b8_stride + 1;
747 /* cbp, ac_pred, pred_dir */
748 CHECKED_ALLOCZ(s->cbp_table , mb_array_size * sizeof(uint8_t))
749 CHECKED_ALLOCZ(s->pred_dir_table, mb_array_size * sizeof(uint8_t))
752 if (s->h263_pred || s->h263_plus || !s->encoding) {
754 //MN: we need these for error resilience of intra-frames
755 CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t));
756 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
757 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
758 s->dc_val[2] = s->dc_val[1] + c_size;
759 for(i=0;i<yc_size;i++)
760 s->dc_val_base[i] = 1024;
763 /* which mb is a intra block */
764 CHECKED_ALLOCZ(s->mbintra_table, mb_array_size);
765 memset(s->mbintra_table, 1, mb_array_size);
767 /* init macroblock skip table */
768 CHECKED_ALLOCZ(s->mbskip_table, mb_array_size+2);
769 //Note the +1 is for a quicker mpeg4 slice_end detection
770 CHECKED_ALLOCZ(s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
772 s->parse_context.state= -1;
773 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
774 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
775 s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
776 s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH);
779 s->context_initialized = 1;
781 s->thread_context[0]= s;
782 for(i=1; i<s->avctx->thread_count; i++){
783 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
784 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
787 for(i=0; i<s->avctx->thread_count; i++){
788 if(init_duplicate_context(s->thread_context[i], s) < 0)
790 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
791 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
800 /* init common structure for both encoder and decoder */
801 void MPV_common_end(MpegEncContext *s)
805 for(i=0; i<s->avctx->thread_count; i++){
806 free_duplicate_context(s->thread_context[i]);
808 for(i=1; i<s->avctx->thread_count; i++){
809 av_freep(&s->thread_context[i]);
812 av_freep(&s->parse_context.buffer);
813 s->parse_context.buffer_size=0;
815 av_freep(&s->mb_type);
816 av_freep(&s->p_mv_table_base);
817 av_freep(&s->b_forw_mv_table_base);
818 av_freep(&s->b_back_mv_table_base);
819 av_freep(&s->b_bidir_forw_mv_table_base);
820 av_freep(&s->b_bidir_back_mv_table_base);
821 av_freep(&s->b_direct_mv_table_base);
823 s->b_forw_mv_table= NULL;
824 s->b_back_mv_table= NULL;
825 s->b_bidir_forw_mv_table= NULL;
826 s->b_bidir_back_mv_table= NULL;
827 s->b_direct_mv_table= NULL;
831 av_freep(&s->b_field_mv_table_base[i][j][k]);
832 s->b_field_mv_table[i][j][k]=NULL;
834 av_freep(&s->b_field_select_table[i][j]);
835 av_freep(&s->p_field_mv_table_base[i][j]);
836 s->p_field_mv_table[i][j]=NULL;
838 av_freep(&s->p_field_select_table[i]);
841 av_freep(&s->dc_val_base);
842 av_freep(&s->ac_val_base);
843 av_freep(&s->coded_block_base);
844 av_freep(&s->mbintra_table);
845 av_freep(&s->cbp_table);
846 av_freep(&s->pred_dir_table);
848 av_freep(&s->mbskip_table);
849 av_freep(&s->prev_pict_types);
850 av_freep(&s->bitstream_buffer);
851 s->allocated_bitstream_buffer_size=0;
853 av_freep(&s->avctx->stats_out);
854 av_freep(&s->ac_stats);
855 av_freep(&s->error_status_table);
856 av_freep(&s->mb_index2xy);
857 av_freep(&s->lambda_table);
858 av_freep(&s->q_intra_matrix);
859 av_freep(&s->q_inter_matrix);
860 av_freep(&s->q_intra_matrix16);
861 av_freep(&s->q_inter_matrix16);
862 av_freep(&s->input_picture);
863 av_freep(&s->reordered_input_picture);
864 av_freep(&s->dct_offset);
867 for(i=0; i<MAX_PICTURE_COUNT; i++){
868 free_picture(s, &s->picture[i]);
871 av_freep(&s->picture);
872 s->context_initialized = 0;
875 s->current_picture_ptr= NULL;
876 s->linesize= s->uvlinesize= 0;
879 av_freep(&s->visualization_buffer[i]);
881 avcodec_default_free_buffers(s->avctx);
884 #ifdef CONFIG_ENCODERS
886 /* init video encoder */
887 int MPV_encode_init(AVCodecContext *avctx)
889 MpegEncContext *s = avctx->priv_data;
891 int chroma_h_shift, chroma_v_shift;
893 MPV_encode_defaults(s);
895 if(avctx->pix_fmt != PIX_FMT_YUVJ420P && avctx->pix_fmt != PIX_FMT_YUV420P){
896 av_log(avctx, AV_LOG_ERROR, "only YUV420 is supported\n");
900 if(avctx->codec_id == CODEC_ID_MJPEG || avctx->codec_id == CODEC_ID_LJPEG){
901 if(avctx->strict_std_compliance>=0 && avctx->pix_fmt != PIX_FMT_YUVJ420P){
902 av_log(avctx, AV_LOG_ERROR, "colorspace not supported in jpeg\n");
906 if(avctx->strict_std_compliance>=0 && avctx->pix_fmt != PIX_FMT_YUV420P){
907 av_log(avctx, AV_LOG_ERROR, "colorspace not supported\n");
912 s->bit_rate = avctx->bit_rate;
913 s->width = avctx->width;
914 s->height = avctx->height;
915 if(avctx->gop_size > 600){
916 av_log(avctx, AV_LOG_ERROR, "Warning keyframe interval too large! reducing it ...\n");
919 s->gop_size = avctx->gop_size;
921 s->flags= avctx->flags;
922 s->flags2= avctx->flags2;
923 s->max_b_frames= avctx->max_b_frames;
924 s->codec_id= avctx->codec->id;
925 s->luma_elim_threshold = avctx->luma_elim_threshold;
926 s->chroma_elim_threshold= avctx->chroma_elim_threshold;
927 s->strict_std_compliance= avctx->strict_std_compliance;
928 s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
929 s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
930 s->mpeg_quant= avctx->mpeg_quant;
931 s->rtp_mode= !!avctx->rtp_payload_size;
932 s->intra_dc_precision= avctx->intra_dc_precision;
933 s->user_specified_pts = AV_NOPTS_VALUE;
935 if (s->gop_size <= 1) {
942 s->me_method = avctx->me_method;
945 s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
947 s->adaptive_quant= ( s->avctx->lumi_masking
948 || s->avctx->dark_masking
949 || s->avctx->temporal_cplx_masking
950 || s->avctx->spatial_cplx_masking
951 || s->avctx->p_masking
952 || s->avctx->border_masking
953 || (s->flags&CODEC_FLAG_QP_RD))
956 s->obmc= !!(s->flags & CODEC_FLAG_OBMC);
957 s->loop_filter= !!(s->flags & CODEC_FLAG_LOOP_FILTER);
958 s->alternate_scan= !!(s->flags & CODEC_FLAG_ALT_SCAN);
960 if(avctx->rc_max_rate && !avctx->rc_buffer_size){
961 av_log(avctx, AV_LOG_ERROR, "a vbv buffer size is needed, for encoding with a maximum bitrate\n");
965 if(avctx->rc_min_rate && avctx->rc_max_rate != avctx->rc_min_rate){
966 av_log(avctx, AV_LOG_INFO, "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
969 if(avctx->rc_min_rate && avctx->rc_min_rate > avctx->bit_rate){
970 av_log(avctx, AV_LOG_INFO, "bitrate below min bitrate\n");
974 if(avctx->rc_max_rate && avctx->rc_max_rate < avctx->bit_rate){
975 av_log(avctx, AV_LOG_INFO, "bitrate above max bitrate\n");
979 if( s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate
980 && (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO)
981 && 90000LL * (avctx->rc_buffer_size-1) > s->avctx->rc_max_rate*0xFFFFLL){
983 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");
986 if((s->flags & CODEC_FLAG_4MV) && s->codec_id != CODEC_ID_MPEG4
987 && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P && s->codec_id != CODEC_ID_FLV1){
988 av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
992 if(s->obmc && s->avctx->mb_decision != FF_MB_DECISION_SIMPLE){
993 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with simple mb decision\n");
997 if(s->obmc && s->codec_id != CODEC_ID_H263 && s->codec_id != CODEC_ID_H263P){
998 av_log(avctx, AV_LOG_ERROR, "OBMC is only supported with H263(+)\n");
1002 if(s->quarter_sample && s->codec_id != CODEC_ID_MPEG4){
1003 av_log(avctx, AV_LOG_ERROR, "qpel not supported by codec\n");
1007 if(s->data_partitioning && s->codec_id != CODEC_ID_MPEG4){
1008 av_log(avctx, AV_LOG_ERROR, "data partitioning not supported by codec\n");
1012 if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){
1013 av_log(avctx, AV_LOG_ERROR, "b frames not supported by codec\n");
1017 if((s->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME|CODEC_FLAG_ALT_SCAN))
1018 && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG2VIDEO){
1019 av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
1023 if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too
1024 av_log(avctx, AV_LOG_ERROR, "mpeg2 style quantization not supported by codec\n");
1028 if((s->flags & CODEC_FLAG_CBP_RD) && !(s->flags & CODEC_FLAG_TRELLIS_QUANT)){
1029 av_log(avctx, AV_LOG_ERROR, "CBP RD needs trellis quant\n");
1033 if((s->flags & CODEC_FLAG_QP_RD) && s->avctx->mb_decision != FF_MB_DECISION_RD){
1034 av_log(avctx, AV_LOG_ERROR, "QP RD needs mbd=2\n");
1038 if(s->avctx->scenechange_threshold < 1000000000 && (s->flags & CODEC_FLAG_CLOSED_GOP)){
1039 av_log(avctx, AV_LOG_ERROR, "closed gop with scene change detection arent supported yet\n");
1043 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4
1044 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO
1045 && (s->codec_id != CODEC_ID_H263P || !(s->flags & CODEC_FLAG_H263P_SLICE_STRUCT))){
1046 av_log(avctx, AV_LOG_ERROR, "multi threaded encoding not supported by codec\n");
1050 if(s->avctx->thread_count > 1)
1053 if(!avctx->time_base.den || !avctx->time_base.num){
1054 av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
1058 i= (INT_MAX/2+128)>>8;
1059 if(avctx->me_threshold >= i){
1060 av_log(avctx, AV_LOG_ERROR, "me_threshold too large, max is %d\n", i - 1);
1063 if(avctx->mb_threshold >= i){
1064 av_log(avctx, AV_LOG_ERROR, "mb_threshold too large, max is %d\n", i - 1);
1068 i= ff_gcd(avctx->time_base.den, avctx->time_base.num);
1070 av_log(avctx, AV_LOG_INFO, "removing common factors from framerate\n");
1071 avctx->time_base.den /= i;
1072 avctx->time_base.num /= i;
1076 if(s->codec_id==CODEC_ID_MJPEG){
1077 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
1078 s->inter_quant_bias= 0;
1079 }else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){
1080 s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x
1081 s->inter_quant_bias= 0;
1083 s->intra_quant_bias=0;
1084 s->inter_quant_bias=-(1<<(QUANT_BIAS_SHIFT-2)); //(a - x/4)/x
1087 if(avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
1088 s->intra_quant_bias= avctx->intra_quant_bias;
1089 if(avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
1090 s->inter_quant_bias= avctx->inter_quant_bias;
1092 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_h_shift, &chroma_v_shift);
1094 if(avctx->codec_id == CODEC_ID_MPEG4 && s->avctx->time_base.den > (1<<16)-1){
1095 av_log(avctx, AV_LOG_ERROR, "timebase not supported by mpeg 4 standard\n");
1098 s->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1;
1100 switch(avctx->codec->id) {
1101 case CODEC_ID_MPEG1VIDEO:
1102 s->out_format = FMT_MPEG1;
1103 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1104 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1106 case CODEC_ID_MPEG2VIDEO:
1107 s->out_format = FMT_MPEG1;
1108 s->low_delay= 0; //s->max_b_frames ? 0 : 1;
1109 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1112 case CODEC_ID_LJPEG:
1113 case CODEC_ID_MJPEG:
1114 s->out_format = FMT_MJPEG;
1115 s->intra_only = 1; /* force intra only for jpeg */
1116 s->mjpeg_write_tables = 1; /* write all tables */
1117 s->mjpeg_data_only_frames = 0; /* write all the needed headers */
1118 s->mjpeg_vsample[0] = 1<<chroma_v_shift;
1119 s->mjpeg_vsample[1] = 1;
1120 s->mjpeg_vsample[2] = 1;
1121 s->mjpeg_hsample[0] = 1<<chroma_h_shift;
1122 s->mjpeg_hsample[1] = 1;
1123 s->mjpeg_hsample[2] = 1;
1124 if (mjpeg_init(s) < 0)
1130 s->out_format = FMT_H261;
1135 if (h263_get_picture_format(s->width, s->height) == 7) {
1136 av_log(avctx, AV_LOG_INFO, "Input picture size isn't suitable for h263 codec! try h263+\n");
1139 s->out_format = FMT_H263;
1140 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1144 case CODEC_ID_H263P:
1145 s->out_format = FMT_H263;
1148 s->umvplus = (avctx->flags & CODEC_FLAG_H263P_UMV) ? 1:0;
1149 s->h263_aic= (avctx->flags & CODEC_FLAG_H263P_AIC) ? 1:0;
1150 s->modified_quant= s->h263_aic;
1151 s->alt_inter_vlc= (avctx->flags & CODEC_FLAG_H263P_AIV) ? 1:0;
1152 s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
1153 s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
1154 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1155 s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
1158 /* These are just to be sure */
1163 s->out_format = FMT_H263;
1164 s->h263_flv = 2; /* format = 1; 11-bit codes */
1165 s->unrestricted_mv = 1;
1166 s->rtp_mode=0; /* don't allow GOB */
1171 s->out_format = FMT_H263;
1176 s->out_format = FMT_H263;
1179 s->modified_quant=1;
1183 s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
1185 case CODEC_ID_MPEG4:
1186 s->out_format = FMT_H263;
1188 s->unrestricted_mv = 1;
1189 s->low_delay= s->max_b_frames ? 0 : 1;
1190 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
1192 case CODEC_ID_MSMPEG4V1:
1193 s->out_format = FMT_H263;
1194 s->h263_msmpeg4 = 1;
1196 s->unrestricted_mv = 1;
1197 s->msmpeg4_version= 1;
1201 case CODEC_ID_MSMPEG4V2:
1202 s->out_format = FMT_H263;
1203 s->h263_msmpeg4 = 1;
1205 s->unrestricted_mv = 1;
1206 s->msmpeg4_version= 2;
1210 case CODEC_ID_MSMPEG4V3:
1211 s->out_format = FMT_H263;
1212 s->h263_msmpeg4 = 1;
1214 s->unrestricted_mv = 1;
1215 s->msmpeg4_version= 3;
1216 s->flipflop_rounding=1;
1221 s->out_format = FMT_H263;
1222 s->h263_msmpeg4 = 1;
1224 s->unrestricted_mv = 1;
1225 s->msmpeg4_version= 4;
1226 s->flipflop_rounding=1;
1231 s->out_format = FMT_H263;
1232 s->h263_msmpeg4 = 1;
1234 s->unrestricted_mv = 1;
1235 s->msmpeg4_version= 5;
1236 s->flipflop_rounding=1;
1244 avctx->has_b_frames= !s->low_delay;
1249 if (MPV_common_init(s) < 0)
1252 if(s->modified_quant)
1253 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
1254 s->progressive_frame=
1255 s->progressive_sequence= !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME));
1256 s->quant_precision=5;
1258 ff_set_cmp(&s->dsp, s->dsp.ildct_cmp, s->avctx->ildct_cmp);
1259 ff_set_cmp(&s->dsp, s->dsp.frame_skip_cmp, s->avctx->frame_skip_cmp);
1261 #ifdef CONFIG_H261_ENCODER
1262 if (s->out_format == FMT_H261)
1263 ff_h261_encode_init(s);
1265 if (s->out_format == FMT_H263)
1266 h263_encode_init(s);
1267 if(s->msmpeg4_version)
1268 ff_msmpeg4_encode_init(s);
1269 if (s->out_format == FMT_MPEG1)
1270 ff_mpeg1_encode_init(s);
1274 int j= s->dsp.idct_permutation[i];
1275 if(s->codec_id==CODEC_ID_MPEG4 && s->mpeg_quant){
1276 s->intra_matrix[j] = ff_mpeg4_default_intra_matrix[i];
1277 s->inter_matrix[j] = ff_mpeg4_default_non_intra_matrix[i];
1278 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1279 s->intra_matrix[j] =
1280 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1283 s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i];
1284 s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i];
1286 if(s->avctx->intra_matrix)
1287 s->intra_matrix[j] = s->avctx->intra_matrix[i];
1288 if(s->avctx->inter_matrix)
1289 s->inter_matrix[j] = s->avctx->inter_matrix[i];
1292 /* precompute matrix */
1293 /* for mjpeg, we do include qscale in the matrix */
1294 if (s->out_format != FMT_MJPEG) {
1295 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
1296 s->intra_matrix, s->intra_quant_bias, avctx->qmin, 31, 1);
1297 convert_matrix(&s->dsp, s->q_inter_matrix, s->q_inter_matrix16,
1298 s->inter_matrix, s->inter_quant_bias, avctx->qmin, 31, 0);
1301 if(ff_rate_control_init(s) < 0)
1307 int MPV_encode_end(AVCodecContext *avctx)
1309 MpegEncContext *s = avctx->priv_data;
1315 ff_rate_control_uninit(s);
1318 if (s->out_format == FMT_MJPEG)
1321 av_freep(&avctx->extradata);
1326 #endif //CONFIG_ENCODERS
1328 void init_rl(RLTable *rl, int use_static)
1330 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
1331 uint8_t index_run[MAX_RUN+1];
1332 int last, run, level, start, end, i;
1334 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1335 if(use_static && rl->max_level[0])
1338 /* compute max_level[], max_run[] and index_run[] */
1339 for(last=0;last<2;last++) {
1348 memset(max_level, 0, MAX_RUN + 1);
1349 memset(max_run, 0, MAX_LEVEL + 1);
1350 memset(index_run, rl->n, MAX_RUN + 1);
1351 for(i=start;i<end;i++) {
1352 run = rl->table_run[i];
1353 level = rl->table_level[i];
1354 if (index_run[run] == rl->n)
1356 if (level > max_level[run])
1357 max_level[run] = level;
1358 if (run > max_run[level])
1359 max_run[level] = run;
1362 rl->max_level[last] = av_mallocz_static(MAX_RUN + 1);
1364 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1365 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1367 rl->max_run[last] = av_mallocz_static(MAX_LEVEL + 1);
1369 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1370 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1372 rl->index_run[last] = av_mallocz_static(MAX_RUN + 1);
1374 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1375 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1379 /* draw the edges of width 'w' of an image of size width, height */
1380 //FIXME check that this is ok for mpeg4 interlaced
1381 static void draw_edges_c(uint8_t *buf, int wrap, int width, int height, int w)
1383 uint8_t *ptr, *last_line;
1386 last_line = buf + (height - 1) * wrap;
1388 /* top and bottom */
1389 memcpy(buf - (i + 1) * wrap, buf, width);
1390 memcpy(last_line + (i + 1) * wrap, last_line, width);
1392 /* left and right */
1394 for(i=0;i<height;i++) {
1395 memset(ptr - w, ptr[0], w);
1396 memset(ptr + width, ptr[width-1], w);
1401 memset(buf - (i + 1) * wrap - w, buf[0], w); /* top left */
1402 memset(buf - (i + 1) * wrap + width, buf[width-1], w); /* top right */
1403 memset(last_line + (i + 1) * wrap - w, last_line[0], w); /* top left */
1404 memset(last_line + (i + 1) * wrap + width, last_line[width-1], w); /* top right */
1408 int ff_find_unused_picture(MpegEncContext *s, int shared){
1412 for(i=0; i<MAX_PICTURE_COUNT; i++){
1413 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
1416 for(i=0; i<MAX_PICTURE_COUNT; i++){
1417 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
1419 for(i=0; i<MAX_PICTURE_COUNT; i++){
1420 if(s->picture[i].data[0]==NULL) return i;
1428 static void update_noise_reduction(MpegEncContext *s){
1431 for(intra=0; intra<2; intra++){
1432 if(s->dct_count[intra] > (1<<16)){
1433 for(i=0; i<64; i++){
1434 s->dct_error_sum[intra][i] >>=1;
1436 s->dct_count[intra] >>= 1;
1439 for(i=0; i<64; i++){
1440 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);
1446 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1448 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1454 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1456 /* mark&release old frames */
1457 if (s->pict_type != B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1458 avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
1460 /* release forgotten pictures */
1461 /* if(mpeg124/h263) */
1463 for(i=0; i<MAX_PICTURE_COUNT; i++){
1464 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1465 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1466 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
1473 /* release non refernce frames */
1474 for(i=0; i<MAX_PICTURE_COUNT; i++){
1475 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1476 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1480 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1481 pic= (AVFrame*)s->current_picture_ptr; //we allready have a unused image (maybe it was set before reading the header)
1483 i= ff_find_unused_picture(s, 0);
1484 pic= (AVFrame*)&s->picture[i];
1487 pic->reference= (s->pict_type != B_TYPE || s->codec_id == CODEC_ID_H264)
1488 && !s->dropable ? 3 : 0;
1490 pic->coded_picture_number= s->coded_picture_number++;
1492 if( alloc_picture(s, (Picture*)pic, 0) < 0)
1495 s->current_picture_ptr= (Picture*)pic;
1496 s->current_picture_ptr->top_field_first= s->top_field_first; //FIXME use only the vars from current_pic
1497 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1500 s->current_picture_ptr->pict_type= s->pict_type;
1501 // if(s->flags && CODEC_FLAG_QSCALE)
1502 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1503 s->current_picture_ptr->key_frame= s->pict_type == I_TYPE;
1505 copy_picture(&s->current_picture, s->current_picture_ptr);
1507 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1508 if (s->pict_type != B_TYPE) {
1509 s->last_picture_ptr= s->next_picture_ptr;
1511 s->next_picture_ptr= s->current_picture_ptr;
1513 /* 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,
1514 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1515 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1516 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1517 s->pict_type, s->dropable);*/
1519 if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr);
1520 if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr);
1522 if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){
1523 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1524 assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
1528 assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1530 if(s->picture_structure!=PICT_FRAME){
1533 if(s->picture_structure == PICT_BOTTOM_FIELD){
1534 s->current_picture.data[i] += s->current_picture.linesize[i];
1536 s->current_picture.linesize[i] *= 2;
1537 s->last_picture.linesize[i] *=2;
1538 s->next_picture.linesize[i] *=2;
1543 s->hurry_up= s->avctx->hurry_up;
1544 s->error_resilience= avctx->error_resilience;
1546 /* set dequantizer, we cant do it during init as it might change for mpeg4
1547 and we cant do it in the header decode as init isnt called for mpeg4 there yet */
1548 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1549 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1550 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1551 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1552 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1553 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1555 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1556 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1559 if(s->dct_error_sum){
1560 assert(s->avctx->noise_reduction && s->encoding);
1562 update_noise_reduction(s);
1566 if(s->avctx->xvmc_acceleration)
1567 return XVMC_field_start(s, avctx);
1572 /* generic function for encode/decode called after a frame has been coded/decoded */
1573 void MPV_frame_end(MpegEncContext *s)
1576 /* draw edge for correct motion prediction if outside */
1578 //just to make sure that all data is rendered.
1579 if(s->avctx->xvmc_acceleration){
1583 if(s->unrestricted_mv && s->current_picture.reference && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1584 draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH );
1585 draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1586 draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2);
1590 s->last_pict_type = s->pict_type;
1591 if(s->pict_type!=B_TYPE){
1592 s->last_non_b_pict_type= s->pict_type;
1595 /* copy back current_picture variables */
1596 for(i=0; i<MAX_PICTURE_COUNT; i++){
1597 if(s->picture[i].data[0] == s->current_picture.data[0]){
1598 s->picture[i]= s->current_picture;
1602 assert(i<MAX_PICTURE_COUNT);
1606 /* release non refernce frames */
1607 for(i=0; i<MAX_PICTURE_COUNT; i++){
1608 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1609 s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
1613 // clear copies, to avoid confusion
1615 memset(&s->last_picture, 0, sizeof(Picture));
1616 memset(&s->next_picture, 0, sizeof(Picture));
1617 memset(&s->current_picture, 0, sizeof(Picture));
1619 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1623 * draws an line from (ex, ey) -> (sx, sy).
1624 * @param w width of the image
1625 * @param h height of the image
1626 * @param stride stride/linesize of the image
1627 * @param color color of the arrow
1629 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1632 sx= clip(sx, 0, w-1);
1633 sy= clip(sy, 0, h-1);
1634 ex= clip(ex, 0, w-1);
1635 ey= clip(ey, 0, h-1);
1637 buf[sy*stride + sx]+= color;
1639 if(ABS(ex - sx) > ABS(ey - sy)){
1644 buf+= sx + sy*stride;
1646 f= ((ey-sy)<<16)/ex;
1647 for(x= 0; x <= ex; x++){
1650 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1651 buf[(y+1)*stride + x]+= (color* fr )>>16;
1658 buf+= sx + sy*stride;
1660 if(ey) f= ((ex-sx)<<16)/ey;
1662 for(y= 0; y <= ey; y++){
1665 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;;
1666 buf[y*stride + x+1]+= (color* fr )>>16;;
1672 * draws an arrow from (ex, ey) -> (sx, sy).
1673 * @param w width of the image
1674 * @param h height of the image
1675 * @param stride stride/linesize of the image
1676 * @param color color of the arrow
1678 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1681 sx= clip(sx, -100, w+100);
1682 sy= clip(sy, -100, h+100);
1683 ex= clip(ex, -100, w+100);
1684 ey= clip(ey, -100, h+100);
1689 if(dx*dx + dy*dy > 3*3){
1692 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1694 //FIXME subpixel accuracy
1695 rx= ROUNDED_DIV(rx*3<<4, length);
1696 ry= ROUNDED_DIV(ry*3<<4, length);
1698 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1699 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1701 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1705 * prints debuging info for the given picture.
1707 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1709 if(!pict || !pict->mb_type) return;
1711 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1714 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1715 switch (pict->pict_type) {
1716 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1717 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1718 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1719 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1720 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1721 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1723 for(y=0; y<s->mb_height; y++){
1724 for(x=0; x<s->mb_width; x++){
1725 if(s->avctx->debug&FF_DEBUG_SKIP){
1726 int count= s->mbskip_table[x + y*s->mb_stride];
1727 if(count>9) count=9;
1728 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1730 if(s->avctx->debug&FF_DEBUG_QP){
1731 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1733 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1734 int mb_type= pict->mb_type[x + y*s->mb_stride];
1735 //Type & MV direction
1737 av_log(s->avctx, AV_LOG_DEBUG, "P");
1738 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1739 av_log(s->avctx, AV_LOG_DEBUG, "A");
1740 else if(IS_INTRA4x4(mb_type))
1741 av_log(s->avctx, AV_LOG_DEBUG, "i");
1742 else if(IS_INTRA16x16(mb_type))
1743 av_log(s->avctx, AV_LOG_DEBUG, "I");
1744 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1745 av_log(s->avctx, AV_LOG_DEBUG, "d");
1746 else if(IS_DIRECT(mb_type))
1747 av_log(s->avctx, AV_LOG_DEBUG, "D");
1748 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1749 av_log(s->avctx, AV_LOG_DEBUG, "g");
1750 else if(IS_GMC(mb_type))
1751 av_log(s->avctx, AV_LOG_DEBUG, "G");
1752 else if(IS_SKIP(mb_type))
1753 av_log(s->avctx, AV_LOG_DEBUG, "S");
1754 else if(!USES_LIST(mb_type, 1))
1755 av_log(s->avctx, AV_LOG_DEBUG, ">");
1756 else if(!USES_LIST(mb_type, 0))
1757 av_log(s->avctx, AV_LOG_DEBUG, "<");
1759 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1760 av_log(s->avctx, AV_LOG_DEBUG, "X");
1765 av_log(s->avctx, AV_LOG_DEBUG, "+");
1766 else if(IS_16X8(mb_type))
1767 av_log(s->avctx, AV_LOG_DEBUG, "-");
1768 else if(IS_8X16(mb_type))
1769 av_log(s->avctx, AV_LOG_DEBUG, "¦");
1770 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1771 av_log(s->avctx, AV_LOG_DEBUG, " ");
1773 av_log(s->avctx, AV_LOG_DEBUG, "?");
1776 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264)
1777 av_log(s->avctx, AV_LOG_DEBUG, "=");
1779 av_log(s->avctx, AV_LOG_DEBUG, " ");
1781 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1783 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1787 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1788 const int shift= 1 + s->quarter_sample;
1792 int h_chroma_shift, v_chroma_shift;
1793 const int width = s->avctx->width;
1794 const int height= s->avctx->height;
1795 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1796 const int mv_stride= (s->mb_width << mv_sample_log2) + 1;
1797 s->low_delay=0; //needed to see the vectors without trashing the buffers
1799 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1801 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1802 pict->data[i]= s->visualization_buffer[i];
1804 pict->type= FF_BUFFER_TYPE_COPY;
1807 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1809 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1810 const int mb_index= mb_x + mb_y*s->mb_stride;
1811 if((s->avctx->debug_mv) && pict->motion_val){
1813 for(type=0; type<3; type++){
1816 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1820 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1824 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1829 if(!USES_LIST(pict->mb_type[mb_index], direction))
1832 if(IS_8X8(pict->mb_type[mb_index])){
1835 int sx= mb_x*16 + 4 + 8*(i&1);
1836 int sy= mb_y*16 + 4 + 8*(i>>1);
1837 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1838 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1839 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1840 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1842 }else if(IS_16X8(pict->mb_type[mb_index])){
1846 int sy=mb_y*16 + 4 + 8*i;
1847 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1848 int mx=(pict->motion_val[direction][xy][0]>>shift);
1849 int my=(pict->motion_val[direction][xy][1]>>shift);
1851 if(IS_INTERLACED(pict->mb_type[mb_index]))
1854 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1856 }else if(IS_8X16(pict->mb_type[mb_index])){
1859 int sx=mb_x*16 + 4 + 8*i;
1861 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1862 int mx=(pict->motion_val[direction][xy][0]>>shift);
1863 int my=(pict->motion_val[direction][xy][1]>>shift);
1865 if(IS_INTERLACED(pict->mb_type[mb_index]))
1868 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1871 int sx= mb_x*16 + 8;
1872 int sy= mb_y*16 + 8;
1873 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1874 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1875 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1876 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1880 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1881 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1884 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c;
1885 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c;
1888 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1889 int mb_type= pict->mb_type[mb_index];
1892 #define COLOR(theta, r)\
1893 u= (int)(128 + r*cos(theta*3.141592/180));\
1894 v= (int)(128 + r*sin(theta*3.141592/180));
1898 if(IS_PCM(mb_type)){
1900 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1902 }else if(IS_INTRA4x4(mb_type)){
1904 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1906 }else if(IS_DIRECT(mb_type)){
1908 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1910 }else if(IS_GMC(mb_type)){
1912 }else if(IS_SKIP(mb_type)){
1914 }else if(!USES_LIST(mb_type, 1)){
1916 }else if(!USES_LIST(mb_type, 0)){
1919 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1923 u*= 0x0101010101010101ULL;
1924 v*= 0x0101010101010101ULL;
1926 *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u;
1927 *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v;
1931 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1932 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1933 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1935 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1937 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1939 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1940 int dm= 1 << (mv_sample_log2-2);
1942 int sx= mb_x*16 + 8*(i&1);
1943 int sy= mb_y*16 + 8*(i>>1);
1944 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1946 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1947 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1949 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1950 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1951 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1955 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1959 s->mbskip_table[mb_index]=0;
1965 #ifdef CONFIG_ENCODERS
1967 static int get_sae(uint8_t *src, int ref, int stride){
1971 for(y=0; y<16; y++){
1972 for(x=0; x<16; x++){
1973 acc+= ABS(src[x+y*stride] - ref);
1980 static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride){
1987 for(y=0; y<h; y+=16){
1988 for(x=0; x<w; x+=16){
1989 int offset= x + y*stride;
1990 int sad = s->dsp.sad[0](NULL, src + offset, ref + offset, stride, 16);
1991 int mean= (s->dsp.pix_sum(src + offset, stride) + 128)>>8;
1992 int sae = get_sae(src + offset, mean, stride);
1994 acc+= sae + 500 < sad;
2001 static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){
2005 const int encoding_delay= s->max_b_frames;
2010 pic_arg->display_picture_number= s->input_picture_number++;
2012 if(pts != AV_NOPTS_VALUE){
2013 if(s->user_specified_pts != AV_NOPTS_VALUE){
2015 int64_t last= s->user_specified_pts;
2018 av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%Ld, last=%Ld\n", pts, s->user_specified_pts);
2022 s->user_specified_pts= pts;
2024 if(s->user_specified_pts != AV_NOPTS_VALUE){
2025 s->user_specified_pts=
2026 pts= s->user_specified_pts + 1;
2027 av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pts);
2029 pts= pic_arg->display_picture_number;
2035 if(encoding_delay && !(s->flags&CODEC_FLAG_INPUT_PRESERVED)) direct=0;
2036 if(pic_arg->linesize[0] != s->linesize) direct=0;
2037 if(pic_arg->linesize[1] != s->uvlinesize) direct=0;
2038 if(pic_arg->linesize[2] != s->uvlinesize) direct=0;
2040 // av_log(AV_LOG_DEBUG, "%d %d %d %d\n",pic_arg->linesize[0], pic_arg->linesize[1], s->linesize, s->uvlinesize);
2043 i= ff_find_unused_picture(s, 1);
2045 pic= (AVFrame*)&s->picture[i];
2049 pic->data[i]= pic_arg->data[i];
2050 pic->linesize[i]= pic_arg->linesize[i];
2052 alloc_picture(s, (Picture*)pic, 1);
2055 i= ff_find_unused_picture(s, 0);
2057 pic= (AVFrame*)&s->picture[i];
2060 alloc_picture(s, (Picture*)pic, 0);
2062 if( pic->data[0] + offset == pic_arg->data[0]
2063 && pic->data[1] + offset == pic_arg->data[1]
2064 && pic->data[2] + offset == pic_arg->data[2]){
2067 int h_chroma_shift, v_chroma_shift;
2068 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
2071 int src_stride= pic_arg->linesize[i];
2072 int dst_stride= i ? s->uvlinesize : s->linesize;
2073 int h_shift= i ? h_chroma_shift : 0;
2074 int v_shift= i ? v_chroma_shift : 0;
2075 int w= s->width >>h_shift;
2076 int h= s->height>>v_shift;
2077 uint8_t *src= pic_arg->data[i];
2078 uint8_t *dst= pic->data[i] + offset;
2080 if(src_stride==dst_stride)
2081 memcpy(dst, src, src_stride*h);
2084 memcpy(dst, src, w);
2092 copy_picture_attributes(s, pic, pic_arg);
2093 pic->pts= pts; //we set this here to avoid modifiying pic_arg
2096 /* shift buffer entries */
2097 for(i=1; i<MAX_PICTURE_COUNT /*s->encoding_delay+1*/; i++)
2098 s->input_picture[i-1]= s->input_picture[i];
2100 s->input_picture[encoding_delay]= (Picture*)pic;
2105 static int skip_check(MpegEncContext *s, Picture *p, Picture *ref){
2110 for(plane=0; plane<3; plane++){
2111 const int stride= p->linesize[plane];
2112 const int bw= plane ? 1 : 2;
2113 for(y=0; y<s->mb_height*bw; y++){
2114 for(x=0; x<s->mb_width*bw; x++){
2115 int v= s->dsp.frame_skip_cmp[1](s, p->data[plane] + 8*(x + y*stride), ref->data[plane] + 8*(x + y*stride), stride, 8);
2117 switch(s->avctx->frame_skip_exp){
2118 case 0: score= FFMAX(score, v); break;
2119 case 1: score+= ABS(v);break;
2120 case 2: score+= v*v;break;
2121 case 3: score64+= ABS(v*v*(int64_t)v);break;
2122 case 4: score64+= v*v*(int64_t)(v*v);break;
2128 if(score) score64= score;
2130 if(score64 < s->avctx->frame_skip_threshold)
2132 if(score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda)>>8))
2137 static void select_input_picture(MpegEncContext *s){
2140 for(i=1; i<MAX_PICTURE_COUNT; i++)
2141 s->reordered_input_picture[i-1]= s->reordered_input_picture[i];
2142 s->reordered_input_picture[MAX_PICTURE_COUNT-1]= NULL;
2144 /* set next picture types & ordering */
2145 if(s->reordered_input_picture[0]==NULL && s->input_picture[0]){
2146 if(/*s->picture_in_gop_number >= s->gop_size ||*/ s->next_picture_ptr==NULL || s->intra_only){
2147 s->reordered_input_picture[0]= s->input_picture[0];
2148 s->reordered_input_picture[0]->pict_type= I_TYPE;
2149 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2153 if(s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor){
2154 if(skip_check(s, s->input_picture[0], s->next_picture_ptr)){
2155 //av_log(NULL, AV_LOG_DEBUG, "skip %p %Ld\n", s->input_picture[0]->data[0], s->input_picture[0]->pts);
2157 if(s->input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2159 s->input_picture[0]->data[i]= NULL;
2160 s->input_picture[0]->type= 0;
2162 assert( s->input_picture[0]->type==FF_BUFFER_TYPE_USER
2163 || s->input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2165 s->avctx->release_buffer(s->avctx, (AVFrame*)s->input_picture[0]);
2172 if(s->flags&CODEC_FLAG_PASS2){
2173 for(i=0; i<s->max_b_frames+1; i++){
2174 int pict_num= s->input_picture[0]->display_picture_number + i;
2176 if(pict_num >= s->rc_context.num_entries)
2178 if(!s->input_picture[i]){
2179 s->rc_context.entry[pict_num-1].new_pict_type = P_TYPE;
2183 s->input_picture[i]->pict_type=
2184 s->rc_context.entry[pict_num].new_pict_type;
2188 if(s->avctx->b_frame_strategy==0){
2189 b_frames= s->max_b_frames;
2190 while(b_frames && !s->input_picture[b_frames]) b_frames--;
2191 }else if(s->avctx->b_frame_strategy==1){
2192 for(i=1; i<s->max_b_frames+1; i++){
2193 if(s->input_picture[i] && s->input_picture[i]->b_frame_score==0){
2194 s->input_picture[i]->b_frame_score=
2195 get_intra_count(s, s->input_picture[i ]->data[0],
2196 s->input_picture[i-1]->data[0], s->linesize) + 1;
2199 for(i=0; i<s->max_b_frames; i++){
2200 if(s->input_picture[i]==NULL || s->input_picture[i]->b_frame_score - 1 > s->mb_num/40) break;
2203 b_frames= FFMAX(0, i-1);
2206 for(i=0; i<b_frames+1; i++){
2207 s->input_picture[i]->b_frame_score=0;
2210 av_log(s->avctx, AV_LOG_ERROR, "illegal b frame strategy\n");
2215 //static int b_count=0;
2216 //b_count+= b_frames;
2217 //av_log(s->avctx, AV_LOG_DEBUG, "b_frames: %d\n", b_count);
2219 for(i= b_frames - 1; i>=0; i--){
2220 int type= s->input_picture[i]->pict_type;
2221 if(type && type != B_TYPE)
2224 if(s->input_picture[b_frames]->pict_type == B_TYPE && b_frames == s->max_b_frames){
2225 av_log(s->avctx, AV_LOG_ERROR, "warning, too many b frames in a row\n");
2228 if(s->picture_in_gop_number + b_frames >= s->gop_size){
2229 if((s->flags2 & CODEC_FLAG2_STRICT_GOP) && s->gop_size > s->picture_in_gop_number){
2230 b_frames= s->gop_size - s->picture_in_gop_number - 1;
2232 if(s->flags & CODEC_FLAG_CLOSED_GOP)
2234 s->input_picture[b_frames]->pict_type= I_TYPE;
2238 if( (s->flags & CODEC_FLAG_CLOSED_GOP)
2240 && s->input_picture[b_frames]->pict_type== I_TYPE)
2243 s->reordered_input_picture[0]= s->input_picture[b_frames];
2244 if(s->reordered_input_picture[0]->pict_type != I_TYPE)
2245 s->reordered_input_picture[0]->pict_type= P_TYPE;
2246 s->reordered_input_picture[0]->coded_picture_number= s->coded_picture_number++;
2247 for(i=0; i<b_frames; i++){
2248 s->reordered_input_picture[i+1]= s->input_picture[i];
2249 s->reordered_input_picture[i+1]->pict_type= B_TYPE;
2250 s->reordered_input_picture[i+1]->coded_picture_number= s->coded_picture_number++;
2255 if(s->reordered_input_picture[0]){
2256 s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0;
2258 copy_picture(&s->new_picture, s->reordered_input_picture[0]);
2260 if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){
2261 // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable
2263 int i= ff_find_unused_picture(s, 0);
2264 Picture *pic= &s->picture[i];
2266 /* mark us unused / free shared pic */
2268 s->reordered_input_picture[0]->data[i]= NULL;
2269 s->reordered_input_picture[0]->type= 0;
2271 pic->reference = s->reordered_input_picture[0]->reference;
2273 alloc_picture(s, pic, 0);
2275 copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]);
2277 s->current_picture_ptr= pic;
2279 // input is not a shared pix -> reuse buffer for current_pix
2281 assert( s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_USER
2282 || s->reordered_input_picture[0]->type==FF_BUFFER_TYPE_INTERNAL);
2284 s->current_picture_ptr= s->reordered_input_picture[0];
2286 s->new_picture.data[i]+=16;
2289 copy_picture(&s->current_picture, s->current_picture_ptr);
2291 s->picture_number= s->new_picture.display_picture_number;
2292 //printf("dpn:%d\n", s->picture_number);
2294 memset(&s->new_picture, 0, sizeof(Picture));
2298 int MPV_encode_picture(AVCodecContext *avctx,
2299 unsigned char *buf, int buf_size, void *data)
2301 MpegEncContext *s = avctx->priv_data;
2302 AVFrame *pic_arg = data;
2303 int i, stuffing_count;
2305 if(avctx->pix_fmt != PIX_FMT_YUV420P && avctx->pix_fmt != PIX_FMT_YUVJ420P){
2306 av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
2310 for(i=0; i<avctx->thread_count; i++){
2311 int start_y= s->thread_context[i]->start_mb_y;
2312 int end_y= s->thread_context[i]-> end_mb_y;
2313 int h= s->mb_height;
2314 uint8_t *start= buf + buf_size*start_y/h;
2315 uint8_t *end = buf + buf_size* end_y/h;
2317 init_put_bits(&s->thread_context[i]->pb, start, end - start);
2320 s->picture_in_gop_number++;
2322 if(load_input_picture(s, pic_arg) < 0)
2325 select_input_picture(s);
2328 if(s->new_picture.data[0]){
2329 s->pict_type= s->new_picture.pict_type;
2331 //printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
2332 MPV_frame_start(s, avctx);
2334 encode_picture(s, s->picture_number);
2336 avctx->real_pict_num = s->picture_number;
2337 avctx->header_bits = s->header_bits;
2338 avctx->mv_bits = s->mv_bits;
2339 avctx->misc_bits = s->misc_bits;
2340 avctx->i_tex_bits = s->i_tex_bits;
2341 avctx->p_tex_bits = s->p_tex_bits;
2342 avctx->i_count = s->i_count;
2343 avctx->p_count = s->mb_num - s->i_count - s->skip_count; //FIXME f/b_count in avctx
2344 avctx->skip_count = s->skip_count;
2348 if (s->out_format == FMT_MJPEG)
2349 mjpeg_picture_trailer(s);
2351 if(s->flags&CODEC_FLAG_PASS1)
2352 ff_write_pass1_stats(s);
2355 avctx->error[i] += s->current_picture_ptr->error[i];
2358 if(s->flags&CODEC_FLAG_PASS1)
2359 assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits + avctx->i_tex_bits + avctx->p_tex_bits == put_bits_count(&s->pb));
2360 flush_put_bits(&s->pb);
2361 s->frame_bits = put_bits_count(&s->pb);
2363 stuffing_count= ff_vbv_update(s, s->frame_bits);
2365 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < stuffing_count + 50){
2366 av_log(s->avctx, AV_LOG_ERROR, "stuffing too large\n");
2370 switch(s->codec_id){
2371 case CODEC_ID_MPEG1VIDEO:
2372 case CODEC_ID_MPEG2VIDEO:
2373 while(stuffing_count--){
2374 put_bits(&s->pb, 8, 0);
2377 case CODEC_ID_MPEG4:
2378 put_bits(&s->pb, 16, 0);
2379 put_bits(&s->pb, 16, 0x1C3);
2380 stuffing_count -= 4;
2381 while(stuffing_count--){
2382 put_bits(&s->pb, 8, 0xFF);
2386 av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
2388 flush_put_bits(&s->pb);
2389 s->frame_bits = put_bits_count(&s->pb);
2392 /* update mpeg1/2 vbv_delay for CBR */
2393 if(s->avctx->rc_max_rate && s->avctx->rc_min_rate == s->avctx->rc_max_rate && s->out_format == FMT_MPEG1
2394 && 90000LL * (avctx->rc_buffer_size-1) <= s->avctx->rc_max_rate*0xFFFFLL){
2397 assert(s->repeat_first_field==0);
2399 vbv_delay= lrintf(90000 * s->rc_context.buffer_index / s->avctx->rc_max_rate);
2400 assert(vbv_delay < 0xFFFF);
2402 s->vbv_delay_ptr[0] &= 0xF8;
2403 s->vbv_delay_ptr[0] |= vbv_delay>>13;
2404 s->vbv_delay_ptr[1] = vbv_delay>>5;
2405 s->vbv_delay_ptr[2] &= 0x07;
2406 s->vbv_delay_ptr[2] |= vbv_delay<<3;
2408 s->total_bits += s->frame_bits;
2409 avctx->frame_bits = s->frame_bits;
2411 assert((pbBufPtr(&s->pb) == s->pb.buf));
2414 assert((s->frame_bits&7)==0);
2416 return s->frame_bits/8;
2419 #endif //CONFIG_ENCODERS
2421 static inline void gmc1_motion(MpegEncContext *s,
2422 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2423 uint8_t **ref_picture)
2426 int offset, src_x, src_y, linesize, uvlinesize;
2427 int motion_x, motion_y;
2430 motion_x= s->sprite_offset[0][0];
2431 motion_y= s->sprite_offset[0][1];
2432 src_x = s->mb_x * 16 + (motion_x >> (s->sprite_warping_accuracy+1));
2433 src_y = s->mb_y * 16 + (motion_y >> (s->sprite_warping_accuracy+1));
2434 motion_x<<=(3-s->sprite_warping_accuracy);
2435 motion_y<<=(3-s->sprite_warping_accuracy);
2436 src_x = clip(src_x, -16, s->width);
2437 if (src_x == s->width)
2439 src_y = clip(src_y, -16, s->height);
2440 if (src_y == s->height)
2443 linesize = s->linesize;
2444 uvlinesize = s->uvlinesize;
2446 ptr = ref_picture[0] + (src_y * linesize) + src_x;
2448 if(s->flags&CODEC_FLAG_EMU_EDGE){
2449 if( (unsigned)src_x >= s->h_edge_pos - 17
2450 || (unsigned)src_y >= s->v_edge_pos - 17){
2451 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
2452 ptr= s->edge_emu_buffer;
2456 if((motion_x|motion_y)&7){
2457 s->dsp.gmc1(dest_y , ptr , linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2458 s->dsp.gmc1(dest_y+8, ptr+8, linesize, 16, motion_x&15, motion_y&15, 128 - s->no_rounding);
2462 dxy= ((motion_x>>3)&1) | ((motion_y>>2)&2);
2463 if (s->no_rounding){
2464 s->dsp.put_no_rnd_pixels_tab[0][dxy](dest_y, ptr, linesize, 16);
2466 s->dsp.put_pixels_tab [0][dxy](dest_y, ptr, linesize, 16);
2470 if(s->flags&CODEC_FLAG_GRAY) return;
2472 motion_x= s->sprite_offset[1][0];
2473 motion_y= s->sprite_offset[1][1];
2474 src_x = s->mb_x * 8 + (motion_x >> (s->sprite_warping_accuracy+1));
2475 src_y = s->mb_y * 8 + (motion_y >> (s->sprite_warping_accuracy+1));
2476 motion_x<<=(3-s->sprite_warping_accuracy);
2477 motion_y<<=(3-s->sprite_warping_accuracy);
2478 src_x = clip(src_x, -8, s->width>>1);
2479 if (src_x == s->width>>1)
2481 src_y = clip(src_y, -8, s->height>>1);
2482 if (src_y == s->height>>1)
2485 offset = (src_y * uvlinesize) + src_x;
2486 ptr = ref_picture[1] + offset;
2487 if(s->flags&CODEC_FLAG_EMU_EDGE){
2488 if( (unsigned)src_x >= (s->h_edge_pos>>1) - 9
2489 || (unsigned)src_y >= (s->v_edge_pos>>1) - 9){
2490 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);
2491 ptr= s->edge_emu_buffer;
2495 s->dsp.gmc1(dest_cb, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2497 ptr = ref_picture[2] + offset;
2499 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);
2500 ptr= s->edge_emu_buffer;
2502 s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
2507 static inline void gmc_motion(MpegEncContext *s,
2508 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2509 uint8_t **ref_picture)
2512 int linesize, uvlinesize;
2513 const int a= s->sprite_warping_accuracy;
2516 linesize = s->linesize;
2517 uvlinesize = s->uvlinesize;
2519 ptr = ref_picture[0];
2521 ox= s->sprite_offset[0][0] + s->sprite_delta[0][0]*s->mb_x*16 + s->sprite_delta[0][1]*s->mb_y*16;
2522 oy= s->sprite_offset[0][1] + s->sprite_delta[1][0]*s->mb_x*16 + s->sprite_delta[1][1]*s->mb_y*16;
2524 s->dsp.gmc(dest_y, ptr, linesize, 16,
2527 s->sprite_delta[0][0], s->sprite_delta[0][1],
2528 s->sprite_delta[1][0], s->sprite_delta[1][1],
2529 a+1, (1<<(2*a+1)) - s->no_rounding,
2530 s->h_edge_pos, s->v_edge_pos);
2531 s->dsp.gmc(dest_y+8, ptr, linesize, 16,
2532 ox + s->sprite_delta[0][0]*8,
2533 oy + s->sprite_delta[1][0]*8,
2534 s->sprite_delta[0][0], s->sprite_delta[0][1],
2535 s->sprite_delta[1][0], s->sprite_delta[1][1],
2536 a+1, (1<<(2*a+1)) - s->no_rounding,
2537 s->h_edge_pos, s->v_edge_pos);
2539 if(s->flags&CODEC_FLAG_GRAY) return;
2541 ox= s->sprite_offset[1][0] + s->sprite_delta[0][0]*s->mb_x*8 + s->sprite_delta[0][1]*s->mb_y*8;
2542 oy= s->sprite_offset[1][1] + s->sprite_delta[1][0]*s->mb_x*8 + s->sprite_delta[1][1]*s->mb_y*8;
2544 ptr = ref_picture[1];
2545 s->dsp.gmc(dest_cb, ptr, uvlinesize, 8,
2548 s->sprite_delta[0][0], s->sprite_delta[0][1],
2549 s->sprite_delta[1][0], s->sprite_delta[1][1],
2550 a+1, (1<<(2*a+1)) - s->no_rounding,
2551 s->h_edge_pos>>1, s->v_edge_pos>>1);
2553 ptr = ref_picture[2];
2554 s->dsp.gmc(dest_cr, ptr, uvlinesize, 8,
2557 s->sprite_delta[0][0], s->sprite_delta[0][1],
2558 s->sprite_delta[1][0], s->sprite_delta[1][1],
2559 a+1, (1<<(2*a+1)) - s->no_rounding,
2560 s->h_edge_pos>>1, s->v_edge_pos>>1);
2564 * Copies a rectangular area of samples to a temporary buffer and replicates the boarder samples.
2565 * @param buf destination buffer
2566 * @param src source buffer
2567 * @param linesize number of bytes between 2 vertically adjacent samples in both the source and destination buffers
2568 * @param block_w width of block
2569 * @param block_h height of block
2570 * @param src_x x coordinate of the top left sample of the block in the source buffer
2571 * @param src_y y coordinate of the top left sample of the block in the source buffer
2572 * @param w width of the source buffer
2573 * @param h height of the source buffer
2575 void ff_emulated_edge_mc(uint8_t *buf, uint8_t *src, int linesize, int block_w, int block_h,
2576 int src_x, int src_y, int w, int h){
2578 int start_y, start_x, end_y, end_x;
2581 src+= (h-1-src_y)*linesize;
2583 }else if(src_y<=-block_h){
2584 src+= (1-block_h-src_y)*linesize;
2590 }else if(src_x<=-block_w){
2591 src+= (1-block_w-src_x);
2595 start_y= FFMAX(0, -src_y);
2596 start_x= FFMAX(0, -src_x);
2597 end_y= FFMIN(block_h, h-src_y);
2598 end_x= FFMIN(block_w, w-src_x);
2600 // copy existing part
2601 for(y=start_y; y<end_y; y++){
2602 for(x=start_x; x<end_x; x++){
2603 buf[x + y*linesize]= src[x + y*linesize];
2608 for(y=0; y<start_y; y++){
2609 for(x=start_x; x<end_x; x++){
2610 buf[x + y*linesize]= buf[x + start_y*linesize];
2615 for(y=end_y; y<block_h; y++){
2616 for(x=start_x; x<end_x; x++){
2617 buf[x + y*linesize]= buf[x + (end_y-1)*linesize];
2621 for(y=0; y<block_h; y++){
2623 for(x=0; x<start_x; x++){
2624 buf[x + y*linesize]= buf[start_x + y*linesize];
2628 for(x=end_x; x<block_w; x++){
2629 buf[x + y*linesize]= buf[end_x - 1 + y*linesize];
2634 static inline int hpel_motion(MpegEncContext *s,
2635 uint8_t *dest, uint8_t *src,
2636 int field_based, int field_select,
2637 int src_x, int src_y,
2638 int width, int height, int stride,
2639 int h_edge_pos, int v_edge_pos,
2640 int w, int h, op_pixels_func *pix_op,
2641 int motion_x, int motion_y)
2646 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2647 src_x += motion_x >> 1;
2648 src_y += motion_y >> 1;
2650 /* WARNING: do no forget half pels */
2651 src_x = clip(src_x, -16, width); //FIXME unneeded for emu?
2654 src_y = clip(src_y, -16, height);
2655 if (src_y == height)
2657 src += src_y * stride + src_x;
2659 if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
2660 if( (unsigned)src_x > h_edge_pos - (motion_x&1) - w
2661 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2662 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2663 src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
2664 src= s->edge_emu_buffer;
2670 pix_op[dxy](dest, src, stride, h);
2674 static inline int hpel_motion_lowres(MpegEncContext *s,
2675 uint8_t *dest, uint8_t *src,
2676 int field_based, int field_select,
2677 int src_x, int src_y,
2678 int width, int height, int stride,
2679 int h_edge_pos, int v_edge_pos,
2680 int w, int h, h264_chroma_mc_func *pix_op,
2681 int motion_x, int motion_y)
2683 const int lowres= s->avctx->lowres;
2684 const int s_mask= (2<<lowres)-1;
2688 if(s->quarter_sample){
2693 sx= motion_x & s_mask;
2694 sy= motion_y & s_mask;
2695 src_x += motion_x >> (lowres+1);
2696 src_y += motion_y >> (lowres+1);
2698 src += src_y * stride + src_x;
2700 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
2701 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2702 ff_emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
2703 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2704 src= s->edge_emu_buffer;
2712 pix_op[lowres](dest, src, stride, h, sx, sy);
2716 /* apply one mpeg motion vector to the three components */
2717 static always_inline void mpeg_motion(MpegEncContext *s,
2718 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2719 int field_based, int bottom_field, int field_select,
2720 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
2721 int motion_x, int motion_y, int h)
2723 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2724 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, uvlinesize, linesize;
2727 if(s->quarter_sample)
2734 v_edge_pos = s->v_edge_pos >> field_based;
2735 linesize = s->current_picture.linesize[0] << field_based;
2736 uvlinesize = s->current_picture.linesize[1] << field_based;
2738 dxy = ((motion_y & 1) << 1) | (motion_x & 1);
2739 src_x = s->mb_x* 16 + (motion_x >> 1);
2740 src_y =(s->mb_y<<(4-field_based)) + (motion_y >> 1);
2742 if (s->out_format == FMT_H263) {
2743 if((s->workaround_bugs & FF_BUG_HPEL_CHROMA) && field_based){
2744 mx = (motion_x>>1)|(motion_x&1);
2746 uvdxy = ((my & 1) << 1) | (mx & 1);
2747 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2748 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2750 uvdxy = dxy | (motion_y & 2) | ((motion_x & 2) >> 1);
2754 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2758 uvsrc_x = s->mb_x*8 + mx;
2759 uvsrc_y = s->mb_y*8 + my;
2761 if(s->chroma_y_shift){
2764 uvdxy = ((my & 1) << 1) | (mx & 1);
2765 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2766 uvsrc_y = (s->mb_y<<(3-field_based)) + (my >> 1);
2768 if(s->chroma_x_shift){
2771 uvdxy = ((motion_y & 1) << 1) | (mx & 1);
2772 uvsrc_x = s->mb_x* 8 + (mx >> 1);
2783 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2784 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2785 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2787 if( (unsigned)src_x > s->h_edge_pos - (motion_x&1) - 16
2788 || (unsigned)src_y > v_edge_pos - (motion_y&1) - h){
2789 if(s->codec_id == CODEC_ID_MPEG2VIDEO ||
2790 s->codec_id == CODEC_ID_MPEG1VIDEO){
2791 av_log(s->avctx,AV_LOG_DEBUG,"MPEG motion vector out of boundary\n");
2794 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2795 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
2796 ptr_y = s->edge_emu_buffer;
2797 if(!(s->flags&CODEC_FLAG_GRAY)){
2798 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2799 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2800 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2801 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2802 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
2808 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2809 dest_y += s->linesize;
2810 dest_cb+= s->uvlinesize;
2811 dest_cr+= s->uvlinesize;
2815 ptr_y += s->linesize;
2816 ptr_cb+= s->uvlinesize;
2817 ptr_cr+= s->uvlinesize;
2820 pix_op[0][dxy](dest_y, ptr_y, linesize, h);
2822 if(!(s->flags&CODEC_FLAG_GRAY)){
2823 pix_op[s->chroma_x_shift][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift);
2824 pix_op[s->chroma_x_shift][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift);
2826 #if defined(CONFIG_H261_ENCODER) || defined(CONFIG_H261_DECODER)
2827 if(s->out_format == FMT_H261){
2828 ff_h261_loop_filter(s);
2833 /* apply one mpeg motion vector to the three components */
2834 static always_inline void mpeg_motion_lowres(MpegEncContext *s,
2835 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2836 int field_based, int bottom_field, int field_select,
2837 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
2838 int motion_x, int motion_y, int h)
2840 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2841 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
2842 const int lowres= s->avctx->lowres;
2843 const int block_s= 8>>lowres;
2844 const int s_mask= (2<<lowres)-1;
2845 const int h_edge_pos = s->h_edge_pos >> lowres;
2846 const int v_edge_pos = s->v_edge_pos >> lowres;
2847 linesize = s->current_picture.linesize[0] << field_based;
2848 uvlinesize = s->current_picture.linesize[1] << field_based;
2850 if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway
2856 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
2859 sx= motion_x & s_mask;
2860 sy= motion_y & s_mask;
2861 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
2862 src_y =(s->mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
2864 if (s->out_format == FMT_H263) {
2865 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
2866 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
2869 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
2872 uvsx = (2*mx) & s_mask;
2873 uvsy = (2*my) & s_mask;
2874 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
2875 uvsrc_y = s->mb_y*block_s + (my >> lowres);
2881 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2882 uvsrc_y =(s->mb_y*block_s>>field_based) + (my >> (lowres+1));
2885 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2886 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2887 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2889 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
2890 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
2891 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
2892 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
2893 ptr_y = s->edge_emu_buffer;
2894 if(!(s->flags&CODEC_FLAG_GRAY)){
2895 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
2896 ff_emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
2897 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2898 ff_emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
2899 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
2905 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
2906 dest_y += s->linesize;
2907 dest_cb+= s->uvlinesize;
2908 dest_cr+= s->uvlinesize;
2912 ptr_y += s->linesize;
2913 ptr_cb+= s->uvlinesize;
2914 ptr_cr+= s->uvlinesize;
2919 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
2921 if(!(s->flags&CODEC_FLAG_GRAY)){
2922 uvsx <<= 2 - lowres;
2923 uvsy <<= 2 - lowres;
2924 pix_op[lowres](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2925 pix_op[lowres](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2927 //FIXME h261 lowres loop filter
2930 //FIXME move to dsputil, avg variant, 16x16 version
2931 static inline void put_obmc(uint8_t *dst, uint8_t *src[5], int stride){
2933 uint8_t * const top = src[1];
2934 uint8_t * const left = src[2];
2935 uint8_t * const mid = src[0];
2936 uint8_t * const right = src[3];
2937 uint8_t * const bottom= src[4];
2938 #define OBMC_FILTER(x, t, l, m, r, b)\
2939 dst[x]= (t*top[x] + l*left[x] + m*mid[x] + r*right[x] + b*bottom[x] + 4)>>3
2940 #define OBMC_FILTER4(x, t, l, m, r, b)\
2941 OBMC_FILTER(x , t, l, m, r, b);\
2942 OBMC_FILTER(x+1 , t, l, m, r, b);\
2943 OBMC_FILTER(x +stride, t, l, m, r, b);\
2944 OBMC_FILTER(x+1+stride, t, l, m, r, b);
2947 OBMC_FILTER (x , 2, 2, 4, 0, 0);
2948 OBMC_FILTER (x+1, 2, 1, 5, 0, 0);
2949 OBMC_FILTER4(x+2, 2, 1, 5, 0, 0);
2950 OBMC_FILTER4(x+4, 2, 0, 5, 1, 0);
2951 OBMC_FILTER (x+6, 2, 0, 5, 1, 0);
2952 OBMC_FILTER (x+7, 2, 0, 4, 2, 0);
2954 OBMC_FILTER (x , 1, 2, 5, 0, 0);
2955 OBMC_FILTER (x+1, 1, 2, 5, 0, 0);
2956 OBMC_FILTER (x+6, 1, 0, 5, 2, 0);
2957 OBMC_FILTER (x+7, 1, 0, 5, 2, 0);
2959 OBMC_FILTER4(x , 1, 2, 5, 0, 0);
2960 OBMC_FILTER4(x+2, 1, 1, 6, 0, 0);
2961 OBMC_FILTER4(x+4, 1, 0, 6, 1, 0);
2962 OBMC_FILTER4(x+6, 1, 0, 5, 2, 0);
2964 OBMC_FILTER4(x , 0, 2, 5, 0, 1);
2965 OBMC_FILTER4(x+2, 0, 1, 6, 0, 1);
2966 OBMC_FILTER4(x+4, 0, 0, 6, 1, 1);
2967 OBMC_FILTER4(x+6, 0, 0, 5, 2, 1);
2969 OBMC_FILTER (x , 0, 2, 5, 0, 1);
2970 OBMC_FILTER (x+1, 0, 2, 5, 0, 1);
2971 OBMC_FILTER4(x+2, 0, 1, 5, 0, 2);
2972 OBMC_FILTER4(x+4, 0, 0, 5, 1, 2);
2973 OBMC_FILTER (x+6, 0, 0, 5, 2, 1);
2974 OBMC_FILTER (x+7, 0, 0, 5, 2, 1);
2976 OBMC_FILTER (x , 0, 2, 4, 0, 2);
2977 OBMC_FILTER (x+1, 0, 1, 5, 0, 2);
2978 OBMC_FILTER (x+6, 0, 0, 5, 1, 2);
2979 OBMC_FILTER (x+7, 0, 0, 4, 2, 2);
2982 /* obmc for 1 8x8 luma block */
2983 static inline void obmc_motion(MpegEncContext *s,
2984 uint8_t *dest, uint8_t *src,
2985 int src_x, int src_y,
2986 op_pixels_func *pix_op,
2987 int16_t mv[5][2]/* mid top left right bottom*/)
2993 assert(s->quarter_sample==0);
2996 if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
2999 ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
3000 hpel_motion(s, ptr[i], src, 0, 0,
3002 s->width, s->height, s->linesize,
3003 s->h_edge_pos, s->v_edge_pos,
3005 mv[i][0], mv[i][1]);
3009 put_obmc(dest, ptr, s->linesize);
3012 static inline void qpel_motion(MpegEncContext *s,
3013 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3014 int field_based, int bottom_field, int field_select,
3015 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
3016 qpel_mc_func (*qpix_op)[16],
3017 int motion_x, int motion_y, int h)
3019 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
3020 int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
3022 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3023 src_x = s->mb_x * 16 + (motion_x >> 2);
3024 src_y = s->mb_y * (16 >> field_based) + (motion_y >> 2);
3026 v_edge_pos = s->v_edge_pos >> field_based;
3027 linesize = s->linesize << field_based;
3028 uvlinesize = s->uvlinesize << field_based;
3033 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA2){
3034 static const int rtab[8]= {0,0,1,1,0,0,0,1};
3035 mx= (motion_x>>1) + rtab[motion_x&7];
3036 my= (motion_y>>1) + rtab[motion_y&7];
3037 }else if(s->workaround_bugs&FF_BUG_QPEL_CHROMA){
3038 mx= (motion_x>>1)|(motion_x&1);
3039 my= (motion_y>>1)|(motion_y&1);
3047 uvdxy= (mx&1) | ((my&1)<<1);
3051 uvsrc_x = s->mb_x * 8 + mx;
3052 uvsrc_y = s->mb_y * (8 >> field_based) + my;
3054 ptr_y = ref_picture[0] + src_y * linesize + src_x;
3055 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
3056 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
3058 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 16
3059 || (unsigned)src_y > v_edge_pos - (motion_y&3) - h ){
3060 ff_emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
3061 src_x, src_y<<field_based, s->h_edge_pos, s->v_edge_pos);
3062 ptr_y= s->edge_emu_buffer;
3063 if(!(s->flags&CODEC_FLAG_GRAY)){
3064 uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
3065 ff_emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize, 9, 9 + field_based,
3066 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3067 ff_emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9, 9 + field_based,
3068 uvsrc_x, uvsrc_y<<field_based, s->h_edge_pos>>1, s->v_edge_pos>>1);
3075 qpix_op[0][dxy](dest_y, ptr_y, linesize);
3078 dest_y += s->linesize;
3079 dest_cb+= s->uvlinesize;
3080 dest_cr+= s->uvlinesize;
3084 ptr_y += s->linesize;
3085 ptr_cb += s->uvlinesize;
3086 ptr_cr += s->uvlinesize;
3088 //damn interlaced mode
3089 //FIXME boundary mirroring is not exactly correct here
3090 qpix_op[1][dxy](dest_y , ptr_y , linesize);
3091 qpix_op[1][dxy](dest_y+8, ptr_y+8, linesize);
3093 if(!(s->flags&CODEC_FLAG_GRAY)){
3094 pix_op[1][uvdxy](dest_cr, ptr_cr, uvlinesize, h >> 1);
3095 pix_op[1][uvdxy](dest_cb, ptr_cb, uvlinesize, h >> 1);
3099 inline int ff_h263_round_chroma(int x){
3101 return (h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3104 return -(h263_chroma_roundtab[x & 0xf] + ((x >> 3) & ~1));
3109 * h263 chorma 4mv motion compensation.
3111 static inline void chroma_4mv_motion(MpegEncContext *s,
3112 uint8_t *dest_cb, uint8_t *dest_cr,
3113 uint8_t **ref_picture,
3114 op_pixels_func *pix_op,
3116 int dxy, emu=0, src_x, src_y, offset;
3119 /* In case of 8X8, we construct a single chroma motion vector
3120 with a special rounding */
3121 mx= ff_h263_round_chroma(mx);
3122 my= ff_h263_round_chroma(my);
3124 dxy = ((my & 1) << 1) | (mx & 1);
3128 src_x = s->mb_x * 8 + mx;
3129 src_y = s->mb_y * 8 + my;
3130 src_x = clip(src_x, -8, s->width/2);
3131 if (src_x == s->width/2)
3133 src_y = clip(src_y, -8, s->height/2);
3134 if (src_y == s->height/2)
3137 offset = (src_y * (s->uvlinesize)) + src_x;
3138 ptr = ref_picture[1] + offset;
3139 if(s->flags&CODEC_FLAG_EMU_EDGE){
3140 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
3141 || (unsigned)src_y > (s->v_edge_pos>>1) - (dxy>>1) - 8){
3142 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);
3143 ptr= s->edge_emu_buffer;
3147 pix_op[dxy](dest_cb, ptr, s->uvlinesize, 8);
3149 ptr = ref_picture[2] + offset;
3151 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);
3152 ptr= s->edge_emu_buffer;
3154 pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
3157 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
3158 uint8_t *dest_cb, uint8_t *dest_cr,
3159 uint8_t **ref_picture,
3160 h264_chroma_mc_func *pix_op,
3162 const int lowres= s->avctx->lowres;
3163 const int block_s= 8>>lowres;
3164 const int s_mask= (2<<lowres)-1;
3165 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
3166 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
3167 int emu=0, src_x, src_y, offset, sx, sy;
3170 if(s->quarter_sample){
3175 /* In case of 8X8, we construct a single chroma motion vector
3176 with a special rounding */
3177 mx= ff_h263_round_chroma(mx);
3178 my= ff_h263_round_chroma(my);
3182 src_x = s->mb_x*block_s + (mx >> (lowres+1));
3183 src_y = s->mb_y*block_s + (my >> (lowres+1));
3185 offset = src_y * s->uvlinesize + src_x;
3186 ptr = ref_picture[1] + offset;
3187 if(s->flags&CODEC_FLAG_EMU_EDGE){
3188 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
3189 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
3190 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3191 ptr= s->edge_emu_buffer;
3197 pix_op[lowres](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
3199 ptr = ref_picture[2] + offset;
3201 ff_emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
3202 ptr= s->edge_emu_buffer;
3204 pix_op[lowres](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
3208 * motion compesation of a single macroblock
3210 * @param dest_y luma destination pointer
3211 * @param dest_cb chroma cb/u destination pointer
3212 * @param dest_cr chroma cr/v destination pointer
3213 * @param dir direction (0->forward, 1->backward)
3214 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3215 * @param pic_op halfpel motion compensation function (average or put normally)
3216 * @param pic_op qpel motion compensation function (average or put normally)
3217 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3219 static inline void MPV_motion(MpegEncContext *s,
3220 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3221 int dir, uint8_t **ref_picture,
3222 op_pixels_func (*pix_op)[4], qpel_mc_func (*qpix_op)[16])
3224 int dxy, mx, my, src_x, src_y, motion_x, motion_y;
3226 uint8_t *ptr, *dest;
3231 if(s->obmc && s->pict_type != B_TYPE){
3232 int16_t mv_cache[4][4][2];
3233 const int xy= s->mb_x + s->mb_y*s->mb_stride;
3234 const int mot_stride= s->b8_stride;
3235 const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
3237 assert(!s->mb_skipped);
3239 memcpy(mv_cache[1][1], s->current_picture.motion_val[0][mot_xy ], sizeof(int16_t)*4);
3240 memcpy(mv_cache[2][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3241 memcpy(mv_cache[3][1], s->current_picture.motion_val[0][mot_xy+mot_stride], sizeof(int16_t)*4);
3243 if(mb_y==0 || IS_INTRA(s->current_picture.mb_type[xy-s->mb_stride])){
3244 memcpy(mv_cache[0][1], mv_cache[1][1], sizeof(int16_t)*4);
3246 memcpy(mv_cache[0][1], s->current_picture.motion_val[0][mot_xy-mot_stride], sizeof(int16_t)*4);
3249 if(mb_x==0 || IS_INTRA(s->current_picture.mb_type[xy-1])){
3250 *(int32_t*)mv_cache[1][0]= *(int32_t*)mv_cache[1][1];
3251 *(int32_t*)mv_cache[2][0]= *(int32_t*)mv_cache[2][1];
3253 *(int32_t*)mv_cache[1][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1];
3254 *(int32_t*)mv_cache[2][0]= *(int32_t*)s->current_picture.motion_val[0][mot_xy-1+mot_stride];
3257 if(mb_x+1>=s->mb_width || IS_INTRA(s->current_picture.mb_type[xy+1])){
3258 *(int32_t*)mv_cache[1][3]= *(int32_t*)mv_cache[1][2];
3259 *(int32_t*)mv_cache[2][3]= *(int32_t*)mv_cache[2][2];
3261 *(int32_t*)mv_cache[1][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2];
3262 *(int32_t*)mv_cache[2][3]= *(int32_t*)s->current_picture.motion_val[0][mot_xy+2+mot_stride];
3268 const int x= (i&1)+1;
3269 const int y= (i>>1)+1;
3271 {mv_cache[y][x ][0], mv_cache[y][x ][1]},
3272 {mv_cache[y-1][x][0], mv_cache[y-1][x][1]},
3273 {mv_cache[y][x-1][0], mv_cache[y][x-1][1]},
3274 {mv_cache[y][x+1][0], mv_cache[y][x+1][1]},
3275 {mv_cache[y+1][x][0], mv_cache[y+1][x][1]}};
3277 obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3279 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3286 if(!(s->flags&CODEC_FLAG_GRAY))
3287 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3292 switch(s->mv_type) {
3295 if(s->real_sprite_warping_points==1){
3296 gmc1_motion(s, dest_y, dest_cb, dest_cr,
3299 gmc_motion(s, dest_y, dest_cb, dest_cr,
3302 }else if(s->quarter_sample){
3303 qpel_motion(s, dest_y, dest_cb, dest_cr,
3305 ref_picture, pix_op, qpix_op,
3306 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3308 ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
3309 ref_picture, pix_op,
3310 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3313 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3315 ref_picture, pix_op,
3316 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3322 if(s->quarter_sample){
3324 motion_x = s->mv[dir][i][0];
3325 motion_y = s->mv[dir][i][1];
3327 dxy = ((motion_y & 3) << 2) | (motion_x & 3);
3328 src_x = mb_x * 16 + (motion_x >> 2) + (i & 1) * 8;
3329 src_y = mb_y * 16 + (motion_y >> 2) + (i >>1) * 8;
3331 /* WARNING: do no forget half pels */
3332 src_x = clip(src_x, -16, s->width);
3333 if (src_x == s->width)
3335 src_y = clip(src_y, -16, s->height);
3336 if (src_y == s->height)
3339 ptr = ref_picture[0] + (src_y * s->linesize) + (src_x);
3340 if(s->flags&CODEC_FLAG_EMU_EDGE){
3341 if( (unsigned)src_x > s->h_edge_pos - (motion_x&3) - 8
3342 || (unsigned)src_y > s->v_edge_pos - (motion_y&3) - 8 ){
3343 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);
3344 ptr= s->edge_emu_buffer;
3347 dest = dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize;
3348 qpix_op[1][dxy](dest, ptr, s->linesize);
3350 mx += s->mv[dir][i][0]/2;
3351 my += s->mv[dir][i][1]/2;
3355 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
3356 ref_picture[0], 0, 0,
3357 mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
3358 s->width, s->height, s->linesize,
3359 s->h_edge_pos, s->v_edge_pos,
3361 s->mv[dir][i][0], s->mv[dir][i][1]);
3363 mx += s->mv[dir][i][0];
3364 my += s->mv[dir][i][1];
3368 if(!(s->flags&CODEC_FLAG_GRAY))
3369 chroma_4mv_motion(s, dest_cb, dest_cr, ref_picture, pix_op[1], mx, my);
3372 if (s->picture_structure == PICT_FRAME) {
3373 if(s->quarter_sample){
3375 qpel_motion(s, dest_y, dest_cb, dest_cr,
3376 1, i, s->field_select[dir][i],
3377 ref_picture, pix_op, qpix_op,
3378 s->mv[dir][i][0], s->mv[dir][i][1], 8);
3382 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3383 1, 0, s->field_select[dir][0],
3384 ref_picture, pix_op,
3385 s->mv[dir][0][0], s->mv[dir][0][1], 8);
3387 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3388 1, 1, s->field_select[dir][1],
3389 ref_picture, pix_op,
3390 s->mv[dir][1][0], s->mv[dir][1][1], 8);
3393 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3394 ref_picture= s->current_picture_ptr->data;
3397 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3398 0, 0, s->field_select[dir][0],
3399 ref_picture, pix_op,
3400 s->mv[dir][0][0], s->mv[dir][0][1], 16);
3405 uint8_t ** ref2picture;
3407 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3408 ref2picture= ref_picture;
3410 ref2picture= s->current_picture_ptr->data;
3413 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3414 0, 0, s->field_select[dir][i],
3415 ref2picture, pix_op,
3416 s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8);
3418 dest_y += 16*s->linesize;
3419 dest_cb+= (16>>s->chroma_y_shift)*s->uvlinesize;
3420 dest_cr+= (16>>s->chroma_y_shift)*s->uvlinesize;
3424 if(s->picture_structure == PICT_FRAME){
3428 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3430 ref_picture, pix_op,
3431 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8);
3433 pix_op = s->dsp.avg_pixels_tab;
3437 mpeg_motion(s, dest_y, dest_cb, dest_cr,
3438 0, 0, s->picture_structure != i+1,
3439 ref_picture, pix_op,
3440 s->mv[dir][2*i][0],s->mv[dir][2*i][1],16);
3442 // after put we make avg of the same block
3443 pix_op=s->dsp.avg_pixels_tab;
3445 //opposite parity is always in the same frame if this is second field
3446 if(!s->first_field){
3447 ref_picture = s->current_picture_ptr->data;
3457 * motion compesation of a single macroblock
3459 * @param dest_y luma destination pointer
3460 * @param dest_cb chroma cb/u destination pointer
3461 * @param dest_cr chroma cr/v destination pointer
3462 * @param dir direction (0->forward, 1->backward)
3463 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
3464 * @param pic_op halfpel motion compensation function (average or put normally)
3465 * the motion vectors are taken from s->mv and the MV type from s->mv_type
3467 static inline void MPV_motion_lowres(MpegEncContext *s,
3468 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
3469 int dir, uint8_t **ref_picture,
3470 h264_chroma_mc_func *pix_op)
3474 const int lowres= s->avctx->lowres;
3475 const int block_s= 8>>lowres;
3480 switch(s->mv_type) {
3482 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3484 ref_picture, pix_op,
3485 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3491 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
3492 ref_picture[0], 0, 0,
3493 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
3494 s->width, s->height, s->linesize,
3495 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
3496 block_s, block_s, pix_op,
3497 s->mv[dir][i][0], s->mv[dir][i][1]);
3499 mx += s->mv[dir][i][0];
3500 my += s->mv[dir][i][1];
3503 if(!(s->flags&CODEC_FLAG_GRAY))
3504 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
3507 if (s->picture_structure == PICT_FRAME) {
3509 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3510 1, 0, s->field_select[dir][0],
3511 ref_picture, pix_op,
3512 s->mv[dir][0][0], s->mv[dir][0][1], block_s);
3514 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3515 1, 1, s->field_select[dir][1],
3516 ref_picture, pix_op,
3517 s->mv[dir][1][0], s->mv[dir][1][1], block_s);
3519 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != B_TYPE && !s->first_field){
3520 ref_picture= s->current_picture_ptr->data;
3523 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3524 0, 0, s->field_select[dir][0],
3525 ref_picture, pix_op,
3526 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s);
3531 uint8_t ** ref2picture;
3533 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){
3534 ref2picture= ref_picture;
3536 ref2picture= s->current_picture_ptr->data;
3539 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3540 0, 0, s->field_select[dir][i],
3541 ref2picture, pix_op,
3542 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s);
3544 dest_y += 2*block_s*s->linesize;
3545 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3546 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
3550 if(s->picture_structure == PICT_FRAME){
3554 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3556 ref_picture, pix_op,
3557 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s);
3559 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3563 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
3564 0, 0, s->picture_structure != i+1,
3565 ref_picture, pix_op,
3566 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s);
3568 // after put we make avg of the same block
3569 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
3571 //opposite parity is always in the same frame if this is second field
3572 if(!s->first_field){
3573 ref_picture = s->current_picture_ptr->data;
3582 /* put block[] to dest[] */
3583 static inline void put_dct(MpegEncContext *s,
3584 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3586 s->dct_unquantize_intra(s, block, i, qscale);
3587 s->dsp.idct_put (dest, line_size, block);
3590 /* add block[] to dest[] */
3591 static inline void add_dct(MpegEncContext *s,
3592 DCTELEM *block, int i, uint8_t *dest, int line_size)
3594 if (s->block_last_index[i] >= 0) {
3595 s->dsp.idct_add (dest, line_size, block);
3599 static inline void add_dequant_dct(MpegEncContext *s,
3600 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
3602 if (s->block_last_index[i] >= 0) {
3603 s->dct_unquantize_inter(s, block, i, qscale);
3605 s->dsp.idct_add (dest, line_size, block);
3610 * cleans dc, ac, coded_block for the current non intra MB
3612 void ff_clean_intra_table_entries(MpegEncContext *s)
3614 int wrap = s->b8_stride;
3615 int xy = s->block_index[0];
3618 s->dc_val[0][xy + 1 ] =
3619 s->dc_val[0][xy + wrap] =
3620 s->dc_val[0][xy + 1 + wrap] = 1024;
3622 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
3623 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
3624 if (s->msmpeg4_version>=3) {
3625 s->coded_block[xy ] =
3626 s->coded_block[xy + 1 ] =
3627 s->coded_block[xy + wrap] =
3628 s->coded_block[xy + 1 + wrap] = 0;
3631 wrap = s->mb_stride;
3632 xy = s->mb_x + s->mb_y * wrap;
3634 s->dc_val[2][xy] = 1024;
3636 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
3637 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
3639 s->mbintra_table[xy]= 0;
3642 /* generic function called after a macroblock has been parsed by the
3643 decoder or after it has been encoded by the encoder.
3645 Important variables used:
3646 s->mb_intra : true if intra macroblock
3647 s->mv_dir : motion vector direction
3648 s->mv_type : motion vector type
3649 s->mv : motion vector
3650 s->interlaced_dct : true if interlaced dct used (mpeg2)
3652 static always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], int lowres_flag)
3655 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
3657 if(s->avctx->xvmc_acceleration){
3658 XVMC_decode_mb(s);//xvmc uses pblocks
3666 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
3667 /* save DCT coefficients */
3669 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
3672 *dct++ = block[i][s->dsp.idct_permutation[j]];
3675 s->current_picture.qscale_table[mb_xy]= s->qscale;
3677 /* update DC predictors for P macroblocks */
3679 if (s->h263_pred || s->h263_aic) {
3680 if(s->mbintra_table[mb_xy])
3681 ff_clean_intra_table_entries(s);
3685 s->last_dc[2] = 128 << s->intra_dc_precision;
3688 else if (s->h263_pred || s->h263_aic)
3689 s->mbintra_table[mb_xy]=1;
3691 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==B_TYPE))) { //FIXME precalc
3692 uint8_t *dest_y, *dest_cb, *dest_cr;
3693 int dct_linesize, dct_offset;
3694 op_pixels_func (*op_pix)[4];
3695 qpel_mc_func (*op_qpix)[16];
3696 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
3697 const int uvlinesize= s->current_picture.linesize[1];
3698 const int readable= s->pict_type != B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
3699 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
3701 /* avoid copy if macroblock skipped in last frame too */
3702 /* skip only during decoding as we might trash the buffers during encoding a bit */
3704 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
3705 const int age= s->current_picture.age;
3709 if (s->mb_skipped) {
3711 assert(s->pict_type!=I_TYPE);
3713 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
3714 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3716 /* if previous was skipped too, then nothing to do ! */
3717 if (*mbskip_ptr >= age && s->current_picture.reference){
3720 } else if(!s->current_picture.reference){
3721 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
3722 if(*mbskip_ptr >99) *mbskip_ptr= 99;
3724 *mbskip_ptr = 0; /* not skipped */
3728 dct_linesize = linesize << s->interlaced_dct;
3729 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
3733 dest_cb= s->dest[1];
3734 dest_cr= s->dest[2];
3736 dest_y = s->b_scratchpad;
3737 dest_cb= s->b_scratchpad+16*linesize;
3738 dest_cr= s->b_scratchpad+32*linesize;
3742 /* motion handling */
3743 /* decoding or more than one mb_type (MC was already done otherwise) */
3746 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
3748 if (s->mv_dir & MV_DIR_FORWARD) {
3749 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
3750 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
3752 if (s->mv_dir & MV_DIR_BACKWARD) {
3753 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
3756 if ((!s->no_rounding) || s->pict_type==B_TYPE){
3757 op_pix = s->dsp.put_pixels_tab;
3758 op_qpix= s->dsp.put_qpel_pixels_tab;
3760 op_pix = s->dsp.put_no_rnd_pixels_tab;
3761 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
3763 if (s->mv_dir & MV_DIR_FORWARD) {
3764 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
3765 op_pix = s->dsp.avg_pixels_tab;
3766 op_qpix= s->dsp.avg_qpel_pixels_tab;
3768 if (s->mv_dir & MV_DIR_BACKWARD) {
3769 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
3774 /* skip dequant / idct if we are really late ;) */
3775 if(s->hurry_up>1) return;
3777 /* add dct residue */
3778 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
3779 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
3780 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3781 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3782 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3783 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3785 if(!(s->flags&CODEC_FLAG_GRAY)){
3786 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3787 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3789 } else if(s->codec_id != CODEC_ID_WMV2){
3790 add_dct(s, block[0], 0, dest_y , dct_linesize);
3791 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
3792 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
3793 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
3795 if(!(s->flags&CODEC_FLAG_GRAY)){
3796 if(s->chroma_y_shift){//Chroma420
3797 add_dct(s, block[4], 4, dest_cb, uvlinesize);
3798 add_dct(s, block[5], 5, dest_cr, uvlinesize);
3801 dct_linesize = uvlinesize << s->interlaced_dct;
3802 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3804 add_dct(s, block[4], 4, dest_cb, dct_linesize);
3805 add_dct(s, block[5], 5, dest_cr, dct_linesize);
3806 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
3807 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
3808 if(!s->chroma_x_shift){//Chroma444
3809 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
3810 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
3811 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
3812 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
3818 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
3821 /* dct only in intra block */
3822 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
3823 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
3824 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
3825 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
3826 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
3828 if(!(s->flags&CODEC_FLAG_GRAY)){
3829 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
3830 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
3833 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
3834 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
3835 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
3836 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
3838 if(!(s->flags&CODEC_FLAG_GRAY)){
3839 if(s->chroma_y_shift){
3840 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
3841 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
3844 dct_linesize = uvlinesize << s->interlaced_dct;
3845 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
3847 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
3848 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
3849 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
3850 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
3851 if(!s->chroma_x_shift){//Chroma444
3852 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
3853 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
3854 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
3855 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
3862 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
3863 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
3864 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
3869 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
3870 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1);
3871 else MPV_decode_mb_internal(s, block, 0);
3874 #ifdef CONFIG_ENCODERS
3876 static inline void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
3878 static const char tab[64]=
3890 DCTELEM *block= s->block[n];
3891 const int last_index= s->block_last_index[n];
3896 threshold= -threshold;
3900 /* are all which we could set to zero are allready zero? */
3901 if(last_index<=skip_dc - 1) return;
3903 for(i=0; i<=last_index; i++){
3904 const int j = s->intra_scantable.permutated[i];
3905 const int level = ABS(block[j]);
3907 if(skip_dc && i==0) continue;
3916 if(score >= threshold) return;
3917 for(i=skip_dc; i<=last_index; i++){
3918 const int j = s->intra_scantable.permutated[i];
3921 if(block[0]) s->block_last_index[n]= 0;
3922 else s->block_last_index[n]= -1;
3925 static inline void clip_coeffs(MpegEncContext *s, DCTELEM *block, int last_index)
3928 const int maxlevel= s->max_qcoeff;
3929 const int minlevel= s->min_qcoeff;
3933 i=1; //skip clipping of intra dc
3937 for(;i<=last_index; i++){
3938 const int j= s->intra_scantable.permutated[i];
3939 int level = block[j];
3941 if (level>maxlevel){
3944 }else if(level<minlevel){
3952 if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
3953 av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);
3956 #endif //CONFIG_ENCODERS
3960 * @param h is the normal height, this will be reduced automatically if needed for the last row
3962 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
3963 if (s->avctx->draw_horiz_band) {
3967 if(s->picture_structure != PICT_FRAME){
3970 if(s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
3973 h= FFMIN(h, s->avctx->height - y);
3975 if(s->pict_type==B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
3976 src= (AVFrame*)s->current_picture_ptr;
3977 else if(s->last_picture_ptr)
3978 src= (AVFrame*)s->last_picture_ptr;
3982 if(s->pict_type==B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
3988 offset[0]= y * s->linesize;;
3990 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
3996 s->avctx->draw_horiz_band(s->avctx, src, offset,
3997 y, s->picture_structure, h);
4001 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
4002 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics
4003 const int uvlinesize= s->current_picture.linesize[1];
4004 const int mb_size= 4 - s->avctx->lowres;
4006 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
4007 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
4008 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
4009 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
4010 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
4011 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;
4012 //block_index is not used by mpeg2, so it is not affected by chroma_format
4014 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
4015 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4016 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
4018 if(!(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
4020 s->dest[0] += s->mb_y * linesize << mb_size;
4021 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4022 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
4026 #ifdef CONFIG_ENCODERS
4028 static void get_vissual_weight(int16_t *weight, uint8_t *ptr, int stride){
4038 for(y2= FFMAX(y-1, 0); y2 < FFMIN(8, y+2); y2++){
4039 for(x2= FFMAX(x-1, 0); x2 < FFMIN(8, x+2); x2++){
4040 int v= ptr[x2 + y2*stride];
4046 weight[x + 8*y]= (36*ff_sqrt(count*sqr - sum*sum)) / count;
4051 static void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
4053 int16_t weight[6][64];
4054 DCTELEM orig[6][64];
4055 const int mb_x= s->mb_x;
4056 const int mb_y= s->mb_y;
4059 int dct_offset = s->linesize*8; //default for progressive frames
4060 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
4063 for(i=0; i<6; i++) skip_dct[i]=0;
4065 if(s->adaptive_quant){
4066 const int last_qp= s->qscale;
4067 const int mb_xy= mb_x + mb_y*s->mb_stride;
4069 s->lambda= s->lambda_table[mb_xy];
4072 if(!(s->flags&CODEC_FLAG_QP_RD)){
4073 s->dquant= s->qscale - last_qp;
4075 if(s->out_format==FMT_H263){
4076 s->dquant= clip(s->dquant, -2, 2); //FIXME RD
4078 if(s->codec_id==CODEC_ID_MPEG4){
4080 if(s->pict_type == B_TYPE){
4082 s->dquant= (s->dquant/2)*2;
4083 if(s->mv_dir&MV_DIRECT)
4086 if(s->mv_type==MV_TYPE_8X8)
4092 ff_set_qscale(s, last_qp + s->dquant);
4093 }else if(s->flags&CODEC_FLAG_QP_RD)
4094 ff_set_qscale(s, s->qscale + s->dquant);
4096 wrap_y = s->linesize;
4097 wrap_c = s->uvlinesize;
4098 ptr_y = s->new_picture.data[0] + (mb_y * 16 * wrap_y) + mb_x * 16;
4099 ptr_cb = s->new_picture.data[1] + (mb_y * 8 * wrap_c) + mb_x * 8;
4100 ptr_cr = s->new_picture.data[2] + (mb_y * 8 * wrap_c) + mb_x * 8;
4102 if(mb_x*16+16 > s->width || mb_y*16+16 > s->height){
4103 uint8_t *ebuf= s->edge_emu_buffer + 32;
4104 ff_emulated_edge_mc(ebuf , ptr_y , wrap_y,16,16,mb_x*16,mb_y*16, s->width , s->height);
4106 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);
4107 ptr_cb= ebuf+18*wrap_y;
4108 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);
4109 ptr_cr= ebuf+18*wrap_y+8;
4113 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4114 int progressive_score, interlaced_score;
4116 s->interlaced_dct=0;
4117 progressive_score= s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y, 8)
4118 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y*8, NULL, wrap_y, 8) - 400;
4120 if(progressive_score > 0){
4121 interlaced_score = s->dsp.ildct_cmp[4](s, ptr_y , NULL, wrap_y*2, 8)
4122 +s->dsp.ildct_cmp[4](s, ptr_y + wrap_y , NULL, wrap_y*2, 8);
4123 if(progressive_score > interlaced_score){
4124 s->interlaced_dct=1;
4132 s->dsp.get_pixels(s->block[0], ptr_y , wrap_y);
4133 s->dsp.get_pixels(s->block[1], ptr_y + 8, wrap_y);
4134 s->dsp.get_pixels(s->block[2], ptr_y + dct_offset , wrap_y);
4135 s->dsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
4137 if(s->flags&CODEC_FLAG_GRAY){
4141 s->dsp.get_pixels(s->block[4], ptr_cb, wrap_c);
4142 s->dsp.get_pixels(s->block[5], ptr_cr, wrap_c);
4145 op_pixels_func (*op_pix)[4];
4146 qpel_mc_func (*op_qpix)[16];
4147 uint8_t *dest_y, *dest_cb, *dest_cr;
4149 dest_y = s->dest[0];
4150 dest_cb = s->dest[1];
4151 dest_cr = s->dest[2];
4153 if ((!s->no_rounding) || s->pict_type==B_TYPE){
4154 op_pix = s->dsp.put_pixels_tab;
4155 op_qpix= s->dsp.put_qpel_pixels_tab;
4157 op_pix = s->dsp.put_no_rnd_pixels_tab;
4158 op_qpix= s->dsp.put_no_rnd_qpel_pixels_tab;
4161 if (s->mv_dir & MV_DIR_FORWARD) {
4162 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
4163 op_pix = s->dsp.avg_pixels_tab;
4164 op_qpix= s->dsp.avg_qpel_pixels_tab;
4166 if (s->mv_dir & MV_DIR_BACKWARD) {
4167 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
4170 if(s->flags&CODEC_FLAG_INTERLACED_DCT){
4171 int progressive_score, interlaced_score;
4173 s->interlaced_dct=0;
4174 progressive_score= s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y, 8)
4175 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y*8, ptr_y + wrap_y*8, wrap_y, 8) - 400;
4177 if(s->avctx->ildct_cmp == FF_CMP_VSSE) progressive_score -= 400;
4179 if(progressive_score>0){
4180 interlaced_score = s->dsp.ildct_cmp[0](s, dest_y , ptr_y , wrap_y*2, 8)
4181 +s->dsp.ildct_cmp[0](s, dest_y + wrap_y , ptr_y + wrap_y , wrap_y*2, 8);
4183 if(progressive_score > interlaced_score){
4184 s->interlaced_dct=1;
4192 s->dsp.diff_pixels(s->block[0], ptr_y , dest_y , wrap_y);
4193 s->dsp.diff_pixels(s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
4194 s->dsp.diff_pixels(s->block[2], ptr_y + dct_offset , dest_y + dct_offset , wrap_y);
4195 s->dsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8, dest_y + dct_offset + 8, wrap_y);
4197 if(s->flags&CODEC_FLAG_GRAY){
4201 s->dsp.diff_pixels(s->block[4], ptr_cb, dest_cb, wrap_c);
4202 s->dsp.diff_pixels(s->block[5], ptr_cr, dest_cr, wrap_c);
4204 /* pre quantization */
4205 if(s->current_picture.mc_mb_var[s->mb_stride*mb_y+ mb_x]<2*s->qscale*s->qscale){
4207 if(s->dsp.sad[1](NULL, ptr_y , dest_y , wrap_y, 8) < 20*s->qscale) skip_dct[0]= 1;
4208 if(s->dsp.sad[1](NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20*s->qscale) skip_dct[1]= 1;
4209 if(s->dsp.sad[1](NULL, ptr_y +dct_offset , dest_y +dct_offset , wrap_y, 8) < 20*s->qscale) skip_dct[2]= 1;
4210 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;
4211 if(s->dsp.sad[1](NULL, ptr_cb , dest_cb , wrap_c, 8) < 20*s->qscale) skip_dct[4]= 1;
4212 if(s->dsp.sad[1](NULL, ptr_cr , dest_cr , wrap_c, 8) < 20*s->qscale) skip_dct[5]= 1;
4216 if(s->avctx->quantizer_noise_shaping){
4217 if(!skip_dct[0]) get_vissual_weight(weight[0], ptr_y , wrap_y);
4218 if(!skip_dct[1]) get_vissual_weight(weight[1], ptr_y + 8, wrap_y);
4219 if(!skip_dct[2]) get_vissual_weight(weight[2], ptr_y + dct_offset , wrap_y);
4220 if(!skip_dct[3]) get_vissual_weight(weight[3], ptr_y + dct_offset + 8, wrap_y);
4221 if(!skip_dct[4]) get_vissual_weight(weight[4], ptr_cb , wrap_c);
4222 if(!skip_dct[5]) get_vissual_weight(weight[5], ptr_cr , wrap_c);
4223 memcpy(orig[0], s->block[0], sizeof(DCTELEM)*64*6);
4226 /* DCT & quantize */
4227 assert(s->out_format!=FMT_MJPEG || s->qscale==8);
4232 s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow);
4233 // FIXME we could decide to change to quantizer instead of clipping
4234 // JS: I don't think that would be a good idea it could lower quality instead
4235 // of improve it. Just INTRADC clipping deserves changes in quantizer
4236 if (overflow) clip_coeffs(s, s->block[i], s->block_last_index[i]);
4238 s->block_last_index[i]= -1;
4240 if(s->avctx->quantizer_noise_shaping){
4243 s->block_last_index[i] = dct_quantize_refine(s, s->block[i], weight[i], orig[i], i, s->qscale);
4248 if(s->luma_elim_threshold && !s->mb_intra)
4250 dct_single_coeff_elimination(s, i, s->luma_elim_threshold);
4251 if(s->chroma_elim_threshold && !s->mb_intra)
4253 dct_single_coeff_elimination(s, i, s->chroma_elim_threshold);
4255 if(s->flags & CODEC_FLAG_CBP_RD){
4257 if(s->block_last_index[i] == -1)
4258 s->coded_score[i]= INT_MAX/256;
4263 if((s->flags&CODEC_FLAG_GRAY) && s->mb_intra){
4264 s->block_last_index[4]=
4265 s->block_last_index[5]= 0;
4267 s->block[5][0]= (1024 + s->c_dc_scale/2)/ s->c_dc_scale;
4270 //non c quantize code returns incorrect block_last_index FIXME
4271 if(s->alternate_scan && s->dct_quantize != dct_quantize_c){
4274 if(s->block_last_index[i]>0){
4275 for(j=63; j>0; j--){
4276 if(s->block[i][ s->intra_scantable.permutated[j] ]) break;
4278 s->block_last_index[i]= j;
4283 /* huffman encode */
4284 switch(s->codec_id){ //FIXME funct ptr could be slightly faster
4285 case CODEC_ID_MPEG1VIDEO:
4286 case CODEC_ID_MPEG2VIDEO:
4287 mpeg1_encode_mb(s, s->block, motion_x, motion_y); break;
4288 case CODEC_ID_MPEG4:
4289 mpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4290 case CODEC_ID_MSMPEG4V2:
4291 case CODEC_ID_MSMPEG4V3:
4293 msmpeg4_encode_mb(s, s->block, motion_x, motion_y); break;
4295 ff_wmv2_encode_mb(s, s->block, motion_x, motion_y); break;
4296 #ifdef CONFIG_H261_ENCODER
4298 ff_h261_encode_mb(s, s->block, motion_x, motion_y); break;
4301 case CODEC_ID_H263P:
4305 h263_encode_mb(s, s->block, motion_x, motion_y); break;
4306 case CODEC_ID_MJPEG:
4307 mjpeg_encode_mb(s, s->block); break;
4313 #endif //CONFIG_ENCODERS
4315 void ff_mpeg_flush(AVCodecContext *avctx){
4317 MpegEncContext *s = avctx->priv_data;
4319 if(s==NULL || s->picture==NULL)
4322 for(i=0; i<MAX_PICTURE_COUNT; i++){
4323 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
4324 || s->picture[i].type == FF_BUFFER_TYPE_USER))
4325 avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
4327 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
4329 s->mb_x= s->mb_y= 0;
4331 s->parse_context.state= -1;
4332 s->parse_context.frame_start_found= 0;
4333 s->parse_context.overread= 0;
4334 s->parse_context.overread_index= 0;
4335 s->parse_context.index= 0;
4336 s->parse_context.last_index= 0;
4337 s->bitstream_buffer_size=0;
4340 #ifdef CONFIG_ENCODERS
4341 void ff_copy_bits(PutBitContext *pb, uint8_t *src, int length)
4343 const uint16_t *srcw= (uint16_t*)src;
4344 int words= length>>4;
4345 int bits= length&15;
4348 if(length==0) return;
4351 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4352 }else if(put_bits_count(pb)&7){
4353 for(i=0; i<words; i++) put_bits(pb, 16, be2me_16(srcw[i]));
4355 for(i=0; put_bits_count(pb)&31; i++)
4356 put_bits(pb, 8, src[i]);
4358 memcpy(pbBufPtr(pb), src+i, 2*words-i);
4359 skip_put_bytes(pb, 2*words-i);
4362 put_bits(pb, bits, be2me_16(srcw[words])>>(16-bits));
4365 static inline void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type){
4368 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4371 d->mb_skip_run= s->mb_skip_run;
4373 d->last_dc[i]= s->last_dc[i];
4376 d->mv_bits= s->mv_bits;
4377 d->i_tex_bits= s->i_tex_bits;
4378 d->p_tex_bits= s->p_tex_bits;
4379 d->i_count= s->i_count;
4380 d->f_count= s->f_count;
4381 d->b_count= s->b_count;
4382 d->skip_count= s->skip_count;
4383 d->misc_bits= s->misc_bits;
4387 d->qscale= s->qscale;
4388 d->dquant= s->dquant;
4391 static inline void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type){
4394 memcpy(d->mv, s->mv, 2*4*2*sizeof(int));
4395 memcpy(d->last_mv, s->last_mv, 2*2*2*sizeof(int)); //FIXME is memcpy faster then a loop?
4398 d->mb_skip_run= s->mb_skip_run;
4400 d->last_dc[i]= s->last_dc[i];
4403 d->mv_bits= s->mv_bits;
4404 d->i_tex_bits= s->i_tex_bits;
4405 d->p_tex_bits= s->p_tex_bits;
4406 d->i_count= s->i_count;
4407 d->f_count= s->f_count;
4408 d->b_count= s->b_count;
4409 d->skip_count= s->skip_count;
4410 d->misc_bits= s->misc_bits;
4412 d->mb_intra= s->mb_intra;
4413 d->mb_skipped= s->mb_skipped;
4414 d->mv_type= s->mv_type;
4415 d->mv_dir= s->mv_dir;
4417 if(s->data_partitioning){
4419 d->tex_pb= s->tex_pb;
4423 d->block_last_index[i]= s->block_last_index[i];
4424 d->interlaced_dct= s->interlaced_dct;
4425 d->qscale= s->qscale;
4428 static inline void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type,
4429 PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2],
4430 int *dmin, int *next_block, int motion_x, int motion_y)
4433 uint8_t *dest_backup[3];
4435 copy_context_before_encode(s, backup, type);
4437 s->block= s->blocks[*next_block];
4438 s->pb= pb[*next_block];
4439 if(s->data_partitioning){
4440 s->pb2 = pb2 [*next_block];
4441 s->tex_pb= tex_pb[*next_block];
4445 memcpy(dest_backup, s->dest, sizeof(s->dest));
4446 s->dest[0] = s->rd_scratchpad;
4447 s->dest[1] = s->rd_scratchpad + 16*s->linesize;
4448 s->dest[2] = s->rd_scratchpad + 16*s->linesize + 8;
4449 assert(s->linesize >= 32); //FIXME
4452 encode_mb(s, motion_x, motion_y);
4454 score= put_bits_count(&s->pb);
4455 if(s->data_partitioning){
4456 score+= put_bits_count(&s->pb2);
4457 score+= put_bits_count(&s->tex_pb);
4460 if(s->avctx->mb_decision == FF_MB_DECISION_RD){
4461 MPV_decode_mb(s, s->block);
4463 score *= s->lambda2;
4464 score += sse_mb(s) << FF_LAMBDA_SHIFT;
4468 memcpy(s->dest, dest_backup, sizeof(s->dest));
4475 copy_context_after_encode(best, s, type);
4479 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){
4480 uint32_t *sq = squareTbl + 256;
4485 return s->dsp.sse[0](NULL, src1, src2, stride, 16);
4486 else if(w==8 && h==8)
4487 return s->dsp.sse[1](NULL, src1, src2, stride, 8);
4491 acc+= sq[src1[x + y*stride] - src2[x + y*stride]];
4500 static int sse_mb(MpegEncContext *s){
4504 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
4505 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
4508 if(s->avctx->mb_cmp == FF_CMP_NSSE){
4509 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)
4510 +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)
4511 +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);
4513 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)
4514 +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)
4515 +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);
4518 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)
4519 +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)
4520 +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);
4523 static int pre_estimate_motion_thread(AVCodecContext *c, void *arg){
4524 MpegEncContext *s= arg;
4528 s->me.dia_size= s->avctx->pre_dia_size;
4529 s->first_slice_line=1;
4530 for(s->mb_y= s->end_mb_y-1; s->mb_y >= s->start_mb_y; s->mb_y--) {
4531 for(s->mb_x=s->mb_width-1; s->mb_x >=0 ;s->mb_x--) {
4532 ff_pre_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4534 s->first_slice_line=0;
4542 static int estimate_motion_thread(AVCodecContext *c, void *arg){
4543 MpegEncContext *s= arg;
4545 s->me.dia_size= s->avctx->dia_size;
4546 s->first_slice_line=1;
4547 for(s->mb_y= s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
4548 s->mb_x=0; //for block init below
4549 ff_init_block_index(s);
4550 for(s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
4551 s->block_index[0]+=2;
4552 s->block_index[1]+=2;
4553 s->block_index[2]+=2;
4554 s->block_index[3]+=2;
4556 /* compute motion vector & mb_type and store in context */
4557 if(s->pict_type==B_TYPE)
4558 ff_estimate_b_frame_motion(s, s->mb_x, s->mb_y);
4560 ff_estimate_p_frame_motion(s, s->mb_x, s->mb_y);
4562 s->first_slice_line=0;
4567 static int mb_var_thread(AVCodecContext *c, void *arg){
4568 MpegEncContext *s= arg;
4571 for(mb_y=s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4572 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4575 uint8_t *pix = s->new_picture.data[0] + (yy * s->linesize) + xx;
4577 int sum = s->dsp.pix_sum(pix, s->linesize);
4579 varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
4581 s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
4582 s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
4583 s->me.mb_var_sum_temp += varc;
4589 static void write_slice_end(MpegEncContext *s){
4590 if(s->codec_id==CODEC_ID_MPEG4){
4591 if(s->partitioned_frame){
4592 ff_mpeg4_merge_partitions(s);
4595 ff_mpeg4_stuffing(&s->pb);
4596 }else if(s->out_format == FMT_MJPEG){
4597 ff_mjpeg_stuffing(&s->pb);
4600 align_put_bits(&s->pb);
4601 flush_put_bits(&s->pb);
4603 if((s->flags&CODEC_FLAG_PASS1) && !s->partitioned_frame)
4604 s->misc_bits+= get_bits_diff(s);
4607 static int encode_thread(AVCodecContext *c, void *arg){
4608 MpegEncContext *s= arg;
4609 int mb_x, mb_y, pdif = 0;
4611 MpegEncContext best_s, backup_s;
4612 uint8_t bit_buf[2][MAX_MB_BYTES];
4613 uint8_t bit_buf2[2][MAX_MB_BYTES];
4614 uint8_t bit_buf_tex[2][MAX_MB_BYTES];
4615 PutBitContext pb[2], pb2[2], tex_pb[2];
4616 //printf("%d->%d\n", s->resync_mb_y, s->end_mb_y);
4619 init_put_bits(&pb [i], bit_buf [i], MAX_MB_BYTES);
4620 init_put_bits(&pb2 [i], bit_buf2 [i], MAX_MB_BYTES);
4621 init_put_bits(&tex_pb[i], bit_buf_tex[i], MAX_MB_BYTES);
4624 s->last_bits= put_bits_count(&s->pb);
4635 /* init last dc values */
4636 /* note: quant matrix value (8) is implied here */
4637 s->last_dc[i] = 128 << s->intra_dc_precision;
4639 s->current_picture_ptr->error[i] = 0;
4642 memset(s->last_mv, 0, sizeof(s->last_mv));
4646 switch(s->codec_id){
4648 case CODEC_ID_H263P:
4650 s->gob_index = ff_h263_get_gob_height(s);
4652 case CODEC_ID_MPEG4:
4653 if(s->partitioned_frame)
4654 ff_mpeg4_init_partitions(s);
4660 s->first_slice_line = 1;
4661 s->ptr_lastgob = s->pb.buf;
4662 for(mb_y= s->start_mb_y; mb_y < s->end_mb_y; mb_y++) {
4663 // printf("row %d at %X\n", s->mb_y, (int)s);
4667 ff_set_qscale(s, s->qscale);
4668 ff_init_block_index(s);
4670 for(mb_x=0; mb_x < s->mb_width; mb_x++) {
4671 int xy= mb_y*s->mb_stride + mb_x; // removed const, H261 needs to adjust this
4672 int mb_type= s->mb_type[xy];
4677 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
4678 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4681 if(s->data_partitioning){
4682 if( s->pb2 .buf_end - s->pb2 .buf - (put_bits_count(&s-> pb2)>>3) < MAX_MB_BYTES
4683 || s->tex_pb.buf_end - s->tex_pb.buf - (put_bits_count(&s->tex_pb )>>3) < MAX_MB_BYTES){
4684 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
4690 s->mb_y = mb_y; // moved into loop, can get changed by H.261
4691 ff_update_block_index(s);
4693 #ifdef CONFIG_H261_ENCODER
4694 if(s->codec_id == CODEC_ID_H261){
4695 ff_h261_reorder_mb_index(s);
4696 xy= s->mb_y*s->mb_stride + s->mb_x;
4697 mb_type= s->mb_type[xy];
4701 /* write gob / video packet header */
4703 int current_packet_size, is_gob_start;
4705 current_packet_size= ((put_bits_count(&s->pb)+7)>>3) - (s->ptr_lastgob - s->pb.buf);
4707 is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
4709 if(s->start_mb_y == mb_y && mb_y > 0 && mb_x==0) is_gob_start=1;
4711 switch(s->codec_id){
4713 case CODEC_ID_H263P:
4714 if(!s->h263_slice_structured)
4715 if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
4717 case CODEC_ID_MPEG2VIDEO:
4718 if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
4719 case CODEC_ID_MPEG1VIDEO:
4720 if(s->mb_skip_run) is_gob_start=0;
4725 if(s->start_mb_y != mb_y || mb_x!=0){
4728 if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
4729 ff_mpeg4_init_partitions(s);
4733 assert((put_bits_count(&s->pb)&7) == 0);
4734 current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
4736 if(s->avctx->error_rate && s->resync_mb_x + s->resync_mb_y > 0){
4737 int r= put_bits_count(&s->pb)/8 + s->picture_number + 16 + s->mb_x + s->mb_y;
4738 int d= 100 / s->avctx->error_rate;
4740 current_packet_size=0;
4741 #ifndef ALT_BITSTREAM_WRITER
4742 s->pb.buf_ptr= s->ptr_lastgob;
4744 assert(pbBufPtr(&s->pb) == s->ptr_lastgob);
4748 if (s->avctx->rtp_callback){
4749 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
4750 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
4753 switch(s->codec_id){
4754 case CODEC_ID_MPEG4:
4755 ff_mpeg4_encode_video_packet_header(s);
4756 ff_mpeg4_clean_buffers(s);
4758 case CODEC_ID_MPEG1VIDEO:
4759 case CODEC_ID_MPEG2VIDEO:
4760 ff_mpeg1_encode_slice_header(s);
4761 ff_mpeg1_clean_buffers(s);
4764 case CODEC_ID_H263P:
4765 h263_encode_gob_header(s, mb_y);
4769 if(s->flags&CODEC_FLAG_PASS1){
4770 int bits= put_bits_count(&s->pb);
4771 s->misc_bits+= bits - s->last_bits;
4775 s->ptr_lastgob += current_packet_size;
4776 s->first_slice_line=1;
4777 s->resync_mb_x=mb_x;
4778 s->resync_mb_y=mb_y;
4782 if( (s->resync_mb_x == s->mb_x)
4783 && s->resync_mb_y+1 == s->mb_y){
4784 s->first_slice_line=0;
4788 s->dquant=0; //only for QP_RD
4790 if(mb_type & (mb_type-1) || (s->flags & CODEC_FLAG_QP_RD)){ // more than 1 MB type possible or CODEC_FLAG_QP_RD
4792 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
4794 copy_context_before_encode(&backup_s, s, -1);
4796 best_s.data_partitioning= s->data_partitioning;
4797 best_s.partitioned_frame= s->partitioned_frame;
4798 if(s->data_partitioning){
4799 backup_s.pb2= s->pb2;
4800 backup_s.tex_pb= s->tex_pb;
4803 if(mb_type&CANDIDATE_MB_TYPE_INTER){
4804 s->mv_dir = MV_DIR_FORWARD;
4805 s->mv_type = MV_TYPE_16X16;
4807 s->mv[0][0][0] = s->p_mv_table[xy][0];
4808 s->mv[0][0][1] = s->p_mv_table[xy][1];
4809 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER, pb, pb2, tex_pb,
4810 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4812 if(mb_type&CANDIDATE_MB_TYPE_INTER_I){
4813 s->mv_dir = MV_DIR_FORWARD;
4814 s->mv_type = MV_TYPE_FIELD;
4817 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
4818 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
4819 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
4821 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER_I, pb, pb2, tex_pb,
4822 &dmin, &next_block, 0, 0);
4824 if(mb_type&CANDIDATE_MB_TYPE_SKIPPED){
4825 s->mv_dir = MV_DIR_FORWARD;
4826 s->mv_type = MV_TYPE_16X16;
4830 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_SKIPPED, pb, pb2, tex_pb,
4831 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4833 if(mb_type&CANDIDATE_MB_TYPE_INTER4V){
4834 s->mv_dir = MV_DIR_FORWARD;
4835 s->mv_type = MV_TYPE_8X8;
4838 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
4839 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
4841 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER4V, pb, pb2, tex_pb,
4842 &dmin, &next_block, 0, 0);
4844 if(mb_type&CANDIDATE_MB_TYPE_FORWARD){
4845 s->mv_dir = MV_DIR_FORWARD;
4846 s->mv_type = MV_TYPE_16X16;
4848 s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
4849 s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
4850 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD, pb, pb2, tex_pb,
4851 &dmin, &next_block, s->mv[0][0][0], s->mv[0][0][1]);
4853 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD){
4854 s->mv_dir = MV_DIR_BACKWARD;
4855 s->mv_type = MV_TYPE_16X16;
4857 s->mv[1][0][0] = s->b_back_mv_table[xy][0];
4858 s->mv[1][0][1] = s->b_back_mv_table[xy][1];
4859 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD, pb, pb2, tex_pb,
4860 &dmin, &next_block, s->mv[1][0][0], s->mv[1][0][1]);
4862 if(mb_type&CANDIDATE_MB_TYPE_BIDIR){
4863 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4864 s->mv_type = MV_TYPE_16X16;
4866 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
4867 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
4868 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
4869 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
4870 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR, pb, pb2, tex_pb,
4871 &dmin, &next_block, 0, 0);
4873 if(mb_type&CANDIDATE_MB_TYPE_DIRECT){
4874 int mx= s->b_direct_mv_table[xy][0];
4875 int my= s->b_direct_mv_table[xy][1];
4877 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
4879 ff_mpeg4_set_direct_mv(s, mx, my);
4880 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_DIRECT, pb, pb2, tex_pb,
4881 &dmin, &next_block, mx, my);
4883 if(mb_type&CANDIDATE_MB_TYPE_FORWARD_I){
4884 s->mv_dir = MV_DIR_FORWARD;
4885 s->mv_type = MV_TYPE_FIELD;
4888 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
4889 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
4890 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
4892 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_FORWARD_I, pb, pb2, tex_pb,
4893 &dmin, &next_block, 0, 0);
4895 if(mb_type&CANDIDATE_MB_TYPE_BACKWARD_I){
4896 s->mv_dir = MV_DIR_BACKWARD;
4897 s->mv_type = MV_TYPE_FIELD;
4900 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
4901 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
4902 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
4904 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BACKWARD_I, pb, pb2, tex_pb,
4905 &dmin, &next_block, 0, 0);
4907 if(mb_type&CANDIDATE_MB_TYPE_BIDIR_I){
4908 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
4909 s->mv_type = MV_TYPE_FIELD;
4911 for(dir=0; dir<2; dir++){
4913 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
4914 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
4915 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
4918 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_BIDIR_I, pb, pb2, tex_pb,
4919 &dmin, &next_block, 0, 0);
4921 if(mb_type&CANDIDATE_MB_TYPE_INTRA){
4923 s->mv_type = MV_TYPE_16X16;
4927 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTRA, pb, pb2, tex_pb,
4928 &dmin, &next_block, 0, 0);
4929 if(s->h263_pred || s->h263_aic){
4931 s->mbintra_table[mb_x + mb_y*s->mb_stride]=1;
4933 ff_clean_intra_table_entries(s); //old mode?
4937 if(s->flags & CODEC_FLAG_QP_RD){
4938 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){
4939 const int last_qp= backup_s.qscale;
4940 int dquant, dir, qp, dc[6];
4942 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0;
4944 assert(backup_s.dquant == 0);
4947 s->mv_dir= best_s.mv_dir;
4948 s->mv_type = MV_TYPE_16X16;
4949 s->mb_intra= best_s.mb_intra;
4950 s->mv[0][0][0] = best_s.mv[0][0][0];
4951 s->mv[0][0][1] = best_s.mv[0][0][1];
4952 s->mv[1][0][0] = best_s.mv[1][0][0];
4953 s->mv[1][0][1] = best_s.mv[1][0][1];
4955 dir= s->pict_type == B_TYPE ? 2 : 1;
4956 if(last_qp + dir > s->avctx->qmax) dir= -dir;
4957 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){
4958 qp= last_qp + dquant;
4959 if(qp < s->avctx->qmin || qp > s->avctx->qmax)
4961 backup_s.dquant= dquant;
4962 if(s->mb_intra && s->dc_val[0]){
4964 dc[i]= s->dc_val[0][ s->block_index[i] ];
4965 memcpy(ac[i], s->ac_val[0][s->block_index[i]], sizeof(DCTELEM)*16);
4969 encode_mb_hq(s, &backup_s, &best_s, CANDIDATE_MB_TYPE_INTER /* wrong but unused */, pb, pb2, tex_pb,
4970 &dmin, &next_block, s->mv[mvdir][0][0], s->mv[mvdir][0][1]);
4971 if(best_s.qscale != qp){
4972 if(s->mb_intra && s->dc_val[0]){
4974 s->dc_val[0][ s->block_index[i] ]= dc[i];
4975 memcpy(s->ac_val[0][s->block_index[i]], ac[i], sizeof(DCTELEM)*16);
4978 if(dir > 0 && dquant==dir){
4986 s->current_picture.qscale_table[xy]= qp;
4990 copy_context_after_encode(s, &best_s, -1);
4992 pb_bits_count= put_bits_count(&s->pb);
4993 flush_put_bits(&s->pb);
4994 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
4997 if(s->data_partitioning){
4998 pb2_bits_count= put_bits_count(&s->pb2);
4999 flush_put_bits(&s->pb2);
5000 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
5001 s->pb2= backup_s.pb2;
5003 tex_pb_bits_count= put_bits_count(&s->tex_pb);
5004 flush_put_bits(&s->tex_pb);
5005 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
5006 s->tex_pb= backup_s.tex_pb;
5008 s->last_bits= put_bits_count(&s->pb);
5010 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5011 ff_h263_update_motion_val(s);
5013 if(next_block==0){ //FIXME 16 vs linesize16
5014 s->dsp.put_pixels_tab[0][0](s->dest[0], s->rd_scratchpad , s->linesize ,16);
5015 s->dsp.put_pixels_tab[1][0](s->dest[1], s->rd_scratchpad + 16*s->linesize , s->uvlinesize, 8);
5016 s->dsp.put_pixels_tab[1][0](s->dest[2], s->rd_scratchpad + 16*s->linesize + 8, s->uvlinesize, 8);
5019 if(s->avctx->mb_decision == FF_MB_DECISION_BITS)
5020 MPV_decode_mb(s, s->block);
5022 int motion_x, motion_y;
5023 s->mv_type=MV_TYPE_16X16;
5024 // only one MB-Type possible
5027 case CANDIDATE_MB_TYPE_INTRA:
5030 motion_x= s->mv[0][0][0] = 0;
5031 motion_y= s->mv[0][0][1] = 0;
5033 case CANDIDATE_MB_TYPE_INTER:
5034 s->mv_dir = MV_DIR_FORWARD;
5036 motion_x= s->mv[0][0][0] = s->p_mv_table[xy][0];
5037 motion_y= s->mv[0][0][1] = s->p_mv_table[xy][1];
5039 case CANDIDATE_MB_TYPE_INTER_I:
5040 s->mv_dir = MV_DIR_FORWARD;
5041 s->mv_type = MV_TYPE_FIELD;
5044 j= s->field_select[0][i] = s->p_field_select_table[i][xy];
5045 s->mv[0][i][0] = s->p_field_mv_table[i][j][xy][0];
5046 s->mv[0][i][1] = s->p_field_mv_table[i][j][xy][1];
5048 motion_x = motion_y = 0;
5050 case CANDIDATE_MB_TYPE_INTER4V:
5051 s->mv_dir = MV_DIR_FORWARD;
5052 s->mv_type = MV_TYPE_8X8;
5055 s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0];
5056 s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1];
5058 motion_x= motion_y= 0;
5060 case CANDIDATE_MB_TYPE_DIRECT:
5061 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
5063 motion_x=s->b_direct_mv_table[xy][0];
5064 motion_y=s->b_direct_mv_table[xy][1];
5065 ff_mpeg4_set_direct_mv(s, motion_x, motion_y);
5067 case CANDIDATE_MB_TYPE_BIDIR:
5068 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5072 s->mv[0][0][0] = s->b_bidir_forw_mv_table[xy][0];
5073 s->mv[0][0][1] = s->b_bidir_forw_mv_table[xy][1];
5074 s->mv[1][0][0] = s->b_bidir_back_mv_table[xy][0];
5075 s->mv[1][0][1] = s->b_bidir_back_mv_table[xy][1];
5077 case CANDIDATE_MB_TYPE_BACKWARD:
5078 s->mv_dir = MV_DIR_BACKWARD;
5080 motion_x= s->mv[1][0][0] = s->b_back_mv_table[xy][0];
5081 motion_y= s->mv[1][0][1] = s->b_back_mv_table[xy][1];
5083 case CANDIDATE_MB_TYPE_FORWARD:
5084 s->mv_dir = MV_DIR_FORWARD;
5086 motion_x= s->mv[0][0][0] = s->b_forw_mv_table[xy][0];
5087 motion_y= s->mv[0][0][1] = s->b_forw_mv_table[xy][1];
5088 // printf(" %d %d ", motion_x, motion_y);
5090 case CANDIDATE_MB_TYPE_FORWARD_I:
5091 s->mv_dir = MV_DIR_FORWARD;
5092 s->mv_type = MV_TYPE_FIELD;
5095 j= s->field_select[0][i] = s->b_field_select_table[0][i][xy];
5096 s->mv[0][i][0] = s->b_field_mv_table[0][i][j][xy][0];
5097 s->mv[0][i][1] = s->b_field_mv_table[0][i][j][xy][1];
5099 motion_x=motion_y=0;
5101 case CANDIDATE_MB_TYPE_BACKWARD_I:
5102 s->mv_dir = MV_DIR_BACKWARD;
5103 s->mv_type = MV_TYPE_FIELD;
5106 j= s->field_select[1][i] = s->b_field_select_table[1][i][xy];
5107 s->mv[1][i][0] = s->b_field_mv_table[1][i][j][xy][0];
5108 s->mv[1][i][1] = s->b_field_mv_table[1][i][j][xy][1];
5110 motion_x=motion_y=0;
5112 case CANDIDATE_MB_TYPE_BIDIR_I:
5113 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD;
5114 s->mv_type = MV_TYPE_FIELD;
5116 for(dir=0; dir<2; dir++){
5118 j= s->field_select[dir][i] = s->b_field_select_table[dir][i][xy];
5119 s->mv[dir][i][0] = s->b_field_mv_table[dir][i][j][xy][0];
5120 s->mv[dir][i][1] = s->b_field_mv_table[dir][i][j][xy][1];
5123 motion_x=motion_y=0;
5126 motion_x=motion_y=0; //gcc warning fix
5127 av_log(s->avctx, AV_LOG_ERROR, "illegal MB type\n");
5130 encode_mb(s, motion_x, motion_y);
5132 // RAL: Update last macroblock type
5133 s->last_mv_dir = s->mv_dir;
5135 if (s->out_format == FMT_H263 && s->pict_type!=B_TYPE)
5136 ff_h263_update_motion_val(s);
5138 MPV_decode_mb(s, s->block);
5141 /* clean the MV table in IPS frames for direct mode in B frames */
5142 if(s->mb_intra /* && I,P,S_TYPE */){
5143 s->p_mv_table[xy][0]=0;
5144 s->p_mv_table[xy][1]=0;
5147 if(s->flags&CODEC_FLAG_PSNR){
5151 if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
5152 if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
5154 s->current_picture_ptr->error[0] += sse(
5155 s, s->new_picture.data[0] + s->mb_x*16 + s->mb_y*s->linesize*16,
5156 s->dest[0], w, h, s->linesize);
5157 s->current_picture_ptr->error[1] += sse(
5158 s, s->new_picture.data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5159 s->dest[1], w>>1, h>>1, s->uvlinesize);
5160 s->current_picture_ptr->error[2] += sse(
5161 s, s->new_picture .data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*8,
5162 s->dest[2], w>>1, h>>1, s->uvlinesize);
5165 if(s->out_format == FMT_H263)
5166 ff_h263_loop_filter(s);
5168 //printf("MB %d %d bits\n", s->mb_x+s->mb_y*s->mb_stride, put_bits_count(&s->pb));
5172 //not beautiful here but we must write it before flushing so it has to be here
5173 if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type == I_TYPE)
5174 msmpeg4_encode_ext_header(s);
5178 /* Send the last GOB if RTP */
5179 if (s->avctx->rtp_callback) {
5180 int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
5181 pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
5182 /* Call the RTP callback to send the last GOB */
5184 s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
5190 #define MERGE(field) dst->field += src->field; src->field=0
5191 static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src){
5192 MERGE(me.scene_change_score);
5193 MERGE(me.mc_mb_var_sum_temp);
5194 MERGE(me.mb_var_sum_temp);
5197 static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src){
5200 MERGE(dct_count[0]); //note, the other dct vars are not part of the context
5201 MERGE(dct_count[1]);
5211 MERGE(padding_bug_score);
5213 if(dst->avctx->noise_reduction){
5214 for(i=0; i<64; i++){
5215 MERGE(dct_error_sum[0][i]);
5216 MERGE(dct_error_sum[1][i]);
5220 assert(put_bits_count(&src->pb) % 8 ==0);
5221 assert(put_bits_count(&dst->pb) % 8 ==0);
5222 ff_copy_bits(&dst->pb, src->pb.buf, put_bits_count(&src->pb));
5223 flush_put_bits(&dst->pb);
5226 static void encode_picture(MpegEncContext *s, int picture_number)
5231 s->picture_number = picture_number;
5233 /* Reset the average MB variance */
5234 s->me.mb_var_sum_temp =
5235 s->me.mc_mb_var_sum_temp = 0;
5237 /* we need to initialize some time vars before we can encode b-frames */
5238 // RAL: Condition added for MPEG1VIDEO
5239 if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4))
5240 ff_set_mpeg4_time(s, s->picture_number); //FIXME rename and use has_b_frames or similar
5242 s->me.scene_change_score=0;
5244 // s->lambda= s->current_picture_ptr->quality; //FIXME qscale / ... stuff for ME ratedistoration
5246 if(s->pict_type==I_TYPE){
5247 if(s->msmpeg4_version >= 3) s->no_rounding=1;
5248 else s->no_rounding=0;
5249 }else if(s->pict_type!=B_TYPE){
5250 if(s->flipflop_rounding || s->codec_id == CODEC_ID_H263P || s->codec_id == CODEC_ID_MPEG4)
5251 s->no_rounding ^= 1;
5254 s->mb_intra=0; //for the rate distortion & bit compare functions
5255 for(i=1; i<s->avctx->thread_count; i++){
5256 ff_update_duplicate_context(s->thread_context[i], s);
5261 /* Estimate motion for every MB */
5262 if(s->pict_type != I_TYPE){
5263 s->lambda = (s->lambda * s->avctx->me_penalty_compensation + 128)>>8;
5264 s->lambda2= (s->lambda2* s->avctx->me_penalty_compensation + 128)>>8;
5265 if(s->pict_type != B_TYPE && s->avctx->me_threshold==0){
5266 if((s->avctx->pre_me && s->last_non_b_pict_type==I_TYPE) || s->avctx->pre_me==2){
5267 s->avctx->execute(s->avctx, pre_estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5271 s->avctx->execute(s->avctx, estimate_motion_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5272 }else /* if(s->pict_type == I_TYPE) */{
5274 for(i=0; i<s->mb_stride*s->mb_height; i++)
5275 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5277 if(!s->fixed_qscale){
5278 /* finding spatial complexity for I-frame rate control */
5279 s->avctx->execute(s->avctx, mb_var_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5282 for(i=1; i<s->avctx->thread_count; i++){
5283 merge_context_after_me(s, s->thread_context[i]);
5285 s->current_picture.mc_mb_var_sum= s->current_picture_ptr->mc_mb_var_sum= s->me.mc_mb_var_sum_temp;
5286 s->current_picture. mb_var_sum= s->current_picture_ptr-> mb_var_sum= s->me. mb_var_sum_temp;
5289 if(s->me.scene_change_score > s->avctx->scenechange_threshold && s->pict_type == P_TYPE){
5290 s->pict_type= I_TYPE;
5291 for(i=0; i<s->mb_stride*s->mb_height; i++)
5292 s->mb_type[i]= CANDIDATE_MB_TYPE_INTRA;
5293 //printf("Scene change detected, encoding as I Frame %d %d\n", s->current_picture.mb_var_sum, s->current_picture.mc_mb_var_sum);
5297 if(s->pict_type==P_TYPE || s->pict_type==S_TYPE) {
5298 s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
5300 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5302 a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
5303 b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
5304 s->f_code= FFMAX(s->f_code, FFMAX(a,b));
5307 ff_fix_long_p_mvs(s);
5308 ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
5309 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5313 ff_fix_long_mvs(s, s->p_field_select_table[i], j,
5314 s->p_field_mv_table[i][j], s->f_code, CANDIDATE_MB_TYPE_INTER_I, 0);
5319 if(s->pict_type==B_TYPE){
5322 a = ff_get_best_fcode(s, s->b_forw_mv_table, CANDIDATE_MB_TYPE_FORWARD);
5323 b = ff_get_best_fcode(s, s->b_bidir_forw_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5324 s->f_code = FFMAX(a, b);
5326 a = ff_get_best_fcode(s, s->b_back_mv_table, CANDIDATE_MB_TYPE_BACKWARD);
5327 b = ff_get_best_fcode(s, s->b_bidir_back_mv_table, CANDIDATE_MB_TYPE_BIDIR);
5328 s->b_code = FFMAX(a, b);
5330 ff_fix_long_mvs(s, NULL, 0, s->b_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_FORWARD, 1);
5331 ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
5332 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5333 ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
5334 if(s->flags & CODEC_FLAG_INTERLACED_ME){
5336 for(dir=0; dir<2; dir++){
5339 int type= dir ? (CANDIDATE_MB_TYPE_BACKWARD_I|CANDIDATE_MB_TYPE_BIDIR_I)
5340 : (CANDIDATE_MB_TYPE_FORWARD_I |CANDIDATE_MB_TYPE_BIDIR_I);
5341 ff_fix_long_mvs(s, s->b_field_select_table[dir][i], j,
5342 s->b_field_mv_table[dir][i][j], dir ? s->b_code : s->f_code, type, 1);
5350 if (!s->fixed_qscale)
5351 s->current_picture.quality = ff_rate_estimate_qscale(s); //FIXME pic_ptr
5353 if(s->adaptive_quant){
5354 switch(s->codec_id){
5355 case CODEC_ID_MPEG4:
5356 ff_clean_mpeg4_qscales(s);
5359 case CODEC_ID_H263P:
5361 ff_clean_h263_qscales(s);
5365 s->lambda= s->lambda_table[0];
5368 s->lambda= s->current_picture.quality;
5369 //printf("%d %d\n", s->avctx->global_quality, s->current_picture.quality);
5372 if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
5373 s->qscale= 3; //reduce clipping problems
5375 if (s->out_format == FMT_MJPEG) {
5376 /* for mjpeg, we do include qscale in the matrix */
5377 s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
5379 int j= s->dsp.idct_permutation[i];
5381 s->intra_matrix[j] = clip_uint8((ff_mpeg1_default_intra_matrix[i] * s->qscale) >> 3);
5383 convert_matrix(&s->dsp, s->q_intra_matrix, s->q_intra_matrix16,
5384 s->intra_matrix, s->intra_quant_bias, 8, 8, 1);
5388 //FIXME var duplication
5389 s->current_picture_ptr->key_frame=
5390 s->current_picture.key_frame= s->pict_type == I_TYPE; //FIXME pic_ptr
5391 s->current_picture_ptr->pict_type=
5392 s->current_picture.pict_type= s->pict_type;
5394 if(s->current_picture.key_frame)
5395 s->picture_in_gop_number=0;
5397 s->last_bits= put_bits_count(&s->pb);
5398 switch(s->out_format) {
5400 mjpeg_picture_header(s);
5402 #ifdef CONFIG_H261_ENCODER
5404 ff_h261_encode_picture_header(s, picture_number);
5408 if (s->codec_id == CODEC_ID_WMV2)
5409 ff_wmv2_encode_picture_header(s, picture_number);
5410 else if (s->h263_msmpeg4)
5411 msmpeg4_encode_picture_header(s, picture_number);
5412 else if (s->h263_pred)
5413 mpeg4_encode_picture_header(s, picture_number);
5414 #ifdef CONFIG_RV10_ENCODER
5415 else if (s->codec_id == CODEC_ID_RV10)
5416 rv10_encode_picture_header(s, picture_number);
5418 #ifdef CONFIG_RV20_ENCODER
5419 else if (s->codec_id == CODEC_ID_RV20)
5420 rv20_encode_picture_header(s, picture_number);
5422 else if (s->codec_id == CODEC_ID_FLV1)
5423 ff_flv_encode_picture_header(s, picture_number);
5425 h263_encode_picture_header(s, picture_number);
5428 mpeg1_encode_picture_header(s, picture_number);
5435 bits= put_bits_count(&s->pb);
5436 s->header_bits= bits - s->last_bits;
5438 for(i=1; i<s->avctx->thread_count; i++){
5439 update_duplicate_context_after_me(s->thread_context[i], s);
5441 s->avctx->execute(s->avctx, encode_thread, (void**)&(s->thread_context[0]), NULL, s->avctx->thread_count);
5442 for(i=1; i<s->avctx->thread_count; i++){
5443 merge_context_after_encode(s, s->thread_context[i]);
5448 #endif //CONFIG_ENCODERS
5450 static void denoise_dct_c(MpegEncContext *s, DCTELEM *block){
5451 const int intra= s->mb_intra;
5454 s->dct_count[intra]++;
5456 for(i=0; i<64; i++){
5457 int level= block[i];
5461 s->dct_error_sum[intra][i] += level;
5462 level -= s->dct_offset[intra][i];
5463 if(level<0) level=0;
5465 s->dct_error_sum[intra][i] -= level;
5466 level += s->dct_offset[intra][i];
5467 if(level>0) level=0;
5474 #ifdef CONFIG_ENCODERS
5476 static int dct_quantize_trellis_c(MpegEncContext *s,
5477 DCTELEM *block, int n,
5478 int qscale, int *overflow){
5480 const uint8_t *scantable= s->intra_scantable.scantable;
5481 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5483 unsigned int threshold1, threshold2;
5495 int coeff_count[64];
5496 int qmul, qadd, start_i, last_non_zero, i, dc;
5497 const int esc_length= s->ac_esc_length;
5499 uint8_t * last_length;
5500 const int lambda= s->lambda2 >> (FF_LAMBDA_SHIFT - 6);
5502 s->dsp.fdct (block);
5504 if(s->dct_error_sum)
5505 s->denoise_dct(s, block);
5507 qadd= ((qscale-1)|1)*8;
5518 /* For AIC we skip quant/dequant of INTRADC */
5523 /* note: block[0] is assumed to be positive */
5524 block[0] = (block[0] + (q >> 1)) / q;
5527 qmat = s->q_intra_matrix[qscale];
5528 if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5529 bias= 1<<(QMAT_SHIFT-1);
5530 length = s->intra_ac_vlc_length;
5531 last_length= s->intra_ac_vlc_last_length;
5535 qmat = s->q_inter_matrix[qscale];
5536 length = s->inter_ac_vlc_length;
5537 last_length= s->inter_ac_vlc_last_length;
5541 threshold1= (1<<QMAT_SHIFT) - bias - 1;
5542 threshold2= (threshold1<<1);
5544 for(i=63; i>=start_i; i--) {
5545 const int j = scantable[i];
5546 int level = block[j] * qmat[j];
5548 if(((unsigned)(level+threshold1))>threshold2){
5554 for(i=start_i; i<=last_non_zero; i++) {
5555 const int j = scantable[i];
5556 int level = block[j] * qmat[j];
5558 // if( bias+level >= (1<<(QMAT_SHIFT - 3))
5559 // || bias-level >= (1<<(QMAT_SHIFT - 3))){
5560 if(((unsigned)(level+threshold1))>threshold2){
5562 level= (bias + level)>>QMAT_SHIFT;
5564 coeff[1][i]= level-1;
5565 // coeff[2][k]= level-2;
5567 level= (bias - level)>>QMAT_SHIFT;
5568 coeff[0][i]= -level;
5569 coeff[1][i]= -level+1;
5570 // coeff[2][k]= -level+2;
5572 coeff_count[i]= FFMIN(level, 2);
5573 assert(coeff_count[i]);
5576 coeff[0][i]= (level>>31)|1;
5581 *overflow= s->max_qcoeff < max; //overflow might have happened
5583 if(last_non_zero < start_i){
5584 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5585 return last_non_zero;
5588 score_tab[start_i]= 0;
5589 survivor[0]= start_i;
5592 for(i=start_i; i<=last_non_zero; i++){
5594 const int dct_coeff= ABS(block[ scantable[i] ]);
5595 const int zero_distoration= dct_coeff*dct_coeff;
5596 int best_score=256*256*256*120;
5597 for(level_index=0; level_index < coeff_count[i]; level_index++){
5599 int level= coeff[level_index][i];
5600 const int alevel= ABS(level);
5605 if(s->out_format == FMT_H263){
5606 unquant_coeff= alevel*qmul + qadd;
5608 j= s->dsp.idct_permutation[ scantable[i] ]; //FIXME optimize
5610 unquant_coeff = (int)( alevel * qscale * s->intra_matrix[j]) >> 3;
5611 unquant_coeff = (unquant_coeff - 1) | 1;
5613 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[j])) >> 4;
5614 unquant_coeff = (unquant_coeff - 1) | 1;
5619 distoration= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distoration;
5621 if((level&(~127)) == 0){
5622 for(j=survivor_count-1; j>=0; j--){
5623 int run= i - survivor[j];
5624 int score= distoration + length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5625 score += score_tab[i-run];
5627 if(score < best_score){
5630 level_tab[i+1]= level-64;
5634 if(s->out_format == FMT_H263){
5635 for(j=survivor_count-1; j>=0; j--){
5636 int run= i - survivor[j];
5637 int score= distoration + last_length[UNI_AC_ENC_INDEX(run, level)]*lambda;
5638 score += score_tab[i-run];
5639 if(score < last_score){
5642 last_level= level-64;
5648 distoration += esc_length*lambda;
5649 for(j=survivor_count-1; j>=0; j--){
5650 int run= i - survivor[j];
5651 int score= distoration + score_tab[i-run];
5653 if(score < best_score){
5656 level_tab[i+1]= level-64;
5660 if(s->out_format == FMT_H263){
5661 for(j=survivor_count-1; j>=0; j--){
5662 int run= i - survivor[j];
5663 int score= distoration + score_tab[i-run];
5664 if(score < last_score){
5667 last_level= level-64;
5675 score_tab[i+1]= best_score;
5677 //Note: there is a vlc code in mpeg4 which is 1 bit shorter then another one with a shorter run and the same level
5678 if(last_non_zero <= 27){
5679 for(; survivor_count; survivor_count--){
5680 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
5684 for(; survivor_count; survivor_count--){
5685 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
5690 survivor[ survivor_count++ ]= i+1;
5693 if(s->out_format != FMT_H263){
5694 last_score= 256*256*256*120;
5695 for(i= survivor[0]; i<=last_non_zero + 1; i++){
5696 int score= score_tab[i];
5697 if(i) score += lambda*2; //FIXME exacter?
5699 if(score < last_score){
5702 last_level= level_tab[i];
5703 last_run= run_tab[i];
5708 s->coded_score[n] = last_score;
5711 last_non_zero= last_i - 1;
5712 memset(block + start_i, 0, (64-start_i)*sizeof(DCTELEM));
5714 if(last_non_zero < start_i)
5715 return last_non_zero;
5717 if(last_non_zero == 0 && start_i == 0){
5719 int best_score= dc * dc;
5721 for(i=0; i<coeff_count[0]; i++){
5722 int level= coeff[i][0];
5723 int alevel= ABS(level);
5724 int unquant_coeff, score, distortion;
5726 if(s->out_format == FMT_H263){
5727 unquant_coeff= (alevel*qmul + qadd)>>3;
5729 unquant_coeff = ((( alevel << 1) + 1) * qscale * ((int) s->inter_matrix[0])) >> 4;
5730 unquant_coeff = (unquant_coeff - 1) | 1;
5732 unquant_coeff = (unquant_coeff + 4) >> 3;
5733 unquant_coeff<<= 3 + 3;
5735 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
5737 if((level&(~127)) == 0) score= distortion + last_length[UNI_AC_ENC_INDEX(0, level)]*lambda;
5738 else score= distortion + esc_length*lambda;
5740 if(score < best_score){
5742 best_level= level - 64;
5745 block[0]= best_level;
5746 s->coded_score[n] = best_score - dc*dc;
5747 if(best_level == 0) return -1;
5748 else return last_non_zero;
5754 block[ perm_scantable[last_non_zero] ]= last_level;
5757 for(; i>start_i; i -= run_tab[i] + 1){
5758 block[ perm_scantable[i-1] ]= level_tab[i];
5761 return last_non_zero;
5764 //#define REFINE_STATS 1
5765 static int16_t basis[64][64];
5767 static void build_basis(uint8_t *perm){
5774 double s= 0.25*(1<<BASIS_SHIFT);
5776 int perm_index= perm[index];
5777 if(i==0) s*= sqrt(0.5);
5778 if(j==0) s*= sqrt(0.5);
5779 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)));
5786 static int dct_quantize_refine(MpegEncContext *s, //FIXME breaks denoise?
5787 DCTELEM *block, int16_t *weight, DCTELEM *orig,
5790 DCTELEM d1[64] __align16;
5792 const uint8_t *scantable= s->intra_scantable.scantable;
5793 const uint8_t *perm_scantable= s->intra_scantable.permutated;
5794 // unsigned int threshold1, threshold2;
5799 int qmul, qadd, start_i, last_non_zero, i, dc;
5801 uint8_t * last_length;
5803 int rle_index, run, q, sum;
5806 static int after_last=0;
5807 static int to_zero=0;
5808 static int from_zero=0;
5811 static int messed_sign=0;
5814 if(basis[0][0] == 0)
5815 build_basis(s->dsp.idct_permutation);
5826 /* For AIC we skip quant/dequant of INTRADC */
5830 q <<= RECON_SHIFT-3;
5831 /* note: block[0] is assumed to be positive */
5833 // block[0] = (block[0] + (q >> 1)) / q;
5835 qmat = s->q_intra_matrix[qscale];
5836 // if(s->mpeg_quant || s->out_format == FMT_MPEG1)
5837 // bias= 1<<(QMAT_SHIFT-1);
5838 length = s->intra_ac_vlc_length;
5839 last_length= s->intra_ac_vlc_last_length;
5843 qmat = s->q_inter_matrix[qscale];
5844 length = s->inter_ac_vlc_length;
5845 last_length= s->inter_ac_vlc_last_length;
5847 last_non_zero = s->block_last_index[n];
5852 dc += (1<<(RECON_SHIFT-1));
5853 for(i=0; i<64; i++){
5854 rem[i]= dc - (orig[i]<<RECON_SHIFT); //FIXME use orig dirrectly instead of copying to rem[]
5857 STOP_TIMER("memset rem[]")}
5860 for(i=0; i<64; i++){
5865 w= ABS(weight[i]) + qns*one;
5866 w= 15 + (48*qns*one + w/2)/w; // 16 .. 63
5869 // w=weight[i] = (63*qns + (w/2)) / w;
5875 lambda= sum*(uint64_t)s->lambda2 >> (FF_LAMBDA_SHIFT - 6 + 6 + 6 + 6);
5881 for(i=start_i; i<=last_non_zero; i++){
5882 int j= perm_scantable[i];
5883 const int level= block[j];
5887 if(level<0) coeff= qmul*level - qadd;
5888 else coeff= qmul*level + qadd;
5889 run_tab[rle_index++]=run;
5892 s->dsp.add_8x8basis(rem, basis[j], coeff);
5898 if(last_non_zero>0){
5899 STOP_TIMER("init rem[]")
5906 int best_score=s->dsp.try_8x8basis(rem, weight, basis[0], 0);
5909 int run2, best_unquant_change=0, analyze_gradient;
5913 analyze_gradient = last_non_zero > 2 || s->avctx->quantizer_noise_shaping >= 3;
5915 if(analyze_gradient){
5919 for(i=0; i<64; i++){
5922 d1[i] = (rem[i]*w*w + (1<<(RECON_SHIFT+12-1)))>>(RECON_SHIFT+12);
5925 STOP_TIMER("rem*w*w")}
5935 const int level= block[0];
5936 int change, old_coeff;
5938 assert(s->mb_intra);
5942 for(change=-1; change<=1; change+=2){
5943 int new_level= level + change;
5944 int score, new_coeff;
5946 new_coeff= q*new_level;
5947 if(new_coeff >= 2048 || new_coeff < 0)
5950 score= s->dsp.try_8x8basis(rem, weight, basis[0], new_coeff - old_coeff);
5951 if(score<best_score){
5954 best_change= change;
5955 best_unquant_change= new_coeff - old_coeff;
5962 run2= run_tab[rle_index++];
5966 for(i=start_i; i<64; i++){
5967 int j= perm_scantable[i];
5968 const int level= block[j];
5969 int change, old_coeff;
5971 if(s->avctx->quantizer_noise_shaping < 3 && i > last_non_zero + 1)
5975 if(level<0) old_coeff= qmul*level - qadd;
5976 else old_coeff= qmul*level + qadd;
5977 run2= run_tab[rle_index++]; //FIXME ! maybe after last
5981 assert(run2>=0 || i >= last_non_zero );
5984 for(change=-1; change<=1; change+=2){
5985 int new_level= level + change;
5986 int score, new_coeff, unquant_change;
5989 if(s->avctx->quantizer_noise_shaping < 2 && ABS(new_level) > ABS(level))
5993 if(new_level<0) new_coeff= qmul*new_level - qadd;
5994 else new_coeff= qmul*new_level + qadd;
5995 if(new_coeff >= 2048 || new_coeff <= -2048)
5997 //FIXME check for overflow
6000 if(level < 63 && level > -63){
6001 if(i < last_non_zero)
6002 score += length[UNI_AC_ENC_INDEX(run, new_level+64)]
6003 - length[UNI_AC_ENC_INDEX(run, level+64)];
6005 score += last_length[UNI_AC_ENC_INDEX(run, new_level+64)]
6006 - last_length[UNI_AC_ENC_INDEX(run, level+64)];
6009 assert(ABS(new_level)==1);
6011 if(analyze_gradient){
6012 int g= d1[ scantable[i] ];
6013 if(g && (g^new_level) >= 0)
6017 if(i < last_non_zero){
6018 int next_i= i + run2 + 1;
6019 int next_level= block[ perm_scantable[next_i] ] + 64;
6021 if(next_level&(~127))
6024 if(next_i < last_non_zero)
6025 score += length[UNI_AC_ENC_INDEX(run, 65)]
6026 + length[UNI_AC_ENC_INDEX(run2, next_level)]
6027 - length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6029 score += length[UNI_AC_ENC_INDEX(run, 65)]
6030 + last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6031 - last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)];
6033 score += last_length[UNI_AC_ENC_INDEX(run, 65)];
6035 score += length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6036 - last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6042 assert(ABS(level)==1);
6044 if(i < last_non_zero){
6045 int next_i= i + run2 + 1;
6046 int next_level= block[ perm_scantable[next_i] ] + 64;
6048 if(next_level&(~127))
6051 if(next_i < last_non_zero)
6052 score += length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6053 - length[UNI_AC_ENC_INDEX(run2, next_level)]
6054 - length[UNI_AC_ENC_INDEX(run, 65)];
6056 score += last_length[UNI_AC_ENC_INDEX(run + run2 + 1, next_level)]
6057 - last_length[UNI_AC_ENC_INDEX(run2, next_level)]
6058 - length[UNI_AC_ENC_INDEX(run, 65)];
6060 score += -last_length[UNI_AC_ENC_INDEX(run, 65)];
6062 score += last_length[UNI_AC_ENC_INDEX(prev_run, prev_level)]
6063 - length[UNI_AC_ENC_INDEX(prev_run, prev_level)];
6070 unquant_change= new_coeff - old_coeff;
6071 assert((score < 100*lambda && score > -100*lambda) || lambda==0);
6073 score+= s->dsp.try_8x8basis(rem, weight, basis[j], unquant_change);
6074 if(score<best_score){
6077 best_change= change;
6078 best_unquant_change= unquant_change;
6082 prev_level= level + 64;
6083 if(prev_level&(~127))
6092 STOP_TIMER("iterative step")}
6096 int j= perm_scantable[ best_coeff ];
6098 block[j] += best_change;
6100 if(best_coeff > last_non_zero){
6101 last_non_zero= best_coeff;
6109 if(block[j] - best_change){
6110 if(ABS(block[j]) > ABS(block[j] - best_change)){
6122 for(; last_non_zero>=start_i; last_non_zero--){
6123 if(block[perm_scantable[last_non_zero]])
6129 if(256*256*256*64 % count == 0){
6130 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);
6135 for(i=start_i; i<=last_non_zero; i++){
6136 int j= perm_scantable[i];
6137 const int level= block[j];
6140 run_tab[rle_index++]=run;
6147 s->dsp.add_8x8basis(rem, basis[j], best_unquant_change);
6153 if(last_non_zero>0){
6154 STOP_TIMER("iterative search")
6159 return last_non_zero;
6162 static int dct_quantize_c(MpegEncContext *s,
6163 DCTELEM *block, int n,
6164 int qscale, int *overflow)
6166 int i, j, level, last_non_zero, q, start_i;
6168 const uint8_t *scantable= s->intra_scantable.scantable;
6171 unsigned int threshold1, threshold2;
6173 s->dsp.fdct (block);
6175 if(s->dct_error_sum)
6176 s->denoise_dct(s, block);
6186 /* For AIC we skip quant/dequant of INTRADC */
6189 /* note: block[0] is assumed to be positive */
6190 block[0] = (block[0] + (q >> 1)) / q;
6193 qmat = s->q_intra_matrix[qscale];
6194 bias= s->intra_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6198 qmat = s->q_inter_matrix[qscale];
6199 bias= s->inter_quant_bias<<(QMAT_SHIFT - QUANT_BIAS_SHIFT);
6201 threshold1= (1<<QMAT_SHIFT) - bias - 1;
6202 threshold2= (threshold1<<1);
6203 for(i=63;i>=start_i;i--) {
6205 level = block[j] * qmat[j];
6207 if(((unsigned)(level+threshold1))>threshold2){
6214 for(i=start_i; i<=last_non_zero; i++) {
6216 level = block[j] * qmat[j];
6218 // if( bias+level >= (1<<QMAT_SHIFT)
6219 // || bias-level >= (1<<QMAT_SHIFT)){
6220 if(((unsigned)(level+threshold1))>threshold2){
6222 level= (bias + level)>>QMAT_SHIFT;
6225 level= (bias - level)>>QMAT_SHIFT;
6233 *overflow= s->max_qcoeff < max; //overflow might have happened
6235 /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
6236 if (s->dsp.idct_permutation_type != FF_NO_IDCT_PERM)
6237 ff_block_permute(block, s->dsp.idct_permutation, scantable, last_non_zero);
6239 return last_non_zero;
6242 #endif //CONFIG_ENCODERS
6244 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
6245 DCTELEM *block, int n, int qscale)
6247 int i, level, nCoeffs;
6248 const uint16_t *quant_matrix;
6250 nCoeffs= s->block_last_index[n];
6253 block[0] = block[0] * s->y_dc_scale;
6255 block[0] = block[0] * s->c_dc_scale;
6256 /* XXX: only mpeg1 */
6257 quant_matrix = s->intra_matrix;
6258 for(i=1;i<=nCoeffs;i++) {
6259 int j= s->intra_scantable.permutated[i];
6264 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6265 level = (level - 1) | 1;
6268 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6269 level = (level - 1) | 1;
6276 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
6277 DCTELEM *block, int n, int qscale)
6279 int i, level, nCoeffs;
6280 const uint16_t *quant_matrix;
6282 nCoeffs= s->block_last_index[n];
6284 quant_matrix = s->inter_matrix;
6285 for(i=0; i<=nCoeffs; i++) {
6286 int j= s->intra_scantable.permutated[i];
6291 level = (((level << 1) + 1) * qscale *
6292 ((int) (quant_matrix[j]))) >> 4;
6293 level = (level - 1) | 1;
6296 level = (((level << 1) + 1) * qscale *
6297 ((int) (quant_matrix[j]))) >> 4;
6298 level = (level - 1) | 1;
6305 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
6306 DCTELEM *block, int n, int qscale)
6308 int i, level, nCoeffs;
6309 const uint16_t *quant_matrix;
6311 if(s->alternate_scan) nCoeffs= 63;
6312 else nCoeffs= s->block_last_index[n];
6315 block[0] = block[0] * s->y_dc_scale;
6317 block[0] = block[0] * s->c_dc_scale;
6318 quant_matrix = s->intra_matrix;
6319 for(i=1;i<=nCoeffs;i++) {
6320 int j= s->intra_scantable.permutated[i];
6325 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6328 level = (int)(level * qscale * quant_matrix[j]) >> 3;
6335 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
6336 DCTELEM *block, int n, int qscale)
6338 int i, level, nCoeffs;
6339 const uint16_t *quant_matrix;
6342 if(s->alternate_scan) nCoeffs= 63;
6343 else nCoeffs= s->block_last_index[n];
6345 quant_matrix = s->inter_matrix;
6346 for(i=0; i<=nCoeffs; i++) {
6347 int j= s->intra_scantable.permutated[i];
6352 level = (((level << 1) + 1) * qscale *
6353 ((int) (quant_matrix[j]))) >> 4;
6356 level = (((level << 1) + 1) * qscale *
6357 ((int) (quant_matrix[j]))) >> 4;
6366 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
6367 DCTELEM *block, int n, int qscale)
6369 int i, level, qmul, qadd;
6372 assert(s->block_last_index[n]>=0);
6378 block[0] = block[0] * s->y_dc_scale;
6380 block[0] = block[0] * s->c_dc_scale;
6381 qadd = (qscale - 1) | 1;
6388 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6390 for(i=1; i<=nCoeffs; i++) {
6394 level = level * qmul - qadd;
6396 level = level * qmul + qadd;
6403 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
6404 DCTELEM *block, int n, int qscale)
6406 int i, level, qmul, qadd;
6409 assert(s->block_last_index[n]>=0);
6411 qadd = (qscale - 1) | 1;
6414 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
6416 for(i=0; i<=nCoeffs; i++) {
6420 level = level * qmul - qadd;
6422 level = level * qmul + qadd;
6429 #ifdef CONFIG_ENCODERS
6430 AVCodec h263_encoder = {
6434 sizeof(MpegEncContext),
6438 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6441 AVCodec h263p_encoder = {
6445 sizeof(MpegEncContext),
6449 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6452 AVCodec flv_encoder = {
6456 sizeof(MpegEncContext),
6460 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6463 AVCodec rv10_encoder = {
6467 sizeof(MpegEncContext),
6471 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6474 AVCodec rv20_encoder = {
6478 sizeof(MpegEncContext),
6482 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6485 AVCodec mpeg4_encoder = {
6489 sizeof(MpegEncContext),
6493 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6494 .capabilities= CODEC_CAP_DELAY,
6497 AVCodec msmpeg4v1_encoder = {
6501 sizeof(MpegEncContext),
6505 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6508 AVCodec msmpeg4v2_encoder = {
6512 sizeof(MpegEncContext),
6516 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6519 AVCodec msmpeg4v3_encoder = {
6523 sizeof(MpegEncContext),
6527 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6530 AVCodec wmv1_encoder = {
6534 sizeof(MpegEncContext),
6538 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV420P, -1},
6541 AVCodec mjpeg_encoder = {
6545 sizeof(MpegEncContext),
6549 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUVJ420P, -1},
6552 #endif //CONFIG_ENCODERS