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 Libav.
10 * Libav 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 * Libav 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 Libav; 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 ? AV_PICTURE_TYPE_B : s->pict_type;
317 if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == AV_PICTURE_TYPE_B)
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->encoding || (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 if (s->width && s->height) {
605 s->mb_width = (s->width + 15) / 16;
606 s->mb_stride = s->mb_width + 1;
607 s->b8_stride = s->mb_width*2 + 1;
608 s->b4_stride = s->mb_width*4 + 1;
609 mb_array_size= s->mb_height * s->mb_stride;
610 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
612 /* set chroma shifts */
613 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
614 &(s->chroma_y_shift) );
616 /* set default edge pos, will be overriden in decode_header if needed */
617 s->h_edge_pos= s->mb_width*16;
618 s->v_edge_pos= s->mb_height*16;
620 s->mb_num = s->mb_width * s->mb_height;
625 s->block_wrap[3]= s->b8_stride;
627 s->block_wrap[5]= s->mb_stride;
629 y_size = s->b8_stride * (2 * s->mb_height + 1);
630 c_size = s->mb_stride * (s->mb_height + 1);
631 yc_size = y_size + 2 * c_size;
633 /* convert fourcc to upper case */
634 s->codec_tag = ff_toupper4(s->avctx->codec_tag);
636 s->stream_codec_tag = ff_toupper4(s->avctx->stream_codec_tag);
638 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
640 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
641 for(y=0; y<s->mb_height; y++){
642 for(x=0; x<s->mb_width; x++){
643 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
646 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
649 /* Allocate MV tables */
650 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
651 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
652 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
653 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
654 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
655 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
656 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
657 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
658 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
659 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
660 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
661 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
663 if(s->msmpeg4_version){
664 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
666 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
668 /* Allocate MB type table */
669 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
671 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
673 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix , 64*32 * sizeof(int), fail)
674 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix , 64*32 * sizeof(int), fail)
675 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
676 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
677 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
678 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
680 if(s->avctx->noise_reduction){
681 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
686 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
687 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, s->picture_count * sizeof(Picture), fail)
688 for(i = 0; i < s->picture_count; i++) {
689 avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
692 if (s->width && s->height) {
693 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
695 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
696 /* interlaced direct mode decoding tables */
701 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
702 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
704 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
705 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
706 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
708 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
711 if (s->out_format == FMT_H263) {
713 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
714 s->coded_block= s->coded_block_base + s->b8_stride + 1;
716 /* cbp, ac_pred, pred_dir */
717 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail)
718 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
721 if (s->h263_pred || s->h263_plus || !s->encoding) {
723 //MN: we need these for error resilience of intra-frames
724 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
725 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
726 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
727 s->dc_val[2] = s->dc_val[1] + c_size;
728 for(i=0;i<yc_size;i++)
729 s->dc_val_base[i] = 1024;
732 /* which mb is a intra block */
733 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
734 memset(s->mbintra_table, 1, mb_array_size);
736 /* init macroblock skip table */
737 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
738 //Note the +1 is for a quicker mpeg4 slice_end detection
739 FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
741 s->parse_context.state= -1;
742 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
743 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
744 s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
745 s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
749 s->context_initialized = 1;
750 s->thread_context[0]= s;
752 if (s->width && s->height) {
753 if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
754 threads = s->avctx->thread_count;
756 for(i=1; i<threads; i++){
757 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
758 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
761 for(i=0; i<threads; i++){
762 if(init_duplicate_context(s->thread_context[i], s) < 0)
764 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
765 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
768 if(init_duplicate_context(s, s) < 0) goto fail;
770 s->end_mb_y = s->mb_height;
780 /* init common structure for both encoder and decoder */
781 void MPV_common_end(MpegEncContext *s)
785 if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
786 for(i=0; i<s->avctx->thread_count; i++){
787 free_duplicate_context(s->thread_context[i]);
789 for(i=1; i<s->avctx->thread_count; i++){
790 av_freep(&s->thread_context[i]);
792 } else free_duplicate_context(s);
794 av_freep(&s->parse_context.buffer);
795 s->parse_context.buffer_size=0;
797 av_freep(&s->mb_type);
798 av_freep(&s->p_mv_table_base);
799 av_freep(&s->b_forw_mv_table_base);
800 av_freep(&s->b_back_mv_table_base);
801 av_freep(&s->b_bidir_forw_mv_table_base);
802 av_freep(&s->b_bidir_back_mv_table_base);
803 av_freep(&s->b_direct_mv_table_base);
805 s->b_forw_mv_table= NULL;
806 s->b_back_mv_table= NULL;
807 s->b_bidir_forw_mv_table= NULL;
808 s->b_bidir_back_mv_table= NULL;
809 s->b_direct_mv_table= NULL;
813 av_freep(&s->b_field_mv_table_base[i][j][k]);
814 s->b_field_mv_table[i][j][k]=NULL;
816 av_freep(&s->b_field_select_table[i][j]);
817 av_freep(&s->p_field_mv_table_base[i][j]);
818 s->p_field_mv_table[i][j]=NULL;
820 av_freep(&s->p_field_select_table[i]);
823 av_freep(&s->dc_val_base);
824 av_freep(&s->coded_block_base);
825 av_freep(&s->mbintra_table);
826 av_freep(&s->cbp_table);
827 av_freep(&s->pred_dir_table);
829 av_freep(&s->mbskip_table);
830 av_freep(&s->prev_pict_types);
831 av_freep(&s->bitstream_buffer);
832 s->allocated_bitstream_buffer_size=0;
834 av_freep(&s->avctx->stats_out);
835 av_freep(&s->ac_stats);
836 av_freep(&s->error_status_table);
837 av_freep(&s->mb_index2xy);
838 av_freep(&s->lambda_table);
839 av_freep(&s->q_intra_matrix);
840 av_freep(&s->q_inter_matrix);
841 av_freep(&s->q_intra_matrix16);
842 av_freep(&s->q_inter_matrix16);
843 av_freep(&s->input_picture);
844 av_freep(&s->reordered_input_picture);
845 av_freep(&s->dct_offset);
847 if(s->picture && !s->avctx->is_copy){
848 for(i=0; i<s->picture_count; i++){
849 free_picture(s, &s->picture[i]);
852 av_freep(&s->picture);
853 s->context_initialized = 0;
856 s->current_picture_ptr= NULL;
857 s->linesize= s->uvlinesize= 0;
860 av_freep(&s->visualization_buffer[i]);
862 if(!(s->avctx->active_thread_type&FF_THREAD_FRAME))
863 avcodec_default_free_buffers(s->avctx);
866 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
868 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
869 uint8_t index_run[MAX_RUN+1];
870 int last, run, level, start, end, i;
872 /* If table is static, we can quit if rl->max_level[0] is not NULL */
873 if(static_store && rl->max_level[0])
876 /* compute max_level[], max_run[] and index_run[] */
877 for(last=0;last<2;last++) {
886 memset(max_level, 0, MAX_RUN + 1);
887 memset(max_run, 0, MAX_LEVEL + 1);
888 memset(index_run, rl->n, MAX_RUN + 1);
889 for(i=start;i<end;i++) {
890 run = rl->table_run[i];
891 level = rl->table_level[i];
892 if (index_run[run] == rl->n)
894 if (level > max_level[run])
895 max_level[run] = level;
896 if (run > max_run[level])
897 max_run[level] = run;
900 rl->max_level[last] = static_store[last];
902 rl->max_level[last] = av_malloc(MAX_RUN + 1);
903 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
905 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
907 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
908 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
910 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
912 rl->index_run[last] = av_malloc(MAX_RUN + 1);
913 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
917 void init_vlc_rl(RLTable *rl)
929 for(i=0; i<rl->vlc.table_size; i++){
930 int code= rl->vlc.table[i][0];
931 int len = rl->vlc.table[i][1];
934 if(len==0){ // illegal code
937 }else if(len<0){ //more bits needed
941 if(code==rl->n){ //esc
945 run= rl->table_run [code] + 1;
946 level= rl->table_level[code] * qmul + qadd;
947 if(code >= rl->last) run+=192;
950 rl->rl_vlc[q][i].len= len;
951 rl->rl_vlc[q][i].level= level;
952 rl->rl_vlc[q][i].run= run;
957 void ff_release_unused_pictures(MpegEncContext *s, int remove_current)
961 /* release non reference frames */
962 for(i=0; i<s->picture_count; i++){
963 if(s->picture[i].data[0] && !s->picture[i].reference
964 && (!s->picture[i].owner2 || s->picture[i].owner2 == s)
965 && (remove_current || &s->picture[i] != s->current_picture_ptr)
966 /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
967 free_frame_buffer(s, &s->picture[i]);
972 int ff_find_unused_picture(MpegEncContext *s, int shared){
976 for(i=s->picture_range_start; i<s->picture_range_end; i++){
977 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
980 for(i=s->picture_range_start; i<s->picture_range_end; i++){
981 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
983 for(i=s->picture_range_start; i<s->picture_range_end; i++){
984 if(s->picture[i].data[0]==NULL) return i;
988 av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
989 /* We could return -1, but the codec would crash trying to draw into a
990 * non-existing frame anyway. This is safer than waiting for a random crash.
991 * Also the return of this is never useful, an encoder must only allocate
992 * as much as allowed in the specification. This has no relationship to how
993 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
994 * enough for such valid streams).
995 * Plus, a decoder has to check stream validity and remove frames if too
996 * many reference frames are around. Waiting for "OOM" is not correct at
997 * all. Similarly, missing reference frames have to be replaced by
998 * interpolated/MC frames, anything else is a bug in the codec ...
1004 static void update_noise_reduction(MpegEncContext *s){
1007 for(intra=0; intra<2; intra++){
1008 if(s->dct_count[intra] > (1<<16)){
1009 for(i=0; i<64; i++){
1010 s->dct_error_sum[intra][i] >>=1;
1012 s->dct_count[intra] >>= 1;
1015 for(i=0; i<64; i++){
1016 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);
1022 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1024 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1030 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1032 /* mark&release old frames */
1033 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->data[0]) {
1034 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1035 free_frame_buffer(s, s->last_picture_ptr);
1037 /* release forgotten pictures */
1038 /* if(mpeg124/h263) */
1040 for(i=0; i<s->picture_count; i++){
1041 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1042 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1043 free_frame_buffer(s, &s->picture[i]);
1051 ff_release_unused_pictures(s, 1);
1053 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1054 pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
1056 i= ff_find_unused_picture(s, 0);
1057 pic= &s->picture[i];
1062 if (s->codec_id == CODEC_ID_H264)
1063 pic->reference = s->picture_structure;
1064 else if (s->pict_type != AV_PICTURE_TYPE_B)
1068 pic->coded_picture_number= s->coded_picture_number++;
1070 if(ff_alloc_picture(s, pic, 0) < 0)
1073 s->current_picture_ptr= pic;
1074 //FIXME use only the vars from current_pic
1075 s->current_picture_ptr->top_field_first= s->top_field_first;
1076 if(s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) {
1077 if(s->picture_structure != PICT_FRAME)
1078 s->current_picture_ptr->top_field_first= (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1080 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1081 s->current_picture_ptr->field_picture= s->picture_structure != PICT_FRAME;
1084 s->current_picture_ptr->pict_type= s->pict_type;
1085 // if(s->flags && CODEC_FLAG_QSCALE)
1086 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1087 s->current_picture_ptr->key_frame= s->pict_type == AV_PICTURE_TYPE_I;
1089 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1091 if (s->pict_type != AV_PICTURE_TYPE_B) {
1092 s->last_picture_ptr= s->next_picture_ptr;
1094 s->next_picture_ptr= s->current_picture_ptr;
1096 /* 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,
1097 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1098 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1099 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1100 s->pict_type, s->dropable);*/
1102 if(s->codec_id != CODEC_ID_H264){
1103 if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) &&
1104 (s->pict_type!=AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)){
1105 if (s->pict_type != AV_PICTURE_TYPE_I)
1106 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1107 else if (s->picture_structure != PICT_FRAME)
1108 av_log(avctx, AV_LOG_INFO, "allocate dummy last picture for field based first keyframe\n");
1110 /* Allocate a dummy frame */
1111 i= ff_find_unused_picture(s, 0);
1112 s->last_picture_ptr= &s->picture[i];
1113 if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
1115 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0);
1116 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 1);
1118 if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==AV_PICTURE_TYPE_B){
1119 /* Allocate a dummy frame */
1120 i= ff_find_unused_picture(s, 0);
1121 s->next_picture_ptr= &s->picture[i];
1122 if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
1124 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 0);
1125 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 1);
1129 if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1130 if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1132 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1134 if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
1137 if(s->picture_structure == PICT_BOTTOM_FIELD){
1138 s->current_picture.data[i] += s->current_picture.linesize[i];
1140 s->current_picture.linesize[i] *= 2;
1141 s->last_picture.linesize[i] *=2;
1142 s->next_picture.linesize[i] *=2;
1146 s->error_recognition= avctx->error_recognition;
1148 /* set dequantizer, we can't do it during init as it might change for mpeg4
1149 and we can't do it in the header decode as init is not called for mpeg4 there yet */
1150 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1151 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1152 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1153 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1154 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1155 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1157 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1158 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1161 if(s->dct_error_sum){
1162 assert(s->avctx->noise_reduction && s->encoding);
1164 update_noise_reduction(s);
1167 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1168 return ff_xvmc_field_start(s, avctx);
1173 /* generic function for encode/decode called after a frame has been coded/decoded */
1174 void MPV_frame_end(MpegEncContext *s)
1177 /* redraw edges for the frame if decoding didn't complete */
1178 //just to make sure that all data is rendered.
1179 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1180 ff_xvmc_field_end(s);
1181 }else if((s->error_count || s->encoding)
1182 && !s->avctx->hwaccel
1183 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1184 && s->unrestricted_mv
1185 && s->current_picture.reference
1187 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1188 s->dsp.draw_edges(s->current_picture.data[0], s->linesize ,
1189 s->h_edge_pos , s->v_edge_pos ,
1190 EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
1191 s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize,
1192 s->h_edge_pos>>1, s->v_edge_pos>>1,
1193 EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
1194 s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize,
1195 s->h_edge_pos>>1, s->v_edge_pos>>1,
1196 EDGE_WIDTH/2, EDGE_TOP | EDGE_BOTTOM);
1201 s->last_pict_type = s->pict_type;
1202 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1203 if(s->pict_type!=AV_PICTURE_TYPE_B){
1204 s->last_non_b_pict_type= s->pict_type;
1207 /* copy back current_picture variables */
1208 for(i=0; i<MAX_PICTURE_COUNT; i++){
1209 if(s->picture[i].data[0] == s->current_picture.data[0]){
1210 s->picture[i]= s->current_picture;
1214 assert(i<MAX_PICTURE_COUNT);
1218 /* release non-reference frames */
1219 for(i=0; i<s->picture_count; i++){
1220 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1221 free_frame_buffer(s, &s->picture[i]);
1225 // clear copies, to avoid confusion
1227 memset(&s->last_picture, 0, sizeof(Picture));
1228 memset(&s->next_picture, 0, sizeof(Picture));
1229 memset(&s->current_picture, 0, sizeof(Picture));
1231 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1233 if (s->codec_id != CODEC_ID_H264 && s->current_picture.reference) {
1234 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_height-1, 0);
1239 * draws an line from (ex, ey) -> (sx, sy).
1240 * @param w width of the image
1241 * @param h height of the image
1242 * @param stride stride/linesize of the image
1243 * @param color color of the arrow
1245 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1248 sx= av_clip(sx, 0, w-1);
1249 sy= av_clip(sy, 0, h-1);
1250 ex= av_clip(ex, 0, w-1);
1251 ey= av_clip(ey, 0, h-1);
1253 buf[sy*stride + sx]+= color;
1255 if(FFABS(ex - sx) > FFABS(ey - sy)){
1257 FFSWAP(int, sx, ex);
1258 FFSWAP(int, sy, ey);
1260 buf+= sx + sy*stride;
1262 f= ((ey-sy)<<16)/ex;
1263 for(x= 0; x <= ex; x++){
1266 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1267 buf[(y+1)*stride + x]+= (color* fr )>>16;
1271 FFSWAP(int, sx, ex);
1272 FFSWAP(int, sy, ey);
1274 buf+= sx + sy*stride;
1276 if(ey) f= ((ex-sx)<<16)/ey;
1278 for(y= 0; y <= ey; y++){
1281 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;
1282 buf[y*stride + x+1]+= (color* fr )>>16;
1288 * draws an arrow from (ex, ey) -> (sx, sy).
1289 * @param w width of the image
1290 * @param h height of the image
1291 * @param stride stride/linesize of the image
1292 * @param color color of the arrow
1294 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1297 sx= av_clip(sx, -100, w+100);
1298 sy= av_clip(sy, -100, h+100);
1299 ex= av_clip(ex, -100, w+100);
1300 ey= av_clip(ey, -100, h+100);
1305 if(dx*dx + dy*dy > 3*3){
1308 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1310 //FIXME subpixel accuracy
1311 rx= ROUNDED_DIV(rx*3<<4, length);
1312 ry= ROUNDED_DIV(ry*3<<4, length);
1314 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1315 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1317 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1321 * prints debuging info for the given picture.
1323 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1325 if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1327 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1330 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1331 switch (pict->pict_type) {
1332 case AV_PICTURE_TYPE_I: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1333 case AV_PICTURE_TYPE_P: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1334 case AV_PICTURE_TYPE_B: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1335 case AV_PICTURE_TYPE_S: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1336 case AV_PICTURE_TYPE_SI: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1337 case AV_PICTURE_TYPE_SP: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1339 for(y=0; y<s->mb_height; y++){
1340 for(x=0; x<s->mb_width; x++){
1341 if(s->avctx->debug&FF_DEBUG_SKIP){
1342 int count= s->mbskip_table[x + y*s->mb_stride];
1343 if(count>9) count=9;
1344 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1346 if(s->avctx->debug&FF_DEBUG_QP){
1347 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1349 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1350 int mb_type= pict->mb_type[x + y*s->mb_stride];
1351 //Type & MV direction
1353 av_log(s->avctx, AV_LOG_DEBUG, "P");
1354 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1355 av_log(s->avctx, AV_LOG_DEBUG, "A");
1356 else if(IS_INTRA4x4(mb_type))
1357 av_log(s->avctx, AV_LOG_DEBUG, "i");
1358 else if(IS_INTRA16x16(mb_type))
1359 av_log(s->avctx, AV_LOG_DEBUG, "I");
1360 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1361 av_log(s->avctx, AV_LOG_DEBUG, "d");
1362 else if(IS_DIRECT(mb_type))
1363 av_log(s->avctx, AV_LOG_DEBUG, "D");
1364 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1365 av_log(s->avctx, AV_LOG_DEBUG, "g");
1366 else if(IS_GMC(mb_type))
1367 av_log(s->avctx, AV_LOG_DEBUG, "G");
1368 else if(IS_SKIP(mb_type))
1369 av_log(s->avctx, AV_LOG_DEBUG, "S");
1370 else if(!USES_LIST(mb_type, 1))
1371 av_log(s->avctx, AV_LOG_DEBUG, ">");
1372 else if(!USES_LIST(mb_type, 0))
1373 av_log(s->avctx, AV_LOG_DEBUG, "<");
1375 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1376 av_log(s->avctx, AV_LOG_DEBUG, "X");
1381 av_log(s->avctx, AV_LOG_DEBUG, "+");
1382 else if(IS_16X8(mb_type))
1383 av_log(s->avctx, AV_LOG_DEBUG, "-");
1384 else if(IS_8X16(mb_type))
1385 av_log(s->avctx, AV_LOG_DEBUG, "|");
1386 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1387 av_log(s->avctx, AV_LOG_DEBUG, " ");
1389 av_log(s->avctx, AV_LOG_DEBUG, "?");
1392 if(IS_INTERLACED(mb_type))
1393 av_log(s->avctx, AV_LOG_DEBUG, "=");
1395 av_log(s->avctx, AV_LOG_DEBUG, " ");
1397 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1399 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1403 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1404 const int shift= 1 + s->quarter_sample;
1408 int h_chroma_shift, v_chroma_shift, block_height;
1409 const int width = s->avctx->width;
1410 const int height= s->avctx->height;
1411 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1412 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1413 s->low_delay=0; //needed to see the vectors without trashing the buffers
1415 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1417 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1418 pict->data[i]= s->visualization_buffer[i];
1420 pict->type= FF_BUFFER_TYPE_COPY;
1422 block_height = 16>>v_chroma_shift;
1424 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1426 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1427 const int mb_index= mb_x + mb_y*s->mb_stride;
1428 if((s->avctx->debug_mv) && pict->motion_val){
1430 for(type=0; type<3; type++){
1433 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_P))
1437 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1441 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1446 if(!USES_LIST(pict->mb_type[mb_index], direction))
1449 if(IS_8X8(pict->mb_type[mb_index])){
1452 int sx= mb_x*16 + 4 + 8*(i&1);
1453 int sy= mb_y*16 + 4 + 8*(i>>1);
1454 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1455 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1456 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1457 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1459 }else if(IS_16X8(pict->mb_type[mb_index])){
1463 int sy=mb_y*16 + 4 + 8*i;
1464 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1465 int mx=(pict->motion_val[direction][xy][0]>>shift);
1466 int my=(pict->motion_val[direction][xy][1]>>shift);
1468 if(IS_INTERLACED(pict->mb_type[mb_index]))
1471 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1473 }else if(IS_8X16(pict->mb_type[mb_index])){
1476 int sx=mb_x*16 + 4 + 8*i;
1478 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1479 int mx=(pict->motion_val[direction][xy][0]>>shift);
1480 int my=(pict->motion_val[direction][xy][1]>>shift);
1482 if(IS_INTERLACED(pict->mb_type[mb_index]))
1485 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1488 int sx= mb_x*16 + 8;
1489 int sy= mb_y*16 + 8;
1490 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1491 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1492 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1493 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1497 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1498 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1500 for(y=0; y<block_height; y++){
1501 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
1502 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
1505 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1506 int mb_type= pict->mb_type[mb_index];
1509 #define COLOR(theta, r)\
1510 u= (int)(128 + r*cos(theta*3.141592/180));\
1511 v= (int)(128 + r*sin(theta*3.141592/180));
1515 if(IS_PCM(mb_type)){
1517 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1519 }else if(IS_INTRA4x4(mb_type)){
1521 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1523 }else if(IS_DIRECT(mb_type)){
1525 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1527 }else if(IS_GMC(mb_type)){
1529 }else if(IS_SKIP(mb_type)){
1531 }else if(!USES_LIST(mb_type, 1)){
1533 }else if(!USES_LIST(mb_type, 0)){
1536 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1540 u*= 0x0101010101010101ULL;
1541 v*= 0x0101010101010101ULL;
1542 for(y=0; y<block_height; y++){
1543 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
1544 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
1548 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1549 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1550 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1552 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1554 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1556 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1557 int dm= 1 << (mv_sample_log2-2);
1559 int sx= mb_x*16 + 8*(i&1);
1560 int sy= mb_y*16 + 8*(i>>1);
1561 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1563 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1564 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1566 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1567 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1568 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1572 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1576 s->mbskip_table[mb_index]=0;
1582 static inline int hpel_motion_lowres(MpegEncContext *s,
1583 uint8_t *dest, uint8_t *src,
1584 int field_based, int field_select,
1585 int src_x, int src_y,
1586 int width, int height, int stride,
1587 int h_edge_pos, int v_edge_pos,
1588 int w, int h, h264_chroma_mc_func *pix_op,
1589 int motion_x, int motion_y)
1591 const int lowres= s->avctx->lowres;
1592 const int op_index= FFMIN(lowres, 2);
1593 const int s_mask= (2<<lowres)-1;
1597 if(s->quarter_sample){
1602 sx= motion_x & s_mask;
1603 sy= motion_y & s_mask;
1604 src_x += motion_x >> (lowres+1);
1605 src_y += motion_y >> (lowres+1);
1607 src += src_y * stride + src_x;
1609 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
1610 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1611 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
1612 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1613 src= s->edge_emu_buffer;
1617 sx= (sx << 2) >> lowres;
1618 sy= (sy << 2) >> lowres;
1621 pix_op[op_index](dest, src, stride, h, sx, sy);
1625 /* apply one mpeg motion vector to the three components */
1626 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1627 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1628 int field_based, int bottom_field, int field_select,
1629 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1630 int motion_x, int motion_y, int h, int mb_y)
1632 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1633 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
1634 const int lowres= s->avctx->lowres;
1635 const int op_index= FFMIN(lowres, 2);
1636 const int block_s= 8>>lowres;
1637 const int s_mask= (2<<lowres)-1;
1638 const int h_edge_pos = s->h_edge_pos >> lowres;
1639 const int v_edge_pos = s->v_edge_pos >> lowres;
1640 linesize = s->current_picture.linesize[0] << field_based;
1641 uvlinesize = s->current_picture.linesize[1] << field_based;
1643 if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
1649 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
1652 sx= motion_x & s_mask;
1653 sy= motion_y & s_mask;
1654 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
1655 src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1657 if (s->out_format == FMT_H263) {
1658 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
1659 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
1662 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
1665 uvsx = (2*mx) & s_mask;
1666 uvsy = (2*my) & s_mask;
1667 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
1668 uvsrc_y = mb_y*block_s + (my >> lowres);
1674 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1675 uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1));
1678 ptr_y = ref_picture[0] + src_y * linesize + src_x;
1679 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1680 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1682 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
1683 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1684 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
1685 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1686 ptr_y = s->edge_emu_buffer;
1687 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1688 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1689 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
1690 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1691 s->dsp.emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
1692 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1698 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
1699 dest_y += s->linesize;
1700 dest_cb+= s->uvlinesize;
1701 dest_cr+= s->uvlinesize;
1705 ptr_y += s->linesize;
1706 ptr_cb+= s->uvlinesize;
1707 ptr_cr+= s->uvlinesize;
1710 sx= (sx << 2) >> lowres;
1711 sy= (sy << 2) >> lowres;
1712 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1714 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1715 uvsx= (uvsx << 2) >> lowres;
1716 uvsy= (uvsy << 2) >> lowres;
1717 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1718 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1720 //FIXME h261 lowres loop filter
1723 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1724 uint8_t *dest_cb, uint8_t *dest_cr,
1725 uint8_t **ref_picture,
1726 h264_chroma_mc_func *pix_op,
1728 const int lowres= s->avctx->lowres;
1729 const int op_index= FFMIN(lowres, 2);
1730 const int block_s= 8>>lowres;
1731 const int s_mask= (2<<lowres)-1;
1732 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
1733 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
1734 int emu=0, src_x, src_y, offset, sx, sy;
1737 if(s->quarter_sample){
1742 /* In case of 8X8, we construct a single chroma motion vector
1743 with a special rounding */
1744 mx= ff_h263_round_chroma(mx);
1745 my= ff_h263_round_chroma(my);
1749 src_x = s->mb_x*block_s + (mx >> (lowres+1));
1750 src_y = s->mb_y*block_s + (my >> (lowres+1));
1752 offset = src_y * s->uvlinesize + src_x;
1753 ptr = ref_picture[1] + offset;
1754 if(s->flags&CODEC_FLAG_EMU_EDGE){
1755 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
1756 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
1757 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1758 ptr= s->edge_emu_buffer;
1762 sx= (sx << 2) >> lowres;
1763 sy= (sy << 2) >> lowres;
1764 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1766 ptr = ref_picture[2] + offset;
1768 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1769 ptr= s->edge_emu_buffer;
1771 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
1775 * motion compensation of a single macroblock
1777 * @param dest_y luma destination pointer
1778 * @param dest_cb chroma cb/u destination pointer
1779 * @param dest_cr chroma cr/v destination pointer
1780 * @param dir direction (0->forward, 1->backward)
1781 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
1782 * @param pix_op halfpel motion compensation function (average or put normally)
1783 * the motion vectors are taken from s->mv and the MV type from s->mv_type
1785 static inline void MPV_motion_lowres(MpegEncContext *s,
1786 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1787 int dir, uint8_t **ref_picture,
1788 h264_chroma_mc_func *pix_op)
1792 const int lowres= s->avctx->lowres;
1793 const int block_s= 8>>lowres;
1798 switch(s->mv_type) {
1800 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1802 ref_picture, pix_op,
1803 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
1809 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1810 ref_picture[0], 0, 0,
1811 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
1812 s->width, s->height, s->linesize,
1813 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
1814 block_s, block_s, pix_op,
1815 s->mv[dir][i][0], s->mv[dir][i][1]);
1817 mx += s->mv[dir][i][0];
1818 my += s->mv[dir][i][1];
1821 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
1822 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
1825 if (s->picture_structure == PICT_FRAME) {
1827 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1828 1, 0, s->field_select[dir][0],
1829 ref_picture, pix_op,
1830 s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
1832 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1833 1, 1, s->field_select[dir][1],
1834 ref_picture, pix_op,
1835 s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
1837 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){
1838 ref_picture= s->current_picture_ptr->data;
1841 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1842 0, 0, s->field_select[dir][0],
1843 ref_picture, pix_op,
1844 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
1849 uint8_t ** ref2picture;
1851 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == AV_PICTURE_TYPE_B || s->first_field){
1852 ref2picture= ref_picture;
1854 ref2picture= s->current_picture_ptr->data;
1857 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1858 0, 0, s->field_select[dir][i],
1859 ref2picture, pix_op,
1860 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1862 dest_y += 2*block_s*s->linesize;
1863 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1864 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1868 if(s->picture_structure == PICT_FRAME){
1872 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1874 ref_picture, pix_op,
1875 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
1877 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1881 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1882 0, 0, s->picture_structure != i+1,
1883 ref_picture, pix_op,
1884 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1886 // after put we make avg of the same block
1887 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1889 //opposite parity is always in the same frame if this is second field
1890 if(!s->first_field){
1891 ref_picture = s->current_picture_ptr->data;
1901 * find the lowest MB row referenced in the MVs
1903 int MPV_lowest_referenced_row(MpegEncContext *s, int dir)
1905 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
1906 int my, off, i, mvs;
1908 if (s->picture_structure != PICT_FRAME) goto unhandled;
1910 switch (s->mv_type) {
1924 for (i = 0; i < mvs; i++) {
1925 my = s->mv[dir][i][1]<<qpel_shift;
1926 my_max = FFMAX(my_max, my);
1927 my_min = FFMIN(my_min, my);
1930 off = (FFMAX(-my_min, my_max) + 63) >> 6;
1932 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
1934 return s->mb_height-1;
1937 /* put block[] to dest[] */
1938 static inline void put_dct(MpegEncContext *s,
1939 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1941 s->dct_unquantize_intra(s, block, i, qscale);
1942 s->dsp.idct_put (dest, line_size, block);
1945 /* add block[] to dest[] */
1946 static inline void add_dct(MpegEncContext *s,
1947 DCTELEM *block, int i, uint8_t *dest, int line_size)
1949 if (s->block_last_index[i] >= 0) {
1950 s->dsp.idct_add (dest, line_size, block);
1954 static inline void add_dequant_dct(MpegEncContext *s,
1955 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1957 if (s->block_last_index[i] >= 0) {
1958 s->dct_unquantize_inter(s, block, i, qscale);
1960 s->dsp.idct_add (dest, line_size, block);
1965 * cleans dc, ac, coded_block for the current non intra MB
1967 void ff_clean_intra_table_entries(MpegEncContext *s)
1969 int wrap = s->b8_stride;
1970 int xy = s->block_index[0];
1973 s->dc_val[0][xy + 1 ] =
1974 s->dc_val[0][xy + wrap] =
1975 s->dc_val[0][xy + 1 + wrap] = 1024;
1977 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
1978 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1979 if (s->msmpeg4_version>=3) {
1980 s->coded_block[xy ] =
1981 s->coded_block[xy + 1 ] =
1982 s->coded_block[xy + wrap] =
1983 s->coded_block[xy + 1 + wrap] = 0;
1986 wrap = s->mb_stride;
1987 xy = s->mb_x + s->mb_y * wrap;
1989 s->dc_val[2][xy] = 1024;
1991 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
1992 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
1994 s->mbintra_table[xy]= 0;
1997 /* generic function called after a macroblock has been parsed by the
1998 decoder or after it has been encoded by the encoder.
2000 Important variables used:
2001 s->mb_intra : true if intra macroblock
2002 s->mv_dir : motion vector direction
2003 s->mv_type : motion vector type
2004 s->mv : motion vector
2005 s->interlaced_dct : true if interlaced dct used (mpeg2)
2007 static av_always_inline
2008 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2009 int lowres_flag, int is_mpeg12)
2011 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2012 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2013 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2017 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2018 /* save DCT coefficients */
2020 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
2021 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2023 for(j=0; j<64; j++){
2024 *dct++ = block[i][s->dsp.idct_permutation[j]];
2025 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2027 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2031 s->current_picture.qscale_table[mb_xy]= s->qscale;
2033 /* update DC predictors for P macroblocks */
2035 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2036 if(s->mbintra_table[mb_xy])
2037 ff_clean_intra_table_entries(s);
2041 s->last_dc[2] = 128 << s->intra_dc_precision;
2044 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2045 s->mbintra_table[mb_xy]=1;
2047 if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==AV_PICTURE_TYPE_B) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc
2048 uint8_t *dest_y, *dest_cb, *dest_cr;
2049 int dct_linesize, dct_offset;
2050 op_pixels_func (*op_pix)[4];
2051 qpel_mc_func (*op_qpix)[16];
2052 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2053 const int uvlinesize= s->current_picture.linesize[1];
2054 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2055 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2057 /* avoid copy if macroblock skipped in last frame too */
2058 /* skip only during decoding as we might trash the buffers during encoding a bit */
2060 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2061 const int age= s->current_picture.age;
2065 if (s->mb_skipped) {
2067 assert(s->pict_type!=AV_PICTURE_TYPE_I);
2069 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
2070 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2072 /* if previous was skipped too, then nothing to do ! */
2073 if (*mbskip_ptr >= age && s->current_picture.reference){
2076 } else if(!s->current_picture.reference){
2077 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2078 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2080 *mbskip_ptr = 0; /* not skipped */
2084 dct_linesize = linesize << s->interlaced_dct;
2085 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
2089 dest_cb= s->dest[1];
2090 dest_cr= s->dest[2];
2092 dest_y = s->b_scratchpad;
2093 dest_cb= s->b_scratchpad+16*linesize;
2094 dest_cr= s->b_scratchpad+32*linesize;
2098 /* motion handling */
2099 /* decoding or more than one mb_type (MC was already done otherwise) */
2102 if(HAVE_PTHREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2103 if (s->mv_dir & MV_DIR_FORWARD) {
2104 ff_thread_await_progress((AVFrame*)s->last_picture_ptr, MPV_lowest_referenced_row(s, 0), 0);
2106 if (s->mv_dir & MV_DIR_BACKWARD) {
2107 ff_thread_await_progress((AVFrame*)s->next_picture_ptr, MPV_lowest_referenced_row(s, 1), 0);
2112 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2114 if (s->mv_dir & MV_DIR_FORWARD) {
2115 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
2116 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2118 if (s->mv_dir & MV_DIR_BACKWARD) {
2119 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
2122 op_qpix= s->me.qpel_put;
2123 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2124 op_pix = s->dsp.put_pixels_tab;
2126 op_pix = s->dsp.put_no_rnd_pixels_tab;
2128 if (s->mv_dir & MV_DIR_FORWARD) {
2129 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2130 op_pix = s->dsp.avg_pixels_tab;
2131 op_qpix= s->me.qpel_avg;
2133 if (s->mv_dir & MV_DIR_BACKWARD) {
2134 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2139 /* skip dequant / idct if we are really late ;) */
2140 if(s->avctx->skip_idct){
2141 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2142 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2143 || s->avctx->skip_idct >= AVDISCARD_ALL)
2147 /* add dct residue */
2148 if(s->encoding || !( s->msmpeg4_version || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2149 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2150 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2151 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2152 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2153 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2155 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2156 if (s->chroma_y_shift){
2157 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2158 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2162 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2163 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2164 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2165 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2168 } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
2169 add_dct(s, block[0], 0, dest_y , dct_linesize);
2170 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2171 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2172 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2174 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2175 if(s->chroma_y_shift){//Chroma420
2176 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2177 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2180 dct_linesize = uvlinesize << s->interlaced_dct;
2181 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2183 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2184 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2185 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2186 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2187 if(!s->chroma_x_shift){//Chroma444
2188 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
2189 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
2190 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
2191 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
2196 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2197 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2200 /* dct only in intra block */
2201 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2202 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2203 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2204 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2205 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2207 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2208 if(s->chroma_y_shift){
2209 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2210 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2214 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2215 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2216 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2217 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2221 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2222 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2223 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2224 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2226 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2227 if(s->chroma_y_shift){
2228 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2229 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2232 dct_linesize = uvlinesize << s->interlaced_dct;
2233 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2235 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2236 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2237 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2238 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2239 if(!s->chroma_x_shift){//Chroma444
2240 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2241 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2242 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2243 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
2251 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2252 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2253 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2258 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2260 if(s->out_format == FMT_MPEG1) {
2261 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2262 else MPV_decode_mb_internal(s, block, 0, 1);
2265 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2266 else MPV_decode_mb_internal(s, block, 0, 0);
2271 * @param h is the normal height, this will be reduced automatically if needed for the last row
2273 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2274 const int field_pic= s->picture_structure != PICT_FRAME;
2280 if (!s->avctx->hwaccel
2281 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2282 && s->unrestricted_mv
2283 && s->current_picture.reference
2285 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2286 int sides = 0, edge_h;
2287 if (y==0) sides |= EDGE_TOP;
2288 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2290 edge_h= FFMIN(h, s->v_edge_pos - y);
2292 s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize , s->h_edge_pos , edge_h , EDGE_WIDTH , sides);
2293 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);
2294 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);
2297 h= FFMIN(h, s->avctx->height - y);
2299 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2301 if (s->avctx->draw_horiz_band) {
2305 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2306 src= (AVFrame*)s->current_picture_ptr;
2307 else if(s->last_picture_ptr)
2308 src= (AVFrame*)s->last_picture_ptr;
2312 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2318 offset[0]= y * s->linesize;
2320 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2326 s->avctx->draw_horiz_band(s->avctx, src, offset,
2327 y, s->picture_structure, h);
2331 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2332 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2333 const int uvlinesize= s->current_picture.linesize[1];
2334 const int mb_size= 4 - s->avctx->lowres;
2336 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2337 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2338 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2339 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2340 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2341 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;
2342 //block_index is not used by mpeg2, so it is not affected by chroma_format
2344 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
2345 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2346 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2348 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2350 if(s->picture_structure==PICT_FRAME){
2351 s->dest[0] += s->mb_y * linesize << mb_size;
2352 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2353 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2355 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2356 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2357 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2358 assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2363 void ff_mpeg_flush(AVCodecContext *avctx){
2365 MpegEncContext *s = avctx->priv_data;
2367 if(s==NULL || s->picture==NULL)
2370 for(i=0; i<s->picture_count; i++){
2371 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
2372 || s->picture[i].type == FF_BUFFER_TYPE_USER))
2373 free_frame_buffer(s, &s->picture[i]);
2375 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2377 s->mb_x= s->mb_y= 0;
2380 s->parse_context.state= -1;
2381 s->parse_context.frame_start_found= 0;
2382 s->parse_context.overread= 0;
2383 s->parse_context.overread_index= 0;
2384 s->parse_context.index= 0;
2385 s->parse_context.last_index= 0;
2386 s->bitstream_buffer_size=0;
2390 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2391 DCTELEM *block, int n, int qscale)
2393 int i, level, nCoeffs;
2394 const uint16_t *quant_matrix;
2396 nCoeffs= s->block_last_index[n];
2399 block[0] = block[0] * s->y_dc_scale;
2401 block[0] = block[0] * s->c_dc_scale;
2402 /* XXX: only mpeg1 */
2403 quant_matrix = s->intra_matrix;
2404 for(i=1;i<=nCoeffs;i++) {
2405 int j= s->intra_scantable.permutated[i];
2410 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2411 level = (level - 1) | 1;
2414 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2415 level = (level - 1) | 1;
2422 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2423 DCTELEM *block, int n, int qscale)
2425 int i, level, nCoeffs;
2426 const uint16_t *quant_matrix;
2428 nCoeffs= s->block_last_index[n];
2430 quant_matrix = s->inter_matrix;
2431 for(i=0; i<=nCoeffs; i++) {
2432 int j= s->intra_scantable.permutated[i];
2437 level = (((level << 1) + 1) * qscale *
2438 ((int) (quant_matrix[j]))) >> 4;
2439 level = (level - 1) | 1;
2442 level = (((level << 1) + 1) * qscale *
2443 ((int) (quant_matrix[j]))) >> 4;
2444 level = (level - 1) | 1;
2451 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2452 DCTELEM *block, int n, int qscale)
2454 int i, level, nCoeffs;
2455 const uint16_t *quant_matrix;
2457 if(s->alternate_scan) nCoeffs= 63;
2458 else nCoeffs= s->block_last_index[n];
2461 block[0] = block[0] * s->y_dc_scale;
2463 block[0] = block[0] * s->c_dc_scale;
2464 quant_matrix = s->intra_matrix;
2465 for(i=1;i<=nCoeffs;i++) {
2466 int j= s->intra_scantable.permutated[i];
2471 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2474 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2481 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2482 DCTELEM *block, int n, int qscale)
2484 int i, level, nCoeffs;
2485 const uint16_t *quant_matrix;
2488 if(s->alternate_scan) nCoeffs= 63;
2489 else nCoeffs= s->block_last_index[n];
2492 block[0] = block[0] * s->y_dc_scale;
2494 block[0] = block[0] * s->c_dc_scale;
2495 quant_matrix = s->intra_matrix;
2496 for(i=1;i<=nCoeffs;i++) {
2497 int j= s->intra_scantable.permutated[i];
2502 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2505 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2514 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2515 DCTELEM *block, int n, int qscale)
2517 int i, level, nCoeffs;
2518 const uint16_t *quant_matrix;
2521 if(s->alternate_scan) nCoeffs= 63;
2522 else nCoeffs= s->block_last_index[n];
2524 quant_matrix = s->inter_matrix;
2525 for(i=0; i<=nCoeffs; i++) {
2526 int j= s->intra_scantable.permutated[i];
2531 level = (((level << 1) + 1) * qscale *
2532 ((int) (quant_matrix[j]))) >> 4;
2535 level = (((level << 1) + 1) * qscale *
2536 ((int) (quant_matrix[j]))) >> 4;
2545 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2546 DCTELEM *block, int n, int qscale)
2548 int i, level, qmul, qadd;
2551 assert(s->block_last_index[n]>=0);
2557 block[0] = block[0] * s->y_dc_scale;
2559 block[0] = block[0] * s->c_dc_scale;
2560 qadd = (qscale - 1) | 1;
2567 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2569 for(i=1; i<=nCoeffs; i++) {
2573 level = level * qmul - qadd;
2575 level = level * qmul + qadd;
2582 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2583 DCTELEM *block, int n, int qscale)
2585 int i, level, qmul, qadd;
2588 assert(s->block_last_index[n]>=0);
2590 qadd = (qscale - 1) | 1;
2593 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2595 for(i=0; i<=nCoeffs; i++) {
2599 level = level * qmul - qadd;
2601 level = level * qmul + qadd;
2609 * set qscale and update qscale dependent variables.
2611 void ff_set_qscale(MpegEncContext * s, int qscale)
2615 else if (qscale > 31)
2619 s->chroma_qscale= s->chroma_qscale_table[qscale];
2621 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2622 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2625 void MPV_report_decode_progress(MpegEncContext *s)
2627 if (s->pict_type != FF_B_TYPE && !s->partitioned_frame && !s->error_occurred)
2628 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0);