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/imgutils.h"
35 #include "mpegvideo.h"
38 #include "xvmc_internal.h"
45 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
46 DCTELEM *block, int n, int qscale);
47 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
48 DCTELEM *block, int n, int qscale);
49 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
50 DCTELEM *block, int n, int qscale);
51 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
52 DCTELEM *block, int n, int qscale);
53 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
54 DCTELEM *block, int n, int qscale);
55 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
56 DCTELEM *block, int n, int qscale);
57 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
58 DCTELEM *block, int n, int qscale);
64 static const uint8_t ff_default_chroma_qscale_table[32] = {
65 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
66 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
67 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
70 const uint8_t ff_mpeg1_dc_scale_table[128] = {
71 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
72 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
73 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
74 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
75 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
76 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,
78 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,
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
84 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,
86 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,
88 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
89 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
90 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
91 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
94 static const uint8_t mpeg2_dc_scale_table2[128] = {
95 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
96 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
97 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
98 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
99 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
100 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
101 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
102 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
103 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
106 static const uint8_t mpeg2_dc_scale_table3[128] = {
107 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
108 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
109 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
110 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
111 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
112 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
113 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
114 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
115 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
118 const uint8_t *const ff_mpeg2_dc_scale_table[4] = {
119 ff_mpeg1_dc_scale_table,
120 mpeg2_dc_scale_table1,
121 mpeg2_dc_scale_table2,
122 mpeg2_dc_scale_table3,
125 const enum AVPixelFormat ff_pixfmt_list_420[] = {
130 const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[] = {
131 AV_PIX_FMT_DXVA2_VLD,
132 AV_PIX_FMT_VAAPI_VLD,
138 const uint8_t *avpriv_mpv_find_start_code(const uint8_t *av_restrict p,
140 uint32_t *av_restrict state)
148 for (i = 0; i < 3; i++) {
149 uint32_t tmp = *state << 8;
150 *state = tmp + *(p++);
151 if (tmp == 0x100 || p == end)
156 if (p[-1] > 1 ) p += 3;
157 else if (p[-2] ) p += 2;
158 else if (p[-3]|(p[-1]-1)) p++;
165 p = FFMIN(p, end) - 4;
171 /* init common dct for both encoder and decoder */
172 av_cold int ff_dct_common_init(MpegEncContext *s)
174 ff_dsputil_init(&s->dsp, s->avctx);
175 ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample);
177 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
178 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
179 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
180 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
181 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
182 if (s->flags & CODEC_FLAG_BITEXACT)
183 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
184 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
187 ff_MPV_common_init_x86(s);
189 ff_MPV_common_init_axp(s);
191 ff_MPV_common_init_arm(s);
193 ff_MPV_common_init_altivec(s);
195 ff_MPV_common_init_bfin(s);
198 /* load & permutate scantables
199 * note: only wmv uses different ones
201 if (s->alternate_scan) {
202 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
203 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
205 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
206 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
208 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
209 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
214 void ff_copy_picture(Picture *dst, Picture *src)
217 dst->f.type = FF_BUFFER_TYPE_COPY;
221 * Release a frame buffer
223 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
225 /* WM Image / Screen codecs allocate internal buffers with different
226 * dimensions / colorspaces; ignore user-defined callbacks for these. */
227 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
228 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
229 s->codec_id != AV_CODEC_ID_MSS2)
230 ff_thread_release_buffer(s->avctx, &pic->f);
232 avcodec_default_release_buffer(s->avctx, &pic->f);
233 av_freep(&pic->f.hwaccel_picture_private);
236 int ff_mpv_frame_size_alloc(MpegEncContext *s, int linesize)
238 int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
240 // edge emu needs blocksize + filter length - 1
241 // (= 17x17 for halfpel / 21x21 for h264)
242 // VC1 computes luma and chroma simultaneously and needs 19X19 + 9x9
243 // at uvlinesize. It supports only YUV420 so 24x24 is enough
244 // linesize * interlaced * MBsize
245 FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size * 4 * 24,
248 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size * 4 * 16 * 2,
250 s->me.temp = s->me.scratchpad;
251 s->rd_scratchpad = s->me.scratchpad;
252 s->b_scratchpad = s->me.scratchpad;
253 s->obmc_scratchpad = s->me.scratchpad + 16;
257 av_freep(&s->edge_emu_buffer);
258 return AVERROR(ENOMEM);
262 * Allocate a frame buffer
264 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
268 if (s->avctx->hwaccel) {
269 assert(!pic->f.hwaccel_picture_private);
270 if (s->avctx->hwaccel->priv_data_size) {
271 pic->f.hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
272 if (!pic->f.hwaccel_picture_private) {
273 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
279 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
280 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
281 s->codec_id != AV_CODEC_ID_MSS2)
282 r = ff_thread_get_buffer(s->avctx, &pic->f);
284 r = avcodec_default_get_buffer(s->avctx, &pic->f);
286 if (r < 0 || !pic->f.type || !pic->f.data[0]) {
287 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n",
288 r, pic->f.type, pic->f.data[0]);
289 av_freep(&pic->f.hwaccel_picture_private);
293 if (s->linesize && (s->linesize != pic->f.linesize[0] ||
294 s->uvlinesize != pic->f.linesize[1])) {
295 av_log(s->avctx, AV_LOG_ERROR,
296 "get_buffer() failed (stride changed)\n");
297 free_frame_buffer(s, pic);
301 if (pic->f.linesize[1] != pic->f.linesize[2]) {
302 av_log(s->avctx, AV_LOG_ERROR,
303 "get_buffer() failed (uv stride mismatch)\n");
304 free_frame_buffer(s, pic);
308 if (!s->edge_emu_buffer &&
309 (ret = ff_mpv_frame_size_alloc(s, pic->f.linesize[0])) < 0) {
310 av_log(s->avctx, AV_LOG_ERROR,
311 "get_buffer() failed to allocate context scratch buffers.\n");
312 free_frame_buffer(s, pic);
320 * Allocate a Picture.
321 * The pixels are allocated/set by calling get_buffer() if shared = 0
323 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
325 const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
327 // the + 1 is needed so memset(,,stride*height) does not sig11
329 const int mb_array_size = s->mb_stride * s->mb_height;
330 const int b8_array_size = s->b8_stride * s->mb_height * 2;
331 const int b4_array_size = s->b4_stride * s->mb_height * 4;
336 assert(pic->f.data[0]);
337 assert(pic->f.type == 0 || pic->f.type == FF_BUFFER_TYPE_SHARED);
338 pic->f.type = FF_BUFFER_TYPE_SHARED;
340 assert(!pic->f.data[0]);
342 if (alloc_frame_buffer(s, pic) < 0)
345 s->linesize = pic->f.linesize[0];
346 s->uvlinesize = pic->f.linesize[1];
349 if (pic->f.qscale_table == NULL) {
351 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var,
352 mb_array_size * sizeof(int16_t), fail)
353 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var,
354 mb_array_size * sizeof(int16_t), fail)
355 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean,
356 mb_array_size * sizeof(int8_t ), fail)
359 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.mbskip_table,
360 mb_array_size * sizeof(uint8_t) + 2, fail)// the + 2 is for the slice end check
361 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table_base,
362 (big_mb_num + s->mb_stride) * sizeof(uint8_t),
364 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base,
365 (big_mb_num + s->mb_stride) * sizeof(uint32_t),
367 pic->f.mb_type = pic->mb_type_base + 2 * s->mb_stride + 1;
368 pic->f.qscale_table = pic->qscale_table_base + 2 * s->mb_stride + 1;
369 if (s->out_format == FMT_H264) {
370 for (i = 0; i < 2; i++) {
371 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
372 2 * (b4_array_size + 4) * sizeof(int16_t),
374 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
375 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
376 4 * mb_array_size * sizeof(uint8_t), fail)
378 pic->f.motion_subsample_log2 = 2;
379 } else if (s->out_format == FMT_H263 || s->encoding ||
380 (s->avctx->debug & FF_DEBUG_MV) || s->avctx->debug_mv) {
381 for (i = 0; i < 2; i++) {
382 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
383 2 * (b8_array_size + 4) * sizeof(int16_t),
385 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
386 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
387 4 * mb_array_size * sizeof(uint8_t), fail)
389 pic->f.motion_subsample_log2 = 3;
391 if (s->avctx->debug&FF_DEBUG_DCT_COEFF) {
392 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.dct_coeff,
393 64 * mb_array_size * sizeof(DCTELEM) * 6, fail)
395 pic->f.qstride = s->mb_stride;
396 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.pan_scan,
397 1 * sizeof(AVPanScan), fail)
403 fail: // for the FF_ALLOCZ_OR_GOTO macro
405 free_frame_buffer(s, pic);
410 * Deallocate a picture.
412 static void free_picture(MpegEncContext *s, Picture *pic)
416 if (pic->f.data[0] && pic->f.type != FF_BUFFER_TYPE_SHARED) {
417 free_frame_buffer(s, pic);
420 av_freep(&pic->mb_var);
421 av_freep(&pic->mc_mb_var);
422 av_freep(&pic->mb_mean);
423 av_freep(&pic->f.mbskip_table);
424 av_freep(&pic->qscale_table_base);
425 pic->f.qscale_table = NULL;
426 av_freep(&pic->mb_type_base);
427 pic->f.mb_type = NULL;
428 av_freep(&pic->f.dct_coeff);
429 av_freep(&pic->f.pan_scan);
430 pic->f.mb_type = NULL;
431 for (i = 0; i < 2; i++) {
432 av_freep(&pic->motion_val_base[i]);
433 av_freep(&pic->f.ref_index[i]);
434 pic->f.motion_val[i] = NULL;
437 if (pic->f.type == FF_BUFFER_TYPE_SHARED) {
438 for (i = 0; i < 4; i++) {
440 pic->f.data[i] = NULL;
446 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base)
448 int y_size = s->b8_stride * (2 * s->mb_height + 1);
449 int c_size = s->mb_stride * (s->mb_height + 1);
450 int yc_size = y_size + 2 * c_size;
458 s->obmc_scratchpad = NULL;
461 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map,
462 ME_MAP_SIZE * sizeof(uint32_t), fail)
463 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map,
464 ME_MAP_SIZE * sizeof(uint32_t), fail)
465 if (s->avctx->noise_reduction) {
466 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum,
467 2 * 64 * sizeof(int), fail)
470 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64 * 12 * 2 * sizeof(DCTELEM), fail)
471 s->block = s->blocks[0];
473 for (i = 0; i < 12; i++) {
474 s->pblocks[i] = &s->block[i];
477 if (s->out_format == FMT_H263) {
479 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base,
480 yc_size * sizeof(int16_t) * 16, fail);
481 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
482 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
483 s->ac_val[2] = s->ac_val[1] + c_size;
488 return -1; // free() through ff_MPV_common_end()
491 static void free_duplicate_context(MpegEncContext *s)
496 av_freep(&s->edge_emu_buffer);
497 av_freep(&s->me.scratchpad);
501 s->obmc_scratchpad = NULL;
503 av_freep(&s->dct_error_sum);
504 av_freep(&s->me.map);
505 av_freep(&s->me.score_map);
506 av_freep(&s->blocks);
507 av_freep(&s->ac_val_base);
511 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
513 #define COPY(a) bak->a = src->a
514 COPY(edge_emu_buffer);
519 COPY(obmc_scratchpad);
526 COPY(me.map_generation);
538 int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
542 // FIXME copy only needed parts
544 backup_duplicate_context(&bak, dst);
545 memcpy(dst, src, sizeof(MpegEncContext));
546 backup_duplicate_context(dst, &bak);
547 for (i = 0; i < 12; i++) {
548 dst->pblocks[i] = &dst->block[i];
550 if (!dst->edge_emu_buffer &&
551 (ret = ff_mpv_frame_size_alloc(dst, dst->linesize)) < 0) {
552 av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
553 "scratch buffers.\n");
556 // STOP_TIMER("update_duplicate_context")
557 // about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
561 int ff_mpeg_update_thread_context(AVCodecContext *dst,
562 const AVCodecContext *src)
566 MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
573 // FIXME can parameters change on I-frames?
574 // in that case dst may need a reinit
575 if (!s->context_initialized) {
576 memcpy(s, s1, sizeof(MpegEncContext));
579 s->bitstream_buffer = NULL;
580 s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
582 if (s1->context_initialized){
583 s->picture_range_start += MAX_PICTURE_COUNT;
584 s->picture_range_end += MAX_PICTURE_COUNT;
585 if((err = ff_MPV_common_init(s)) < 0)
590 if (s->height != s1->height || s->width != s1->width || s->context_reinit) {
591 s->context_reinit = 0;
592 s->height = s1->height;
593 s->width = s1->width;
594 if ((err = ff_MPV_common_frame_size_change(s)) < 0)
598 s->avctx->coded_height = s1->avctx->coded_height;
599 s->avctx->coded_width = s1->avctx->coded_width;
600 s->avctx->width = s1->avctx->width;
601 s->avctx->height = s1->avctx->height;
603 s->coded_picture_number = s1->coded_picture_number;
604 s->picture_number = s1->picture_number;
605 s->input_picture_number = s1->input_picture_number;
607 av_assert0(!s->picture || s->picture != s1->picture);
608 memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
609 memcpy(&s->last_picture, &s1->last_picture,
610 (char *) &s1->last_picture_ptr - (char *) &s1->last_picture);
612 // reset s->picture[].f.extended_data to s->picture[].f.data
613 for (i = 0; i < s->picture_count; i++)
614 s->picture[i].f.extended_data = s->picture[i].f.data;
616 s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
617 s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
618 s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
620 // Error/bug resilience
621 s->next_p_frame_damaged = s1->next_p_frame_damaged;
622 s->workaround_bugs = s1->workaround_bugs;
623 s->padding_bug_score = s1->padding_bug_score;
626 memcpy(&s->time_increment_bits, &s1->time_increment_bits,
627 (char *) &s1->shape - (char *) &s1->time_increment_bits);
630 s->max_b_frames = s1->max_b_frames;
631 s->low_delay = s1->low_delay;
632 s->droppable = s1->droppable;
634 // DivX handling (doesn't work)
635 s->divx_packed = s1->divx_packed;
637 if (s1->bitstream_buffer) {
638 if (s1->bitstream_buffer_size +
639 FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
640 av_fast_malloc(&s->bitstream_buffer,
641 &s->allocated_bitstream_buffer_size,
642 s1->allocated_bitstream_buffer_size);
643 s->bitstream_buffer_size = s1->bitstream_buffer_size;
644 memcpy(s->bitstream_buffer, s1->bitstream_buffer,
645 s1->bitstream_buffer_size);
646 memset(s->bitstream_buffer + s->bitstream_buffer_size, 0,
647 FF_INPUT_BUFFER_PADDING_SIZE);
650 // linesize dependend scratch buffer allocation
651 if (!s->edge_emu_buffer)
653 if (ff_mpv_frame_size_alloc(s, s1->linesize) < 0) {
654 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context "
655 "scratch buffers.\n");
656 return AVERROR(ENOMEM);
659 av_log(s->avctx, AV_LOG_ERROR, "Context scratch buffers could not "
660 "be allocated due to unknown size.\n");
663 // MPEG2/interlacing info
664 memcpy(&s->progressive_sequence, &s1->progressive_sequence,
665 (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
667 if (!s1->first_field) {
668 s->last_pict_type = s1->pict_type;
669 if (s1->current_picture_ptr)
670 s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality;
672 if (s1->pict_type != AV_PICTURE_TYPE_B) {
673 s->last_non_b_pict_type = s1->pict_type;
681 * Set the given MpegEncContext to common defaults
682 * (same for encoding and decoding).
683 * The changed fields will not depend upon the
684 * prior state of the MpegEncContext.
686 void ff_MPV_common_defaults(MpegEncContext *s)
688 s->y_dc_scale_table =
689 s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
690 s->chroma_qscale_table = ff_default_chroma_qscale_table;
691 s->progressive_frame = 1;
692 s->progressive_sequence = 1;
693 s->picture_structure = PICT_FRAME;
695 s->coded_picture_number = 0;
696 s->picture_number = 0;
697 s->input_picture_number = 0;
699 s->picture_in_gop_number = 0;
704 s->picture_range_start = 0;
705 s->picture_range_end = MAX_PICTURE_COUNT;
707 s->slice_context_count = 1;
711 * Set the given MpegEncContext to defaults for decoding.
712 * the changed fields will not depend upon
713 * the prior state of the MpegEncContext.
715 void ff_MPV_decode_defaults(MpegEncContext *s)
717 ff_MPV_common_defaults(s);
721 * Initialize and allocates MpegEncContext fields dependent on the resolution.
723 static int init_context_frame(MpegEncContext *s)
725 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
727 s->mb_width = (s->width + 15) / 16;
728 s->mb_stride = s->mb_width + 1;
729 s->b8_stride = s->mb_width * 2 + 1;
730 s->b4_stride = s->mb_width * 4 + 1;
731 mb_array_size = s->mb_height * s->mb_stride;
732 mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
734 /* set default edge pos, will be overriden
735 * in decode_header if needed */
736 s->h_edge_pos = s->mb_width * 16;
737 s->v_edge_pos = s->mb_height * 16;
739 s->mb_num = s->mb_width * s->mb_height;
744 s->block_wrap[3] = s->b8_stride;
746 s->block_wrap[5] = s->mb_stride;
748 y_size = s->b8_stride * (2 * s->mb_height + 1);
749 c_size = s->mb_stride * (s->mb_height + 1);
750 yc_size = y_size + 2 * c_size;
752 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
753 for (y = 0; y < s->mb_height; y++)
754 for (x = 0; x < s->mb_width; x++)
755 s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
757 s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
760 /* Allocate MV tables */
761 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
762 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
763 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
764 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
765 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
766 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
767 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
768 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
769 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
770 s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
771 s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base + s->mb_stride + 1;
772 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
774 /* Allocate MB type table */
775 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size * sizeof(uint16_t), fail) // needed for encoding
777 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
779 FF_ALLOC_OR_GOTO(s->avctx, s->cplx_tab,
780 mb_array_size * sizeof(float), fail);
781 FF_ALLOC_OR_GOTO(s->avctx, s->bits_tab,
782 mb_array_size * sizeof(float), fail);
786 FF_ALLOC_OR_GOTO(s->avctx, s->er_temp_buffer,
787 mb_array_size * sizeof(uint8_t), fail);
788 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table,
789 mb_array_size * sizeof(uint8_t), fail);
791 if (s->codec_id == AV_CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)) {
792 /* interlaced direct mode decoding tables */
793 for (i = 0; i < 2; i++) {
795 for (j = 0; j < 2; j++) {
796 for (k = 0; k < 2; k++) {
797 FF_ALLOCZ_OR_GOTO(s->avctx,
798 s->b_field_mv_table_base[i][j][k],
799 mv_table_size * 2 * sizeof(int16_t),
801 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
804 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
805 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
806 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
808 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
811 if (s->out_format == FMT_H263) {
813 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
814 s->coded_block = s->coded_block_base + s->b8_stride + 1;
816 /* cbp, ac_pred, pred_dir */
817 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail);
818 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
821 if (s->h263_pred || s->h263_plus || !s->encoding) {
823 // MN: we need these for error resilience of intra-frames
824 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
825 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
826 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
827 s->dc_val[2] = s->dc_val[1] + c_size;
828 for (i = 0; i < yc_size; i++)
829 s->dc_val_base[i] = 1024;
832 /* which mb is a intra block */
833 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
834 memset(s->mbintra_table, 1, mb_array_size);
836 /* init macroblock skip table */
837 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail);
838 // Note the + 1 is for a quicker mpeg4 slice_end detection
842 return AVERROR(ENOMEM);
846 * init common structure for both encoder and decoder.
847 * this assumes that some variables like width/height are already set
849 av_cold int ff_MPV_common_init(MpegEncContext *s)
852 int nb_slices = (HAVE_THREADS &&
853 s->avctx->active_thread_type & FF_THREAD_SLICE) ?
854 s->avctx->thread_count : 1;
856 if (s->encoding && s->avctx->slices)
857 nb_slices = s->avctx->slices;
859 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
860 s->mb_height = (s->height + 31) / 32 * 2;
861 else if (s->codec_id != AV_CODEC_ID_H264)
862 s->mb_height = (s->height + 15) / 16;
864 if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
865 av_log(s->avctx, AV_LOG_ERROR,
866 "decoding to AV_PIX_FMT_NONE is not supported.\n");
870 if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
873 max_slices = FFMIN(MAX_THREADS, s->mb_height);
875 max_slices = MAX_THREADS;
876 av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
877 " reducing to %d\n", nb_slices, max_slices);
878 nb_slices = max_slices;
881 if ((s->width || s->height) &&
882 av_image_check_size(s->width, s->height, 0, s->avctx))
885 ff_dct_common_init(s);
887 s->flags = s->avctx->flags;
888 s->flags2 = s->avctx->flags2;
890 /* set chroma shifts */
891 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
893 /* convert fourcc to upper case */
894 s->codec_tag = avpriv_toupper4(s->avctx->codec_tag);
895 s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
897 s->avctx->coded_frame = &s->current_picture.f;
900 if (s->msmpeg4_version) {
901 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
902 2 * 2 * (MAX_LEVEL + 1) *
903 (MAX_RUN + 1) * 2 * sizeof(int), fail);
905 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
907 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail)
908 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail)
909 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail)
910 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
911 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
912 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
913 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
914 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
916 if (s->avctx->noise_reduction) {
917 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail);
921 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
922 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture,
923 s->picture_count * sizeof(Picture), fail);
924 for (i = 0; i < s->picture_count; i++) {
925 avcodec_get_frame_defaults(&s->picture[i].f);
928 if (init_context_frame(s))
931 s->parse_context.state = -1;
933 s->context_initialized = 1;
934 s->thread_context[0] = s;
936 // if (s->width && s->height) {
938 for (i = 1; i < nb_slices; i++) {
939 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
940 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
943 for (i = 0; i < nb_slices; i++) {
944 if (init_duplicate_context(s->thread_context[i], s) < 0)
946 s->thread_context[i]->start_mb_y =
947 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
948 s->thread_context[i]->end_mb_y =
949 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
952 if (init_duplicate_context(s, s) < 0)
955 s->end_mb_y = s->mb_height;
957 s->slice_context_count = nb_slices;
962 ff_MPV_common_end(s);
967 * Frees and resets MpegEncContext fields depending on the resolution.
968 * Is used during resolution changes to avoid a full reinitialization of the
971 static int free_context_frame(MpegEncContext *s)
975 av_freep(&s->mb_type);
976 av_freep(&s->p_mv_table_base);
977 av_freep(&s->b_forw_mv_table_base);
978 av_freep(&s->b_back_mv_table_base);
979 av_freep(&s->b_bidir_forw_mv_table_base);
980 av_freep(&s->b_bidir_back_mv_table_base);
981 av_freep(&s->b_direct_mv_table_base);
982 s->p_mv_table = NULL;
983 s->b_forw_mv_table = NULL;
984 s->b_back_mv_table = NULL;
985 s->b_bidir_forw_mv_table = NULL;
986 s->b_bidir_back_mv_table = NULL;
987 s->b_direct_mv_table = NULL;
988 for (i = 0; i < 2; i++) {
989 for (j = 0; j < 2; j++) {
990 for (k = 0; k < 2; k++) {
991 av_freep(&s->b_field_mv_table_base[i][j][k]);
992 s->b_field_mv_table[i][j][k] = NULL;
994 av_freep(&s->b_field_select_table[i][j]);
995 av_freep(&s->p_field_mv_table_base[i][j]);
996 s->p_field_mv_table[i][j] = NULL;
998 av_freep(&s->p_field_select_table[i]);
1001 av_freep(&s->dc_val_base);
1002 av_freep(&s->coded_block_base);
1003 av_freep(&s->mbintra_table);
1004 av_freep(&s->cbp_table);
1005 av_freep(&s->pred_dir_table);
1007 av_freep(&s->mbskip_table);
1009 av_freep(&s->error_status_table);
1010 av_freep(&s->er_temp_buffer);
1011 av_freep(&s->mb_index2xy);
1012 av_freep(&s->lambda_table);
1014 av_freep(&s->cplx_tab);
1015 av_freep(&s->bits_tab);
1017 s->linesize = s->uvlinesize = 0;
1019 for (i = 0; i < 3; i++)
1020 av_freep(&s->visualization_buffer[i]);
1025 int ff_MPV_common_frame_size_change(MpegEncContext *s)
1029 if (s->slice_context_count > 1) {
1030 for (i = 0; i < s->slice_context_count; i++) {
1031 free_duplicate_context(s->thread_context[i]);
1033 for (i = 1; i < s->slice_context_count; i++) {
1034 av_freep(&s->thread_context[i]);
1037 free_duplicate_context(s);
1039 free_context_frame(s);
1042 for (i = 0; i < s->picture_count; i++) {
1043 s->picture[i].needs_realloc = 1;
1046 s->last_picture_ptr =
1047 s->next_picture_ptr =
1048 s->current_picture_ptr = NULL;
1051 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
1052 s->mb_height = (s->height + 31) / 32 * 2;
1053 else if (s->codec_id != AV_CODEC_ID_H264)
1054 s->mb_height = (s->height + 15) / 16;
1056 if ((s->width || s->height) &&
1057 av_image_check_size(s->width, s->height, 0, s->avctx))
1058 return AVERROR_INVALIDDATA;
1060 if ((err = init_context_frame(s)))
1063 s->thread_context[0] = s;
1065 if (s->width && s->height) {
1066 int nb_slices = s->slice_context_count;
1067 if (nb_slices > 1) {
1068 for (i = 1; i < nb_slices; i++) {
1069 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1070 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1073 for (i = 0; i < nb_slices; i++) {
1074 if (init_duplicate_context(s->thread_context[i], s) < 0)
1076 s->thread_context[i]->start_mb_y =
1077 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1078 s->thread_context[i]->end_mb_y =
1079 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1082 if (init_duplicate_context(s, s) < 0)
1085 s->end_mb_y = s->mb_height;
1087 s->slice_context_count = nb_slices;
1092 ff_MPV_common_end(s);
1096 /* init common structure for both encoder and decoder */
1097 void ff_MPV_common_end(MpegEncContext *s)
1101 if (s->slice_context_count > 1) {
1102 for (i = 0; i < s->slice_context_count; i++) {
1103 free_duplicate_context(s->thread_context[i]);
1105 for (i = 1; i < s->slice_context_count; i++) {
1106 av_freep(&s->thread_context[i]);
1108 s->slice_context_count = 1;
1109 } else free_duplicate_context(s);
1111 av_freep(&s->parse_context.buffer);
1112 s->parse_context.buffer_size = 0;
1114 av_freep(&s->bitstream_buffer);
1115 s->allocated_bitstream_buffer_size = 0;
1117 av_freep(&s->avctx->stats_out);
1118 av_freep(&s->ac_stats);
1120 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
1121 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
1122 s->q_chroma_intra_matrix= NULL;
1123 s->q_chroma_intra_matrix16= NULL;
1124 av_freep(&s->q_intra_matrix);
1125 av_freep(&s->q_inter_matrix);
1126 av_freep(&s->q_intra_matrix16);
1127 av_freep(&s->q_inter_matrix16);
1128 av_freep(&s->input_picture);
1129 av_freep(&s->reordered_input_picture);
1130 av_freep(&s->dct_offset);
1132 if (s->picture && !s->avctx->internal->is_copy) {
1133 for (i = 0; i < s->picture_count; i++) {
1134 free_picture(s, &s->picture[i]);
1137 av_freep(&s->picture);
1139 free_context_frame(s);
1141 if (!(s->avctx->active_thread_type & FF_THREAD_FRAME))
1142 avcodec_default_free_buffers(s->avctx);
1144 s->context_initialized = 0;
1145 s->last_picture_ptr =
1146 s->next_picture_ptr =
1147 s->current_picture_ptr = NULL;
1148 s->linesize = s->uvlinesize = 0;
1151 void ff_init_rl(RLTable *rl,
1152 uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3])
1154 int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1];
1155 uint8_t index_run[MAX_RUN + 1];
1156 int last, run, level, start, end, i;
1158 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1159 if (static_store && rl->max_level[0])
1162 /* compute max_level[], max_run[] and index_run[] */
1163 for (last = 0; last < 2; last++) {
1172 memset(max_level, 0, MAX_RUN + 1);
1173 memset(max_run, 0, MAX_LEVEL + 1);
1174 memset(index_run, rl->n, MAX_RUN + 1);
1175 for (i = start; i < end; i++) {
1176 run = rl->table_run[i];
1177 level = rl->table_level[i];
1178 if (index_run[run] == rl->n)
1180 if (level > max_level[run])
1181 max_level[run] = level;
1182 if (run > max_run[level])
1183 max_run[level] = run;
1186 rl->max_level[last] = static_store[last];
1188 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1189 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1191 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1193 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1194 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1196 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1198 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1199 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1203 void ff_init_vlc_rl(RLTable *rl)
1207 for (q = 0; q < 32; q++) {
1209 int qadd = (q - 1) | 1;
1215 for (i = 0; i < rl->vlc.table_size; i++) {
1216 int code = rl->vlc.table[i][0];
1217 int len = rl->vlc.table[i][1];
1220 if (len == 0) { // illegal code
1223 } else if (len < 0) { // more bits needed
1227 if (code == rl->n) { // esc
1231 run = rl->table_run[code] + 1;
1232 level = rl->table_level[code] * qmul + qadd;
1233 if (code >= rl->last) run += 192;
1236 rl->rl_vlc[q][i].len = len;
1237 rl->rl_vlc[q][i].level = level;
1238 rl->rl_vlc[q][i].run = run;
1243 void ff_release_unused_pictures(MpegEncContext*s, int remove_current)
1247 /* release non reference frames */
1248 for (i = 0; i < s->picture_count; i++) {
1249 if (s->picture[i].f.data[0] && !s->picture[i].f.reference &&
1250 (!s->picture[i].owner2 || s->picture[i].owner2 == s) &&
1251 (remove_current || &s->picture[i] != s->current_picture_ptr)
1252 /* && s->picture[i].type!= FF_BUFFER_TYPE_SHARED */) {
1253 free_frame_buffer(s, &s->picture[i]);
1258 static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
1260 if (pic->f.data[0] == NULL)
1262 if (pic->needs_realloc && !(pic->f.reference & DELAYED_PIC_REF))
1263 if (!pic->owner2 || pic->owner2 == s)
1268 static int find_unused_picture(MpegEncContext *s, int shared)
1273 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1274 if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type == 0)
1278 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1279 if (pic_is_unused(s, &s->picture[i]) && s->picture[i].f.type != 0)
1282 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1283 if (pic_is_unused(s, &s->picture[i]))
1288 av_log(s->avctx, AV_LOG_FATAL,
1289 "Internal error, picture buffer overflow\n");
1290 /* We could return -1, but the codec would crash trying to draw into a
1291 * non-existing frame anyway. This is safer than waiting for a random crash.
1292 * Also the return of this is never useful, an encoder must only allocate
1293 * as much as allowed in the specification. This has no relationship to how
1294 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1295 * enough for such valid streams).
1296 * Plus, a decoder has to check stream validity and remove frames if too
1297 * many reference frames are around. Waiting for "OOM" is not correct at
1298 * all. Similarly, missing reference frames have to be replaced by
1299 * interpolated/MC frames, anything else is a bug in the codec ...
1305 int ff_find_unused_picture(MpegEncContext *s, int shared)
1307 int ret = find_unused_picture(s, shared);
1309 if (ret >= 0 && ret < s->picture_range_end) {
1310 if (s->picture[ret].needs_realloc) {
1311 s->picture[ret].needs_realloc = 0;
1312 free_picture(s, &s->picture[ret]);
1313 avcodec_get_frame_defaults(&s->picture[ret].f);
1319 static void update_noise_reduction(MpegEncContext *s)
1323 for (intra = 0; intra < 2; intra++) {
1324 if (s->dct_count[intra] > (1 << 16)) {
1325 for (i = 0; i < 64; i++) {
1326 s->dct_error_sum[intra][i] >>= 1;
1328 s->dct_count[intra] >>= 1;
1331 for (i = 0; i < 64; i++) {
1332 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1333 s->dct_count[intra] +
1334 s->dct_error_sum[intra][i] / 2) /
1335 (s->dct_error_sum[intra][i] + 1);
1341 * generic function for encode/decode called after coding/decoding
1342 * the header and before a frame is coded/decoded.
1344 int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1350 if (!ff_thread_can_start_frame(avctx)) {
1351 av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
1355 /* mark & release old frames */
1356 if (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3) {
1357 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1358 s->last_picture_ptr != s->next_picture_ptr &&
1359 s->last_picture_ptr->f.data[0]) {
1360 if (s->last_picture_ptr->owner2 == s)
1361 free_frame_buffer(s, s->last_picture_ptr);
1364 /* release forgotten pictures */
1365 /* if (mpeg124/h263) */
1367 for (i = 0; i < s->picture_count; i++) {
1368 if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
1369 &s->picture[i] != s->last_picture_ptr &&
1370 &s->picture[i] != s->next_picture_ptr &&
1371 s->picture[i].f.reference && !s->picture[i].needs_realloc) {
1372 if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1373 av_log(avctx, AV_LOG_ERROR,
1374 "releasing zombie picture\n");
1375 free_frame_buffer(s, &s->picture[i]);
1382 ff_release_unused_pictures(s, 1);
1384 if (s->current_picture_ptr &&
1385 s->current_picture_ptr->f.data[0] == NULL) {
1386 // we already have a unused image
1387 // (maybe it was set before reading the header)
1388 pic = s->current_picture_ptr;
1390 i = ff_find_unused_picture(s, 0);
1392 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1395 pic = &s->picture[i];
1398 pic->f.reference = 0;
1399 if (!s->droppable) {
1400 if (s->codec_id == AV_CODEC_ID_H264)
1401 pic->f.reference = s->picture_structure;
1402 else if (s->pict_type != AV_PICTURE_TYPE_B)
1403 pic->f.reference = 3;
1406 pic->f.coded_picture_number = s->coded_picture_number++;
1408 if (ff_alloc_picture(s, pic, 0) < 0)
1411 s->current_picture_ptr = pic;
1412 // FIXME use only the vars from current_pic
1413 s->current_picture_ptr->f.top_field_first = s->top_field_first;
1414 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
1415 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1416 if (s->picture_structure != PICT_FRAME)
1417 s->current_picture_ptr->f.top_field_first =
1418 (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1420 s->current_picture_ptr->f.interlaced_frame = !s->progressive_frame &&
1421 !s->progressive_sequence;
1422 s->current_picture_ptr->field_picture = s->picture_structure != PICT_FRAME;
1425 s->current_picture_ptr->f.pict_type = s->pict_type;
1426 // if (s->flags && CODEC_FLAG_QSCALE)
1427 // s->current_picture_ptr->quality = s->new_picture_ptr->quality;
1428 s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1430 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1432 if (s->pict_type != AV_PICTURE_TYPE_B) {
1433 s->last_picture_ptr = s->next_picture_ptr;
1435 s->next_picture_ptr = s->current_picture_ptr;
1437 av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
1438 s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1439 s->last_picture_ptr ? s->last_picture_ptr->f.data[0] : NULL,
1440 s->next_picture_ptr ? s->next_picture_ptr->f.data[0] : NULL,
1441 s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL,
1442 s->pict_type, s->droppable);
1444 if (s->codec_id != AV_CODEC_ID_H264) {
1445 if ((s->last_picture_ptr == NULL ||
1446 s->last_picture_ptr->f.data[0] == NULL) &&
1447 (s->pict_type != AV_PICTURE_TYPE_I ||
1448 s->picture_structure != PICT_FRAME)) {
1449 if (s->pict_type != AV_PICTURE_TYPE_I)
1450 av_log(avctx, AV_LOG_ERROR,
1451 "warning: first frame is no keyframe\n");
1452 else if (s->picture_structure != PICT_FRAME)
1453 av_log(avctx, AV_LOG_INFO,
1454 "allocate dummy last picture for field based first keyframe\n");
1456 /* Allocate a dummy frame */
1457 i = ff_find_unused_picture(s, 0);
1459 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1462 s->last_picture_ptr = &s->picture[i];
1463 s->last_picture_ptr->f.key_frame = 0;
1464 if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
1465 s->last_picture_ptr = NULL;
1469 if(s->codec_id == AV_CODEC_ID_FLV1 || s->codec_id == AV_CODEC_ID_H263){
1470 for(i=0; i<avctx->height; i++)
1471 memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width);
1474 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0);
1475 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1);
1476 s->last_picture_ptr->f.reference = 3;
1478 if ((s->next_picture_ptr == NULL ||
1479 s->next_picture_ptr->f.data[0] == NULL) &&
1480 s->pict_type == AV_PICTURE_TYPE_B) {
1481 /* Allocate a dummy frame */
1482 i = ff_find_unused_picture(s, 0);
1484 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1487 s->next_picture_ptr = &s->picture[i];
1488 s->next_picture_ptr->f.key_frame = 0;
1489 if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
1490 s->next_picture_ptr = NULL;
1493 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 0);
1494 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 1);
1495 s->next_picture_ptr->f.reference = 3;
1499 if (s->last_picture_ptr)
1500 ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1501 if (s->next_picture_ptr)
1502 ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1504 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME)) {
1505 if (s->next_picture_ptr)
1506 s->next_picture_ptr->owner2 = s;
1507 if (s->last_picture_ptr)
1508 s->last_picture_ptr->owner2 = s;
1511 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
1512 s->last_picture_ptr->f.data[0]));
1514 if (s->picture_structure!= PICT_FRAME && s->out_format != FMT_H264) {
1516 for (i = 0; i < 4; i++) {
1517 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1518 s->current_picture.f.data[i] +=
1519 s->current_picture.f.linesize[i];
1521 s->current_picture.f.linesize[i] *= 2;
1522 s->last_picture.f.linesize[i] *= 2;
1523 s->next_picture.f.linesize[i] *= 2;
1527 s->err_recognition = avctx->err_recognition;
1529 /* set dequantizer, we can't do it during init as
1530 * it might change for mpeg4 and we can't do it in the header
1531 * decode as init is not called for mpeg4 there yet */
1532 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1533 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1534 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1535 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1536 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1537 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1539 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1540 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1543 if (s->dct_error_sum) {
1544 assert(s->avctx->noise_reduction && s->encoding);
1545 update_noise_reduction(s);
1548 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1549 return ff_xvmc_field_start(s, avctx);
1554 /* generic function for encode/decode called after a
1555 * frame has been coded/decoded. */
1556 void ff_MPV_frame_end(MpegEncContext *s)
1559 /* redraw edges for the frame if decoding didn't complete */
1560 // just to make sure that all data is rendered.
1561 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
1562 ff_xvmc_field_end(s);
1563 } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
1564 !s->avctx->hwaccel &&
1565 !(s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&
1566 s->unrestricted_mv &&
1567 s->current_picture.f.reference &&
1569 !(s->flags & CODEC_FLAG_EMU_EDGE) &&
1572 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1573 int hshift = desc->log2_chroma_w;
1574 int vshift = desc->log2_chroma_h;
1575 s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
1576 s->h_edge_pos, s->v_edge_pos,
1577 EDGE_WIDTH, EDGE_WIDTH,
1578 EDGE_TOP | EDGE_BOTTOM);
1579 s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
1580 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1581 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1582 EDGE_TOP | EDGE_BOTTOM);
1583 s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
1584 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1585 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1586 EDGE_TOP | EDGE_BOTTOM);
1591 s->last_pict_type = s->pict_type;
1592 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality;
1593 if (s->pict_type!= AV_PICTURE_TYPE_B) {
1594 s->last_non_b_pict_type = s->pict_type;
1597 /* copy back current_picture variables */
1598 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1599 if (s->picture[i].f.data[0] == s->current_picture.f.data[0]) {
1600 s->picture[i] = s->current_picture;
1604 assert(i < MAX_PICTURE_COUNT);
1608 /* release non-reference frames */
1609 for (i = 0; i < s->picture_count; i++) {
1610 if (s->picture[i].f.data[0] && !s->picture[i].f.reference
1611 /* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */) {
1612 free_frame_buffer(s, &s->picture[i]);
1616 // clear copies, to avoid confusion
1618 memset(&s->last_picture, 0, sizeof(Picture));
1619 memset(&s->next_picture, 0, sizeof(Picture));
1620 memset(&s->current_picture, 0, sizeof(Picture));
1622 s->avctx->coded_frame = &s->current_picture_ptr->f;
1624 if (s->codec_id != AV_CODEC_ID_H264 && s->current_picture.f.reference) {
1625 ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
1630 * Draw a line from (ex, ey) -> (sx, sy).
1631 * @param w width of the image
1632 * @param h height of the image
1633 * @param stride stride/linesize of the image
1634 * @param color color of the arrow
1636 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
1637 int w, int h, int stride, int color)
1641 sx = av_clip(sx, 0, w - 1);
1642 sy = av_clip(sy, 0, h - 1);
1643 ex = av_clip(ex, 0, w - 1);
1644 ey = av_clip(ey, 0, h - 1);
1646 buf[sy * stride + sx] += color;
1648 if (FFABS(ex - sx) > FFABS(ey - sy)) {
1650 FFSWAP(int, sx, ex);
1651 FFSWAP(int, sy, ey);
1653 buf += sx + sy * stride;
1655 f = ((ey - sy) << 16) / ex;
1656 for(x= 0; x <= ex; x++){
1658 fr = (x * f) & 0xFFFF;
1659 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1660 if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
1664 FFSWAP(int, sx, ex);
1665 FFSWAP(int, sy, ey);
1667 buf += sx + sy * stride;
1670 f = ((ex - sx) << 16) / ey;
1673 for(y= 0; y <= ey; y++){
1675 fr = (y*f) & 0xFFFF;
1676 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1677 if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
1683 * Draw an arrow from (ex, ey) -> (sx, sy).
1684 * @param w width of the image
1685 * @param h height of the image
1686 * @param stride stride/linesize of the image
1687 * @param color color of the arrow
1689 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
1690 int ey, int w, int h, int stride, int color)
1694 sx = av_clip(sx, -100, w + 100);
1695 sy = av_clip(sy, -100, h + 100);
1696 ex = av_clip(ex, -100, w + 100);
1697 ey = av_clip(ey, -100, h + 100);
1702 if (dx * dx + dy * dy > 3 * 3) {
1705 int length = ff_sqrt((rx * rx + ry * ry) << 8);
1707 // FIXME subpixel accuracy
1708 rx = ROUNDED_DIV(rx * 3 << 4, length);
1709 ry = ROUNDED_DIV(ry * 3 << 4, length);
1711 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1712 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1714 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1718 * Print debugging info for the given picture.
1720 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict)
1722 if ( s->avctx->hwaccel || !pict || !pict->mb_type
1723 || (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU))
1727 if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
1730 av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
1731 av_get_picture_type_char(pict->pict_type));
1732 for (y = 0; y < s->mb_height; y++) {
1733 for (x = 0; x < s->mb_width; x++) {
1734 if (s->avctx->debug & FF_DEBUG_SKIP) {
1735 int count = s->mbskip_table[x + y * s->mb_stride];
1738 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1740 if (s->avctx->debug & FF_DEBUG_QP) {
1741 av_log(s->avctx, AV_LOG_DEBUG, "%2d",
1742 pict->qscale_table[x + y * s->mb_stride]);
1744 if (s->avctx->debug & FF_DEBUG_MB_TYPE) {
1745 int mb_type = pict->mb_type[x + y * s->mb_stride];
1746 // Type & MV direction
1747 if (IS_PCM(mb_type))
1748 av_log(s->avctx, AV_LOG_DEBUG, "P");
1749 else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1750 av_log(s->avctx, AV_LOG_DEBUG, "A");
1751 else if (IS_INTRA4x4(mb_type))
1752 av_log(s->avctx, AV_LOG_DEBUG, "i");
1753 else if (IS_INTRA16x16(mb_type))
1754 av_log(s->avctx, AV_LOG_DEBUG, "I");
1755 else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1756 av_log(s->avctx, AV_LOG_DEBUG, "d");
1757 else if (IS_DIRECT(mb_type))
1758 av_log(s->avctx, AV_LOG_DEBUG, "D");
1759 else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
1760 av_log(s->avctx, AV_LOG_DEBUG, "g");
1761 else if (IS_GMC(mb_type))
1762 av_log(s->avctx, AV_LOG_DEBUG, "G");
1763 else if (IS_SKIP(mb_type))
1764 av_log(s->avctx, AV_LOG_DEBUG, "S");
1765 else if (!USES_LIST(mb_type, 1))
1766 av_log(s->avctx, AV_LOG_DEBUG, ">");
1767 else if (!USES_LIST(mb_type, 0))
1768 av_log(s->avctx, AV_LOG_DEBUG, "<");
1770 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1771 av_log(s->avctx, AV_LOG_DEBUG, "X");
1775 if (IS_8X8(mb_type))
1776 av_log(s->avctx, AV_LOG_DEBUG, "+");
1777 else if (IS_16X8(mb_type))
1778 av_log(s->avctx, AV_LOG_DEBUG, "-");
1779 else if (IS_8X16(mb_type))
1780 av_log(s->avctx, AV_LOG_DEBUG, "|");
1781 else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
1782 av_log(s->avctx, AV_LOG_DEBUG, " ");
1784 av_log(s->avctx, AV_LOG_DEBUG, "?");
1787 if (IS_INTERLACED(mb_type))
1788 av_log(s->avctx, AV_LOG_DEBUG, "=");
1790 av_log(s->avctx, AV_LOG_DEBUG, " ");
1793 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1797 if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
1798 (s->avctx->debug_mv)) {
1799 const int shift = 1 + s->quarter_sample;
1803 int h_chroma_shift, v_chroma_shift, block_height;
1804 const int width = s->avctx->width;
1805 const int height = s->avctx->height;
1806 const int mv_sample_log2 = 4 - pict->motion_subsample_log2;
1807 const int mv_stride = (s->mb_width << mv_sample_log2) +
1808 (s->codec_id == AV_CODEC_ID_H264 ? 0 : 1);
1809 s->low_delay = 0; // needed to see the vectors without trashing the buffers
1811 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1813 for (i = 0; i < 3; i++) {
1814 size_t size= (i == 0) ? pict->linesize[i] * FFALIGN(height, 16):
1815 pict->linesize[i] * FFALIGN(height, 16) >> v_chroma_shift;
1816 s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
1817 memcpy(s->visualization_buffer[i], pict->data[i], size);
1818 pict->data[i] = s->visualization_buffer[i];
1820 pict->type = FF_BUFFER_TYPE_COPY;
1822 ptr = pict->data[0];
1823 block_height = 16 >> v_chroma_shift;
1825 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1827 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1828 const int mb_index = mb_x + mb_y * s->mb_stride;
1829 if ((s->avctx->debug_mv) && pict->motion_val[0]) {
1831 for (type = 0; type < 3; type++) {
1835 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
1836 (pict->pict_type!= AV_PICTURE_TYPE_P))
1841 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
1842 (pict->pict_type!= AV_PICTURE_TYPE_B))
1847 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
1848 (pict->pict_type!= AV_PICTURE_TYPE_B))
1853 if (!USES_LIST(pict->mb_type[mb_index], direction))
1856 if (IS_8X8(pict->mb_type[mb_index])) {
1858 for (i = 0; i < 4; i++) {
1859 int sx = mb_x * 16 + 4 + 8 * (i & 1);
1860 int sy = mb_y * 16 + 4 + 8 * (i >> 1);
1861 int xy = (mb_x * 2 + (i & 1) +
1862 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1863 int mx = (pict->motion_val[direction][xy][0] >> shift) + sx;
1864 int my = (pict->motion_val[direction][xy][1] >> shift) + sy;
1865 draw_arrow(ptr, sx, sy, mx, my, width,
1866 height, s->linesize, 100);
1868 } else if (IS_16X8(pict->mb_type[mb_index])) {
1870 for (i = 0; i < 2; i++) {
1871 int sx = mb_x * 16 + 8;
1872 int sy = mb_y * 16 + 4 + 8 * i;
1873 int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
1874 int mx = (pict->motion_val[direction][xy][0] >> shift);
1875 int my = (pict->motion_val[direction][xy][1] >> shift);
1877 if (IS_INTERLACED(pict->mb_type[mb_index]))
1880 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1881 height, s->linesize, 100);
1883 } else if (IS_8X16(pict->mb_type[mb_index])) {
1885 for (i = 0; i < 2; i++) {
1886 int sx = mb_x * 16 + 4 + 8 * i;
1887 int sy = mb_y * 16 + 8;
1888 int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
1889 int mx = pict->motion_val[direction][xy][0] >> shift;
1890 int my = pict->motion_val[direction][xy][1] >> shift;
1892 if (IS_INTERLACED(pict->mb_type[mb_index]))
1895 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1896 height, s->linesize, 100);
1899 int sx= mb_x * 16 + 8;
1900 int sy= mb_y * 16 + 8;
1901 int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
1902 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1903 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1904 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1908 if ((s->avctx->debug & FF_DEBUG_VIS_QP)) {
1909 uint64_t c = (pict->qscale_table[mb_index] * 128 / 31) *
1910 0x0101010101010101ULL;
1912 for (y = 0; y < block_height; y++) {
1913 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1914 (block_height * mb_y + y) *
1915 pict->linesize[1]) = c;
1916 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1917 (block_height * mb_y + y) *
1918 pict->linesize[2]) = c;
1921 if ((s->avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
1922 pict->motion_val[0]) {
1923 int mb_type = pict->mb_type[mb_index];
1926 #define COLOR(theta, r) \
1927 u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
1928 v = (int)(128 + r * sin(theta * 3.141592 / 180));
1932 if (IS_PCM(mb_type)) {
1934 } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
1935 IS_INTRA16x16(mb_type)) {
1937 } else if (IS_INTRA4x4(mb_type)) {
1939 } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
1941 } else if (IS_DIRECT(mb_type)) {
1943 } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
1945 } else if (IS_GMC(mb_type)) {
1947 } else if (IS_SKIP(mb_type)) {
1949 } else if (!USES_LIST(mb_type, 1)) {
1951 } else if (!USES_LIST(mb_type, 0)) {
1954 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1958 u *= 0x0101010101010101ULL;
1959 v *= 0x0101010101010101ULL;
1960 for (y = 0; y < block_height; y++) {
1961 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1962 (block_height * mb_y + y) * pict->linesize[1]) = u;
1963 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1964 (block_height * mb_y + y) * pict->linesize[2]) = v;
1968 if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
1969 *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
1970 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1971 *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
1972 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1974 if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
1975 for (y = 0; y < 16; y++)
1976 pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
1977 pict->linesize[0]] ^= 0x80;
1979 if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
1980 int dm = 1 << (mv_sample_log2 - 2);
1981 for (i = 0; i < 4; i++) {
1982 int sx = mb_x * 16 + 8 * (i & 1);
1983 int sy = mb_y * 16 + 8 * (i >> 1);
1984 int xy = (mb_x * 2 + (i & 1) +
1985 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1987 int32_t *mv = (int32_t *) &pict->motion_val[0][xy];
1988 if (mv[0] != mv[dm] ||
1989 mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
1990 for (y = 0; y < 8; y++)
1991 pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
1992 if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
1993 *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
1994 pict->linesize[0]) ^= 0x8080808080808080ULL;
1998 if (IS_INTERLACED(mb_type) &&
1999 s->codec_id == AV_CODEC_ID_H264) {
2003 s->mbskip_table[mb_index] = 0;
2009 static inline int hpel_motion_lowres(MpegEncContext *s,
2010 uint8_t *dest, uint8_t *src,
2011 int field_based, int field_select,
2012 int src_x, int src_y,
2013 int width, int height, int stride,
2014 int h_edge_pos, int v_edge_pos,
2015 int w, int h, h264_chroma_mc_func *pix_op,
2016 int motion_x, int motion_y)
2018 const int lowres = s->avctx->lowres;
2019 const int op_index = FFMIN(lowres, 2);
2020 const int s_mask = (2 << lowres) - 1;
2024 if (s->quarter_sample) {
2029 sx = motion_x & s_mask;
2030 sy = motion_y & s_mask;
2031 src_x += motion_x >> lowres + 1;
2032 src_y += motion_y >> lowres + 1;
2034 src += src_y * stride + src_x;
2036 if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
2037 (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2038 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
2039 (h + 1) << field_based, src_x,
2040 src_y << field_based,
2043 src = s->edge_emu_buffer;
2047 sx = (sx << 2) >> lowres;
2048 sy = (sy << 2) >> lowres;
2051 pix_op[op_index](dest, src, stride, h, sx, sy);
2055 /* apply one mpeg motion vector to the three components */
2056 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
2063 uint8_t **ref_picture,
2064 h264_chroma_mc_func *pix_op,
2065 int motion_x, int motion_y,
2068 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2069 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
2071 const int lowres = s->avctx->lowres;
2072 const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 2);
2073 const int block_s = 8>>lowres;
2074 const int s_mask = (2 << lowres) - 1;
2075 const int h_edge_pos = s->h_edge_pos >> lowres;
2076 const int v_edge_pos = s->v_edge_pos >> lowres;
2077 linesize = s->current_picture.f.linesize[0] << field_based;
2078 uvlinesize = s->current_picture.f.linesize[1] << field_based;
2080 // FIXME obviously not perfect but qpel will not work in lowres anyway
2081 if (s->quarter_sample) {
2087 motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2090 sx = motion_x & s_mask;
2091 sy = motion_y & s_mask;
2092 src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2093 src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2095 if (s->out_format == FMT_H263) {
2096 uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2097 uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2098 uvsrc_x = src_x >> 1;
2099 uvsrc_y = src_y >> 1;
2100 } else if (s->out_format == FMT_H261) {
2101 // even chroma mv's are full pel in H261
2104 uvsx = (2 * mx) & s_mask;
2105 uvsy = (2 * my) & s_mask;
2106 uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2107 uvsrc_y = mb_y * block_s + (my >> lowres);
2109 if(s->chroma_y_shift){
2114 uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2115 uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2117 if(s->chroma_x_shift){
2121 uvsy = motion_y & s_mask;
2123 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2126 uvsx = motion_x & s_mask;
2127 uvsy = motion_y & s_mask;
2134 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2135 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2136 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2138 if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) ||
2139 (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2140 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2141 linesize >> field_based, 17, 17 + field_based,
2142 src_x, src_y << field_based, h_edge_pos,
2144 ptr_y = s->edge_emu_buffer;
2145 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2146 uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
2147 s->vdsp.emulated_edge_mc(uvbuf , ptr_cb, uvlinesize >> field_based, 9,
2149 uvsrc_x, uvsrc_y << field_based,
2150 h_edge_pos >> 1, v_edge_pos >> 1);
2151 s->vdsp.emulated_edge_mc(uvbuf + 16, ptr_cr, uvlinesize >> field_based, 9,
2153 uvsrc_x, uvsrc_y << field_based,
2154 h_edge_pos >> 1, v_edge_pos >> 1);
2156 ptr_cr = uvbuf + 16;
2160 // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
2162 dest_y += s->linesize;
2163 dest_cb += s->uvlinesize;
2164 dest_cr += s->uvlinesize;
2168 ptr_y += s->linesize;
2169 ptr_cb += s->uvlinesize;
2170 ptr_cr += s->uvlinesize;
2173 sx = (sx << 2) >> lowres;
2174 sy = (sy << 2) >> lowres;
2175 pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2177 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2178 uvsx = (uvsx << 2) >> lowres;
2179 uvsy = (uvsy << 2) >> lowres;
2180 if (h >> s->chroma_y_shift) {
2181 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2182 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2185 // FIXME h261 lowres loop filter
2188 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
2189 uint8_t *dest_cb, uint8_t *dest_cr,
2190 uint8_t **ref_picture,
2191 h264_chroma_mc_func * pix_op,
2194 const int lowres = s->avctx->lowres;
2195 const int op_index = FFMIN(lowres, 2);
2196 const int block_s = 8 >> lowres;
2197 const int s_mask = (2 << lowres) - 1;
2198 const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2199 const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2200 int emu = 0, src_x, src_y, offset, sx, sy;
2203 if (s->quarter_sample) {
2208 /* In case of 8X8, we construct a single chroma motion vector
2209 with a special rounding */
2210 mx = ff_h263_round_chroma(mx);
2211 my = ff_h263_round_chroma(my);
2215 src_x = s->mb_x * block_s + (mx >> lowres + 1);
2216 src_y = s->mb_y * block_s + (my >> lowres + 1);
2218 offset = src_y * s->uvlinesize + src_x;
2219 ptr = ref_picture[1] + offset;
2220 if (s->flags & CODEC_FLAG_EMU_EDGE) {
2221 if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2222 (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2223 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
2224 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2225 ptr = s->edge_emu_buffer;
2229 sx = (sx << 2) >> lowres;
2230 sy = (sy << 2) >> lowres;
2231 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2233 ptr = ref_picture[2] + offset;
2235 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2236 src_x, src_y, h_edge_pos, v_edge_pos);
2237 ptr = s->edge_emu_buffer;
2239 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2243 * motion compensation of a single macroblock
2245 * @param dest_y luma destination pointer
2246 * @param dest_cb chroma cb/u destination pointer
2247 * @param dest_cr chroma cr/v destination pointer
2248 * @param dir direction (0->forward, 1->backward)
2249 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2250 * @param pix_op halfpel motion compensation function (average or put normally)
2251 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2253 static inline void MPV_motion_lowres(MpegEncContext *s,
2254 uint8_t *dest_y, uint8_t *dest_cb,
2256 int dir, uint8_t **ref_picture,
2257 h264_chroma_mc_func *pix_op)
2261 const int lowres = s->avctx->lowres;
2262 const int block_s = 8 >>lowres;
2267 switch (s->mv_type) {
2269 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2271 ref_picture, pix_op,
2272 s->mv[dir][0][0], s->mv[dir][0][1],
2278 for (i = 0; i < 4; i++) {
2279 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2280 s->linesize) * block_s,
2281 ref_picture[0], 0, 0,
2282 (2 * mb_x + (i & 1)) * block_s,
2283 (2 * mb_y + (i >> 1)) * block_s,
2284 s->width, s->height, s->linesize,
2285 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2286 block_s, block_s, pix_op,
2287 s->mv[dir][i][0], s->mv[dir][i][1]);
2289 mx += s->mv[dir][i][0];
2290 my += s->mv[dir][i][1];
2293 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2294 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2298 if (s->picture_structure == PICT_FRAME) {
2300 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2301 1, 0, s->field_select[dir][0],
2302 ref_picture, pix_op,
2303 s->mv[dir][0][0], s->mv[dir][0][1],
2306 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2307 1, 1, s->field_select[dir][1],
2308 ref_picture, pix_op,
2309 s->mv[dir][1][0], s->mv[dir][1][1],
2312 if (s->picture_structure != s->field_select[dir][0] + 1 &&
2313 s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2314 ref_picture = s->current_picture_ptr->f.data;
2317 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2318 0, 0, s->field_select[dir][0],
2319 ref_picture, pix_op,
2321 s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2325 for (i = 0; i < 2; i++) {
2326 uint8_t **ref2picture;
2328 if (s->picture_structure == s->field_select[dir][i] + 1 ||
2329 s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2330 ref2picture = ref_picture;
2332 ref2picture = s->current_picture_ptr->f.data;
2335 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2336 0, 0, s->field_select[dir][i],
2337 ref2picture, pix_op,
2338 s->mv[dir][i][0], s->mv[dir][i][1] +
2339 2 * block_s * i, block_s, mb_y >> 1);
2341 dest_y += 2 * block_s * s->linesize;
2342 dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2343 dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2347 if (s->picture_structure == PICT_FRAME) {
2348 for (i = 0; i < 2; i++) {
2350 for (j = 0; j < 2; j++) {
2351 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2353 ref_picture, pix_op,
2354 s->mv[dir][2 * i + j][0],
2355 s->mv[dir][2 * i + j][1],
2358 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2361 for (i = 0; i < 2; i++) {
2362 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2363 0, 0, s->picture_structure != i + 1,
2364 ref_picture, pix_op,
2365 s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2366 2 * block_s, mb_y >> 1);
2368 // after put we make avg of the same block
2369 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2371 // opposite parity is always in the same
2372 // frame if this is second field
2373 if (!s->first_field) {
2374 ref_picture = s->current_picture_ptr->f.data;
2385 * find the lowest MB row referenced in the MVs
2387 int ff_MPV_lowest_referenced_row(MpegEncContext *s, int dir)
2389 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2390 int my, off, i, mvs;
2392 if (s->picture_structure != PICT_FRAME || s->mcsel)
2395 switch (s->mv_type) {
2409 for (i = 0; i < mvs; i++) {
2410 my = s->mv[dir][i][1]<<qpel_shift;
2411 my_max = FFMAX(my_max, my);
2412 my_min = FFMIN(my_min, my);
2415 off = (FFMAX(-my_min, my_max) + 63) >> 6;
2417 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2419 return s->mb_height-1;
2422 /* put block[] to dest[] */
2423 static inline void put_dct(MpegEncContext *s,
2424 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2426 s->dct_unquantize_intra(s, block, i, qscale);
2427 s->dsp.idct_put (dest, line_size, block);
2430 /* add block[] to dest[] */
2431 static inline void add_dct(MpegEncContext *s,
2432 DCTELEM *block, int i, uint8_t *dest, int line_size)
2434 if (s->block_last_index[i] >= 0) {
2435 s->dsp.idct_add (dest, line_size, block);
2439 static inline void add_dequant_dct(MpegEncContext *s,
2440 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2442 if (s->block_last_index[i] >= 0) {
2443 s->dct_unquantize_inter(s, block, i, qscale);
2445 s->dsp.idct_add (dest, line_size, block);
2450 * Clean dc, ac, coded_block for the current non-intra MB.
2452 void ff_clean_intra_table_entries(MpegEncContext *s)
2454 int wrap = s->b8_stride;
2455 int xy = s->block_index[0];
2458 s->dc_val[0][xy + 1 ] =
2459 s->dc_val[0][xy + wrap] =
2460 s->dc_val[0][xy + 1 + wrap] = 1024;
2462 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2463 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2464 if (s->msmpeg4_version>=3) {
2465 s->coded_block[xy ] =
2466 s->coded_block[xy + 1 ] =
2467 s->coded_block[xy + wrap] =
2468 s->coded_block[xy + 1 + wrap] = 0;
2471 wrap = s->mb_stride;
2472 xy = s->mb_x + s->mb_y * wrap;
2474 s->dc_val[2][xy] = 1024;
2476 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2477 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2479 s->mbintra_table[xy]= 0;
2482 /* generic function called after a macroblock has been parsed by the
2483 decoder or after it has been encoded by the encoder.
2485 Important variables used:
2486 s->mb_intra : true if intra macroblock
2487 s->mv_dir : motion vector direction
2488 s->mv_type : motion vector type
2489 s->mv : motion vector
2490 s->interlaced_dct : true if interlaced dct used (mpeg2)
2492 static av_always_inline
2493 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2494 int lowres_flag, int is_mpeg12)
2496 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2497 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2498 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2502 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2503 /* save DCT coefficients */
2505 DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2506 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2508 for(j=0; j<64; j++){
2509 *dct++ = block[i][s->dsp.idct_permutation[j]];
2510 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2512 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2516 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2518 /* update DC predictors for P macroblocks */
2520 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2521 if(s->mbintra_table[mb_xy])
2522 ff_clean_intra_table_entries(s);
2526 s->last_dc[2] = 128 << s->intra_dc_precision;
2529 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2530 s->mbintra_table[mb_xy]=1;
2532 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
2533 uint8_t *dest_y, *dest_cb, *dest_cr;
2534 int dct_linesize, dct_offset;
2535 op_pixels_func (*op_pix)[4];
2536 qpel_mc_func (*op_qpix)[16];
2537 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2538 const int uvlinesize = s->current_picture.f.linesize[1];
2539 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2540 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2542 /* avoid copy if macroblock skipped in last frame too */
2543 /* skip only during decoding as we might trash the buffers during encoding a bit */
2545 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2547 if (s->mb_skipped) {
2549 av_assert2(s->pict_type!=AV_PICTURE_TYPE_I);
2551 } else if(!s->current_picture.f.reference) {
2554 *mbskip_ptr = 0; /* not skipped */
2558 dct_linesize = linesize << s->interlaced_dct;
2559 dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
2563 dest_cb= s->dest[1];
2564 dest_cr= s->dest[2];
2566 dest_y = s->b_scratchpad;
2567 dest_cb= s->b_scratchpad+16*linesize;
2568 dest_cr= s->b_scratchpad+32*linesize;
2572 /* motion handling */
2573 /* decoding or more than one mb_type (MC was already done otherwise) */
2576 if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2577 if (s->mv_dir & MV_DIR_FORWARD) {
2578 ff_thread_await_progress(&s->last_picture_ptr->f,
2579 ff_MPV_lowest_referenced_row(s, 0),
2582 if (s->mv_dir & MV_DIR_BACKWARD) {
2583 ff_thread_await_progress(&s->next_picture_ptr->f,
2584 ff_MPV_lowest_referenced_row(s, 1),
2590 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2592 if (s->mv_dir & MV_DIR_FORWARD) {
2593 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2594 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2596 if (s->mv_dir & MV_DIR_BACKWARD) {
2597 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2600 op_qpix= s->me.qpel_put;
2601 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2602 op_pix = s->dsp.put_pixels_tab;
2604 op_pix = s->dsp.put_no_rnd_pixels_tab;
2606 if (s->mv_dir & MV_DIR_FORWARD) {
2607 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2608 op_pix = s->dsp.avg_pixels_tab;
2609 op_qpix= s->me.qpel_avg;
2611 if (s->mv_dir & MV_DIR_BACKWARD) {
2612 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2617 /* skip dequant / idct if we are really late ;) */
2618 if(s->avctx->skip_idct){
2619 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2620 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2621 || s->avctx->skip_idct >= AVDISCARD_ALL)
2625 /* add dct residue */
2626 if(s->encoding || !( s->msmpeg4_version || s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO
2627 || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
2628 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2629 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2630 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2631 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2633 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2634 if (s->chroma_y_shift){
2635 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2636 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2640 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2641 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2642 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2643 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2646 } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
2647 add_dct(s, block[0], 0, dest_y , dct_linesize);
2648 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2649 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2650 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2652 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2653 if(s->chroma_y_shift){//Chroma420
2654 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2655 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2658 dct_linesize = uvlinesize << s->interlaced_dct;
2659 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
2661 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2662 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2663 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2664 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2665 if(!s->chroma_x_shift){//Chroma444
2666 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2667 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2668 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2669 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2674 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2675 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2678 /* dct only in intra block */
2679 if(s->encoding || !(s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO)){
2680 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2681 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2682 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2683 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2685 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2686 if(s->chroma_y_shift){
2687 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2688 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2692 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2693 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2694 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2695 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2699 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2700 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2701 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2702 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2704 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2705 if(s->chroma_y_shift){
2706 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2707 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2710 dct_linesize = uvlinesize << s->interlaced_dct;
2711 dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
2713 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2714 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2715 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2716 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2717 if(!s->chroma_x_shift){//Chroma444
2718 s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2719 s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2720 s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2721 s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2729 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2730 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2731 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2736 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2738 if(s->out_format == FMT_MPEG1) {
2739 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2740 else MPV_decode_mb_internal(s, block, 0, 1);
2743 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2744 else MPV_decode_mb_internal(s, block, 0, 0);
2748 * @param h is the normal height, this will be reduced automatically if needed for the last row
2750 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2751 const int field_pic= s->picture_structure != PICT_FRAME;
2757 if (!s->avctx->hwaccel
2758 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2759 && s->unrestricted_mv
2760 && s->current_picture.f.reference
2762 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2763 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
2764 int sides = 0, edge_h;
2765 int hshift = desc->log2_chroma_w;
2766 int vshift = desc->log2_chroma_h;
2767 if (y==0) sides |= EDGE_TOP;
2768 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2770 edge_h= FFMIN(h, s->v_edge_pos - y);
2772 s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2773 s->linesize, s->h_edge_pos, edge_h,
2774 EDGE_WIDTH, EDGE_WIDTH, sides);
2775 s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2776 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2777 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2778 s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2779 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2780 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2783 h= FFMIN(h, s->avctx->height - y);
2785 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2787 if (s->avctx->draw_horiz_band) {
2789 int offset[AV_NUM_DATA_POINTERS];
2792 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2793 src = &s->current_picture_ptr->f;
2794 else if(s->last_picture_ptr)
2795 src = &s->last_picture_ptr->f;
2799 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2800 for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2803 offset[0]= y * s->linesize;
2805 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2806 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2812 s->avctx->draw_horiz_band(s->avctx, src, offset,
2813 y, s->picture_structure, h);
2817 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2818 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2819 const int uvlinesize = s->current_picture.f.linesize[1];
2820 const int mb_size= 4 - s->avctx->lowres;
2822 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2823 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2824 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2825 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2826 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2827 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;
2828 //block_index is not used by mpeg2, so it is not affected by chroma_format
2830 s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2831 s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2832 s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2834 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2836 if(s->picture_structure==PICT_FRAME){
2837 s->dest[0] += s->mb_y * linesize << mb_size;
2838 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2839 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2841 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2842 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2843 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2844 av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2849 void ff_mpeg_flush(AVCodecContext *avctx){
2851 MpegEncContext *s = avctx->priv_data;
2853 if(s==NULL || s->picture==NULL)
2856 for(i=0; i<s->picture_count; i++){
2857 if (s->picture[i].f.data[0] &&
2858 (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2859 s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2860 free_frame_buffer(s, &s->picture[i]);
2862 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2864 s->mb_x= s->mb_y= 0;
2867 s->parse_context.state= -1;
2868 s->parse_context.frame_start_found= 0;
2869 s->parse_context.overread= 0;
2870 s->parse_context.overread_index= 0;
2871 s->parse_context.index= 0;
2872 s->parse_context.last_index= 0;
2873 s->bitstream_buffer_size=0;
2877 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2878 DCTELEM *block, int n, int qscale)
2880 int i, level, nCoeffs;
2881 const uint16_t *quant_matrix;
2883 nCoeffs= s->block_last_index[n];
2885 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2886 /* XXX: only mpeg1 */
2887 quant_matrix = s->intra_matrix;
2888 for(i=1;i<=nCoeffs;i++) {
2889 int j= s->intra_scantable.permutated[i];
2894 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2895 level = (level - 1) | 1;
2898 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2899 level = (level - 1) | 1;
2906 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2907 DCTELEM *block, int n, int qscale)
2909 int i, level, nCoeffs;
2910 const uint16_t *quant_matrix;
2912 nCoeffs= s->block_last_index[n];
2914 quant_matrix = s->inter_matrix;
2915 for(i=0; i<=nCoeffs; i++) {
2916 int j= s->intra_scantable.permutated[i];
2921 level = (((level << 1) + 1) * qscale *
2922 ((int) (quant_matrix[j]))) >> 4;
2923 level = (level - 1) | 1;
2926 level = (((level << 1) + 1) * qscale *
2927 ((int) (quant_matrix[j]))) >> 4;
2928 level = (level - 1) | 1;
2935 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2936 DCTELEM *block, int n, int qscale)
2938 int i, level, nCoeffs;
2939 const uint16_t *quant_matrix;
2941 if(s->alternate_scan) nCoeffs= 63;
2942 else nCoeffs= s->block_last_index[n];
2944 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2945 quant_matrix = s->intra_matrix;
2946 for(i=1;i<=nCoeffs;i++) {
2947 int j= s->intra_scantable.permutated[i];
2952 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2955 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2962 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2963 DCTELEM *block, int n, int qscale)
2965 int i, level, nCoeffs;
2966 const uint16_t *quant_matrix;
2969 if(s->alternate_scan) nCoeffs= 63;
2970 else nCoeffs= s->block_last_index[n];
2972 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2974 quant_matrix = s->intra_matrix;
2975 for(i=1;i<=nCoeffs;i++) {
2976 int j= s->intra_scantable.permutated[i];
2981 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2984 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2993 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2994 DCTELEM *block, int n, int qscale)
2996 int i, level, nCoeffs;
2997 const uint16_t *quant_matrix;
3000 if(s->alternate_scan) nCoeffs= 63;
3001 else nCoeffs= s->block_last_index[n];
3003 quant_matrix = s->inter_matrix;
3004 for(i=0; i<=nCoeffs; i++) {
3005 int j= s->intra_scantable.permutated[i];
3010 level = (((level << 1) + 1) * qscale *
3011 ((int) (quant_matrix[j]))) >> 4;
3014 level = (((level << 1) + 1) * qscale *
3015 ((int) (quant_matrix[j]))) >> 4;
3024 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
3025 DCTELEM *block, int n, int qscale)
3027 int i, level, qmul, qadd;
3030 assert(s->block_last_index[n]>=0);
3035 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
3036 qadd = (qscale - 1) | 1;
3043 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3045 for(i=1; i<=nCoeffs; i++) {
3049 level = level * qmul - qadd;
3051 level = level * qmul + qadd;
3058 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
3059 DCTELEM *block, int n, int qscale)
3061 int i, level, qmul, qadd;
3064 assert(s->block_last_index[n]>=0);
3066 qadd = (qscale - 1) | 1;
3069 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3071 for(i=0; i<=nCoeffs; i++) {
3075 level = level * qmul - qadd;
3077 level = level * qmul + qadd;
3085 * set qscale and update qscale dependent variables.
3087 void ff_set_qscale(MpegEncContext * s, int qscale)
3091 else if (qscale > 31)
3095 s->chroma_qscale= s->chroma_qscale_table[qscale];
3097 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3098 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3101 void ff_MPV_report_decode_progress(MpegEncContext *s)
3103 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred)
3104 ff_thread_report_progress(&s->current_picture_ptr->f, s->mb_y, 0);