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 ? 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!=AV_PICTURE_TYPE_B){
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)
684 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
685 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, s->picture_count * sizeof(Picture), fail)
686 for(i = 0; i < s->picture_count; i++) {
687 avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
690 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
692 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
693 /* interlaced direct mode decoding tables */
698 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
699 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
701 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
702 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
703 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
705 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
708 if (s->out_format == FMT_H263) {
710 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
711 s->coded_block= s->coded_block_base + s->b8_stride + 1;
713 /* cbp, ac_pred, pred_dir */
714 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail)
715 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
718 if (s->h263_pred || s->h263_plus || !s->encoding) {
720 //MN: we need these for error resilience of intra-frames
721 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
722 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
723 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
724 s->dc_val[2] = s->dc_val[1] + c_size;
725 for(i=0;i<yc_size;i++)
726 s->dc_val_base[i] = 1024;
729 /* which mb is a intra block */
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
731 memset(s->mbintra_table, 1, mb_array_size);
733 /* init macroblock skip table */
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
735 //Note the +1 is for a quicker mpeg4 slice_end detection
736 FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
738 s->parse_context.state= -1;
739 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
740 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
741 s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
742 s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
745 s->context_initialized = 1;
746 s->thread_context[0]= s;
748 if (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE) {
749 threads = s->avctx->thread_count;
751 for(i=1; i<threads; i++){
752 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
753 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
756 for(i=0; i<threads; i++){
757 if(init_duplicate_context(s->thread_context[i], s) < 0)
759 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
760 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
763 if(init_duplicate_context(s, s) < 0) goto fail;
765 s->end_mb_y = s->mb_height;
774 /* init common structure for both encoder and decoder */
775 void MPV_common_end(MpegEncContext *s)
779 if (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE) {
780 for(i=0; i<s->avctx->thread_count; i++){
781 free_duplicate_context(s->thread_context[i]);
783 for(i=1; i<s->avctx->thread_count; i++){
784 av_freep(&s->thread_context[i]);
786 } else free_duplicate_context(s);
788 av_freep(&s->parse_context.buffer);
789 s->parse_context.buffer_size=0;
791 av_freep(&s->mb_type);
792 av_freep(&s->p_mv_table_base);
793 av_freep(&s->b_forw_mv_table_base);
794 av_freep(&s->b_back_mv_table_base);
795 av_freep(&s->b_bidir_forw_mv_table_base);
796 av_freep(&s->b_bidir_back_mv_table_base);
797 av_freep(&s->b_direct_mv_table_base);
799 s->b_forw_mv_table= NULL;
800 s->b_back_mv_table= NULL;
801 s->b_bidir_forw_mv_table= NULL;
802 s->b_bidir_back_mv_table= NULL;
803 s->b_direct_mv_table= NULL;
807 av_freep(&s->b_field_mv_table_base[i][j][k]);
808 s->b_field_mv_table[i][j][k]=NULL;
810 av_freep(&s->b_field_select_table[i][j]);
811 av_freep(&s->p_field_mv_table_base[i][j]);
812 s->p_field_mv_table[i][j]=NULL;
814 av_freep(&s->p_field_select_table[i]);
817 av_freep(&s->dc_val_base);
818 av_freep(&s->coded_block_base);
819 av_freep(&s->mbintra_table);
820 av_freep(&s->cbp_table);
821 av_freep(&s->pred_dir_table);
823 av_freep(&s->mbskip_table);
824 av_freep(&s->prev_pict_types);
825 av_freep(&s->bitstream_buffer);
826 s->allocated_bitstream_buffer_size=0;
828 av_freep(&s->avctx->stats_out);
829 av_freep(&s->ac_stats);
830 av_freep(&s->error_status_table);
831 av_freep(&s->mb_index2xy);
832 av_freep(&s->lambda_table);
833 av_freep(&s->q_intra_matrix);
834 av_freep(&s->q_inter_matrix);
835 av_freep(&s->q_intra_matrix16);
836 av_freep(&s->q_inter_matrix16);
837 av_freep(&s->input_picture);
838 av_freep(&s->reordered_input_picture);
839 av_freep(&s->dct_offset);
841 if(s->picture && !s->avctx->is_copy){
842 for(i=0; i<s->picture_count; i++){
843 free_picture(s, &s->picture[i]);
846 av_freep(&s->picture);
847 s->context_initialized = 0;
850 s->current_picture_ptr= NULL;
851 s->linesize= s->uvlinesize= 0;
854 av_freep(&s->visualization_buffer[i]);
856 if(!(s->avctx->active_thread_type&FF_THREAD_FRAME))
857 avcodec_default_free_buffers(s->avctx);
860 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
862 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
863 uint8_t index_run[MAX_RUN+1];
864 int last, run, level, start, end, i;
866 /* If table is static, we can quit if rl->max_level[0] is not NULL */
867 if(static_store && rl->max_level[0])
870 /* compute max_level[], max_run[] and index_run[] */
871 for(last=0;last<2;last++) {
880 memset(max_level, 0, MAX_RUN + 1);
881 memset(max_run, 0, MAX_LEVEL + 1);
882 memset(index_run, rl->n, MAX_RUN + 1);
883 for(i=start;i<end;i++) {
884 run = rl->table_run[i];
885 level = rl->table_level[i];
886 if (index_run[run] == rl->n)
888 if (level > max_level[run])
889 max_level[run] = level;
890 if (run > max_run[level])
891 max_run[level] = run;
894 rl->max_level[last] = static_store[last];
896 rl->max_level[last] = av_malloc(MAX_RUN + 1);
897 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
899 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
901 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
902 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
904 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
906 rl->index_run[last] = av_malloc(MAX_RUN + 1);
907 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
911 void init_vlc_rl(RLTable *rl)
923 for(i=0; i<rl->vlc.table_size; i++){
924 int code= rl->vlc.table[i][0];
925 int len = rl->vlc.table[i][1];
928 if(len==0){ // illegal code
931 }else if(len<0){ //more bits needed
935 if(code==rl->n){ //esc
939 run= rl->table_run [code] + 1;
940 level= rl->table_level[code] * qmul + qadd;
941 if(code >= rl->last) run+=192;
944 rl->rl_vlc[q][i].len= len;
945 rl->rl_vlc[q][i].level= level;
946 rl->rl_vlc[q][i].run= run;
951 void ff_release_unused_pictures(MpegEncContext *s, int remove_current)
955 /* release non reference frames */
956 for(i=0; i<s->picture_count; i++){
957 if(s->picture[i].data[0] && !s->picture[i].reference
958 && (!s->picture[i].owner2 || s->picture[i].owner2 == s)
959 && (remove_current || &s->picture[i] != s->current_picture_ptr)
960 /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
961 free_frame_buffer(s, &s->picture[i]);
966 int ff_find_unused_picture(MpegEncContext *s, int shared){
970 for(i=s->picture_range_start; i<s->picture_range_end; i++){
971 if(s->picture[i].data[0]==NULL && s->picture[i].type==0) return i;
974 for(i=s->picture_range_start; i<s->picture_range_end; i++){
975 if(s->picture[i].data[0]==NULL && s->picture[i].type!=0) return i; //FIXME
977 for(i=s->picture_range_start; i<s->picture_range_end; i++){
978 if(s->picture[i].data[0]==NULL) return i;
982 av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
983 /* We could return -1, but the codec would crash trying to draw into a
984 * non-existing frame anyway. This is safer than waiting for a random crash.
985 * Also the return of this is never useful, an encoder must only allocate
986 * as much as allowed in the specification. This has no relationship to how
987 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
988 * enough for such valid streams).
989 * Plus, a decoder has to check stream validity and remove frames if too
990 * many reference frames are around. Waiting for "OOM" is not correct at
991 * all. Similarly, missing reference frames have to be replaced by
992 * interpolated/MC frames, anything else is a bug in the codec ...
998 static void update_noise_reduction(MpegEncContext *s){
1001 for(intra=0; intra<2; intra++){
1002 if(s->dct_count[intra] > (1<<16)){
1003 for(i=0; i<64; i++){
1004 s->dct_error_sum[intra][i] >>=1;
1006 s->dct_count[intra] >>= 1;
1009 for(i=0; i<64; i++){
1010 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);
1016 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1018 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1024 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1026 /* mark&release old frames */
1027 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]) {
1028 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1029 free_frame_buffer(s, s->last_picture_ptr);
1031 /* release forgotten pictures */
1032 /* if(mpeg124/h263) */
1034 for(i=0; i<s->picture_count; i++){
1035 if(s->picture[i].data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference){
1036 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1037 free_frame_buffer(s, &s->picture[i]);
1045 ff_release_unused_pictures(s, 1);
1047 if(s->current_picture_ptr && s->current_picture_ptr->data[0]==NULL)
1048 pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
1050 i= ff_find_unused_picture(s, 0);
1051 pic= &s->picture[i];
1056 if (s->codec_id == CODEC_ID_H264)
1057 pic->reference = s->picture_structure;
1058 else if (s->pict_type != AV_PICTURE_TYPE_B)
1062 pic->coded_picture_number= s->coded_picture_number++;
1064 if(ff_alloc_picture(s, pic, 0) < 0)
1067 s->current_picture_ptr= pic;
1068 //FIXME use only the vars from current_pic
1069 s->current_picture_ptr->top_field_first= s->top_field_first;
1070 if(s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) {
1071 if(s->picture_structure != PICT_FRAME)
1072 s->current_picture_ptr->top_field_first= (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1074 s->current_picture_ptr->interlaced_frame= !s->progressive_frame && !s->progressive_sequence;
1075 s->current_picture_ptr->field_picture= s->picture_structure != PICT_FRAME;
1078 s->current_picture_ptr->pict_type= s->pict_type;
1079 // if(s->flags && CODEC_FLAG_QSCALE)
1080 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1081 s->current_picture_ptr->key_frame= s->pict_type == AV_PICTURE_TYPE_I;
1083 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1085 if (s->pict_type != AV_PICTURE_TYPE_B) {
1086 s->last_picture_ptr= s->next_picture_ptr;
1088 s->next_picture_ptr= s->current_picture_ptr;
1090 /* 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,
1091 s->last_picture_ptr ? s->last_picture_ptr->data[0] : NULL,
1092 s->next_picture_ptr ? s->next_picture_ptr->data[0] : NULL,
1093 s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL,
1094 s->pict_type, s->dropable);*/
1096 if(s->codec_id != CODEC_ID_H264){
1097 if((s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) &&
1098 (s->pict_type!=AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)){
1099 if (s->pict_type != AV_PICTURE_TYPE_I)
1100 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1101 else if (s->picture_structure != PICT_FRAME)
1102 av_log(avctx, AV_LOG_INFO, "allocate dummy last picture for field based first keyframe\n");
1104 /* Allocate a dummy frame */
1105 i= ff_find_unused_picture(s, 0);
1106 s->last_picture_ptr= &s->picture[i];
1107 if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
1109 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0);
1110 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 1);
1112 if((s->next_picture_ptr==NULL || s->next_picture_ptr->data[0]==NULL) && s->pict_type==AV_PICTURE_TYPE_B){
1113 /* Allocate a dummy frame */
1114 i= ff_find_unused_picture(s, 0);
1115 s->next_picture_ptr= &s->picture[i];
1116 if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
1118 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 0);
1119 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 1);
1123 if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1124 if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1126 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
1128 if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
1131 if(s->picture_structure == PICT_BOTTOM_FIELD){
1132 s->current_picture.data[i] += s->current_picture.linesize[i];
1134 s->current_picture.linesize[i] *= 2;
1135 s->last_picture.linesize[i] *=2;
1136 s->next_picture.linesize[i] *=2;
1140 s->error_recognition= avctx->error_recognition;
1142 /* set dequantizer, we can't do it during init as it might change for mpeg4
1143 and we can't do it in the header decode as init is not called for mpeg4 there yet */
1144 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1145 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1146 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1147 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1148 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1149 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1151 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1152 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1155 if(s->dct_error_sum){
1156 assert(s->avctx->noise_reduction && s->encoding);
1158 update_noise_reduction(s);
1161 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1162 return ff_xvmc_field_start(s, avctx);
1167 /* generic function for encode/decode called after a frame has been coded/decoded */
1168 void MPV_frame_end(MpegEncContext *s)
1171 /* redraw edges for the frame if decoding didn't complete */
1172 //just to make sure that all data is rendered.
1173 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1174 ff_xvmc_field_end(s);
1175 }else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND))
1176 && !s->avctx->hwaccel
1177 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1178 && s->unrestricted_mv
1179 && s->current_picture.reference
1181 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1182 int edges = EDGE_BOTTOM | EDGE_TOP, h = s->v_edge_pos;
1184 s->dsp.draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , h , EDGE_WIDTH , edges);
1185 s->dsp.draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges);
1186 s->dsp.draw_edges(s->current_picture.data[2], s->uvlinesize, s->h_edge_pos>>1, h>>1, EDGE_WIDTH/2, edges);
1192 s->last_pict_type = s->pict_type;
1193 s->last_lambda_for[s->pict_type]= s->current_picture_ptr->quality;
1194 if(s->pict_type!=AV_PICTURE_TYPE_B){
1195 s->last_non_b_pict_type= s->pict_type;
1198 /* copy back current_picture variables */
1199 for(i=0; i<MAX_PICTURE_COUNT; i++){
1200 if(s->picture[i].data[0] == s->current_picture.data[0]){
1201 s->picture[i]= s->current_picture;
1205 assert(i<MAX_PICTURE_COUNT);
1209 /* release non-reference frames */
1210 for(i=0; i<s->picture_count; i++){
1211 if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
1212 free_frame_buffer(s, &s->picture[i]);
1216 // clear copies, to avoid confusion
1218 memset(&s->last_picture, 0, sizeof(Picture));
1219 memset(&s->next_picture, 0, sizeof(Picture));
1220 memset(&s->current_picture, 0, sizeof(Picture));
1222 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1224 if (s->codec_id != CODEC_ID_H264 && s->current_picture.reference) {
1225 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_height-1, 0);
1230 * draws an line from (ex, ey) -> (sx, sy).
1231 * @param w width of the image
1232 * @param h height of the image
1233 * @param stride stride/linesize of the image
1234 * @param color color of the arrow
1236 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1239 sx= av_clip(sx, 0, w-1);
1240 sy= av_clip(sy, 0, h-1);
1241 ex= av_clip(ex, 0, w-1);
1242 ey= av_clip(ey, 0, h-1);
1244 buf[sy*stride + sx]+= color;
1246 if(FFABS(ex - sx) > FFABS(ey - sy)){
1248 FFSWAP(int, sx, ex);
1249 FFSWAP(int, sy, ey);
1251 buf+= sx + sy*stride;
1253 f= ((ey-sy)<<16)/ex;
1254 for(x= 0; x <= ex; x++){
1257 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1258 buf[(y+1)*stride + x]+= (color* fr )>>16;
1262 FFSWAP(int, sx, ex);
1263 FFSWAP(int, sy, ey);
1265 buf+= sx + sy*stride;
1267 if(ey) f= ((ex-sx)<<16)/ey;
1269 for(y= 0; y <= ey; y++){
1272 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;
1273 buf[y*stride + x+1]+= (color* fr )>>16;
1279 * draws an arrow from (ex, ey) -> (sx, sy).
1280 * @param w width of the image
1281 * @param h height of the image
1282 * @param stride stride/linesize of the image
1283 * @param color color of the arrow
1285 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1288 sx= av_clip(sx, -100, w+100);
1289 sy= av_clip(sy, -100, h+100);
1290 ex= av_clip(ex, -100, w+100);
1291 ey= av_clip(ey, -100, h+100);
1296 if(dx*dx + dy*dy > 3*3){
1299 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1301 //FIXME subpixel accuracy
1302 rx= ROUNDED_DIV(rx*3<<4, length);
1303 ry= ROUNDED_DIV(ry*3<<4, length);
1305 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1306 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1308 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1312 * prints debuging info for the given picture.
1314 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1316 if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1318 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1321 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1322 switch (pict->pict_type) {
1323 case AV_PICTURE_TYPE_I: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1324 case AV_PICTURE_TYPE_P: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1325 case AV_PICTURE_TYPE_B: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1326 case AV_PICTURE_TYPE_S: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1327 case AV_PICTURE_TYPE_SI: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1328 case AV_PICTURE_TYPE_SP: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1330 for(y=0; y<s->mb_height; y++){
1331 for(x=0; x<s->mb_width; x++){
1332 if(s->avctx->debug&FF_DEBUG_SKIP){
1333 int count= s->mbskip_table[x + y*s->mb_stride];
1334 if(count>9) count=9;
1335 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1337 if(s->avctx->debug&FF_DEBUG_QP){
1338 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1340 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1341 int mb_type= pict->mb_type[x + y*s->mb_stride];
1342 //Type & MV direction
1344 av_log(s->avctx, AV_LOG_DEBUG, "P");
1345 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1346 av_log(s->avctx, AV_LOG_DEBUG, "A");
1347 else if(IS_INTRA4x4(mb_type))
1348 av_log(s->avctx, AV_LOG_DEBUG, "i");
1349 else if(IS_INTRA16x16(mb_type))
1350 av_log(s->avctx, AV_LOG_DEBUG, "I");
1351 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1352 av_log(s->avctx, AV_LOG_DEBUG, "d");
1353 else if(IS_DIRECT(mb_type))
1354 av_log(s->avctx, AV_LOG_DEBUG, "D");
1355 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1356 av_log(s->avctx, AV_LOG_DEBUG, "g");
1357 else if(IS_GMC(mb_type))
1358 av_log(s->avctx, AV_LOG_DEBUG, "G");
1359 else if(IS_SKIP(mb_type))
1360 av_log(s->avctx, AV_LOG_DEBUG, "S");
1361 else if(!USES_LIST(mb_type, 1))
1362 av_log(s->avctx, AV_LOG_DEBUG, ">");
1363 else if(!USES_LIST(mb_type, 0))
1364 av_log(s->avctx, AV_LOG_DEBUG, "<");
1366 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1367 av_log(s->avctx, AV_LOG_DEBUG, "X");
1372 av_log(s->avctx, AV_LOG_DEBUG, "+");
1373 else if(IS_16X8(mb_type))
1374 av_log(s->avctx, AV_LOG_DEBUG, "-");
1375 else if(IS_8X16(mb_type))
1376 av_log(s->avctx, AV_LOG_DEBUG, "|");
1377 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1378 av_log(s->avctx, AV_LOG_DEBUG, " ");
1380 av_log(s->avctx, AV_LOG_DEBUG, "?");
1383 if(IS_INTERLACED(mb_type))
1384 av_log(s->avctx, AV_LOG_DEBUG, "=");
1386 av_log(s->avctx, AV_LOG_DEBUG, " ");
1388 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1390 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1394 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1395 const int shift= 1 + s->quarter_sample;
1399 int h_chroma_shift, v_chroma_shift, block_height;
1400 const int width = s->avctx->width;
1401 const int height= s->avctx->height;
1402 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1403 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1404 s->low_delay=0; //needed to see the vectors without trashing the buffers
1406 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1408 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1409 pict->data[i]= s->visualization_buffer[i];
1411 pict->type= FF_BUFFER_TYPE_COPY;
1413 block_height = 16>>v_chroma_shift;
1415 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1417 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1418 const int mb_index= mb_x + mb_y*s->mb_stride;
1419 if((s->avctx->debug_mv) && pict->motion_val){
1421 for(type=0; type<3; type++){
1424 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_P))
1428 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1432 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1437 if(!USES_LIST(pict->mb_type[mb_index], direction))
1440 if(IS_8X8(pict->mb_type[mb_index])){
1443 int sx= mb_x*16 + 4 + 8*(i&1);
1444 int sy= mb_y*16 + 4 + 8*(i>>1);
1445 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1446 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1447 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1448 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1450 }else if(IS_16X8(pict->mb_type[mb_index])){
1454 int sy=mb_y*16 + 4 + 8*i;
1455 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1456 int mx=(pict->motion_val[direction][xy][0]>>shift);
1457 int my=(pict->motion_val[direction][xy][1]>>shift);
1459 if(IS_INTERLACED(pict->mb_type[mb_index]))
1462 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1464 }else if(IS_8X16(pict->mb_type[mb_index])){
1467 int sx=mb_x*16 + 4 + 8*i;
1469 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1470 int mx=(pict->motion_val[direction][xy][0]>>shift);
1471 int my=(pict->motion_val[direction][xy][1]>>shift);
1473 if(IS_INTERLACED(pict->mb_type[mb_index]))
1476 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1479 int sx= mb_x*16 + 8;
1480 int sy= mb_y*16 + 8;
1481 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1482 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1483 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1484 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1488 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1489 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1491 for(y=0; y<block_height; y++){
1492 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
1493 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
1496 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1497 int mb_type= pict->mb_type[mb_index];
1500 #define COLOR(theta, r)\
1501 u= (int)(128 + r*cos(theta*3.141592/180));\
1502 v= (int)(128 + r*sin(theta*3.141592/180));
1506 if(IS_PCM(mb_type)){
1508 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1510 }else if(IS_INTRA4x4(mb_type)){
1512 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1514 }else if(IS_DIRECT(mb_type)){
1516 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1518 }else if(IS_GMC(mb_type)){
1520 }else if(IS_SKIP(mb_type)){
1522 }else if(!USES_LIST(mb_type, 1)){
1524 }else if(!USES_LIST(mb_type, 0)){
1527 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1531 u*= 0x0101010101010101ULL;
1532 v*= 0x0101010101010101ULL;
1533 for(y=0; y<block_height; y++){
1534 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
1535 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
1539 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1540 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1541 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1543 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1545 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1547 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1548 int dm= 1 << (mv_sample_log2-2);
1550 int sx= mb_x*16 + 8*(i&1);
1551 int sy= mb_y*16 + 8*(i>>1);
1552 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1554 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1555 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1557 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1558 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1559 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1563 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1567 s->mbskip_table[mb_index]=0;
1573 static inline int hpel_motion_lowres(MpegEncContext *s,
1574 uint8_t *dest, uint8_t *src,
1575 int field_based, int field_select,
1576 int src_x, int src_y,
1577 int width, int height, int stride,
1578 int h_edge_pos, int v_edge_pos,
1579 int w, int h, h264_chroma_mc_func *pix_op,
1580 int motion_x, int motion_y)
1582 const int lowres= s->avctx->lowres;
1583 const int op_index= FFMIN(lowres, 2);
1584 const int s_mask= (2<<lowres)-1;
1588 if(s->quarter_sample){
1593 sx= motion_x & s_mask;
1594 sy= motion_y & s_mask;
1595 src_x += motion_x >> (lowres+1);
1596 src_y += motion_y >> (lowres+1);
1598 src += src_y * stride + src_x;
1600 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
1601 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1602 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
1603 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1604 src= s->edge_emu_buffer;
1608 sx= (sx << 2) >> lowres;
1609 sy= (sy << 2) >> lowres;
1612 pix_op[op_index](dest, src, stride, h, sx, sy);
1616 /* apply one mpeg motion vector to the three components */
1617 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1618 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1619 int field_based, int bottom_field, int field_select,
1620 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1621 int motion_x, int motion_y, int h, int mb_y)
1623 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1624 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
1625 const int lowres= s->avctx->lowres;
1626 const int op_index= FFMIN(lowres-1+s->chroma_x_shift, 2);
1627 const int block_s= 8>>lowres;
1628 const int s_mask= (2<<lowres)-1;
1629 const int h_edge_pos = s->h_edge_pos >> lowres;
1630 const int v_edge_pos = s->v_edge_pos >> lowres;
1631 linesize = s->current_picture.linesize[0] << field_based;
1632 uvlinesize = s->current_picture.linesize[1] << field_based;
1634 if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
1640 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
1643 sx= motion_x & s_mask;
1644 sy= motion_y & s_mask;
1645 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
1646 src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1648 if (s->out_format == FMT_H263) {
1649 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
1650 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
1653 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
1656 uvsx = (2*mx) & s_mask;
1657 uvsy = (2*my) & s_mask;
1658 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
1659 uvsrc_y = mb_y*block_s + (my >> lowres);
1661 if(s->chroma_y_shift){
1666 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1667 uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1));
1669 if(s->chroma_x_shift){
1673 uvsy = motion_y & s_mask;
1675 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1678 uvsx = motion_x & s_mask;
1679 uvsy = motion_y & s_mask;
1686 ptr_y = ref_picture[0] + src_y * linesize + src_x;
1687 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1688 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1690 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
1691 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1692 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
1693 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1694 ptr_y = s->edge_emu_buffer;
1695 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1696 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1697 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
1698 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1699 s->dsp.emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
1700 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1706 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.data
1707 dest_y += s->linesize;
1708 dest_cb+= s->uvlinesize;
1709 dest_cr+= s->uvlinesize;
1713 ptr_y += s->linesize;
1714 ptr_cb+= s->uvlinesize;
1715 ptr_cr+= s->uvlinesize;
1718 sx= (sx << 2) >> lowres;
1719 sy= (sy << 2) >> lowres;
1720 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1722 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1723 uvsx= (uvsx << 2) >> lowres;
1724 uvsy= (uvsy << 2) >> lowres;
1725 if(h >> s->chroma_y_shift){
1726 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1727 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1730 //FIXME h261 lowres loop filter
1733 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1734 uint8_t *dest_cb, uint8_t *dest_cr,
1735 uint8_t **ref_picture,
1736 h264_chroma_mc_func *pix_op,
1738 const int lowres= s->avctx->lowres;
1739 const int op_index= FFMIN(lowres, 2);
1740 const int block_s= 8>>lowres;
1741 const int s_mask= (2<<lowres)-1;
1742 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
1743 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
1744 int emu=0, src_x, src_y, offset, sx, sy;
1747 if(s->quarter_sample){
1752 /* In case of 8X8, we construct a single chroma motion vector
1753 with a special rounding */
1754 mx= ff_h263_round_chroma(mx);
1755 my= ff_h263_round_chroma(my);
1759 src_x = s->mb_x*block_s + (mx >> (lowres+1));
1760 src_y = s->mb_y*block_s + (my >> (lowres+1));
1762 offset = src_y * s->uvlinesize + src_x;
1763 ptr = ref_picture[1] + offset;
1764 if(s->flags&CODEC_FLAG_EMU_EDGE){
1765 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
1766 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
1767 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1768 ptr= s->edge_emu_buffer;
1772 sx= (sx << 2) >> lowres;
1773 sy= (sy << 2) >> lowres;
1774 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1776 ptr = ref_picture[2] + offset;
1778 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1779 ptr= s->edge_emu_buffer;
1781 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
1785 * motion compensation of a single macroblock
1787 * @param dest_y luma destination pointer
1788 * @param dest_cb chroma cb/u destination pointer
1789 * @param dest_cr chroma cr/v destination pointer
1790 * @param dir direction (0->forward, 1->backward)
1791 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
1792 * @param pix_op halfpel motion compensation function (average or put normally)
1793 * the motion vectors are taken from s->mv and the MV type from s->mv_type
1795 static inline void MPV_motion_lowres(MpegEncContext *s,
1796 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1797 int dir, uint8_t **ref_picture,
1798 h264_chroma_mc_func *pix_op)
1802 const int lowres= s->avctx->lowres;
1803 const int block_s= 8>>lowres;
1808 switch(s->mv_type) {
1810 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1812 ref_picture, pix_op,
1813 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
1819 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1820 ref_picture[0], 0, 0,
1821 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
1822 s->width, s->height, s->linesize,
1823 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
1824 block_s, block_s, pix_op,
1825 s->mv[dir][i][0], s->mv[dir][i][1]);
1827 mx += s->mv[dir][i][0];
1828 my += s->mv[dir][i][1];
1831 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
1832 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
1835 if (s->picture_structure == PICT_FRAME) {
1837 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1838 1, 0, s->field_select[dir][0],
1839 ref_picture, pix_op,
1840 s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
1842 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1843 1, 1, s->field_select[dir][1],
1844 ref_picture, pix_op,
1845 s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
1847 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){
1848 ref_picture= s->current_picture_ptr->data;
1851 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1852 0, 0, s->field_select[dir][0],
1853 ref_picture, pix_op,
1854 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
1859 uint8_t ** ref2picture;
1861 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == AV_PICTURE_TYPE_B || s->first_field){
1862 ref2picture= ref_picture;
1864 ref2picture= s->current_picture_ptr->data;
1867 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1868 0, 0, s->field_select[dir][i],
1869 ref2picture, pix_op,
1870 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1872 dest_y += 2*block_s*s->linesize;
1873 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1874 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1878 if(s->picture_structure == PICT_FRAME){
1882 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1884 ref_picture, pix_op,
1885 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
1887 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1891 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1892 0, 0, s->picture_structure != i+1,
1893 ref_picture, pix_op,
1894 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1896 // after put we make avg of the same block
1897 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1899 //opposite parity is always in the same frame if this is second field
1900 if(!s->first_field){
1901 ref_picture = s->current_picture_ptr->data;
1911 * find the lowest MB row referenced in the MVs
1913 int MPV_lowest_referenced_row(MpegEncContext *s, int dir)
1915 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
1916 int my, off, i, mvs;
1918 if (s->picture_structure != PICT_FRAME) goto unhandled;
1920 switch (s->mv_type) {
1934 for (i = 0; i < mvs; i++) {
1935 my = s->mv[dir][i][1]<<qpel_shift;
1936 my_max = FFMAX(my_max, my);
1937 my_min = FFMIN(my_min, my);
1940 off = (FFMAX(-my_min, my_max) + 63) >> 6;
1942 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
1944 return s->mb_height-1;
1947 /* put block[] to dest[] */
1948 static inline void put_dct(MpegEncContext *s,
1949 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1951 s->dct_unquantize_intra(s, block, i, qscale);
1952 s->dsp.idct_put (dest, line_size, block);
1955 /* add block[] to dest[] */
1956 static inline void add_dct(MpegEncContext *s,
1957 DCTELEM *block, int i, uint8_t *dest, int line_size)
1959 if (s->block_last_index[i] >= 0) {
1960 s->dsp.idct_add (dest, line_size, block);
1964 static inline void add_dequant_dct(MpegEncContext *s,
1965 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1967 if (s->block_last_index[i] >= 0) {
1968 s->dct_unquantize_inter(s, block, i, qscale);
1970 s->dsp.idct_add (dest, line_size, block);
1975 * cleans dc, ac, coded_block for the current non intra MB
1977 void ff_clean_intra_table_entries(MpegEncContext *s)
1979 int wrap = s->b8_stride;
1980 int xy = s->block_index[0];
1983 s->dc_val[0][xy + 1 ] =
1984 s->dc_val[0][xy + wrap] =
1985 s->dc_val[0][xy + 1 + wrap] = 1024;
1987 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
1988 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
1989 if (s->msmpeg4_version>=3) {
1990 s->coded_block[xy ] =
1991 s->coded_block[xy + 1 ] =
1992 s->coded_block[xy + wrap] =
1993 s->coded_block[xy + 1 + wrap] = 0;
1996 wrap = s->mb_stride;
1997 xy = s->mb_x + s->mb_y * wrap;
1999 s->dc_val[2][xy] = 1024;
2001 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2002 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2004 s->mbintra_table[xy]= 0;
2007 /* generic function called after a macroblock has been parsed by the
2008 decoder or after it has been encoded by the encoder.
2010 Important variables used:
2011 s->mb_intra : true if intra macroblock
2012 s->mv_dir : motion vector direction
2013 s->mv_type : motion vector type
2014 s->mv : motion vector
2015 s->interlaced_dct : true if interlaced dct used (mpeg2)
2017 static av_always_inline
2018 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2019 int lowres_flag, int is_mpeg12)
2021 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2022 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2023 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2027 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2028 /* save DCT coefficients */
2030 DCTELEM *dct = &s->current_picture.dct_coeff[mb_xy*64*6];
2031 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2033 for(j=0; j<64; j++){
2034 *dct++ = block[i][s->dsp.idct_permutation[j]];
2035 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2037 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2041 s->current_picture.qscale_table[mb_xy]= s->qscale;
2043 /* update DC predictors for P macroblocks */
2045 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2046 if(s->mbintra_table[mb_xy])
2047 ff_clean_intra_table_entries(s);
2051 s->last_dc[2] = 128 << s->intra_dc_precision;
2054 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2055 s->mbintra_table[mb_xy]=1;
2057 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
2058 uint8_t *dest_y, *dest_cb, *dest_cr;
2059 int dct_linesize, dct_offset;
2060 op_pixels_func (*op_pix)[4];
2061 qpel_mc_func (*op_qpix)[16];
2062 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2063 const int uvlinesize= s->current_picture.linesize[1];
2064 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2065 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2067 /* avoid copy if macroblock skipped in last frame too */
2068 /* skip only during decoding as we might trash the buffers during encoding a bit */
2070 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2071 const int age= s->current_picture.age;
2075 if (s->mb_skipped) {
2077 assert(s->pict_type!=AV_PICTURE_TYPE_I);
2079 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
2080 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2082 /* if previous was skipped too, then nothing to do ! */
2083 if (*mbskip_ptr >= age && s->current_picture.reference){
2086 } else if(!s->current_picture.reference){
2087 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2088 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2090 *mbskip_ptr = 0; /* not skipped */
2094 dct_linesize = linesize << s->interlaced_dct;
2095 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
2099 dest_cb= s->dest[1];
2100 dest_cr= s->dest[2];
2102 dest_y = s->b_scratchpad;
2103 dest_cb= s->b_scratchpad+16*linesize;
2104 dest_cr= s->b_scratchpad+32*linesize;
2108 /* motion handling */
2109 /* decoding or more than one mb_type (MC was already done otherwise) */
2112 if(HAVE_PTHREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2113 if (s->mv_dir & MV_DIR_FORWARD) {
2114 ff_thread_await_progress((AVFrame*)s->last_picture_ptr, MPV_lowest_referenced_row(s, 0), 0);
2116 if (s->mv_dir & MV_DIR_BACKWARD) {
2117 ff_thread_await_progress((AVFrame*)s->next_picture_ptr, MPV_lowest_referenced_row(s, 1), 0);
2122 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2124 if (s->mv_dir & MV_DIR_FORWARD) {
2125 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix);
2126 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2128 if (s->mv_dir & MV_DIR_BACKWARD) {
2129 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix);
2132 op_qpix= s->me.qpel_put;
2133 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2134 op_pix = s->dsp.put_pixels_tab;
2136 op_pix = s->dsp.put_no_rnd_pixels_tab;
2138 if (s->mv_dir & MV_DIR_FORWARD) {
2139 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.data, op_pix, op_qpix);
2140 op_pix = s->dsp.avg_pixels_tab;
2141 op_qpix= s->me.qpel_avg;
2143 if (s->mv_dir & MV_DIR_BACKWARD) {
2144 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.data, op_pix, op_qpix);
2149 /* skip dequant / idct if we are really late ;) */
2150 if(s->avctx->skip_idct){
2151 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2152 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2153 || s->avctx->skip_idct >= AVDISCARD_ALL)
2157 /* add dct residue */
2158 if(s->encoding || !( s->msmpeg4_version || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2159 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2160 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2161 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2162 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2163 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2165 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2166 if (s->chroma_y_shift){
2167 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2168 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2172 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2173 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2174 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2175 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2178 } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
2179 add_dct(s, block[0], 0, dest_y , dct_linesize);
2180 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2181 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2182 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2184 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2185 if(s->chroma_y_shift){//Chroma420
2186 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2187 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2190 dct_linesize = uvlinesize << s->interlaced_dct;
2191 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*block_size;
2193 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2194 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2195 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2196 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2197 if(!s->chroma_x_shift){//Chroma444
2198 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2199 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2200 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2201 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2206 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2207 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2210 /* dct only in intra block */
2211 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2212 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2213 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2214 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2215 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2217 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2218 if(s->chroma_y_shift){
2219 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2220 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2224 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2225 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2226 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2227 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2231 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2232 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2233 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2234 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2236 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2237 if(s->chroma_y_shift){
2238 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2239 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2242 dct_linesize = uvlinesize << s->interlaced_dct;
2243 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*block_size;
2245 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2246 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2247 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2248 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2249 if(!s->chroma_x_shift){//Chroma444
2250 s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2251 s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2252 s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2253 s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2261 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2262 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2263 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2268 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2270 if(s->out_format == FMT_MPEG1) {
2271 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2272 else MPV_decode_mb_internal(s, block, 0, 1);
2275 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2276 else MPV_decode_mb_internal(s, block, 0, 0);
2281 * @param h is the normal height, this will be reduced automatically if needed for the last row
2283 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2284 const int field_pic= s->picture_structure != PICT_FRAME;
2290 if (!s->avctx->hwaccel
2291 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2292 && s->unrestricted_mv
2293 && s->current_picture.reference
2295 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2296 int sides = 0, edge_h;
2297 if (y==0) sides |= EDGE_TOP;
2298 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2300 edge_h= FFMIN(h, s->v_edge_pos - y);
2302 s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize , s->h_edge_pos , edge_h , EDGE_WIDTH , sides);
2303 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);
2304 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);
2307 h= FFMIN(h, s->avctx->height - y);
2309 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2311 if (s->avctx->draw_horiz_band) {
2315 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2316 src= (AVFrame*)s->current_picture_ptr;
2317 else if(s->last_picture_ptr)
2318 src= (AVFrame*)s->last_picture_ptr;
2322 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2328 offset[0]= y * s->linesize;
2330 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2336 s->avctx->draw_horiz_band(s->avctx, src, offset,
2337 y, s->picture_structure, h);
2341 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2342 const int linesize= s->current_picture.linesize[0]; //not s->linesize as this would be wrong for field pics
2343 const int uvlinesize= s->current_picture.linesize[1];
2344 const int mb_size= 4 - s->avctx->lowres;
2346 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2347 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2348 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2349 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2350 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2351 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;
2352 //block_index is not used by mpeg2, so it is not affected by chroma_format
2354 s->dest[0] = s->current_picture.data[0] + ((s->mb_x - 1) << mb_size);
2355 s->dest[1] = s->current_picture.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2356 s->dest[2] = s->current_picture.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2358 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2360 if(s->picture_structure==PICT_FRAME){
2361 s->dest[0] += s->mb_y * linesize << mb_size;
2362 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2363 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2365 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2366 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2367 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2368 assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2373 void ff_mpeg_flush(AVCodecContext *avctx){
2375 MpegEncContext *s = avctx->priv_data;
2377 if(s==NULL || s->picture==NULL)
2380 for(i=0; i<s->picture_count; i++){
2381 if(s->picture[i].data[0] && ( s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
2382 || s->picture[i].type == FF_BUFFER_TYPE_USER))
2383 free_frame_buffer(s, &s->picture[i]);
2385 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2387 s->mb_x= s->mb_y= 0;
2390 s->parse_context.state= -1;
2391 s->parse_context.frame_start_found= 0;
2392 s->parse_context.overread= 0;
2393 s->parse_context.overread_index= 0;
2394 s->parse_context.index= 0;
2395 s->parse_context.last_index= 0;
2396 s->bitstream_buffer_size=0;
2400 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2401 DCTELEM *block, int n, int qscale)
2403 int i, level, nCoeffs;
2404 const uint16_t *quant_matrix;
2406 nCoeffs= s->block_last_index[n];
2409 block[0] = block[0] * s->y_dc_scale;
2411 block[0] = block[0] * s->c_dc_scale;
2412 /* XXX: only mpeg1 */
2413 quant_matrix = s->intra_matrix;
2414 for(i=1;i<=nCoeffs;i++) {
2415 int j= s->intra_scantable.permutated[i];
2420 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2421 level = (level - 1) | 1;
2424 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2425 level = (level - 1) | 1;
2432 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2433 DCTELEM *block, int n, int qscale)
2435 int i, level, nCoeffs;
2436 const uint16_t *quant_matrix;
2438 nCoeffs= s->block_last_index[n];
2440 quant_matrix = s->inter_matrix;
2441 for(i=0; i<=nCoeffs; i++) {
2442 int j= s->intra_scantable.permutated[i];
2447 level = (((level << 1) + 1) * qscale *
2448 ((int) (quant_matrix[j]))) >> 4;
2449 level = (level - 1) | 1;
2452 level = (((level << 1) + 1) * qscale *
2453 ((int) (quant_matrix[j]))) >> 4;
2454 level = (level - 1) | 1;
2461 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2462 DCTELEM *block, int n, int qscale)
2464 int i, level, nCoeffs;
2465 const uint16_t *quant_matrix;
2467 if(s->alternate_scan) nCoeffs= 63;
2468 else nCoeffs= s->block_last_index[n];
2471 block[0] = block[0] * s->y_dc_scale;
2473 block[0] = block[0] * s->c_dc_scale;
2474 quant_matrix = s->intra_matrix;
2475 for(i=1;i<=nCoeffs;i++) {
2476 int j= s->intra_scantable.permutated[i];
2481 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2484 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2491 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2492 DCTELEM *block, int n, int qscale)
2494 int i, level, nCoeffs;
2495 const uint16_t *quant_matrix;
2498 if(s->alternate_scan) nCoeffs= 63;
2499 else nCoeffs= s->block_last_index[n];
2502 block[0] = block[0] * s->y_dc_scale;
2504 block[0] = block[0] * s->c_dc_scale;
2505 quant_matrix = s->intra_matrix;
2506 for(i=1;i<=nCoeffs;i++) {
2507 int j= s->intra_scantable.permutated[i];
2512 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2515 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2524 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2525 DCTELEM *block, int n, int qscale)
2527 int i, level, nCoeffs;
2528 const uint16_t *quant_matrix;
2531 if(s->alternate_scan) nCoeffs= 63;
2532 else nCoeffs= s->block_last_index[n];
2534 quant_matrix = s->inter_matrix;
2535 for(i=0; i<=nCoeffs; i++) {
2536 int j= s->intra_scantable.permutated[i];
2541 level = (((level << 1) + 1) * qscale *
2542 ((int) (quant_matrix[j]))) >> 4;
2545 level = (((level << 1) + 1) * qscale *
2546 ((int) (quant_matrix[j]))) >> 4;
2555 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2556 DCTELEM *block, int n, int qscale)
2558 int i, level, qmul, qadd;
2561 assert(s->block_last_index[n]>=0);
2567 block[0] = block[0] * s->y_dc_scale;
2569 block[0] = block[0] * s->c_dc_scale;
2570 qadd = (qscale - 1) | 1;
2577 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2579 for(i=1; i<=nCoeffs; i++) {
2583 level = level * qmul - qadd;
2585 level = level * qmul + qadd;
2592 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2593 DCTELEM *block, int n, int qscale)
2595 int i, level, qmul, qadd;
2598 assert(s->block_last_index[n]>=0);
2600 qadd = (qscale - 1) | 1;
2603 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2605 for(i=0; i<=nCoeffs; i++) {
2609 level = level * qmul - qadd;
2611 level = level * qmul + qadd;
2619 * set qscale and update qscale dependent variables.
2621 void ff_set_qscale(MpegEncContext * s, int qscale)
2625 else if (qscale > 31)
2629 s->chroma_qscale= s->chroma_qscale_table[qscale];
2631 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2632 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2635 void MPV_report_decode_progress(MpegEncContext *s)
2637 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame)
2638 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0);