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 * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
8 * This file is part of FFmpeg.
10 * FFmpeg is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * FFmpeg is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with FFmpeg; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 * The simplest mpeg encoder (well, it was the simplest!).
30 #include "libavutil/intmath.h"
31 #include "libavutil/imgutils.h"
35 #include "mpegvideo.h"
36 #include "mpegvideo_common.h"
40 #include "xvmc_internal.h"
47 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
48 DCTELEM *block, int n, int qscale);
49 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
50 DCTELEM *block, int n, int qscale);
51 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
52 DCTELEM *block, int n, int qscale);
53 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
54 DCTELEM *block, int n, int qscale);
55 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
56 DCTELEM *block, int n, int qscale);
57 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
58 DCTELEM *block, int n, int qscale);
59 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
60 DCTELEM *block, int n, int qscale);
63 /* enable all paranoid tests for rounding, overflows, etc... */
69 static const uint8_t ff_default_chroma_qscale_table[32]={
70 // 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
71 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
74 const uint8_t ff_mpeg1_dc_scale_table[128]={
75 // 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
76 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
77 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
78 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
79 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
82 static const uint8_t mpeg2_dc_scale_table1[128]={
83 // 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
84 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
85 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
86 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
87 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90 static const uint8_t mpeg2_dc_scale_table2[128]={
91 // 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
92 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
93 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
94 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
95 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98 static const uint8_t mpeg2_dc_scale_table3[128]={
99 // 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
100 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
101 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
102 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
103 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106 const uint8_t * const ff_mpeg2_dc_scale_table[4]={
107 ff_mpeg1_dc_scale_table,
108 mpeg2_dc_scale_table1,
109 mpeg2_dc_scale_table2,
110 mpeg2_dc_scale_table3,
113 const enum PixelFormat ff_pixfmt_list_420[] = {
118 const enum PixelFormat ff_hwaccel_pixfmt_list_420[] = {
125 const uint8_t *ff_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
133 uint32_t tmp= *state << 8;
134 *state= tmp + *(p++);
135 if(tmp == 0x100 || p==end)
140 if (p[-1] > 1 ) p+= 3;
141 else if(p[-2] ) p+= 2;
142 else if(p[-3]|(p[-1]-1)) p++;
155 /* init common dct for both encoder and decoder */
156 av_cold int ff_dct_common_init(MpegEncContext *s)
158 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
159 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
160 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
161 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
162 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
163 if(s->flags & CODEC_FLAG_BITEXACT)
164 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
165 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
168 MPV_common_init_mmx(s);
170 MPV_common_init_axp(s);
172 MPV_common_init_mlib(s);
174 MPV_common_init_mmi(s);
176 MPV_common_init_arm(s);
178 MPV_common_init_altivec(s);
180 MPV_common_init_bfin(s);
183 /* load & permutate scantables
184 note: only wmv uses different ones
186 if(s->alternate_scan){
187 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
188 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
190 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
191 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
193 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
194 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
199 void ff_copy_picture(Picture *dst, Picture *src){
201 dst->type= FF_BUFFER_TYPE_COPY;
205 * Release a frame buffer
207 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
209 ff_thread_release_buffer(s->avctx, (AVFrame*)pic);
210 av_freep(&pic->hwaccel_picture_private);
214 * Allocate a frame buffer
216 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
220 if (s->avctx->hwaccel) {
221 assert(!pic->hwaccel_picture_private);
222 if (s->avctx->hwaccel->priv_data_size) {
223 pic->hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
224 if (!pic->hwaccel_picture_private) {
225 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
231 r = ff_thread_get_buffer(s->avctx, (AVFrame*)pic);
233 if (r<0 || !pic->age || !pic->type || !pic->data[0]) {
234 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", r, pic->age, pic->type, pic->data[0]);
235 av_freep(&pic->hwaccel_picture_private);
239 if (s->linesize && (s->linesize != pic->linesize[0] || s->uvlinesize != pic->linesize[1])) {
240 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
241 free_frame_buffer(s, pic);
245 if (pic->linesize[1] != pic->linesize[2]) {
246 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
247 free_frame_buffer(s, pic);
255 * allocates a Picture
256 * The pixels are allocated/set by calling get_buffer() if shared=0
258 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){
259 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
260 const int mb_array_size= s->mb_stride*s->mb_height;
261 const int b8_array_size= s->b8_stride*s->mb_height*2;
262 const int b4_array_size= s->b4_stride*s->mb_height*4;
267 assert(pic->data[0]);
268 assert(pic->type == 0 || pic->type == FF_BUFFER_TYPE_SHARED);
269 pic->type= FF_BUFFER_TYPE_SHARED;
271 assert(!pic->data[0]);
273 if (alloc_frame_buffer(s, pic) < 0)
276 s->linesize = pic->linesize[0];
277 s->uvlinesize= pic->linesize[1];
280 if(pic->qscale_table==NULL){
282 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var , mb_array_size * sizeof(int16_t) , fail)
283 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t) , fail)
284 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean , mb_array_size * sizeof(int8_t ) , fail)
287 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check
288 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t) , fail)
289 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail)
290 pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1;
291 if(s->out_format == FMT_H264){
293 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t), fail)
294 pic->motion_val[i]= pic->motion_val_base[i]+4;
295 FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
297 pic->motion_subsample_log2= 2;
298 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
300 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail)
301 pic->motion_val[i]= pic->motion_val_base[i]+4;
302 FF_ALLOCZ_OR_GOTO(s->avctx, pic->ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
304 pic->motion_subsample_log2= 3;
306 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
307 FF_ALLOCZ_OR_GOTO(s->avctx, pic->dct_coeff, 64 * mb_array_size * sizeof(DCTELEM)*6, fail)
309 pic->qstride= s->mb_stride;
310 FF_ALLOCZ_OR_GOTO(s->avctx, pic->pan_scan , 1 * sizeof(AVPanScan), fail)
313 /* It might be nicer if the application would keep track of these
314 * but it would require an API change. */
315 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
316 s->prev_pict_types[0]= s->dropable ? FF_B_TYPE : s->pict_type;
317 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == FF_B_TYPE)
318 pic->age= INT_MAX; // Skipped MBs in B-frames are quite rare in MPEG-1/2 and it is a bit tricky to skip them anyway.
322 fail: //for the FF_ALLOCZ_OR_GOTO macro
324 free_frame_buffer(s, pic);
329 * deallocates a picture
331 static void free_picture(MpegEncContext *s, Picture *pic){
334 if(pic->data[0] && pic->type!=FF_BUFFER_TYPE_SHARED){
335 free_frame_buffer(s, pic);
338 av_freep(&pic->mb_var);
339 av_freep(&pic->mc_mb_var);
340 av_freep(&pic->mb_mean);
341 av_freep(&pic->mbskip_table);
342 av_freep(&pic->qscale_table);
343 av_freep(&pic->mb_type_base);
344 av_freep(&pic->dct_coeff);
345 av_freep(&pic->pan_scan);
348 av_freep(&pic->motion_val_base[i]);
349 av_freep(&pic->ref_index[i]);
352 if(pic->type == FF_BUFFER_TYPE_SHARED){
361 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
362 int y_size = s->b8_stride * (2 * s->mb_height + 1);
363 int c_size = s->mb_stride * (s->mb_height + 1);
364 int yc_size = y_size + 2 * c_size;
367 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
368 FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
369 s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21;
371 //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
372 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail)
373 s->me.temp= s->me.scratchpad;
374 s->rd_scratchpad= s->me.scratchpad;
375 s->b_scratchpad= s->me.scratchpad;
376 s->obmc_scratchpad= s->me.scratchpad + 16;
378 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map , ME_MAP_SIZE*sizeof(uint32_t), fail)
379 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail)
380 if(s->avctx->noise_reduction){
381 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail)
384 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail)
385 s->block= s->blocks[0];
388 s->pblocks[i] = &s->block[i];
391 if (s->out_format == FMT_H263) {
393 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
394 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
395 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
396 s->ac_val[2] = s->ac_val[1] + c_size;
401 return -1; //free() through MPV_common_end()
404 static void free_duplicate_context(MpegEncContext *s){
407 av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
408 av_freep(&s->me.scratchpad);
412 s->obmc_scratchpad= NULL;
414 av_freep(&s->dct_error_sum);
415 av_freep(&s->me.map);
416 av_freep(&s->me.score_map);
417 av_freep(&s->blocks);
418 av_freep(&s->ac_val_base);
422 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
423 #define COPY(a) bak->a= src->a
424 COPY(allocated_edge_emu_buffer);
425 COPY(edge_emu_buffer);
430 COPY(obmc_scratchpad);
437 COPY(me.map_generation);
449 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
452 //FIXME copy only needed parts
454 backup_duplicate_context(&bak, dst);
455 memcpy(dst, src, sizeof(MpegEncContext));
456 backup_duplicate_context(dst, &bak);
458 dst->pblocks[i] = &dst->block[i];
460 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
463 int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
465 MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
467 if(dst == src || !s1->context_initialized) return 0;
469 //FIXME can parameters change on I-frames? in that case dst may need a reinit
470 if(!s->context_initialized){
471 memcpy(s, s1, sizeof(MpegEncContext));
474 s->picture_range_start += MAX_PICTURE_COUNT;
475 s->picture_range_end += MAX_PICTURE_COUNT;
476 s->bitstream_buffer = NULL;
477 s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
482 s->avctx->coded_height = s1->avctx->coded_height;
483 s->avctx->coded_width = s1->avctx->coded_width;
484 s->avctx->width = s1->avctx->width;
485 s->avctx->height = s1->avctx->height;
487 s->coded_picture_number = s1->coded_picture_number;
488 s->picture_number = s1->picture_number;
489 s->input_picture_number = s1->input_picture_number;
491 memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
492 memcpy(&s->last_picture, &s1->last_picture, (char*)&s1->last_picture_ptr - (char*)&s1->last_picture);
494 s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
495 s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
496 s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
498 memcpy(s->prev_pict_types, s1->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
500 //Error/bug resilience
501 s->next_p_frame_damaged = s1->next_p_frame_damaged;
502 s->workaround_bugs = s1->workaround_bugs;
505 memcpy(&s->time_increment_bits, &s1->time_increment_bits, (char*)&s1->shape - (char*)&s1->time_increment_bits);
508 s->max_b_frames = s1->max_b_frames;
509 s->low_delay = s1->low_delay;
510 s->dropable = s1->dropable;
512 //DivX handling (doesn't work)
513 s->divx_packed = s1->divx_packed;
515 if(s1->bitstream_buffer){
516 if (s1->bitstream_buffer_size + FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
517 av_fast_malloc(&s->bitstream_buffer, &s->allocated_bitstream_buffer_size, s1->allocated_bitstream_buffer_size);
518 s->bitstream_buffer_size = s1->bitstream_buffer_size;
519 memcpy(s->bitstream_buffer, s1->bitstream_buffer, s1->bitstream_buffer_size);
520 memset(s->bitstream_buffer+s->bitstream_buffer_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
523 //MPEG2/interlacing info
524 memcpy(&s->progressive_sequence, &s1->progressive_sequence, (char*)&s1->rtp_mode - (char*)&s1->progressive_sequence);
526 if(!s1->first_field){
527 s->last_pict_type= s1->pict_type;
528 if (s1->current_picture_ptr) s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->quality;
530 if(s1->pict_type!=FF_B_TYPE){
531 s->last_non_b_pict_type= s1->pict_type;
539 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
540 * the changed fields will not depend upon the prior state of the MpegEncContext.
542 void MPV_common_defaults(MpegEncContext *s){
544 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
545 s->chroma_qscale_table= ff_default_chroma_qscale_table;
546 s->progressive_frame= 1;
547 s->progressive_sequence= 1;
548 s->picture_structure= PICT_FRAME;
550 s->coded_picture_number = 0;
551 s->picture_number = 0;
552 s->input_picture_number = 0;
554 s->picture_in_gop_number = 0;
559 s->picture_range_start = 0;
560 s->picture_range_end = MAX_PICTURE_COUNT;
564 * sets the given MpegEncContext to defaults for decoding.
565 * the changed fields will not depend upon the prior state of the MpegEncContext.
567 void MPV_decode_defaults(MpegEncContext *s){
568 MPV_common_defaults(s);
572 * init common structure for both encoder and decoder.
573 * this assumes that some variables like width/height are already set
575 av_cold int MPV_common_init(MpegEncContext *s)
577 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y, threads;
579 if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
580 s->mb_height = (s->height + 31) / 32 * 2;
581 else if (s->codec_id != CODEC_ID_H264)
582 s->mb_height = (s->height + 15) / 16;
584 if(s->avctx->pix_fmt == PIX_FMT_NONE){
585 av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n");
589 if(s->avctx->active_thread_type&FF_THREAD_SLICE &&
590 (s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height))){
591 av_log(s->avctx, AV_LOG_ERROR, "too many threads\n");
595 if((s->width || s->height) && av_image_check_size(s->width, s->height, 0, s->avctx))
598 dsputil_init(&s->dsp, s->avctx);
599 ff_dct_common_init(s);
601 s->flags= s->avctx->flags;
602 s->flags2= s->avctx->flags2;
604 s->mb_width = (s->width + 15) / 16;
605 s->mb_stride = s->mb_width + 1;
606 s->b8_stride = s->mb_width*2 + 1;
607 s->b4_stride = s->mb_width*4 + 1;
608 mb_array_size= s->mb_height * s->mb_stride;
609 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
611 /* set chroma shifts */
612 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
613 &(s->chroma_y_shift) );
615 /* set default edge pos, will be overriden in decode_header if needed */
616 s->h_edge_pos= s->mb_width*16;
617 s->v_edge_pos= s->mb_height*16;
619 s->mb_num = s->mb_width * s->mb_height;
624 s->block_wrap[3]= s->b8_stride;
626 s->block_wrap[5]= s->mb_stride;
628 y_size = s->b8_stride * (2 * s->mb_height + 1);
629 c_size = s->mb_stride * (s->mb_height + 1);
630 yc_size = y_size + 2 * c_size;
632 /* convert fourcc to upper case */
633 s->codec_tag = ff_toupper4(s->avctx->codec_tag);
635 s->stream_codec_tag = ff_toupper4(s->avctx->stream_codec_tag);
637 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
639 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
640 for(y=0; y<s->mb_height; y++){
641 for(x=0; x<s->mb_width; x++){
642 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
645 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
648 /* Allocate MV tables */
649 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
650 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
651 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
652 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
653 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
654 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
655 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
656 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
657 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
658 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
659 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
660 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
662 if(s->msmpeg4_version){
663 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
665 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
667 /* Allocate MB type table */
668 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
670 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
672 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix , 64*32 * sizeof(int), fail)
673 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix , 64*32 * sizeof(int), fail)
674 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
675 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
676 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
677 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
679 if(s->avctx->noise_reduction){
680 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
683 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
684 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, s->picture_count * sizeof(Picture), fail)
685 for(i = 0; i < s->picture_count; i++) {
686 avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
689 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
691 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
692 /* interlaced direct mode decoding tables */
697 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
698 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
700 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
701 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
702 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
704 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
707 if (s->out_format == FMT_H263) {
709 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
710 s->coded_block= s->coded_block_base + s->b8_stride + 1;
712 /* cbp, ac_pred, pred_dir */
713 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail)
714 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
717 if (s->h263_pred || s->h263_plus || !s->encoding) {
719 //MN: we need these for error resilience of intra-frames
720 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
721 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
722 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
723 s->dc_val[2] = s->dc_val[1] + c_size;
724 for(i=0;i<yc_size;i++)
725 s->dc_val_base[i] = 1024;
728 /* which mb is a intra block */
729 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
730 memset(s->mbintra_table, 1, mb_array_size);
732 /* init macroblock skip table */
733 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
734 //Note the +1 is for a quicker mpeg4 slice_end detection
735 FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
737 s->parse_context.state= -1;
738 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
739 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
740 s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
741 s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
744 s->context_initialized = 1;
745 s->thread_context[0]= s;
747 if (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE) {
748 threads = s->avctx->thread_count;
750 for(i=1; i<threads; i++){
751 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
752 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
755 for(i=0; i<threads; i++){
756 if(init_duplicate_context(s->thread_context[i], s) < 0)
758 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
759 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
762 if(init_duplicate_context(s, s) < 0) goto fail;
764 s->end_mb_y = s->mb_height;
773 /* init common structure for both encoder and decoder */
774 void MPV_common_end(MpegEncContext *s)
778 if (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE) {
779 for(i=0; i<s->avctx->thread_count; i++){
780 free_duplicate_context(s->thread_context[i]);
782 for(i=1; i<s->avctx->thread_count; i++){
783 av_freep(&s->thread_context[i]);
785 } else free_duplicate_context(s);
787 av_freep(&s->parse_context.buffer);
788 s->parse_context.buffer_size=0;
790 av_freep(&s->mb_type);
791 av_freep(&s->p_mv_table_base);
792 av_freep(&s->b_forw_mv_table_base);
793 av_freep(&s->b_back_mv_table_base);
794 av_freep(&s->b_bidir_forw_mv_table_base);
795 av_freep(&s->b_bidir_back_mv_table_base);
796 av_freep(&s->b_direct_mv_table_base);
798 s->b_forw_mv_table= NULL;
799 s->b_back_mv_table= NULL;
800 s->b_bidir_forw_mv_table= NULL;
801 s->b_bidir_back_mv_table= NULL;
802 s->b_direct_mv_table= NULL;
806 av_freep(&s->b_field_mv_table_base[i][j][k]);
807 s->b_field_mv_table[i][j][k]=NULL;
809 av_freep(&s->b_field_select_table[i][j]);
810 av_freep(&s->p_field_mv_table_base[i][j]);
811 s->p_field_mv_table[i][j]=NULL;
813 av_freep(&s->p_field_select_table[i]);
816 av_freep(&s->dc_val_base);
817 av_freep(&s->coded_block_base);
818 av_freep(&s->mbintra_table);
819 av_freep(&s->cbp_table);
820 av_freep(&s->pred_dir_table);
822 av_freep(&s->mbskip_table);
823 av_freep(&s->prev_pict_types);
824 av_freep(&s->bitstream_buffer);
825 s->allocated_bitstream_buffer_size=0;
827 av_freep(&s->avctx->stats_out);
828 av_freep(&s->ac_stats);
829 av_freep(&s->error_status_table);
830 av_freep(&s->mb_index2xy);
831 av_freep(&s->lambda_table);
832 av_freep(&s->q_intra_matrix);
833 av_freep(&s->q_inter_matrix);
834 av_freep(&s->q_intra_matrix16);
835 av_freep(&s->q_inter_matrix16);
836 av_freep(&s->input_picture);
837 av_freep(&s->reordered_input_picture);
838 av_freep(&s->dct_offset);
840 if(s->picture && !s->avctx->is_copy){
841 for(i=0; i<s->picture_count; i++){
842 free_picture(s, &s->picture[i]);
845 av_freep(&s->picture);
846 s->context_initialized = 0;
849 s->current_picture_ptr= NULL;
850 s->linesize= s->uvlinesize= 0;
853 av_freep(&s->visualization_buffer[i]);
855 if(!(s->avctx->active_thread_type&FF_THREAD_FRAME))
856 avcodec_default_free_buffers(s->avctx);
859 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
861 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
862 uint8_t index_run[MAX_RUN+1];
863 int last, run, level, start, end, i;
865 /* If table is static, we can quit if rl->max_level[0] is not NULL */
866 if(static_store && rl->max_level[0])
869 /* compute max_level[], max_run[] and index_run[] */
870 for(last=0;last<2;last++) {
879 memset(max_level, 0, MAX_RUN + 1);
880 memset(max_run, 0, MAX_LEVEL + 1);
881 memset(index_run, rl->n, MAX_RUN + 1);
882 for(i=start;i<end;i++) {
883 run = rl->table_run[i];
884 level = rl->table_level[i];
885 if (index_run[run] == rl->n)
887 if (level > max_level[run])
888 max_level[run] = level;
889 if (run > max_run[level])
890 max_run[level] = run;
893 rl->max_level[last] = static_store[last];
895 rl->max_level[last] = av_malloc(MAX_RUN + 1);
896 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
898 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
900 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
901 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
903 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
905 rl->index_run[last] = av_malloc(MAX_RUN + 1);
906 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
910 void init_vlc_rl(RLTable *rl)
922 for(i=0; i<rl->vlc.table_size; i++){
923 int code= rl->vlc.table[i][0];
924 int len = rl->vlc.table[i][1];
927 if(len==0){ // illegal code
930 }else if(len<0){ //more bits needed
934 if(code==rl->n){ //esc
938 run= rl->table_run [code] + 1;
939 level= rl->table_level[code] * qmul + qadd;
940 if(code >= rl->last) run+=192;
943 rl->rl_vlc[q][i].len= len;
944 rl->rl_vlc[q][i].level= level;
945 rl->rl_vlc[q][i].run= run;
950 void ff_release_unused_pictures(MpegEncContext *s, int remove_current)
954 /* release non reference frames */
955 for(i=0; i<s->picture_count; i++){
956 if(s->picture[i].data[0] && !s->picture[i].reference
957 && s->picture[i].owner2 == s
958 && (remove_current || &s->picture[i] != s->current_picture_ptr)
959 /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
960 free_frame_buffer(s, &s->picture[i]);
965 int ff_find_unused_picture(MpegEncContext *s, int shared){
969 for(i=s->picture_range_start; i<s->picture_range_end; i++){
970 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
973 for(i=s->picture_range_start; i<s->picture_range_end; i++){
974 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
976 for(i=s->picture_range_start; i<s->picture_range_end; i++){
977 if(s->picture[i].data[0]==NULL) return i;
981 av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
982 /* We could return -1, but the codec would crash trying to draw into a
983 * non-existing frame anyway. This is safer than waiting for a random crash.
984 * Also the return of this is never useful, an encoder must only allocate
985 * as much as allowed in the specification. This has no relationship to how
986 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
987 * enough for such valid streams).
988 * Plus, a decoder has to check stream validity and remove frames if too
989 * many reference frames are around. Waiting for "OOM" is not correct at
990 * all. Similarly, missing reference frames have to be replaced by
991 * interpolated/MC frames, anything else is a bug in the codec ...
997 static void update_noise_reduction(MpegEncContext *s){
1000 for(intra=0; intra<2; intra++){
1001 if(s->dct_count[intra] > (1<<16)){
1002 for(i=0; i<64; i++){
1003 s->dct_error_sum[intra][i] >>=1;
1005 s->dct_count[intra] >>= 1;
1008 for(i=0; i<64; i++){
1009 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);
1015 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1017 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1023 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1025 /* mark&release old frames */
1026 if (s->pict_type != FF_B_TYPE && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1027 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1028 free_frame_buffer(s, s->last_picture_ptr);
1030 /* release forgotten pictures */
1031 /* if(mpeg124/h263) */
1033 for(i=0; i<s->picture_count; i++){
1034 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1035 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1036 free_frame_buffer(s, &s->picture[i]);
1044 ff_release_unused_pictures(s, 1);
1046 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1047 pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
1049 i= ff_find_unused_picture(s, 0);
1050 pic= &s->picture[i];
1055 if (s->codec_id == CODEC_ID_H264)
1056 pic->reference = s->picture_structure;
1057 else if (s->pict_type != FF_B_TYPE)
1061 pic->coded_picture_number= s->coded_picture_number++;
1063 if(ff_alloc_picture(s, pic, 0) < 0)
1066 s->current_picture_ptr= pic;
1067 //FIXME use only the vars from current_pic
1068 s->current_picture_ptr->top_field_first= s->top_field_first;
1069 if(s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) {
1070 if(s->picture_structure != PICT_FRAME)
1071 s->current_picture_ptr->top_field_first= (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1073 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1074 s->current_picture_ptr->field_picture= s->picture_structure != PICT_FRAME;
1077 s->current_picture_ptr->pict_type= s->pict_type;
1078 // if(s->flags && CODEC_FLAG_QSCALE)
1079 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1080 s->current_picture_ptr->key_frame= s->pict_type == FF_I_TYPE;
1082 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1084 if (s->pict_type != FF_B_TYPE) {
1085 s->last_picture_ptr= s->next_picture_ptr;
1087 s->next_picture_ptr= s->current_picture_ptr;
1089 /* 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,
1090 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1091 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1092 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1093 s->pict_type, s->dropable);*/
1095 if(s->codec_id != CODEC_ID_H264){
1096 if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && s->pict_type!=FF_I_TYPE){
1097 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1098 /* Allocate a dummy frame */
1099 i= ff_find_unused_picture(s, 0);
1100 s->last_picture_ptr= &s->picture[i];
1101 if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
1103 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0);
1104 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 1);
1106 if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==FF_B_TYPE){
1107 /* Allocate a dummy frame */
1108 i= ff_find_unused_picture(s, 0);
1109 s->next_picture_ptr= &s->picture[i];
1110 if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
1112 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 0);
1113 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 1);
1117 if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1118 if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1120 assert(s->pict_type == FF_I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1122 if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
1125 if(s->picture_structure == PICT_BOTTOM_FIELD){
1126 s->current_picture.data[i] += s->current_picture.linesize[i];
1128 s->current_picture.linesize[i] *= 2;
1129 s->last_picture.linesize[i] *=2;
1130 s->next_picture.linesize[i] *=2;
1135 s->hurry_up= s->avctx->hurry_up;
1137 s->error_recognition= avctx->error_recognition;
1139 /* set dequantizer, we can't do it during init as it might change for mpeg4
1140 and we can't do it in the header decode as init is not called for mpeg4 there yet */
1141 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1142 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1143 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1144 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1145 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1146 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1148 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1149 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1152 if(s->dct_error_sum){
1153 assert(s->avctx->noise_reduction && s->encoding);
1155 update_noise_reduction(s);
1158 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1159 return ff_xvmc_field_start(s, avctx);
1164 /* generic function for encode/decode called after a frame has been coded/decoded */
1165 void MPV_frame_end(MpegEncContext *s)
1168 /* redraw edges for the frame if decoding didn't complete */
1169 //just to make sure that all data is rendered.
1170 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1171 ff_xvmc_field_end(s);
1172 }else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND))
1173 && !s->avctx->hwaccel
1174 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1175 && s->unrestricted_mv
1176 && s->current_picture.reference
1178 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1179 int edges = EDGE_BOTTOM | EDGE_TOP, h = s->v_edge_pos;
1181 s->dsp.draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , h , EDGE_WIDTH , edges);
1182 s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges);
1183 s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges);
1189 s->last_pict_type = s->pict_type;
1190 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1191 if(s->pict_type!=FF_B_TYPE){
1192 s->last_non_b_pict_type= s->pict_type;
1195 /* copy back current_picture variables */
1196 for(i=0; i<MAX_PICTURE_COUNT; i++){
1197 if(s->picture[i].data[0] == s->current_picture.data[0]){
1198 s->picture[i]= s->current_picture;
1202 assert(i<MAX_PICTURE_COUNT);
1206 /* release non-reference frames */
1207 for(i=0; i<s->picture_count; i++){
1208 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1209 free_frame_buffer(s, &s->picture[i]);
1213 // clear copies, to avoid confusion
1215 memset(&s->last_picture, 0, sizeof(Picture));
1216 memset(&s->next_picture, 0, sizeof(Picture));
1217 memset(&s->current_picture, 0, sizeof(Picture));
1219 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1221 if (s->codec_id != CODEC_ID_H264 && s->current_picture.reference) {
1222 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_height-1, 0);
1227 * draws an line from (ex, ey) -> (sx, sy).
1228 * @param w width of the image
1229 * @param h height of the image
1230 * @param stride stride/linesize of the image
1231 * @param color color of the arrow
1233 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1236 sx= av_clip(sx, 0, w-1);
1237 sy= av_clip(sy, 0, h-1);
1238 ex= av_clip(ex, 0, w-1);
1239 ey= av_clip(ey, 0, h-1);
1241 buf[sy*stride + sx]+= color;
1243 if(FFABS(ex - sx) > FFABS(ey - sy)){
1245 FFSWAP(int, sx, ex);
1246 FFSWAP(int, sy, ey);
1248 buf+= sx + sy*stride;
1250 f= ((ey-sy)<<16)/ex;
1251 for(x= 0; x <= ex; x++){
1254 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1255 buf[(y+1)*stride + x]+= (color* fr )>>16;
1259 FFSWAP(int, sx, ex);
1260 FFSWAP(int, sy, ey);
1262 buf+= sx + sy*stride;
1264 if(ey) f= ((ex-sx)<<16)/ey;
1266 for(y= 0; y <= ey; y++){
1269 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;
1270 buf[y*stride + x+1]+= (color* fr )>>16;
1276 * draws an arrow from (ex, ey) -> (sx, sy).
1277 * @param w width of the image
1278 * @param h height of the image
1279 * @param stride stride/linesize of the image
1280 * @param color color of the arrow
1282 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1285 sx= av_clip(sx, -100, w+100);
1286 sy= av_clip(sy, -100, h+100);
1287 ex= av_clip(ex, -100, w+100);
1288 ey= av_clip(ey, -100, h+100);
1293 if(dx*dx + dy*dy > 3*3){
1296 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1298 //FIXME subpixel accuracy
1299 rx= ROUNDED_DIV(rx*3<<4, length);
1300 ry= ROUNDED_DIV(ry*3<<4, length);
1302 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1303 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1305 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1309 * prints debuging info for the given picture.
1311 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1313 if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1315 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1318 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1319 switch (pict->pict_type) {
1320 case FF_I_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1321 case FF_P_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1322 case FF_B_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1323 case FF_S_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1324 case FF_SI_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1325 case FF_SP_TYPE: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1327 for(y=0; y<s->mb_height; y++){
1328 for(x=0; x<s->mb_width; x++){
1329 if(s->avctx->debug&FF_DEBUG_SKIP){
1330 int count= s->mbskip_table[x + y*s->mb_stride];
1331 if(count>9) count=9;
1332 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1334 if(s->avctx->debug&FF_DEBUG_QP){
1335 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1337 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1338 int mb_type= pict->mb_type[x + y*s->mb_stride];
1339 //Type & MV direction
1341 av_log(s->avctx, AV_LOG_DEBUG, "P");
1342 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1343 av_log(s->avctx, AV_LOG_DEBUG, "A");
1344 else if(IS_INTRA4x4(mb_type))
1345 av_log(s->avctx, AV_LOG_DEBUG, "i");
1346 else if(IS_INTRA16x16(mb_type))
1347 av_log(s->avctx, AV_LOG_DEBUG, "I");
1348 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1349 av_log(s->avctx, AV_LOG_DEBUG, "d");
1350 else if(IS_DIRECT(mb_type))
1351 av_log(s->avctx, AV_LOG_DEBUG, "D");
1352 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1353 av_log(s->avctx, AV_LOG_DEBUG, "g");
1354 else if(IS_GMC(mb_type))
1355 av_log(s->avctx, AV_LOG_DEBUG, "G");
1356 else if(IS_SKIP(mb_type))
1357 av_log(s->avctx, AV_LOG_DEBUG, "S");
1358 else if(!USES_LIST(mb_type, 1))
1359 av_log(s->avctx, AV_LOG_DEBUG, ">");
1360 else if(!USES_LIST(mb_type, 0))
1361 av_log(s->avctx, AV_LOG_DEBUG, "<");
1363 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1364 av_log(s->avctx, AV_LOG_DEBUG, "X");
1369 av_log(s->avctx, AV_LOG_DEBUG, "+");
1370 else if(IS_16X8(mb_type))
1371 av_log(s->avctx, AV_LOG_DEBUG, "-");
1372 else if(IS_8X16(mb_type))
1373 av_log(s->avctx, AV_LOG_DEBUG, "|");
1374 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1375 av_log(s->avctx, AV_LOG_DEBUG, " ");
1377 av_log(s->avctx, AV_LOG_DEBUG, "?");
1380 if(IS_INTERLACED(mb_type))
1381 av_log(s->avctx, AV_LOG_DEBUG, "=");
1383 av_log(s->avctx, AV_LOG_DEBUG, " ");
1385 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1387 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1391 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1392 const int shift= 1 + s->quarter_sample;
1396 int h_chroma_shift, v_chroma_shift, block_height;
1397 const int width = s->avctx->width;
1398 const int height= s->avctx->height;
1399 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1400 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1401 s->low_delay=0; //needed to see the vectors without trashing the buffers
1403 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1405 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1406 pict->data[i]= s->visualization_buffer[i];
1408 pict->type= FF_BUFFER_TYPE_COPY;
1410 block_height = 16>>v_chroma_shift;
1412 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1414 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1415 const int mb_index= mb_x + mb_y*s->mb_stride;
1416 if((s->avctx->debug_mv) && pict->motion_val){
1418 for(type=0; type<3; type++){
1421 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=FF_P_TYPE))
1425 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=FF_B_TYPE))
1429 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=FF_B_TYPE))
1434 if(!USES_LIST(pict->mb_type[mb_index], direction))
1437 if(IS_8X8(pict->mb_type[mb_index])){
1440 int sx= mb_x*16 + 4 + 8*(i&1);
1441 int sy= mb_y*16 + 4 + 8*(i>>1);
1442 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1443 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1444 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1445 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1447 }else if(IS_16X8(pict->mb_type[mb_index])){
1451 int sy=mb_y*16 + 4 + 8*i;
1452 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1453 int mx=(pict->motion_val[direction][xy][0]>>shift);
1454 int my=(pict->motion_val[direction][xy][1]>>shift);
1456 if(IS_INTERLACED(pict->mb_type[mb_index]))
1459 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1461 }else if(IS_8X16(pict->mb_type[mb_index])){
1464 int sx=mb_x*16 + 4 + 8*i;
1466 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1467 int mx=(pict->motion_val[direction][xy][0]>>shift);
1468 int my=(pict->motion_val[direction][xy][1]>>shift);
1470 if(IS_INTERLACED(pict->mb_type[mb_index]))
1473 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1476 int sx= mb_x*16 + 8;
1477 int sy= mb_y*16 + 8;
1478 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1479 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1480 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1481 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1485 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1486 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1488 for(y=0; y<block_height; y++){
1489 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
1490 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
1493 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1494 int mb_type= pict->mb_type[mb_index];
1497 #define COLOR(theta, r)\
1498 u= (int)(128 + r*cos(theta*3.141592/180));\
1499 v= (int)(128 + r*sin(theta*3.141592/180));
1503 if(IS_PCM(mb_type)){
1505 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1507 }else if(IS_INTRA4x4(mb_type)){
1509 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1511 }else if(IS_DIRECT(mb_type)){
1513 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1515 }else if(IS_GMC(mb_type)){
1517 }else if(IS_SKIP(mb_type)){
1519 }else if(!USES_LIST(mb_type, 1)){
1521 }else if(!USES_LIST(mb_type, 0)){
1524 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1528 u*= 0x0101010101010101ULL;
1529 v*= 0x0101010101010101ULL;
1530 for(y=0; y<block_height; y++){
1531 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
1532 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
1536 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1537 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1538 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1540 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1542 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1544 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1545 int dm= 1 << (mv_sample_log2-2);
1547 int sx= mb_x*16 + 8*(i&1);
1548 int sy= mb_y*16 + 8*(i>>1);
1549 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1551 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1552 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1554 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1555 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1556 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1560 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1564 s->mbskip_table[mb_index]=0;
1570 static inline int hpel_motion_lowres(MpegEncContext *s,
1571 uint8_t *dest, uint8_t *src,
1572 int field_based, int field_select,
1573 int src_x, int src_y,
1574 int width, int height, int stride,
1575 int h_edge_pos, int v_edge_pos,
1576 int w, int h, h264_chroma_mc_func *pix_op,
1577 int motion_x, int motion_y)
1579 const int lowres= s->avctx->lowres;
1580 const int op_index= FFMIN(lowres, 2);
1581 const int s_mask= (2<<lowres)-1;
1585 if(s->quarter_sample){
1590 sx= motion_x & s_mask;
1591 sy= motion_y & s_mask;
1592 src_x += motion_x >> (lowres+1);
1593 src_y += motion_y >> (lowres+1);
1595 src += src_y * stride + src_x;
1597 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
1598 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1599 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
1600 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1601 src= s->edge_emu_buffer;
1605 sx= (sx << 2) >> lowres;
1606 sy= (sy << 2) >> lowres;
1609 pix_op[op_index](dest, src, stride, h, sx, sy);
1613 /* apply one mpeg motion vector to the three components */
1614 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1615 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1616 int field_based, int bottom_field, int field_select,
1617 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1618 int motion_x, int motion_y, int h, int mb_y)
1620 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1621 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
1622 const int lowres= s->avctx->lowres;
1623 const int op_index= FFMIN(lowres, 2);
1624 const int block_s= 8>>lowres;
1625 const int s_mask= (2<<lowres)-1;
1626 const int h_edge_pos = s->h_edge_pos >> lowres;
1627 const int v_edge_pos = s->v_edge_pos >> lowres;
1628 linesize = s->current_picture.linesize[0] << field_based;
1629 uvlinesize = s->current_picture.linesize[1] << field_based;
1631 if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
1637 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
1640 sx= motion_x & s_mask;
1641 sy= motion_y & s_mask;
1642 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
1643 src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1645 if (s->out_format == FMT_H263) {
1646 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
1647 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
1650 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
1653 uvsx = (2*mx) & s_mask;
1654 uvsy = (2*my) & s_mask;
1655 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
1656 uvsrc_y = mb_y*block_s + (my >> lowres);
1662 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1663 uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1));
1666 ptr_y = ref_picture[0] + src_y * linesize + src_x;
1667 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1668 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1670 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
1671 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1672 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
1673 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1674 ptr_y = s->edge_emu_buffer;
1675 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1676 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1677 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
1678 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1679 s->dsp.emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
1680 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1686 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
1687 dest_y += s->linesize;
1688 dest_cb+= s->uvlinesize;
1689 dest_cr+= s->uvlinesize;
1693 ptr_y += s->linesize;
1694 ptr_cb+= s->uvlinesize;
1695 ptr_cr+= s->uvlinesize;
1698 sx= (sx << 2) >> lowres;
1699 sy= (sy << 2) >> lowres;
1700 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1702 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1703 uvsx= (uvsx << 2) >> lowres;
1704 uvsy= (uvsy << 2) >> lowres;
1705 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1706 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1708 //FIXME h261 lowres loop filter
1711 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1712 uint8_t *dest_cb, uint8_t *dest_cr,
1713 uint8_t **ref_picture,
1714 h264_chroma_mc_func *pix_op,
1716 const int lowres= s->avctx->lowres;
1717 const int op_index= FFMIN(lowres, 2);
1718 const int block_s= 8>>lowres;
1719 const int s_mask= (2<<lowres)-1;
1720 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
1721 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
1722 int emu=0, src_x, src_y, offset, sx, sy;
1725 if(s->quarter_sample){
1730 /* In case of 8X8, we construct a single chroma motion vector
1731 with a special rounding */
1732 mx= ff_h263_round_chroma(mx);
1733 my= ff_h263_round_chroma(my);
1737 src_x = s->mb_x*block_s + (mx >> (lowres+1));
1738 src_y = s->mb_y*block_s + (my >> (lowres+1));
1740 offset = src_y * s->uvlinesize + src_x;
1741 ptr = ref_picture[1] + offset;
1742 if(s->flags&CODEC_FLAG_EMU_EDGE){
1743 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
1744 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
1745 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1746 ptr= s->edge_emu_buffer;
1750 sx= (sx << 2) >> lowres;
1751 sy= (sy << 2) >> lowres;
1752 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1754 ptr = ref_picture[2] + offset;
1756 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1757 ptr= s->edge_emu_buffer;
1759 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
1763 * motion compensation of a single macroblock
1765 * @param dest_y luma destination pointer
1766 * @param dest_cb chroma cb/u destination pointer
1767 * @param dest_cr chroma cr/v destination pointer
1768 * @param dir direction (0->forward, 1->backward)
1769 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
1770 * @param pix_op halfpel motion compensation function (average or put normally)
1771 * the motion vectors are taken from s->mv and the MV type from s->mv_type
1773 static inline void MPV_motion_lowres(MpegEncContext *s,
1774 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1775 int dir, uint8_t **ref_picture,
1776 h264_chroma_mc_func *pix_op)
1780 const int lowres= s->avctx->lowres;
1781 const int block_s= 8>>lowres;
1786 switch(s->mv_type) {
1788 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1790 ref_picture, pix_op,
1791 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
1797 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1798 ref_picture[0], 0, 0,
1799 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
1800 s->width, s->height, s->linesize,
1801 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
1802 block_s, block_s, pix_op,
1803 s->mv[dir][i][0], s->mv[dir][i][1]);
1805 mx += s->mv[dir][i][0];
1806 my += s->mv[dir][i][1];
1809 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
1810 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
1813 if (s->picture_structure == PICT_FRAME) {
1815 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1816 1, 0, s->field_select[dir][0],
1817 ref_picture, pix_op,
1818 s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
1820 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1821 1, 1, s->field_select[dir][1],
1822 ref_picture, pix_op,
1823 s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
1825 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != FF_B_TYPE && !s->first_field){
1826 ref_picture= s->current_picture_ptr->data;
1829 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1830 0, 0, s->field_select[dir][0],
1831 ref_picture, pix_op,
1832 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
1837 uint8_t ** ref2picture;
1839 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == FF_B_TYPE || s->first_field){
1840 ref2picture= ref_picture;
1842 ref2picture= s->current_picture_ptr->data;
1845 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1846 0, 0, s->field_select[dir][i],
1847 ref2picture, pix_op,
1848 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1850 dest_y += 2*block_s*s->linesize;
1851 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1852 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1856 if(s->picture_structure == PICT_FRAME){
1860 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1862 ref_picture, pix_op,
1863 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
1865 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1869 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1870 0, 0, s->picture_structure != i+1,
1871 ref_picture, pix_op,
1872 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1874 // after put we make avg of the same block
1875 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1877 //opposite parity is always in the same frame if this is second field
1878 if(!s->first_field){
1879 ref_picture = s->current_picture_ptr->data;
1889 * find the lowest MB row referenced in the MVs
1891 int MPV_lowest_referenced_row(MpegEncContext *s, int dir)
1893 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
1894 int my, off, i, mvs;
1896 if (s->picture_structure != PICT_FRAME) goto unhandled;
1898 switch (s->mv_type) {
1912 for (i = 0; i < mvs; i++) {
1913 my = s->mv[dir][i][1]<<qpel_shift;
1914 my_max = FFMAX(my_max, my);
1915 my_min = FFMIN(my_min, my);
1918 off = (FFMAX(-my_min, my_max) + 63) >> 6;
1920 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
1922 return s->mb_height-1;
1925 /* put block[] to dest[] */
1926 static inline void put_dct(MpegEncContext *s,
1927 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1929 s->dct_unquantize_intra(s, block, i, qscale);
1930 s->dsp.idct_put (dest, line_size, block);
1933 /* add block[] to dest[] */
1934 static inline void add_dct(MpegEncContext *s,
1935 DCTELEM *block, int i, uint8_t *dest, int line_size)
1937 if (s->block_last_index[i] >= 0) {
1938 s->dsp.idct_add (dest, line_size, block);
1942 static inline void add_dequant_dct(MpegEncContext *s,
1943 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1945 if (s->block_last_index[i] >= 0) {
1946 s->dct_unquantize_inter(s, block, i, qscale);
1948 s->dsp.idct_add (dest, line_size, block);
1953 * cleans dc, ac, coded_block for the current non intra MB
1955 void ff_clean_intra_table_entries(MpegEncContext *s)
1957 int wrap = s->b8_stride;
1958 int xy = s->block_index[0];
1961 s->dc_val[0][xy + 1 ] =
1962 s->dc_val[0][xy + wrap] =
1963 s->dc_val[0][xy + 1 + wrap] = 1024;
1965 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
1966 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1967 if (s->msmpeg4_version>=3) {
1968 s->coded_block[xy ] =
1969 s->coded_block[xy + 1 ] =
1970 s->coded_block[xy + wrap] =
1971 s->coded_block[xy + 1 + wrap] = 0;
1974 wrap = s->mb_stride;
1975 xy = s->mb_x + s->mb_y * wrap;
1977 s->dc_val[2][xy] = 1024;
1979 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
1980 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1982 s->mbintra_table[xy]= 0;
1985 /* generic function called after a macroblock has been parsed by the
1986 decoder or after it has been encoded by the encoder.
1988 Important variables used:
1989 s->mb_intra : true if intra macroblock
1990 s->mv_dir : motion vector direction
1991 s->mv_type : motion vector type
1992 s->mv : motion vector
1993 s->interlaced_dct : true if interlaced dct used (mpeg2)
1995 static av_always_inline
1996 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
1997 int lowres_flag, int is_mpeg12)
1999 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2000 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2001 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2005 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2006 /* save DCT coefficients */
2008 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
2009 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2011 for(j=0; j<64; j++){
2012 *dct++ = block[i][s->dsp.idct_permutation[j]];
2013 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2015 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2019 s->current_picture.qscale_table[mb_xy]= s->qscale;
2021 /* update DC predictors for P macroblocks */
2023 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2024 if(s->mbintra_table[mb_xy])
2025 ff_clean_intra_table_entries(s);
2029 s->last_dc[2] = 128 << s->intra_dc_precision;
2032 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2033 s->mbintra_table[mb_xy]=1;
2035 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==FF_B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
2036 uint8_t *dest_y, *dest_cb, *dest_cr;
2037 int dct_linesize, dct_offset;
2038 op_pixels_func (*op_pix)[4];
2039 qpel_mc_func (*op_qpix)[16];
2040 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2041 const int uvlinesize= s->current_picture.linesize[1];
2042 const int readable= s->pict_type != FF_B_TYPE || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2043 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2045 /* avoid copy if macroblock skipped in last frame too */
2046 /* skip only during decoding as we might trash the buffers during encoding a bit */
2048 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2049 const int age= s->current_picture.age;
2053 if (s->mb_skipped) {
2055 assert(s->pict_type!=FF_I_TYPE);
2057 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
2058 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2060 /* if previous was skipped too, then nothing to do ! */
2061 if (*mbskip_ptr >= age && s->current_picture.reference){
2064 } else if(!s->current_picture.reference){
2065 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2066 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2068 *mbskip_ptr = 0; /* not skipped */
2072 dct_linesize = linesize << s->interlaced_dct;
2073 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
2077 dest_cb= s->dest[1];
2078 dest_cr= s->dest[2];
2080 dest_y = s->b_scratchpad;
2081 dest_cb= s->b_scratchpad+16*linesize;
2082 dest_cr= s->b_scratchpad+32*linesize;
2086 /* motion handling */
2087 /* decoding or more than one mb_type (MC was already done otherwise) */
2090 if(HAVE_PTHREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2091 if (s->mv_dir & MV_DIR_FORWARD) {
2092 ff_thread_await_progress((AVFrame*)s->last_picture_ptr, MPV_lowest_referenced_row(s, 0), 0);
2094 if (s->mv_dir & MV_DIR_BACKWARD) {
2095 ff_thread_await_progress((AVFrame*)s->next_picture_ptr, MPV_lowest_referenced_row(s, 1), 0);
2100 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2102 if (s->mv_dir & MV_DIR_FORWARD) {
2103 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
2104 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2106 if (s->mv_dir & MV_DIR_BACKWARD) {
2107 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
2110 op_qpix= s->me.qpel_put;
2111 if ((!s->no_rounding) || s->pict_type==FF_B_TYPE){
2112 op_pix = s->dsp.put_pixels_tab;
2114 op_pix = s->dsp.put_no_rnd_pixels_tab;
2116 if (s->mv_dir & MV_DIR_FORWARD) {
2117 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2118 op_pix = s->dsp.avg_pixels_tab;
2119 op_qpix= s->me.qpel_avg;
2121 if (s->mv_dir & MV_DIR_BACKWARD) {
2122 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2127 /* skip dequant / idct if we are really late ;) */
2129 if(s->hurry_up>1) goto skip_idct;
2131 if(s->avctx->skip_idct){
2132 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == FF_B_TYPE)
2133 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != FF_I_TYPE)
2134 || s->avctx->skip_idct >= AVDISCARD_ALL)
2138 /* add dct residue */
2139 if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2140 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2141 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2142 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2143 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2144 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2146 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2147 if (s->chroma_y_shift){
2148 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2149 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2153 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2154 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2155 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2156 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2159 } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
2160 add_dct(s, block[0], 0, dest_y , dct_linesize);
2161 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2162 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2163 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2165 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2166 if(s->chroma_y_shift){//Chroma420
2167 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2168 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2171 dct_linesize = uvlinesize << s->interlaced_dct;
2172 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2174 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2175 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2176 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2177 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2178 if(!s->chroma_x_shift){//Chroma444
2179 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
2180 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
2181 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
2182 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
2187 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2188 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2191 /* dct only in intra block */
2192 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2193 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2194 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2195 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2196 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2198 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2199 if(s->chroma_y_shift){
2200 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2201 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2205 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2206 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2207 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2208 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2212 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2213 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2214 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2215 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2217 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2218 if(s->chroma_y_shift){
2219 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2220 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2223 dct_linesize = uvlinesize << s->interlaced_dct;
2224 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2226 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2227 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2228 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2229 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2230 if(!s->chroma_x_shift){//Chroma444
2231 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2232 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2233 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2234 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
2242 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2243 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2244 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2249 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2251 if(s->out_format == FMT_MPEG1) {
2252 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2253 else MPV_decode_mb_internal(s, block, 0, 1);
2256 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2257 else MPV_decode_mb_internal(s, block, 0, 0);
2262 * @param h is the normal height, this will be reduced automatically if needed for the last row
2264 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2265 const int field_pic= s->picture_structure != PICT_FRAME;
2271 if (!s->avctx->hwaccel
2272 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2273 && s->unrestricted_mv
2274 && s->current_picture.reference
2276 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2277 int sides = 0, edge_h;
2278 if (y==0) sides |= EDGE_TOP;
2279 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2281 edge_h= FFMIN(h, s->v_edge_pos - y);
2283 s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize , s->h_edge_pos , edge_h , EDGE_WIDTH , sides);
2284 s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, edge_h>>1, EDGE_WIDTH/2, sides);
2285 s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>1)*s->uvlinesize, s->uvlinesize, s->h_edge_pos>>1, edge_h>>1, EDGE_WIDTH/2, sides);
2288 h= FFMIN(h, s->avctx->height - y);
2290 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2292 if (s->avctx->draw_horiz_band) {
2296 if(s->pict_type==FF_B_TYPE || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2297 src= (AVFrame*)s->current_picture_ptr;
2298 else if(s->last_picture_ptr)
2299 src= (AVFrame*)s->last_picture_ptr;
2303 if(s->pict_type==FF_B_TYPE && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2309 offset[0]= y * s->linesize;
2311 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2317 s->avctx->draw_horiz_band(s->avctx, src, offset,
2318 y, s->picture_structure, h);
2322 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2323 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2324 const int uvlinesize= s->current_picture.linesize[1];
2325 const int mb_size= 4 - s->avctx->lowres;
2327 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2328 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2329 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2330 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2331 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2332 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;
2333 //block_index is not used by mpeg2, so it is not affected by chroma_format
2335 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
2336 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2337 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2339 if(!(s->pict_type==FF_B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2341 if(s->picture_structure==PICT_FRAME){
2342 s->dest[0] += s->mb_y * linesize << mb_size;
2343 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2344 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2346 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2347 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2348 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2349 assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2354 void ff_mpeg_flush(AVCodecContext *avctx){
2356 MpegEncContext *s = avctx->priv_data;
2358 if(s==NULL || s->picture==NULL)
2361 for(i=0; i<s->picture_count; i++){
2362 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
2363 || s->picture[i].type == FF_BUFFER_TYPE_USER))
2364 free_frame_buffer(s, &s->picture[i]);
2366 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2368 s->mb_x= s->mb_y= 0;
2371 s->parse_context.state= -1;
2372 s->parse_context.frame_start_found= 0;
2373 s->parse_context.overread= 0;
2374 s->parse_context.overread_index= 0;
2375 s->parse_context.index= 0;
2376 s->parse_context.last_index= 0;
2377 s->bitstream_buffer_size=0;
2381 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2382 DCTELEM *block, int n, int qscale)
2384 int i, level, nCoeffs;
2385 const uint16_t *quant_matrix;
2387 nCoeffs= s->block_last_index[n];
2390 block[0] = block[0] * s->y_dc_scale;
2392 block[0] = block[0] * s->c_dc_scale;
2393 /* XXX: only mpeg1 */
2394 quant_matrix = s->intra_matrix;
2395 for(i=1;i<=nCoeffs;i++) {
2396 int j= s->intra_scantable.permutated[i];
2401 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2402 level = (level - 1) | 1;
2405 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2406 level = (level - 1) | 1;
2413 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2414 DCTELEM *block, int n, int qscale)
2416 int i, level, nCoeffs;
2417 const uint16_t *quant_matrix;
2419 nCoeffs= s->block_last_index[n];
2421 quant_matrix = s->inter_matrix;
2422 for(i=0; i<=nCoeffs; i++) {
2423 int j= s->intra_scantable.permutated[i];
2428 level = (((level << 1) + 1) * qscale *
2429 ((int) (quant_matrix[j]))) >> 4;
2430 level = (level - 1) | 1;
2433 level = (((level << 1) + 1) * qscale *
2434 ((int) (quant_matrix[j]))) >> 4;
2435 level = (level - 1) | 1;
2442 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2443 DCTELEM *block, int n, int qscale)
2445 int i, level, nCoeffs;
2446 const uint16_t *quant_matrix;
2448 if(s->alternate_scan) nCoeffs= 63;
2449 else nCoeffs= s->block_last_index[n];
2452 block[0] = block[0] * s->y_dc_scale;
2454 block[0] = block[0] * s->c_dc_scale;
2455 quant_matrix = s->intra_matrix;
2456 for(i=1;i<=nCoeffs;i++) {
2457 int j= s->intra_scantable.permutated[i];
2462 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2465 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2472 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2473 DCTELEM *block, int n, int qscale)
2475 int i, level, nCoeffs;
2476 const uint16_t *quant_matrix;
2479 if(s->alternate_scan) nCoeffs= 63;
2480 else nCoeffs= s->block_last_index[n];
2483 block[0] = block[0] * s->y_dc_scale;
2485 block[0] = block[0] * s->c_dc_scale;
2486 quant_matrix = s->intra_matrix;
2487 for(i=1;i<=nCoeffs;i++) {
2488 int j= s->intra_scantable.permutated[i];
2493 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2496 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2505 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2506 DCTELEM *block, int n, int qscale)
2508 int i, level, nCoeffs;
2509 const uint16_t *quant_matrix;
2512 if(s->alternate_scan) nCoeffs= 63;
2513 else nCoeffs= s->block_last_index[n];
2515 quant_matrix = s->inter_matrix;
2516 for(i=0; i<=nCoeffs; i++) {
2517 int j= s->intra_scantable.permutated[i];
2522 level = (((level << 1) + 1) * qscale *
2523 ((int) (quant_matrix[j]))) >> 4;
2526 level = (((level << 1) + 1) * qscale *
2527 ((int) (quant_matrix[j]))) >> 4;
2536 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2537 DCTELEM *block, int n, int qscale)
2539 int i, level, qmul, qadd;
2542 assert(s->block_last_index[n]>=0);
2548 block[0] = block[0] * s->y_dc_scale;
2550 block[0] = block[0] * s->c_dc_scale;
2551 qadd = (qscale - 1) | 1;
2558 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2560 for(i=1; i<=nCoeffs; i++) {
2564 level = level * qmul - qadd;
2566 level = level * qmul + qadd;
2573 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2574 DCTELEM *block, int n, int qscale)
2576 int i, level, qmul, qadd;
2579 assert(s->block_last_index[n]>=0);
2581 qadd = (qscale - 1) | 1;
2584 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2586 for(i=0; i<=nCoeffs; i++) {
2590 level = level * qmul - qadd;
2592 level = level * qmul + qadd;
2600 * set qscale and update qscale dependent variables.
2602 void ff_set_qscale(MpegEncContext * s, int qscale)
2606 else if (qscale > 31)
2610 s->chroma_qscale= s->chroma_qscale_table[qscale];
2612 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2613 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2616 void MPV_report_decode_progress(MpegEncContext *s)
2618 if (s->pict_type != FF_B_TYPE && !s->partitioned_frame)
2619 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0);