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[] = {
126 const uint8_t *avpriv_mpv_find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
134 uint32_t tmp= *state << 8;
135 *state= tmp + *(p++);
136 if(tmp == 0x100 || p==end)
141 if (p[-1] > 1 ) p+= 3;
142 else if(p[-2] ) p+= 2;
143 else if(p[-3]|(p[-1]-1)) p++;
156 /* init common dct for both encoder and decoder */
157 av_cold int ff_dct_common_init(MpegEncContext *s)
159 dsputil_init(&s->dsp, s->avctx);
161 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
162 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
163 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
164 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
165 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
166 if(s->flags & CODEC_FLAG_BITEXACT)
167 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
168 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
171 MPV_common_init_mmx(s);
173 MPV_common_init_axp(s);
175 MPV_common_init_mlib(s);
177 MPV_common_init_mmi(s);
179 MPV_common_init_arm(s);
181 MPV_common_init_altivec(s);
183 MPV_common_init_bfin(s);
186 /* load & permutate scantables
187 note: only wmv uses different ones
189 if(s->alternate_scan){
190 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
191 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
193 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
194 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
196 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
197 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
202 void ff_copy_picture(Picture *dst, Picture *src){
204 dst->f.type= FF_BUFFER_TYPE_COPY;
208 * Release a frame buffer
210 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
212 /* Windows Media Image codecs allocate internal buffers with different
213 dimensions; ignore user defined callbacks for these */
214 if (s->codec_id != CODEC_ID_WMV3IMAGE && s->codec_id != CODEC_ID_VC1IMAGE)
215 ff_thread_release_buffer(s->avctx, (AVFrame*)pic);
217 avcodec_default_release_buffer(s->avctx, (AVFrame*)pic);
218 av_freep(&pic->f.hwaccel_picture_private);
222 * Allocate a frame buffer
224 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
228 if (s->avctx->hwaccel) {
229 assert(!pic->f.hwaccel_picture_private);
230 if (s->avctx->hwaccel->priv_data_size) {
231 pic->f.hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
232 if (!pic->f.hwaccel_picture_private) {
233 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
239 if (s->codec_id != CODEC_ID_WMV3IMAGE && s->codec_id != CODEC_ID_VC1IMAGE)
240 r = ff_thread_get_buffer(s->avctx, (AVFrame*)pic);
242 r = avcodec_default_get_buffer(s->avctx, (AVFrame*)pic);
244 if (r < 0 || !pic->f.age || !pic->f.type || !pic->f.data[0]) {
245 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n",
246 r, pic->f.age, pic->f.type, pic->f.data[0]);
247 av_freep(&pic->f.hwaccel_picture_private);
251 if (s->linesize && (s->linesize != pic->f.linesize[0] || s->uvlinesize != pic->f.linesize[1])) {
252 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (stride changed)\n");
253 free_frame_buffer(s, pic);
257 if (pic->f.linesize[1] != pic->f.linesize[2]) {
258 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (uv stride mismatch)\n");
259 free_frame_buffer(s, pic);
267 * allocates a Picture
268 * The pixels are allocated/set by calling get_buffer() if shared=0
270 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){
271 const int big_mb_num= s->mb_stride*(s->mb_height+1) + 1; //the +1 is needed so memset(,,stride*height) does not sig11
272 const int mb_array_size= s->mb_stride*s->mb_height;
273 const int b8_array_size= s->b8_stride*s->mb_height*2;
274 const int b4_array_size= s->b4_stride*s->mb_height*4;
279 assert(pic->f.data[0]);
280 assert(pic->f.type == 0 || pic->f.type == FF_BUFFER_TYPE_SHARED);
281 pic->f.type = FF_BUFFER_TYPE_SHARED;
283 assert(!pic->f.data[0]);
285 if (alloc_frame_buffer(s, pic) < 0)
288 s->linesize = pic->f.linesize[0];
289 s->uvlinesize = pic->f.linesize[1];
292 if (pic->f.qscale_table == NULL) {
294 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var , mb_array_size * sizeof(int16_t) , fail)
295 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var, mb_array_size * sizeof(int16_t) , fail)
296 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean , mb_array_size * sizeof(int8_t ) , fail)
299 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.mbskip_table, mb_array_size * sizeof(uint8_t) + 2, fail) //the +2 is for the slice end check
300 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table_base , (big_mb_num + s->mb_stride) * sizeof(uint8_t) , fail)
301 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail)
302 pic->f.mb_type = pic->mb_type_base + 2*s->mb_stride + 1;
303 pic->f.qscale_table = pic->qscale_table_base + 2*s->mb_stride + 1;
304 if(s->out_format == FMT_H264){
306 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t), fail)
307 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
308 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
310 pic->f.motion_subsample_log2 = 2;
311 }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){
313 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b8_array_size+4) * sizeof(int16_t), fail)
314 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
315 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i], 4*mb_array_size * sizeof(uint8_t), fail)
317 pic->f.motion_subsample_log2 = 3;
319 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
320 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.dct_coeff, 64 * mb_array_size * sizeof(DCTELEM) * 6, fail)
322 pic->f.qstride = s->mb_stride;
323 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.pan_scan , 1 * sizeof(AVPanScan), fail)
326 /* It might be nicer if the application would keep track of these
327 * but it would require an API change. */
328 memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1);
329 s->prev_pict_types[0]= s->dropable ? AV_PICTURE_TYPE_B : s->pict_type;
330 if (pic->f.age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->f.age] == AV_PICTURE_TYPE_B)
331 pic->f.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.
335 fail: //for the FF_ALLOCZ_OR_GOTO macro
337 free_frame_buffer(s, pic);
342 * deallocates a picture
344 static void free_picture(MpegEncContext *s, Picture *pic){
347 if (pic->f.data[0] && pic->f.type != FF_BUFFER_TYPE_SHARED) {
348 free_frame_buffer(s, pic);
351 av_freep(&pic->mb_var);
352 av_freep(&pic->mc_mb_var);
353 av_freep(&pic->mb_mean);
354 av_freep(&pic->f.mbskip_table);
355 av_freep(&pic->qscale_table_base);
356 av_freep(&pic->mb_type_base);
357 av_freep(&pic->f.dct_coeff);
358 av_freep(&pic->f.pan_scan);
359 pic->f.mb_type = NULL;
361 av_freep(&pic->motion_val_base[i]);
362 av_freep(&pic->f.ref_index[i]);
365 if (pic->f.type == FF_BUFFER_TYPE_SHARED) {
368 pic->f.data[i] = NULL;
374 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
375 int y_size = s->b8_stride * (2 * s->mb_height + 1);
376 int c_size = s->mb_stride * (s->mb_height + 1);
377 int yc_size = y_size + 2 * c_size;
380 // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
381 FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, (s->width+64)*2*21*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
383 //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
384 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail)
385 s->me.temp= s->me.scratchpad;
386 s->rd_scratchpad= s->me.scratchpad;
387 s->b_scratchpad= s->me.scratchpad;
388 s->obmc_scratchpad= s->me.scratchpad + 16;
390 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map , ME_MAP_SIZE*sizeof(uint32_t), fail)
391 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE*sizeof(uint32_t), fail)
392 if(s->avctx->noise_reduction){
393 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail)
396 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64*12*2 * sizeof(DCTELEM), fail)
397 s->block= s->blocks[0];
400 s->pblocks[i] = &s->block[i];
403 if (s->out_format == FMT_H263) {
405 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base, yc_size * sizeof(int16_t) * 16, fail);
406 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
407 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
408 s->ac_val[2] = s->ac_val[1] + c_size;
413 return -1; //free() through MPV_common_end()
416 static void free_duplicate_context(MpegEncContext *s){
419 av_freep(&s->edge_emu_buffer);
420 av_freep(&s->me.scratchpad);
424 s->obmc_scratchpad= NULL;
426 av_freep(&s->dct_error_sum);
427 av_freep(&s->me.map);
428 av_freep(&s->me.score_map);
429 av_freep(&s->blocks);
430 av_freep(&s->ac_val_base);
434 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
435 #define COPY(a) bak->a= src->a
436 COPY(edge_emu_buffer);
441 COPY(obmc_scratchpad);
448 COPY(me.map_generation);
460 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src){
463 //FIXME copy only needed parts
465 backup_duplicate_context(&bak, dst);
466 memcpy(dst, src, sizeof(MpegEncContext));
467 backup_duplicate_context(dst, &bak);
469 dst->pblocks[i] = &dst->block[i];
471 //STOP_TIMER("update_duplicate_context") //about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
474 int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
476 MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
478 if(dst == src || !s1->context_initialized) return 0;
480 //FIXME can parameters change on I-frames? in that case dst may need a reinit
481 if(!s->context_initialized){
482 memcpy(s, s1, sizeof(MpegEncContext));
485 s->picture_range_start += MAX_PICTURE_COUNT;
486 s->picture_range_end += MAX_PICTURE_COUNT;
487 s->bitstream_buffer = NULL;
488 s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
493 s->avctx->coded_height = s1->avctx->coded_height;
494 s->avctx->coded_width = s1->avctx->coded_width;
495 s->avctx->width = s1->avctx->width;
496 s->avctx->height = s1->avctx->height;
498 s->coded_picture_number = s1->coded_picture_number;
499 s->picture_number = s1->picture_number;
500 s->input_picture_number = s1->input_picture_number;
502 memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
503 memcpy(&s->last_picture, &s1->last_picture, (char*)&s1->last_picture_ptr - (char*)&s1->last_picture);
505 s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
506 s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
507 s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
509 memcpy(s->prev_pict_types, s1->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE);
511 //Error/bug resilience
512 s->next_p_frame_damaged = s1->next_p_frame_damaged;
513 s->workaround_bugs = s1->workaround_bugs;
516 memcpy(&s->time_increment_bits, &s1->time_increment_bits, (char*)&s1->shape - (char*)&s1->time_increment_bits);
519 s->max_b_frames = s1->max_b_frames;
520 s->low_delay = s1->low_delay;
521 s->dropable = s1->dropable;
523 //DivX handling (doesn't work)
524 s->divx_packed = s1->divx_packed;
526 if(s1->bitstream_buffer){
527 if (s1->bitstream_buffer_size + FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
528 av_fast_malloc(&s->bitstream_buffer, &s->allocated_bitstream_buffer_size, s1->allocated_bitstream_buffer_size);
529 s->bitstream_buffer_size = s1->bitstream_buffer_size;
530 memcpy(s->bitstream_buffer, s1->bitstream_buffer, s1->bitstream_buffer_size);
531 memset(s->bitstream_buffer+s->bitstream_buffer_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
534 //MPEG2/interlacing info
535 memcpy(&s->progressive_sequence, &s1->progressive_sequence, (char*)&s1->rtp_mode - (char*)&s1->progressive_sequence);
537 if(!s1->first_field){
538 s->last_pict_type= s1->pict_type;
539 if (s1->current_picture_ptr) s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality;
541 if (s1->pict_type != AV_PICTURE_TYPE_B) {
542 s->last_non_b_pict_type= s1->pict_type;
550 * sets the given MpegEncContext to common defaults (same for encoding and decoding).
551 * the changed fields will not depend upon the prior state of the MpegEncContext.
553 void MPV_common_defaults(MpegEncContext *s){
555 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
556 s->chroma_qscale_table= ff_default_chroma_qscale_table;
557 s->progressive_frame= 1;
558 s->progressive_sequence= 1;
559 s->picture_structure= PICT_FRAME;
561 s->coded_picture_number = 0;
562 s->picture_number = 0;
563 s->input_picture_number = 0;
565 s->picture_in_gop_number = 0;
570 s->picture_range_start = 0;
571 s->picture_range_end = MAX_PICTURE_COUNT;
575 * sets the given MpegEncContext to defaults for decoding.
576 * the changed fields will not depend upon the prior state of the MpegEncContext.
578 void MPV_decode_defaults(MpegEncContext *s){
579 MPV_common_defaults(s);
583 * init common structure for both encoder and decoder.
584 * this assumes that some variables like width/height are already set
586 av_cold int MPV_common_init(MpegEncContext *s)
588 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y,
589 threads = (s->encoding ||
591 s->avctx->active_thread_type & FF_THREAD_SLICE)) ?
592 s->avctx->thread_count : 1;
594 if(s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
595 s->mb_height = (s->height + 31) / 32 * 2;
596 else if (s->codec_id != CODEC_ID_H264)
597 s->mb_height = (s->height + 15) / 16;
599 if(s->avctx->pix_fmt == PIX_FMT_NONE){
600 av_log(s->avctx, AV_LOG_ERROR, "decoding to PIX_FMT_NONE is not supported.\n");
604 if((s->encoding || (s->avctx->active_thread_type & FF_THREAD_SLICE)) &&
605 (s->avctx->thread_count > MAX_THREADS || (s->avctx->thread_count > s->mb_height && s->mb_height))){
606 int max_threads = FFMIN(MAX_THREADS, s->mb_height);
607 av_log(s->avctx, AV_LOG_WARNING, "too many threads (%d), reducing to %d\n",
608 s->avctx->thread_count, max_threads);
609 threads = max_threads;
612 if((s->width || s->height) && av_image_check_size(s->width, s->height, 0, s->avctx))
615 ff_dct_common_init(s);
617 s->flags= s->avctx->flags;
618 s->flags2= s->avctx->flags2;
620 if (s->width && s->height) {
621 s->mb_width = (s->width + 15) / 16;
622 s->mb_stride = s->mb_width + 1;
623 s->b8_stride = s->mb_width*2 + 1;
624 s->b4_stride = s->mb_width*4 + 1;
625 mb_array_size= s->mb_height * s->mb_stride;
626 mv_table_size= (s->mb_height+2) * s->mb_stride + 1;
628 /* set chroma shifts */
629 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
630 &(s->chroma_y_shift) );
632 /* set default edge pos, will be overriden in decode_header if needed */
633 s->h_edge_pos= s->mb_width*16;
634 s->v_edge_pos= s->mb_height*16;
636 s->mb_num = s->mb_width * s->mb_height;
641 s->block_wrap[3]= s->b8_stride;
643 s->block_wrap[5]= s->mb_stride;
645 y_size = s->b8_stride * (2 * s->mb_height + 1);
646 c_size = s->mb_stride * (s->mb_height + 1);
647 yc_size = y_size + 2 * c_size;
649 /* convert fourcc to upper case */
650 s->codec_tag = avpriv_toupper4(s->avctx->codec_tag);
652 s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
654 s->avctx->coded_frame= (AVFrame*)&s->current_picture;
656 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num+1)*sizeof(int), fail) //error ressilience code looks cleaner with this
657 for(y=0; y<s->mb_height; y++){
658 for(x=0; x<s->mb_width; x++){
659 s->mb_index2xy[ x + y*s->mb_width ] = x + y*s->mb_stride;
662 s->mb_index2xy[ s->mb_height*s->mb_width ] = (s->mb_height-1)*s->mb_stride + s->mb_width; //FIXME really needed?
665 /* Allocate MV tables */
666 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
667 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
668 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
669 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
670 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
671 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
672 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
673 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
674 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
675 s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
676 s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
677 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
679 if(s->msmpeg4_version){
680 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
682 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
684 /* Allocate MB type table */
685 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
687 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
689 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix , 64*32 * sizeof(int), fail)
690 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix , 64*32 * sizeof(int), fail)
691 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
692 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64*32*2 * sizeof(uint16_t), fail)
693 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
694 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
696 if(s->avctx->noise_reduction){
697 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
702 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
703 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, s->picture_count * sizeof(Picture), fail)
704 for(i = 0; i < s->picture_count; i++) {
705 avcodec_get_frame_defaults((AVFrame *)&s->picture[i]);
708 if (s->width && s->height) {
709 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size*sizeof(uint8_t), fail)
711 if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
712 /* interlaced direct mode decoding tables */
717 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k], mv_table_size * 2 * sizeof(int16_t), fail)
718 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
720 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
721 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
722 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]+ s->mb_stride + 1;
724 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
727 if (s->out_format == FMT_H263) {
729 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
730 s->coded_block= s->coded_block_base + s->b8_stride + 1;
732 /* cbp, ac_pred, pred_dir */
733 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail)
734 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail)
737 if (s->h263_pred || s->h263_plus || !s->encoding) {
739 //MN: we need these for error resilience of intra-frames
740 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
741 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
742 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
743 s->dc_val[2] = s->dc_val[1] + c_size;
744 for(i=0;i<yc_size;i++)
745 s->dc_val_base[i] = 1024;
748 /* which mb is a intra block */
749 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
750 memset(s->mbintra_table, 1, mb_array_size);
752 /* init macroblock skip table */
753 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size+2, fail);
754 //Note the +1 is for a quicker mpeg4 slice_end detection
755 FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
757 s->parse_context.state= -1;
758 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
759 s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
760 s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
761 s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH);
765 s->context_initialized = 1;
766 s->thread_context[0]= s;
768 if (s->width && s->height) {
769 if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
770 for(i=1; i<threads; i++){
771 s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
772 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
775 for(i=0; i<threads; i++){
776 if(init_duplicate_context(s->thread_context[i], s) < 0)
778 s->thread_context[i]->start_mb_y= (s->mb_height*(i ) + s->avctx->thread_count/2) / s->avctx->thread_count;
779 s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count/2) / s->avctx->thread_count;
782 if(init_duplicate_context(s, s) < 0) goto fail;
784 s->end_mb_y = s->mb_height;
794 /* init common structure for both encoder and decoder */
795 void MPV_common_end(MpegEncContext *s)
799 if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
800 for(i=0; i<s->avctx->thread_count; i++){
801 free_duplicate_context(s->thread_context[i]);
803 for(i=1; i<s->avctx->thread_count; i++){
804 av_freep(&s->thread_context[i]);
806 } else free_duplicate_context(s);
808 av_freep(&s->parse_context.buffer);
809 s->parse_context.buffer_size=0;
811 av_freep(&s->mb_type);
812 av_freep(&s->p_mv_table_base);
813 av_freep(&s->b_forw_mv_table_base);
814 av_freep(&s->b_back_mv_table_base);
815 av_freep(&s->b_bidir_forw_mv_table_base);
816 av_freep(&s->b_bidir_back_mv_table_base);
817 av_freep(&s->b_direct_mv_table_base);
819 s->b_forw_mv_table= NULL;
820 s->b_back_mv_table= NULL;
821 s->b_bidir_forw_mv_table= NULL;
822 s->b_bidir_back_mv_table= NULL;
823 s->b_direct_mv_table= NULL;
827 av_freep(&s->b_field_mv_table_base[i][j][k]);
828 s->b_field_mv_table[i][j][k]=NULL;
830 av_freep(&s->b_field_select_table[i][j]);
831 av_freep(&s->p_field_mv_table_base[i][j]);
832 s->p_field_mv_table[i][j]=NULL;
834 av_freep(&s->p_field_select_table[i]);
837 av_freep(&s->dc_val_base);
838 av_freep(&s->coded_block_base);
839 av_freep(&s->mbintra_table);
840 av_freep(&s->cbp_table);
841 av_freep(&s->pred_dir_table);
843 av_freep(&s->mbskip_table);
844 av_freep(&s->prev_pict_types);
845 av_freep(&s->bitstream_buffer);
846 s->allocated_bitstream_buffer_size=0;
848 av_freep(&s->avctx->stats_out);
849 av_freep(&s->ac_stats);
850 av_freep(&s->error_status_table);
851 av_freep(&s->mb_index2xy);
852 av_freep(&s->lambda_table);
853 av_freep(&s->q_intra_matrix);
854 av_freep(&s->q_inter_matrix);
855 av_freep(&s->q_intra_matrix16);
856 av_freep(&s->q_inter_matrix16);
857 av_freep(&s->input_picture);
858 av_freep(&s->reordered_input_picture);
859 av_freep(&s->dct_offset);
861 if(s->picture && !s->avctx->internal->is_copy){
862 for(i=0; i<s->picture_count; i++){
863 free_picture(s, &s->picture[i]);
866 av_freep(&s->picture);
867 s->context_initialized = 0;
870 s->current_picture_ptr= NULL;
871 s->linesize= s->uvlinesize= 0;
874 av_freep(&s->visualization_buffer[i]);
876 if(!(s->avctx->active_thread_type&FF_THREAD_FRAME))
877 avcodec_default_free_buffers(s->avctx);
880 void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3])
882 int8_t max_level[MAX_RUN+1], max_run[MAX_LEVEL+1];
883 uint8_t index_run[MAX_RUN+1];
884 int last, run, level, start, end, i;
886 /* If table is static, we can quit if rl->max_level[0] is not NULL */
887 if(static_store && rl->max_level[0])
890 /* compute max_level[], max_run[] and index_run[] */
891 for(last=0;last<2;last++) {
900 memset(max_level, 0, MAX_RUN + 1);
901 memset(max_run, 0, MAX_LEVEL + 1);
902 memset(index_run, rl->n, MAX_RUN + 1);
903 for(i=start;i<end;i++) {
904 run = rl->table_run[i];
905 level = rl->table_level[i];
906 if (index_run[run] == rl->n)
908 if (level > max_level[run])
909 max_level[run] = level;
910 if (run > max_run[level])
911 max_run[level] = run;
914 rl->max_level[last] = static_store[last];
916 rl->max_level[last] = av_malloc(MAX_RUN + 1);
917 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
919 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
921 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
922 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
924 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
926 rl->index_run[last] = av_malloc(MAX_RUN + 1);
927 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
931 void init_vlc_rl(RLTable *rl)
943 for(i=0; i<rl->vlc.table_size; i++){
944 int code= rl->vlc.table[i][0];
945 int len = rl->vlc.table[i][1];
948 if(len==0){ // illegal code
951 }else if(len<0){ //more bits needed
955 if(code==rl->n){ //esc
959 run= rl->table_run [code] + 1;
960 level= rl->table_level[code] * qmul + qadd;
961 if(code >= rl->last) run+=192;
964 rl->rl_vlc[q][i].len= len;
965 rl->rl_vlc[q][i].level= level;
966 rl->rl_vlc[q][i].run= run;
971 void ff_release_unused_pictures(MpegEncContext *s, int remove_current)
975 /* release non reference frames */
976 for(i=0; i<s->picture_count; i++){
977 if (s->picture[i].f.data[0] && !s->picture[i].f.reference
978 && (!s->picture[i].owner2 || s->picture[i].owner2 == s)
979 && (remove_current || &s->picture[i] != s->current_picture_ptr)
980 /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
981 free_frame_buffer(s, &s->picture[i]);
986 int ff_find_unused_picture(MpegEncContext *s, int shared){
990 for(i=s->picture_range_start; i<s->picture_range_end; i++){
991 if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type == 0)
995 for(i=s->picture_range_start; i<s->picture_range_end; i++){
996 if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type != 0)
999 for(i=s->picture_range_start; i<s->picture_range_end; i++){
1000 if (s->picture[i].f.data[0] == NULL)
1005 av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
1006 /* We could return -1, but the codec would crash trying to draw into a
1007 * non-existing frame anyway. This is safer than waiting for a random crash.
1008 * Also the return of this is never useful, an encoder must only allocate
1009 * as much as allowed in the specification. This has no relationship to how
1010 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1011 * enough for such valid streams).
1012 * Plus, a decoder has to check stream validity and remove frames if too
1013 * many reference frames are around. Waiting for "OOM" is not correct at
1014 * all. Similarly, missing reference frames have to be replaced by
1015 * interpolated/MC frames, anything else is a bug in the codec ...
1021 static void update_noise_reduction(MpegEncContext *s){
1024 for(intra=0; intra<2; intra++){
1025 if(s->dct_count[intra] > (1<<16)){
1026 for(i=0; i<64; i++){
1027 s->dct_error_sum[intra][i] >>=1;
1029 s->dct_count[intra] >>= 1;
1032 for(i=0; i<64; i++){
1033 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);
1039 * generic function for encode/decode called after coding/decoding the header and before a frame is coded/decoded
1041 int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1047 assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3);
1049 /* mark&release old frames */
1050 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && s->last_picture_ptr->f.data[0]) {
1051 if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){
1052 if (s->last_picture_ptr->owner2 == s)
1053 free_frame_buffer(s, s->last_picture_ptr);
1055 /* release forgotten pictures */
1056 /* if(mpeg124/h263) */
1058 for(i=0; i<s->picture_count; i++){
1059 if (s->picture[i].owner2 == s && s->picture[i].f.data[0] && &s->picture[i] != s->next_picture_ptr && s->picture[i].f.reference) {
1060 if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1061 av_log(avctx, AV_LOG_ERROR, "releasing zombie picture\n");
1062 free_frame_buffer(s, &s->picture[i]);
1070 ff_release_unused_pictures(s, 1);
1072 if (s->current_picture_ptr && s->current_picture_ptr->f.data[0] == NULL)
1073 pic= s->current_picture_ptr; //we already have a unused image (maybe it was set before reading the header)
1075 i= ff_find_unused_picture(s, 0);
1076 pic= &s->picture[i];
1079 pic->f.reference = 0;
1081 if (s->codec_id == CODEC_ID_H264)
1082 pic->f.reference = s->picture_structure;
1083 else if (s->pict_type != AV_PICTURE_TYPE_B)
1084 pic->f.reference = 3;
1087 pic->f.coded_picture_number = s->coded_picture_number++;
1089 if(ff_alloc_picture(s, pic, 0) < 0)
1092 s->current_picture_ptr= pic;
1093 //FIXME use only the vars from current_pic
1094 s->current_picture_ptr->f.top_field_first = s->top_field_first;
1095 if(s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO) {
1096 if(s->picture_structure != PICT_FRAME)
1097 s->current_picture_ptr->f.top_field_first = (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1099 s->current_picture_ptr->f.interlaced_frame = !s->progressive_frame && !s->progressive_sequence;
1100 s->current_picture_ptr->field_picture = s->picture_structure != PICT_FRAME;
1103 s->current_picture_ptr->f.pict_type = s->pict_type;
1104 // if(s->flags && CODEC_FLAG_QSCALE)
1105 // s->current_picture_ptr->quality= s->new_picture_ptr->quality;
1106 s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1108 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1110 if (s->pict_type != AV_PICTURE_TYPE_B) {
1111 s->last_picture_ptr= s->next_picture_ptr;
1113 s->next_picture_ptr= s->current_picture_ptr;
1115 /* 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,
1116 s->last_picture_ptr ? s->last_picture_ptr->f.data[0] : NULL,
1117 s->next_picture_ptr ? s->next_picture_ptr->f.data[0] : NULL,
1118 s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL,
1119 s->pict_type, s->dropable);*/
1121 if(s->codec_id != CODEC_ID_H264){
1122 if ((s->last_picture_ptr == NULL || s->last_picture_ptr->f.data[0] == NULL) &&
1123 (s->pict_type!=AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)){
1124 if (s->pict_type != AV_PICTURE_TYPE_I)
1125 av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n");
1126 else if (s->picture_structure != PICT_FRAME)
1127 av_log(avctx, AV_LOG_INFO, "allocate dummy last picture for field based first keyframe\n");
1129 /* Allocate a dummy frame */
1130 i= ff_find_unused_picture(s, 0);
1131 s->last_picture_ptr= &s->picture[i];
1132 if(ff_alloc_picture(s, s->last_picture_ptr, 0) < 0)
1134 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 0);
1135 ff_thread_report_progress((AVFrame*)s->last_picture_ptr, INT_MAX, 1);
1137 if ((s->next_picture_ptr == NULL || s->next_picture_ptr->f.data[0] == NULL) && s->pict_type == AV_PICTURE_TYPE_B) {
1138 /* Allocate a dummy frame */
1139 i= ff_find_unused_picture(s, 0);
1140 s->next_picture_ptr= &s->picture[i];
1141 if(ff_alloc_picture(s, s->next_picture_ptr, 0) < 0)
1143 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 0);
1144 ff_thread_report_progress((AVFrame*)s->next_picture_ptr, INT_MAX, 1);
1148 if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1149 if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1151 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr && s->last_picture_ptr->f.data[0]));
1153 if(s->picture_structure!=PICT_FRAME && s->out_format != FMT_H264){
1156 if(s->picture_structure == PICT_BOTTOM_FIELD){
1157 s->current_picture.f.data[i] += s->current_picture.f.linesize[i];
1159 s->current_picture.f.linesize[i] *= 2;
1160 s->last_picture.f.linesize[i] *= 2;
1161 s->next_picture.f.linesize[i] *= 2;
1165 s->error_recognition= avctx->error_recognition;
1167 /* set dequantizer, we can't do it during init as it might change for mpeg4
1168 and we can't do it in the header decode as init is not called for mpeg4 there yet */
1169 if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO){
1170 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1171 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1172 }else if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
1173 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1174 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1176 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1177 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1180 if(s->dct_error_sum){
1181 assert(s->avctx->noise_reduction && s->encoding);
1183 update_noise_reduction(s);
1186 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1187 return ff_xvmc_field_start(s, avctx);
1192 /* generic function for encode/decode called after a frame has been coded/decoded */
1193 void MPV_frame_end(MpegEncContext *s)
1196 /* redraw edges for the frame if decoding didn't complete */
1197 //just to make sure that all data is rendered.
1198 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
1199 ff_xvmc_field_end(s);
1200 }else if((s->error_count || s->encoding)
1201 && !s->avctx->hwaccel
1202 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
1203 && s->unrestricted_mv
1204 && s->current_picture.f.reference
1206 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
1207 int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
1208 int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
1209 s->dsp.draw_edges(s->current_picture.f.data[0], s->linesize,
1210 s->h_edge_pos , s->v_edge_pos,
1211 EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
1212 s->dsp.draw_edges(s->current_picture.f.data[1], s->uvlinesize,
1213 s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
1214 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
1215 s->dsp.draw_edges(s->current_picture.f.data[2], s->uvlinesize,
1216 s->h_edge_pos>>hshift, s->v_edge_pos>>vshift,
1217 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, EDGE_TOP | EDGE_BOTTOM);
1222 s->last_pict_type = s->pict_type;
1223 s->last_lambda_for[s->pict_type] = s->current_picture_ptr->f.quality;
1224 if(s->pict_type!=AV_PICTURE_TYPE_B){
1225 s->last_non_b_pict_type= s->pict_type;
1228 /* copy back current_picture variables */
1229 for(i=0; i<MAX_PICTURE_COUNT; i++){
1230 if(s->picture[i].f.data[0] == s->current_picture.f.data[0]){
1231 s->picture[i]= s->current_picture;
1235 assert(i<MAX_PICTURE_COUNT);
1239 /* release non-reference frames */
1240 for(i=0; i<s->picture_count; i++){
1241 if (s->picture[i].f.data[0] && !s->picture[i].f.reference /*&& s->picture[i].type != FF_BUFFER_TYPE_SHARED*/) {
1242 free_frame_buffer(s, &s->picture[i]);
1246 // clear copies, to avoid confusion
1248 memset(&s->last_picture, 0, sizeof(Picture));
1249 memset(&s->next_picture, 0, sizeof(Picture));
1250 memset(&s->current_picture, 0, sizeof(Picture));
1252 s->avctx->coded_frame= (AVFrame*)s->current_picture_ptr;
1254 if (s->codec_id != CODEC_ID_H264 && s->current_picture.f.reference) {
1255 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_height-1, 0);
1260 * draws an line from (ex, ey) -> (sx, sy).
1261 * @param w width of the image
1262 * @param h height of the image
1263 * @param stride stride/linesize of the image
1264 * @param color color of the arrow
1266 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1269 sx= av_clip(sx, 0, w-1);
1270 sy= av_clip(sy, 0, h-1);
1271 ex= av_clip(ex, 0, w-1);
1272 ey= av_clip(ey, 0, h-1);
1274 buf[sy*stride + sx]+= color;
1276 if(FFABS(ex - sx) > FFABS(ey - sy)){
1278 FFSWAP(int, sx, ex);
1279 FFSWAP(int, sy, ey);
1281 buf+= sx + sy*stride;
1283 f= ((ey-sy)<<16)/ex;
1284 for(x= 0; x <= ex; x++){
1287 buf[ y *stride + x]+= (color*(0x10000-fr))>>16;
1288 buf[(y+1)*stride + x]+= (color* fr )>>16;
1292 FFSWAP(int, sx, ex);
1293 FFSWAP(int, sy, ey);
1295 buf+= sx + sy*stride;
1297 if(ey) f= ((ex-sx)<<16)/ey;
1299 for(y= 0; y <= ey; y++){
1302 buf[y*stride + x ]+= (color*(0x10000-fr))>>16;
1303 buf[y*stride + x+1]+= (color* fr )>>16;
1309 * draws an arrow from (ex, ey) -> (sx, sy).
1310 * @param w width of the image
1311 * @param h height of the image
1312 * @param stride stride/linesize of the image
1313 * @param color color of the arrow
1315 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
1318 sx= av_clip(sx, -100, w+100);
1319 sy= av_clip(sy, -100, h+100);
1320 ex= av_clip(ex, -100, w+100);
1321 ey= av_clip(ey, -100, h+100);
1326 if(dx*dx + dy*dy > 3*3){
1329 int length= ff_sqrt((rx*rx + ry*ry)<<8);
1331 //FIXME subpixel accuracy
1332 rx= ROUNDED_DIV(rx*3<<4, length);
1333 ry= ROUNDED_DIV(ry*3<<4, length);
1335 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1336 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1338 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1342 * prints debuging info for the given picture.
1344 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
1346 if(s->avctx->hwaccel || !pict || !pict->mb_type) return;
1348 if(s->avctx->debug&(FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)){
1351 av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
1352 switch (pict->pict_type) {
1353 case AV_PICTURE_TYPE_I: av_log(s->avctx,AV_LOG_DEBUG,"I\n"); break;
1354 case AV_PICTURE_TYPE_P: av_log(s->avctx,AV_LOG_DEBUG,"P\n"); break;
1355 case AV_PICTURE_TYPE_B: av_log(s->avctx,AV_LOG_DEBUG,"B\n"); break;
1356 case AV_PICTURE_TYPE_S: av_log(s->avctx,AV_LOG_DEBUG,"S\n"); break;
1357 case AV_PICTURE_TYPE_SI: av_log(s->avctx,AV_LOG_DEBUG,"SI\n"); break;
1358 case AV_PICTURE_TYPE_SP: av_log(s->avctx,AV_LOG_DEBUG,"SP\n"); break;
1360 for(y=0; y<s->mb_height; y++){
1361 for(x=0; x<s->mb_width; x++){
1362 if(s->avctx->debug&FF_DEBUG_SKIP){
1363 int count= s->mbskip_table[x + y*s->mb_stride];
1364 if(count>9) count=9;
1365 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1367 if(s->avctx->debug&FF_DEBUG_QP){
1368 av_log(s->avctx, AV_LOG_DEBUG, "%2d", pict->qscale_table[x + y*s->mb_stride]);
1370 if(s->avctx->debug&FF_DEBUG_MB_TYPE){
1371 int mb_type= pict->mb_type[x + y*s->mb_stride];
1372 //Type & MV direction
1374 av_log(s->avctx, AV_LOG_DEBUG, "P");
1375 else if(IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1376 av_log(s->avctx, AV_LOG_DEBUG, "A");
1377 else if(IS_INTRA4x4(mb_type))
1378 av_log(s->avctx, AV_LOG_DEBUG, "i");
1379 else if(IS_INTRA16x16(mb_type))
1380 av_log(s->avctx, AV_LOG_DEBUG, "I");
1381 else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1382 av_log(s->avctx, AV_LOG_DEBUG, "d");
1383 else if(IS_DIRECT(mb_type))
1384 av_log(s->avctx, AV_LOG_DEBUG, "D");
1385 else if(IS_GMC(mb_type) && IS_SKIP(mb_type))
1386 av_log(s->avctx, AV_LOG_DEBUG, "g");
1387 else if(IS_GMC(mb_type))
1388 av_log(s->avctx, AV_LOG_DEBUG, "G");
1389 else if(IS_SKIP(mb_type))
1390 av_log(s->avctx, AV_LOG_DEBUG, "S");
1391 else if(!USES_LIST(mb_type, 1))
1392 av_log(s->avctx, AV_LOG_DEBUG, ">");
1393 else if(!USES_LIST(mb_type, 0))
1394 av_log(s->avctx, AV_LOG_DEBUG, "<");
1396 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1397 av_log(s->avctx, AV_LOG_DEBUG, "X");
1402 av_log(s->avctx, AV_LOG_DEBUG, "+");
1403 else if(IS_16X8(mb_type))
1404 av_log(s->avctx, AV_LOG_DEBUG, "-");
1405 else if(IS_8X16(mb_type))
1406 av_log(s->avctx, AV_LOG_DEBUG, "|");
1407 else if(IS_INTRA(mb_type) || IS_16X16(mb_type))
1408 av_log(s->avctx, AV_LOG_DEBUG, " ");
1410 av_log(s->avctx, AV_LOG_DEBUG, "?");
1413 if(IS_INTERLACED(mb_type))
1414 av_log(s->avctx, AV_LOG_DEBUG, "=");
1416 av_log(s->avctx, AV_LOG_DEBUG, " ");
1418 // av_log(s->avctx, AV_LOG_DEBUG, " ");
1420 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1424 if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){
1425 const int shift= 1 + s->quarter_sample;
1429 int h_chroma_shift, v_chroma_shift, block_height;
1430 const int width = s->avctx->width;
1431 const int height= s->avctx->height;
1432 const int mv_sample_log2= 4 - pict->motion_subsample_log2;
1433 const int mv_stride= (s->mb_width << mv_sample_log2) + (s->codec_id == CODEC_ID_H264 ? 0 : 1);
1434 s->low_delay=0; //needed to see the vectors without trashing the buffers
1436 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1438 memcpy(s->visualization_buffer[i], pict->data[i], (i==0) ? pict->linesize[i]*height:pict->linesize[i]*height >> v_chroma_shift);
1439 pict->data[i]= s->visualization_buffer[i];
1441 pict->type= FF_BUFFER_TYPE_COPY;
1443 block_height = 16>>v_chroma_shift;
1445 for(mb_y=0; mb_y<s->mb_height; mb_y++){
1447 for(mb_x=0; mb_x<s->mb_width; mb_x++){
1448 const int mb_index= mb_x + mb_y*s->mb_stride;
1449 if((s->avctx->debug_mv) && pict->motion_val){
1451 for(type=0; type<3; type++){
1454 case 0: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_P_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_P))
1458 case 1: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_FOR)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1462 case 2: if ((!(s->avctx->debug_mv&FF_DEBUG_VIS_MV_B_BACK)) || (pict->pict_type!=AV_PICTURE_TYPE_B))
1467 if(!USES_LIST(pict->mb_type[mb_index], direction))
1470 if(IS_8X8(pict->mb_type[mb_index])){
1473 int sx= mb_x*16 + 4 + 8*(i&1);
1474 int sy= mb_y*16 + 4 + 8*(i>>1);
1475 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1476 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1477 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1478 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1480 }else if(IS_16X8(pict->mb_type[mb_index])){
1484 int sy=mb_y*16 + 4 + 8*i;
1485 int xy= (mb_x*2 + (mb_y*2 + i)*mv_stride) << (mv_sample_log2-1);
1486 int mx=(pict->motion_val[direction][xy][0]>>shift);
1487 int my=(pict->motion_val[direction][xy][1]>>shift);
1489 if(IS_INTERLACED(pict->mb_type[mb_index]))
1492 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1494 }else if(IS_8X16(pict->mb_type[mb_index])){
1497 int sx=mb_x*16 + 4 + 8*i;
1499 int xy= (mb_x*2 + i + mb_y*2*mv_stride) << (mv_sample_log2-1);
1500 int mx=(pict->motion_val[direction][xy][0]>>shift);
1501 int my=(pict->motion_val[direction][xy][1]>>shift);
1503 if(IS_INTERLACED(pict->mb_type[mb_index]))
1506 draw_arrow(ptr, sx, sy, mx+sx, my+sy, width, height, s->linesize, 100);
1509 int sx= mb_x*16 + 8;
1510 int sy= mb_y*16 + 8;
1511 int xy= (mb_x + mb_y*mv_stride) << mv_sample_log2;
1512 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1513 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1514 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1518 if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){
1519 uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL;
1521 for(y=0; y<block_height; y++){
1522 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c;
1523 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c;
1526 if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){
1527 int mb_type= pict->mb_type[mb_index];
1530 #define COLOR(theta, r)\
1531 u= (int)(128 + r*cos(theta*3.141592/180));\
1532 v= (int)(128 + r*sin(theta*3.141592/180));
1536 if(IS_PCM(mb_type)){
1538 }else if((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) || IS_INTRA16x16(mb_type)){
1540 }else if(IS_INTRA4x4(mb_type)){
1542 }else if(IS_DIRECT(mb_type) && IS_SKIP(mb_type)){
1544 }else if(IS_DIRECT(mb_type)){
1546 }else if(IS_GMC(mb_type) && IS_SKIP(mb_type)){
1548 }else if(IS_GMC(mb_type)){
1550 }else if(IS_SKIP(mb_type)){
1552 }else if(!USES_LIST(mb_type, 1)){
1554 }else if(!USES_LIST(mb_type, 0)){
1557 assert(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1561 u*= 0x0101010101010101ULL;
1562 v*= 0x0101010101010101ULL;
1563 for(y=0; y<block_height; y++){
1564 *(uint64_t*)(pict->data[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u;
1565 *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v;
1569 if(IS_8X8(mb_type) || IS_16X8(mb_type)){
1570 *(uint64_t*)(pict->data[0] + 16*mb_x + 0 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1571 *(uint64_t*)(pict->data[0] + 16*mb_x + 8 + (16*mb_y + 8)*pict->linesize[0])^= 0x8080808080808080ULL;
1573 if(IS_8X8(mb_type) || IS_8X16(mb_type)){
1575 pict->data[0][16*mb_x + 8 + (16*mb_y + y)*pict->linesize[0]]^= 0x80;
1577 if(IS_8X8(mb_type) && mv_sample_log2 >= 2){
1578 int dm= 1 << (mv_sample_log2-2);
1580 int sx= mb_x*16 + 8*(i&1);
1581 int sy= mb_y*16 + 8*(i>>1);
1582 int xy= (mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*mv_stride) << (mv_sample_log2-1);
1584 int32_t *mv = (int32_t*)&pict->motion_val[0][xy];
1585 if(mv[0] != mv[dm] || mv[dm*mv_stride] != mv[dm*(mv_stride+1)])
1587 pict->data[0][sx + 4 + (sy + y)*pict->linesize[0]]^= 0x80;
1588 if(mv[0] != mv[dm*mv_stride] || mv[dm] != mv[dm*(mv_stride+1)])
1589 *(uint64_t*)(pict->data[0] + sx + (sy + 4)*pict->linesize[0])^= 0x8080808080808080ULL;
1593 if(IS_INTERLACED(mb_type) && s->codec_id == CODEC_ID_H264){
1597 s->mbskip_table[mb_index]=0;
1603 static inline int hpel_motion_lowres(MpegEncContext *s,
1604 uint8_t *dest, uint8_t *src,
1605 int field_based, int field_select,
1606 int src_x, int src_y,
1607 int width, int height, int stride,
1608 int h_edge_pos, int v_edge_pos,
1609 int w, int h, h264_chroma_mc_func *pix_op,
1610 int motion_x, int motion_y)
1612 const int lowres= s->avctx->lowres;
1613 const int op_index= FFMIN(lowres, 2);
1614 const int s_mask= (2<<lowres)-1;
1618 if(s->quarter_sample){
1623 sx= motion_x & s_mask;
1624 sy= motion_y & s_mask;
1625 src_x += motion_x >> (lowres+1);
1626 src_y += motion_y >> (lowres+1);
1628 src += src_y * stride + src_x;
1630 if( (unsigned)src_x > h_edge_pos - (!!sx) - w
1631 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1632 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
1633 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1634 src= s->edge_emu_buffer;
1638 sx= (sx << 2) >> lowres;
1639 sy= (sy << 2) >> lowres;
1642 pix_op[op_index](dest, src, stride, h, sx, sy);
1646 /* apply one mpeg motion vector to the three components */
1647 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
1648 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1649 int field_based, int bottom_field, int field_select,
1650 uint8_t **ref_picture, h264_chroma_mc_func *pix_op,
1651 int motion_x, int motion_y, int h, int mb_y)
1653 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
1654 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy, uvsx, uvsy;
1655 const int lowres= s->avctx->lowres;
1656 const int op_index= FFMIN(lowres, 2);
1657 const int block_s= 8>>lowres;
1658 const int s_mask= (2<<lowres)-1;
1659 const int h_edge_pos = s->h_edge_pos >> lowres;
1660 const int v_edge_pos = s->v_edge_pos >> lowres;
1661 linesize = s->current_picture.f.linesize[0] << field_based;
1662 uvlinesize = s->current_picture.f.linesize[1] << field_based;
1664 if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway
1670 motion_y += (bottom_field - field_select)*((1<<lowres)-1);
1673 sx= motion_x & s_mask;
1674 sy= motion_y & s_mask;
1675 src_x = s->mb_x*2*block_s + (motion_x >> (lowres+1));
1676 src_y =( mb_y*2*block_s>>field_based) + (motion_y >> (lowres+1));
1678 if (s->out_format == FMT_H263) {
1679 uvsx = ((motion_x>>1) & s_mask) | (sx&1);
1680 uvsy = ((motion_y>>1) & s_mask) | (sy&1);
1683 }else if(s->out_format == FMT_H261){//even chroma mv's are full pel in H261
1686 uvsx = (2*mx) & s_mask;
1687 uvsy = (2*my) & s_mask;
1688 uvsrc_x = s->mb_x*block_s + (mx >> lowres);
1689 uvsrc_y = mb_y*block_s + (my >> lowres);
1695 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
1696 uvsrc_y =( mb_y*block_s>>field_based) + (my >> (lowres+1));
1699 ptr_y = ref_picture[0] + src_y * linesize + src_x;
1700 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
1701 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
1703 if( (unsigned)src_x > h_edge_pos - (!!sx) - 2*block_s
1704 || (unsigned)src_y >(v_edge_pos >> field_based) - (!!sy) - h){
1705 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize, 17, 17+field_based,
1706 src_x, src_y<<field_based, h_edge_pos, v_edge_pos);
1707 ptr_y = s->edge_emu_buffer;
1708 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1709 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
1710 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9, 9+field_based,
1711 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1712 s->dsp.emulated_edge_mc(uvbuf+16, ptr_cr, s->uvlinesize, 9, 9+field_based,
1713 uvsrc_x, uvsrc_y<<field_based, h_edge_pos>>1, v_edge_pos>>1);
1719 if(bottom_field){ //FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
1720 dest_y += s->linesize;
1721 dest_cb+= s->uvlinesize;
1722 dest_cr+= s->uvlinesize;
1726 ptr_y += s->linesize;
1727 ptr_cb+= s->uvlinesize;
1728 ptr_cr+= s->uvlinesize;
1731 sx= (sx << 2) >> lowres;
1732 sy= (sy << 2) >> lowres;
1733 pix_op[lowres-1](dest_y, ptr_y, linesize, h, sx, sy);
1735 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
1736 uvsx= (uvsx << 2) >> lowres;
1737 uvsy= (uvsy << 2) >> lowres;
1738 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1739 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
1741 //FIXME h261 lowres loop filter
1744 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
1745 uint8_t *dest_cb, uint8_t *dest_cr,
1746 uint8_t **ref_picture,
1747 h264_chroma_mc_func *pix_op,
1749 const int lowres= s->avctx->lowres;
1750 const int op_index= FFMIN(lowres, 2);
1751 const int block_s= 8>>lowres;
1752 const int s_mask= (2<<lowres)-1;
1753 const int h_edge_pos = s->h_edge_pos >> (lowres+1);
1754 const int v_edge_pos = s->v_edge_pos >> (lowres+1);
1755 int emu=0, src_x, src_y, offset, sx, sy;
1758 if(s->quarter_sample){
1763 /* In case of 8X8, we construct a single chroma motion vector
1764 with a special rounding */
1765 mx= ff_h263_round_chroma(mx);
1766 my= ff_h263_round_chroma(my);
1770 src_x = s->mb_x*block_s + (mx >> (lowres+1));
1771 src_y = s->mb_y*block_s + (my >> (lowres+1));
1773 offset = src_y * s->uvlinesize + src_x;
1774 ptr = ref_picture[1] + offset;
1775 if(s->flags&CODEC_FLAG_EMU_EDGE){
1776 if( (unsigned)src_x > h_edge_pos - (!!sx) - block_s
1777 || (unsigned)src_y > v_edge_pos - (!!sy) - block_s){
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;
1783 sx= (sx << 2) >> lowres;
1784 sy= (sy << 2) >> lowres;
1785 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
1787 ptr = ref_picture[2] + offset;
1789 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
1790 ptr= s->edge_emu_buffer;
1792 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
1796 * motion compensation of a single macroblock
1798 * @param dest_y luma destination pointer
1799 * @param dest_cb chroma cb/u destination pointer
1800 * @param dest_cr chroma cr/v destination pointer
1801 * @param dir direction (0->forward, 1->backward)
1802 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
1803 * @param pix_op halfpel motion compensation function (average or put normally)
1804 * the motion vectors are taken from s->mv and the MV type from s->mv_type
1806 static inline void MPV_motion_lowres(MpegEncContext *s,
1807 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1808 int dir, uint8_t **ref_picture,
1809 h264_chroma_mc_func *pix_op)
1813 const int lowres= s->avctx->lowres;
1814 const int block_s= 8>>lowres;
1819 switch(s->mv_type) {
1821 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1823 ref_picture, pix_op,
1824 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y);
1830 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) * s->linesize)*block_s,
1831 ref_picture[0], 0, 0,
1832 (2*mb_x + (i & 1))*block_s, (2*mb_y + (i >>1))*block_s,
1833 s->width, s->height, s->linesize,
1834 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
1835 block_s, block_s, pix_op,
1836 s->mv[dir][i][0], s->mv[dir][i][1]);
1838 mx += s->mv[dir][i][0];
1839 my += s->mv[dir][i][1];
1842 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY))
1843 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture, pix_op, mx, my);
1846 if (s->picture_structure == PICT_FRAME) {
1848 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1849 1, 0, s->field_select[dir][0],
1850 ref_picture, pix_op,
1851 s->mv[dir][0][0], s->mv[dir][0][1], block_s, mb_y);
1853 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1854 1, 1, s->field_select[dir][1],
1855 ref_picture, pix_op,
1856 s->mv[dir][1][0], s->mv[dir][1][1], block_s, mb_y);
1858 if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){
1859 ref_picture = s->current_picture_ptr->f.data;
1862 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1863 0, 0, s->field_select[dir][0],
1864 ref_picture, pix_op,
1865 s->mv[dir][0][0], s->mv[dir][0][1], 2*block_s, mb_y>>1);
1870 uint8_t ** ref2picture;
1872 if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == AV_PICTURE_TYPE_B || s->first_field){
1873 ref2picture= ref_picture;
1875 ref2picture = s->current_picture_ptr->f.data;
1878 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1879 0, 0, s->field_select[dir][i],
1880 ref2picture, pix_op,
1881 s->mv[dir][i][0], s->mv[dir][i][1] + 2*block_s*i, block_s, mb_y>>1);
1883 dest_y += 2*block_s*s->linesize;
1884 dest_cb+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1885 dest_cr+= (2*block_s>>s->chroma_y_shift)*s->uvlinesize;
1889 if(s->picture_structure == PICT_FRAME){
1893 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1895 ref_picture, pix_op,
1896 s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], block_s, mb_y);
1898 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1902 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
1903 0, 0, s->picture_structure != i+1,
1904 ref_picture, pix_op,
1905 s->mv[dir][2*i][0],s->mv[dir][2*i][1],2*block_s, mb_y>>1);
1907 // after put we make avg of the same block
1908 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
1910 //opposite parity is always in the same frame if this is second field
1911 if(!s->first_field){
1912 ref_picture = s->current_picture_ptr->f.data;
1922 * find the lowest MB row referenced in the MVs
1924 int MPV_lowest_referenced_row(MpegEncContext *s, int dir)
1926 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
1927 int my, off, i, mvs;
1929 if (s->picture_structure != PICT_FRAME) goto unhandled;
1931 switch (s->mv_type) {
1945 for (i = 0; i < mvs; i++) {
1946 my = s->mv[dir][i][1]<<qpel_shift;
1947 my_max = FFMAX(my_max, my);
1948 my_min = FFMIN(my_min, my);
1951 off = (FFMAX(-my_min, my_max) + 63) >> 6;
1953 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
1955 return s->mb_height-1;
1958 /* put block[] to dest[] */
1959 static inline void put_dct(MpegEncContext *s,
1960 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1962 s->dct_unquantize_intra(s, block, i, qscale);
1963 s->dsp.idct_put (dest, line_size, block);
1966 /* add block[] to dest[] */
1967 static inline void add_dct(MpegEncContext *s,
1968 DCTELEM *block, int i, uint8_t *dest, int line_size)
1970 if (s->block_last_index[i] >= 0) {
1971 s->dsp.idct_add (dest, line_size, block);
1975 static inline void add_dequant_dct(MpegEncContext *s,
1976 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
1978 if (s->block_last_index[i] >= 0) {
1979 s->dct_unquantize_inter(s, block, i, qscale);
1981 s->dsp.idct_add (dest, line_size, block);
1986 * cleans dc, ac, coded_block for the current non intra MB
1988 void ff_clean_intra_table_entries(MpegEncContext *s)
1990 int wrap = s->b8_stride;
1991 int xy = s->block_index[0];
1994 s->dc_val[0][xy + 1 ] =
1995 s->dc_val[0][xy + wrap] =
1996 s->dc_val[0][xy + 1 + wrap] = 1024;
1998 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
1999 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2000 if (s->msmpeg4_version>=3) {
2001 s->coded_block[xy ] =
2002 s->coded_block[xy + 1 ] =
2003 s->coded_block[xy + wrap] =
2004 s->coded_block[xy + 1 + wrap] = 0;
2007 wrap = s->mb_stride;
2008 xy = s->mb_x + s->mb_y * wrap;
2010 s->dc_val[2][xy] = 1024;
2012 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2013 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2015 s->mbintra_table[xy]= 0;
2018 /* generic function called after a macroblock has been parsed by the
2019 decoder or after it has been encoded by the encoder.
2021 Important variables used:
2022 s->mb_intra : true if intra macroblock
2023 s->mv_dir : motion vector direction
2024 s->mv_type : motion vector type
2025 s->mv : motion vector
2026 s->interlaced_dct : true if interlaced dct used (mpeg2)
2028 static av_always_inline
2029 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2030 int lowres_flag, int is_mpeg12)
2032 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2033 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2034 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2038 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2039 /* save DCT coefficients */
2041 DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2042 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2044 for(j=0; j<64; j++){
2045 *dct++ = block[i][s->dsp.idct_permutation[j]];
2046 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2048 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2052 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2054 /* update DC predictors for P macroblocks */
2056 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2057 if(s->mbintra_table[mb_xy])
2058 ff_clean_intra_table_entries(s);
2062 s->last_dc[2] = 128 << s->intra_dc_precision;
2065 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2066 s->mbintra_table[mb_xy]=1;
2068 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
2069 uint8_t *dest_y, *dest_cb, *dest_cr;
2070 int dct_linesize, dct_offset;
2071 op_pixels_func (*op_pix)[4];
2072 qpel_mc_func (*op_qpix)[16];
2073 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2074 const int uvlinesize = s->current_picture.f.linesize[1];
2075 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2076 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2078 /* avoid copy if macroblock skipped in last frame too */
2079 /* skip only during decoding as we might trash the buffers during encoding a bit */
2081 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2082 const int age = s->current_picture.f.age;
2086 if (s->mb_skipped) {
2088 assert(s->pict_type!=AV_PICTURE_TYPE_I);
2090 (*mbskip_ptr) ++; /* indicate that this time we skipped it */
2091 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2093 /* if previous was skipped too, then nothing to do ! */
2094 if (*mbskip_ptr >= age && s->current_picture.f.reference){
2097 } else if(!s->current_picture.f.reference) {
2098 (*mbskip_ptr) ++; /* increase counter so the age can be compared cleanly */
2099 if(*mbskip_ptr >99) *mbskip_ptr= 99;
2101 *mbskip_ptr = 0; /* not skipped */
2105 dct_linesize = linesize << s->interlaced_dct;
2106 dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
2110 dest_cb= s->dest[1];
2111 dest_cr= s->dest[2];
2113 dest_y = s->b_scratchpad;
2114 dest_cb= s->b_scratchpad+16*linesize;
2115 dest_cr= s->b_scratchpad+32*linesize;
2119 /* motion handling */
2120 /* decoding or more than one mb_type (MC was already done otherwise) */
2123 if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2124 if (s->mv_dir & MV_DIR_FORWARD) {
2125 ff_thread_await_progress((AVFrame*)s->last_picture_ptr, MPV_lowest_referenced_row(s, 0), 0);
2127 if (s->mv_dir & MV_DIR_BACKWARD) {
2128 ff_thread_await_progress((AVFrame*)s->next_picture_ptr, MPV_lowest_referenced_row(s, 1), 0);
2133 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2135 if (s->mv_dir & MV_DIR_FORWARD) {
2136 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2137 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2139 if (s->mv_dir & MV_DIR_BACKWARD) {
2140 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2143 op_qpix= s->me.qpel_put;
2144 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2145 op_pix = s->dsp.put_pixels_tab;
2147 op_pix = s->dsp.put_no_rnd_pixels_tab;
2149 if (s->mv_dir & MV_DIR_FORWARD) {
2150 MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2151 op_pix = s->dsp.avg_pixels_tab;
2152 op_qpix= s->me.qpel_avg;
2154 if (s->mv_dir & MV_DIR_BACKWARD) {
2155 MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2160 /* skip dequant / idct if we are really late ;) */
2161 if(s->avctx->skip_idct){
2162 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2163 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2164 || s->avctx->skip_idct >= AVDISCARD_ALL)
2168 /* add dct residue */
2169 if(s->encoding || !( s->msmpeg4_version || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO
2170 || (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){
2171 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2172 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2173 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2174 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2176 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2177 if (s->chroma_y_shift){
2178 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2179 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2183 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2184 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2185 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2186 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2189 } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){
2190 add_dct(s, block[0], 0, dest_y , dct_linesize);
2191 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2192 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2193 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2195 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2196 if(s->chroma_y_shift){//Chroma420
2197 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2198 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2201 dct_linesize = uvlinesize << s->interlaced_dct;
2202 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2204 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2205 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2206 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2207 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2208 if(!s->chroma_x_shift){//Chroma444
2209 add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
2210 add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
2211 add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
2212 add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
2217 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2218 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2221 /* dct only in intra block */
2222 if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){
2223 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2224 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2225 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2226 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2228 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2229 if(s->chroma_y_shift){
2230 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2231 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2235 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2236 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2237 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2238 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2242 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2243 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2244 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2245 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2247 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2248 if(s->chroma_y_shift){
2249 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2250 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2253 dct_linesize = uvlinesize << s->interlaced_dct;
2254 dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*8;
2256 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2257 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2258 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2259 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2260 if(!s->chroma_x_shift){//Chroma444
2261 s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]);
2262 s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]);
2263 s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
2264 s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
2272 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2273 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2274 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2279 void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2281 if(s->out_format == FMT_MPEG1) {
2282 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2283 else MPV_decode_mb_internal(s, block, 0, 1);
2286 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2287 else MPV_decode_mb_internal(s, block, 0, 0);
2292 * @param h is the normal height, this will be reduced automatically if needed for the last row
2294 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2295 const int field_pic= s->picture_structure != PICT_FRAME;
2301 if (!s->avctx->hwaccel
2302 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2303 && s->unrestricted_mv
2304 && s->current_picture.f.reference
2306 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2307 int sides = 0, edge_h;
2308 int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
2309 int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
2310 if (y==0) sides |= EDGE_TOP;
2311 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2313 edge_h= FFMIN(h, s->v_edge_pos - y);
2315 s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2316 s->linesize, s->h_edge_pos, edge_h,
2317 EDGE_WIDTH, EDGE_WIDTH, sides);
2318 s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2319 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2320 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2321 s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2322 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2323 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2326 h= FFMIN(h, s->avctx->height - y);
2328 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2330 if (s->avctx->draw_horiz_band) {
2332 int offset[AV_NUM_DATA_POINTERS];
2335 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2336 src= (AVFrame*)s->current_picture_ptr;
2337 else if(s->last_picture_ptr)
2338 src= (AVFrame*)s->last_picture_ptr;
2342 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2343 for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2346 offset[0]= y * s->linesize;
2348 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2349 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2355 s->avctx->draw_horiz_band(s->avctx, src, offset,
2356 y, s->picture_structure, h);
2360 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2361 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2362 const int uvlinesize = s->current_picture.f.linesize[1];
2363 const int mb_size= 4 - s->avctx->lowres;
2365 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2366 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2367 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2368 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2369 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2370 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;
2371 //block_index is not used by mpeg2, so it is not affected by chroma_format
2373 s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2374 s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2375 s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2377 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2379 if(s->picture_structure==PICT_FRAME){
2380 s->dest[0] += s->mb_y * linesize << mb_size;
2381 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2382 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2384 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2385 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2386 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2387 assert((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2392 void ff_mpeg_flush(AVCodecContext *avctx){
2394 MpegEncContext *s = avctx->priv_data;
2396 if(s==NULL || s->picture==NULL)
2399 for(i=0; i<s->picture_count; i++){
2400 if (s->picture[i].f.data[0] &&
2401 (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2402 s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2403 free_frame_buffer(s, &s->picture[i]);
2405 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2407 s->mb_x= s->mb_y= 0;
2409 s->parse_context.state= -1;
2410 s->parse_context.frame_start_found= 0;
2411 s->parse_context.overread= 0;
2412 s->parse_context.overread_index= 0;
2413 s->parse_context.index= 0;
2414 s->parse_context.last_index= 0;
2415 s->bitstream_buffer_size=0;
2419 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2420 DCTELEM *block, int n, int qscale)
2422 int i, level, nCoeffs;
2423 const uint16_t *quant_matrix;
2425 nCoeffs= s->block_last_index[n];
2428 block[0] = block[0] * s->y_dc_scale;
2430 block[0] = block[0] * s->c_dc_scale;
2431 /* XXX: only mpeg1 */
2432 quant_matrix = s->intra_matrix;
2433 for(i=1;i<=nCoeffs;i++) {
2434 int j= s->intra_scantable.permutated[i];
2439 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2440 level = (level - 1) | 1;
2443 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2444 level = (level - 1) | 1;
2451 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2452 DCTELEM *block, int n, int qscale)
2454 int i, level, nCoeffs;
2455 const uint16_t *quant_matrix;
2457 nCoeffs= s->block_last_index[n];
2459 quant_matrix = s->inter_matrix;
2460 for(i=0; i<=nCoeffs; i++) {
2461 int j= s->intra_scantable.permutated[i];
2466 level = (((level << 1) + 1) * qscale *
2467 ((int) (quant_matrix[j]))) >> 4;
2468 level = (level - 1) | 1;
2471 level = (((level << 1) + 1) * qscale *
2472 ((int) (quant_matrix[j]))) >> 4;
2473 level = (level - 1) | 1;
2480 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2481 DCTELEM *block, int n, int qscale)
2483 int i, level, nCoeffs;
2484 const uint16_t *quant_matrix;
2486 if(s->alternate_scan) nCoeffs= 63;
2487 else nCoeffs= s->block_last_index[n];
2490 block[0] = block[0] * s->y_dc_scale;
2492 block[0] = block[0] * s->c_dc_scale;
2493 quant_matrix = s->intra_matrix;
2494 for(i=1;i<=nCoeffs;i++) {
2495 int j= s->intra_scantable.permutated[i];
2500 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2503 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2510 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2511 DCTELEM *block, int n, int qscale)
2513 int i, level, nCoeffs;
2514 const uint16_t *quant_matrix;
2517 if(s->alternate_scan) nCoeffs= 63;
2518 else nCoeffs= s->block_last_index[n];
2521 block[0] = block[0] * s->y_dc_scale;
2523 block[0] = block[0] * s->c_dc_scale;
2524 quant_matrix = s->intra_matrix;
2525 for(i=1;i<=nCoeffs;i++) {
2526 int j= s->intra_scantable.permutated[i];
2531 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2534 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2543 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2544 DCTELEM *block, int n, int qscale)
2546 int i, level, nCoeffs;
2547 const uint16_t *quant_matrix;
2550 if(s->alternate_scan) nCoeffs= 63;
2551 else nCoeffs= s->block_last_index[n];
2553 quant_matrix = s->inter_matrix;
2554 for(i=0; i<=nCoeffs; i++) {
2555 int j= s->intra_scantable.permutated[i];
2560 level = (((level << 1) + 1) * qscale *
2561 ((int) (quant_matrix[j]))) >> 4;
2564 level = (((level << 1) + 1) * qscale *
2565 ((int) (quant_matrix[j]))) >> 4;
2574 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2575 DCTELEM *block, int n, int qscale)
2577 int i, level, qmul, qadd;
2580 assert(s->block_last_index[n]>=0);
2586 block[0] = block[0] * s->y_dc_scale;
2588 block[0] = block[0] * s->c_dc_scale;
2589 qadd = (qscale - 1) | 1;
2596 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2598 for(i=1; i<=nCoeffs; i++) {
2602 level = level * qmul - qadd;
2604 level = level * qmul + qadd;
2611 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
2612 DCTELEM *block, int n, int qscale)
2614 int i, level, qmul, qadd;
2617 assert(s->block_last_index[n]>=0);
2619 qadd = (qscale - 1) | 1;
2622 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2624 for(i=0; i<=nCoeffs; i++) {
2628 level = level * qmul - qadd;
2630 level = level * qmul + qadd;
2638 * set qscale and update qscale dependent variables.
2640 void ff_set_qscale(MpegEncContext * s, int qscale)
2644 else if (qscale > 31)
2648 s->chroma_qscale= s->chroma_qscale_table[qscale];
2650 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
2651 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
2654 void MPV_report_decode_progress(MpegEncContext *s)
2656 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred)
2657 ff_thread_report_progress((AVFrame*)s->current_picture_ptr, s->mb_y, 0);