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 memset(s->last_picture.f.data, 0, sizeof(s->last_picture.f.data));
1500 memset(s->next_picture.f.data, 0, sizeof(s->next_picture.f.data));
1501 if (s->last_picture_ptr)
1502 ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1503 if (s->next_picture_ptr)
1504 ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1506 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME)) {
1507 if (s->next_picture_ptr)
1508 s->next_picture_ptr->owner2 = s;
1509 if (s->last_picture_ptr)
1510 s->last_picture_ptr->owner2 = s;
1513 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
1514 s->last_picture_ptr->f.data[0]));
1516 if (s->picture_structure!= PICT_FRAME && s->out_format != FMT_H264) {
1518 for (i = 0; i < 4; i++) {
1519 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1520 s->current_picture.f.data[i] +=
1521 s->current_picture.f.linesize[i];
1523 s->current_picture.f.linesize[i] *= 2;
1524 s->last_picture.f.linesize[i] *= 2;
1525 s->next_picture.f.linesize[i] *= 2;
1529 s->err_recognition = avctx->err_recognition;
1531 /* set dequantizer, we can't do it during init as
1532 * it might change for mpeg4 and we can't do it in the header
1533 * decode as init is not called for mpeg4 there yet */
1534 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1535 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1536 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1537 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1538 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1539 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1541 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1542 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1545 if (s->dct_error_sum) {
1546 assert(s->avctx->noise_reduction && s->encoding);
1547 update_noise_reduction(s);
1550 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1551 return ff_xvmc_field_start(s, avctx);
1556 /* generic function for encode/decode called after a
1557 * frame has been coded/decoded. */
1558 void ff_MPV_frame_end(MpegEncContext *s)
1561 /* redraw edges for the frame if decoding didn't complete */
1562 // just to make sure that all data is rendered.
1563 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
1564 ff_xvmc_field_end(s);
1565 } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
1566 !s->avctx->hwaccel &&
1567 !(s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&
1568 s->unrestricted_mv &&
1569 s->current_picture.f.reference &&
1571 !(s->flags & CODEC_FLAG_EMU_EDGE) &&
1574 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1575 int hshift = desc->log2_chroma_w;
1576 int vshift = desc->log2_chroma_h;
1577 s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
1578 s->h_edge_pos, s->v_edge_pos,
1579 EDGE_WIDTH, EDGE_WIDTH,
1580 EDGE_TOP | EDGE_BOTTOM);
1581 s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
1582 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1583 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1584 EDGE_TOP | EDGE_BOTTOM);
1585 s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
1586 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1587 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1588 EDGE_TOP | EDGE_BOTTOM);
1593 s->last_pict_type = s->pict_type;
1594 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality;
1595 if (s->pict_type!= AV_PICTURE_TYPE_B) {
1596 s->last_non_b_pict_type = s->pict_type;
1599 /* copy back current_picture variables */
1600 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1601 if (s->picture[i].f.data[0] == s->current_picture.f.data[0]) {
1602 s->picture[i] = s->current_picture;
1606 assert(i < MAX_PICTURE_COUNT);
1610 /* release non-reference frames */
1611 for (i = 0; i < s->picture_count; i++) {
1612 if (s->picture[i].f.data[0] && !s->picture[i].f.reference
1613 /* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */) {
1614 free_frame_buffer(s, &s->picture[i]);
1618 // clear copies, to avoid confusion
1620 memset(&s->last_picture, 0, sizeof(Picture));
1621 memset(&s->next_picture, 0, sizeof(Picture));
1622 memset(&s->current_picture, 0, sizeof(Picture));
1624 s->avctx->coded_frame = &s->current_picture_ptr->f;
1626 if (s->codec_id != AV_CODEC_ID_H264 && s->current_picture.f.reference) {
1627 ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
1632 * Draw a line from (ex, ey) -> (sx, sy).
1633 * @param w width of the image
1634 * @param h height of the image
1635 * @param stride stride/linesize of the image
1636 * @param color color of the arrow
1638 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
1639 int w, int h, int stride, int color)
1643 sx = av_clip(sx, 0, w - 1);
1644 sy = av_clip(sy, 0, h - 1);
1645 ex = av_clip(ex, 0, w - 1);
1646 ey = av_clip(ey, 0, h - 1);
1648 buf[sy * stride + sx] += color;
1650 if (FFABS(ex - sx) > FFABS(ey - sy)) {
1652 FFSWAP(int, sx, ex);
1653 FFSWAP(int, sy, ey);
1655 buf += sx + sy * stride;
1657 f = ((ey - sy) << 16) / ex;
1658 for(x= 0; x <= ex; x++){
1660 fr = (x * f) & 0xFFFF;
1661 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1662 if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
1666 FFSWAP(int, sx, ex);
1667 FFSWAP(int, sy, ey);
1669 buf += sx + sy * stride;
1672 f = ((ex - sx) << 16) / ey;
1675 for(y= 0; y <= ey; y++){
1677 fr = (y*f) & 0xFFFF;
1678 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1679 if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
1685 * Draw an arrow from (ex, ey) -> (sx, sy).
1686 * @param w width of the image
1687 * @param h height of the image
1688 * @param stride stride/linesize of the image
1689 * @param color color of the arrow
1691 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
1692 int ey, int w, int h, int stride, int color)
1696 sx = av_clip(sx, -100, w + 100);
1697 sy = av_clip(sy, -100, h + 100);
1698 ex = av_clip(ex, -100, w + 100);
1699 ey = av_clip(ey, -100, h + 100);
1704 if (dx * dx + dy * dy > 3 * 3) {
1707 int length = ff_sqrt((rx * rx + ry * ry) << 8);
1709 // FIXME subpixel accuracy
1710 rx = ROUNDED_DIV(rx * 3 << 4, length);
1711 ry = ROUNDED_DIV(ry * 3 << 4, length);
1713 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1714 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1716 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1720 * Print debugging info for the given picture.
1722 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict)
1724 if ( s->avctx->hwaccel || !pict || !pict->mb_type
1725 || (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU))
1729 if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
1732 av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
1733 av_get_picture_type_char(pict->pict_type));
1734 for (y = 0; y < s->mb_height; y++) {
1735 for (x = 0; x < s->mb_width; x++) {
1736 if (s->avctx->debug & FF_DEBUG_SKIP) {
1737 int count = s->mbskip_table[x + y * s->mb_stride];
1740 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1742 if (s->avctx->debug & FF_DEBUG_QP) {
1743 av_log(s->avctx, AV_LOG_DEBUG, "%2d",
1744 pict->qscale_table[x + y * s->mb_stride]);
1746 if (s->avctx->debug & FF_DEBUG_MB_TYPE) {
1747 int mb_type = pict->mb_type[x + y * s->mb_stride];
1748 // Type & MV direction
1749 if (IS_PCM(mb_type))
1750 av_log(s->avctx, AV_LOG_DEBUG, "P");
1751 else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1752 av_log(s->avctx, AV_LOG_DEBUG, "A");
1753 else if (IS_INTRA4x4(mb_type))
1754 av_log(s->avctx, AV_LOG_DEBUG, "i");
1755 else if (IS_INTRA16x16(mb_type))
1756 av_log(s->avctx, AV_LOG_DEBUG, "I");
1757 else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1758 av_log(s->avctx, AV_LOG_DEBUG, "d");
1759 else if (IS_DIRECT(mb_type))
1760 av_log(s->avctx, AV_LOG_DEBUG, "D");
1761 else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
1762 av_log(s->avctx, AV_LOG_DEBUG, "g");
1763 else if (IS_GMC(mb_type))
1764 av_log(s->avctx, AV_LOG_DEBUG, "G");
1765 else if (IS_SKIP(mb_type))
1766 av_log(s->avctx, AV_LOG_DEBUG, "S");
1767 else if (!USES_LIST(mb_type, 1))
1768 av_log(s->avctx, AV_LOG_DEBUG, ">");
1769 else if (!USES_LIST(mb_type, 0))
1770 av_log(s->avctx, AV_LOG_DEBUG, "<");
1772 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1773 av_log(s->avctx, AV_LOG_DEBUG, "X");
1777 if (IS_8X8(mb_type))
1778 av_log(s->avctx, AV_LOG_DEBUG, "+");
1779 else if (IS_16X8(mb_type))
1780 av_log(s->avctx, AV_LOG_DEBUG, "-");
1781 else if (IS_8X16(mb_type))
1782 av_log(s->avctx, AV_LOG_DEBUG, "|");
1783 else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
1784 av_log(s->avctx, AV_LOG_DEBUG, " ");
1786 av_log(s->avctx, AV_LOG_DEBUG, "?");
1789 if (IS_INTERLACED(mb_type))
1790 av_log(s->avctx, AV_LOG_DEBUG, "=");
1792 av_log(s->avctx, AV_LOG_DEBUG, " ");
1795 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1799 if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
1800 (s->avctx->debug_mv)) {
1801 const int shift = 1 + s->quarter_sample;
1805 int h_chroma_shift, v_chroma_shift, block_height;
1806 const int width = s->avctx->width;
1807 const int height = s->avctx->height;
1808 const int mv_sample_log2 = 4 - pict->motion_subsample_log2;
1809 const int mv_stride = (s->mb_width << mv_sample_log2) +
1810 (s->codec_id == AV_CODEC_ID_H264 ? 0 : 1);
1811 s->low_delay = 0; // needed to see the vectors without trashing the buffers
1813 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1815 for (i = 0; i < 3; i++) {
1816 size_t size= (i == 0) ? pict->linesize[i] * FFALIGN(height, 16):
1817 pict->linesize[i] * FFALIGN(height, 16) >> v_chroma_shift;
1818 s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
1819 memcpy(s->visualization_buffer[i], pict->data[i], size);
1820 pict->data[i] = s->visualization_buffer[i];
1822 pict->type = FF_BUFFER_TYPE_COPY;
1824 ptr = pict->data[0];
1825 block_height = 16 >> v_chroma_shift;
1827 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1829 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1830 const int mb_index = mb_x + mb_y * s->mb_stride;
1831 if ((s->avctx->debug_mv) && pict->motion_val[0]) {
1833 for (type = 0; type < 3; type++) {
1837 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
1838 (pict->pict_type!= AV_PICTURE_TYPE_P))
1843 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
1844 (pict->pict_type!= AV_PICTURE_TYPE_B))
1849 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
1850 (pict->pict_type!= AV_PICTURE_TYPE_B))
1855 if (!USES_LIST(pict->mb_type[mb_index], direction))
1858 if (IS_8X8(pict->mb_type[mb_index])) {
1860 for (i = 0; i < 4; i++) {
1861 int sx = mb_x * 16 + 4 + 8 * (i & 1);
1862 int sy = mb_y * 16 + 4 + 8 * (i >> 1);
1863 int xy = (mb_x * 2 + (i & 1) +
1864 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1865 int mx = (pict->motion_val[direction][xy][0] >> shift) + sx;
1866 int my = (pict->motion_val[direction][xy][1] >> shift) + sy;
1867 draw_arrow(ptr, sx, sy, mx, my, width,
1868 height, s->linesize, 100);
1870 } else if (IS_16X8(pict->mb_type[mb_index])) {
1872 for (i = 0; i < 2; i++) {
1873 int sx = mb_x * 16 + 8;
1874 int sy = mb_y * 16 + 4 + 8 * i;
1875 int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
1876 int mx = (pict->motion_val[direction][xy][0] >> shift);
1877 int my = (pict->motion_val[direction][xy][1] >> shift);
1879 if (IS_INTERLACED(pict->mb_type[mb_index]))
1882 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1883 height, s->linesize, 100);
1885 } else if (IS_8X16(pict->mb_type[mb_index])) {
1887 for (i = 0; i < 2; i++) {
1888 int sx = mb_x * 16 + 4 + 8 * i;
1889 int sy = mb_y * 16 + 8;
1890 int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
1891 int mx = pict->motion_val[direction][xy][0] >> shift;
1892 int my = pict->motion_val[direction][xy][1] >> shift;
1894 if (IS_INTERLACED(pict->mb_type[mb_index]))
1897 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1898 height, s->linesize, 100);
1901 int sx= mb_x * 16 + 8;
1902 int sy= mb_y * 16 + 8;
1903 int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
1904 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1905 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1906 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1910 if ((s->avctx->debug & FF_DEBUG_VIS_QP)) {
1911 uint64_t c = (pict->qscale_table[mb_index] * 128 / 31) *
1912 0x0101010101010101ULL;
1914 for (y = 0; y < block_height; y++) {
1915 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1916 (block_height * mb_y + y) *
1917 pict->linesize[1]) = c;
1918 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1919 (block_height * mb_y + y) *
1920 pict->linesize[2]) = c;
1923 if ((s->avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
1924 pict->motion_val[0]) {
1925 int mb_type = pict->mb_type[mb_index];
1928 #define COLOR(theta, r) \
1929 u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
1930 v = (int)(128 + r * sin(theta * 3.141592 / 180));
1934 if (IS_PCM(mb_type)) {
1936 } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
1937 IS_INTRA16x16(mb_type)) {
1939 } else if (IS_INTRA4x4(mb_type)) {
1941 } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
1943 } else if (IS_DIRECT(mb_type)) {
1945 } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
1947 } else if (IS_GMC(mb_type)) {
1949 } else if (IS_SKIP(mb_type)) {
1951 } else if (!USES_LIST(mb_type, 1)) {
1953 } else if (!USES_LIST(mb_type, 0)) {
1956 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1960 u *= 0x0101010101010101ULL;
1961 v *= 0x0101010101010101ULL;
1962 for (y = 0; y < block_height; y++) {
1963 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1964 (block_height * mb_y + y) * pict->linesize[1]) = u;
1965 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1966 (block_height * mb_y + y) * pict->linesize[2]) = v;
1970 if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
1971 *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
1972 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1973 *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
1974 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1976 if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
1977 for (y = 0; y < 16; y++)
1978 pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
1979 pict->linesize[0]] ^= 0x80;
1981 if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
1982 int dm = 1 << (mv_sample_log2 - 2);
1983 for (i = 0; i < 4; i++) {
1984 int sx = mb_x * 16 + 8 * (i & 1);
1985 int sy = mb_y * 16 + 8 * (i >> 1);
1986 int xy = (mb_x * 2 + (i & 1) +
1987 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1989 int32_t *mv = (int32_t *) &pict->motion_val[0][xy];
1990 if (mv[0] != mv[dm] ||
1991 mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
1992 for (y = 0; y < 8; y++)
1993 pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
1994 if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
1995 *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
1996 pict->linesize[0]) ^= 0x8080808080808080ULL;
2000 if (IS_INTERLACED(mb_type) &&
2001 s->codec_id == AV_CODEC_ID_H264) {
2005 s->mbskip_table[mb_index] = 0;
2011 static inline int hpel_motion_lowres(MpegEncContext *s,
2012 uint8_t *dest, uint8_t *src,
2013 int field_based, int field_select,
2014 int src_x, int src_y,
2015 int width, int height, int stride,
2016 int h_edge_pos, int v_edge_pos,
2017 int w, int h, h264_chroma_mc_func *pix_op,
2018 int motion_x, int motion_y)
2020 const int lowres = s->avctx->lowres;
2021 const int op_index = FFMIN(lowres, 2);
2022 const int s_mask = (2 << lowres) - 1;
2026 if (s->quarter_sample) {
2031 sx = motion_x & s_mask;
2032 sy = motion_y & s_mask;
2033 src_x += motion_x >> lowres + 1;
2034 src_y += motion_y >> lowres + 1;
2036 src += src_y * stride + src_x;
2038 if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
2039 (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2040 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
2041 (h + 1) << field_based, src_x,
2042 src_y << field_based,
2045 src = s->edge_emu_buffer;
2049 sx = (sx << 2) >> lowres;
2050 sy = (sy << 2) >> lowres;
2053 pix_op[op_index](dest, src, stride, h, sx, sy);
2057 /* apply one mpeg motion vector to the three components */
2058 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
2065 uint8_t **ref_picture,
2066 h264_chroma_mc_func *pix_op,
2067 int motion_x, int motion_y,
2070 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2071 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
2073 const int lowres = s->avctx->lowres;
2074 const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 2);
2075 const int block_s = 8>>lowres;
2076 const int s_mask = (2 << lowres) - 1;
2077 const int h_edge_pos = s->h_edge_pos >> lowres;
2078 const int v_edge_pos = s->v_edge_pos >> lowres;
2079 linesize = s->current_picture.f.linesize[0] << field_based;
2080 uvlinesize = s->current_picture.f.linesize[1] << field_based;
2082 // FIXME obviously not perfect but qpel will not work in lowres anyway
2083 if (s->quarter_sample) {
2089 motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2092 sx = motion_x & s_mask;
2093 sy = motion_y & s_mask;
2094 src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2095 src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2097 if (s->out_format == FMT_H263) {
2098 uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2099 uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2100 uvsrc_x = src_x >> 1;
2101 uvsrc_y = src_y >> 1;
2102 } else if (s->out_format == FMT_H261) {
2103 // even chroma mv's are full pel in H261
2106 uvsx = (2 * mx) & s_mask;
2107 uvsy = (2 * my) & s_mask;
2108 uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2109 uvsrc_y = mb_y * block_s + (my >> lowres);
2111 if(s->chroma_y_shift){
2116 uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2117 uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2119 if(s->chroma_x_shift){
2123 uvsy = motion_y & s_mask;
2125 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2128 uvsx = motion_x & s_mask;
2129 uvsy = motion_y & s_mask;
2136 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2137 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2138 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2140 if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) ||
2141 (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2142 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2143 linesize >> field_based, 17, 17 + field_based,
2144 src_x, src_y << field_based, h_edge_pos,
2146 ptr_y = s->edge_emu_buffer;
2147 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2148 uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
2149 s->vdsp.emulated_edge_mc(uvbuf , ptr_cb, uvlinesize >> field_based, 9,
2151 uvsrc_x, uvsrc_y << field_based,
2152 h_edge_pos >> 1, v_edge_pos >> 1);
2153 s->vdsp.emulated_edge_mc(uvbuf + 16, ptr_cr, uvlinesize >> field_based, 9,
2155 uvsrc_x, uvsrc_y << field_based,
2156 h_edge_pos >> 1, v_edge_pos >> 1);
2158 ptr_cr = uvbuf + 16;
2162 // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
2164 dest_y += s->linesize;
2165 dest_cb += s->uvlinesize;
2166 dest_cr += s->uvlinesize;
2170 ptr_y += s->linesize;
2171 ptr_cb += s->uvlinesize;
2172 ptr_cr += s->uvlinesize;
2175 sx = (sx << 2) >> lowres;
2176 sy = (sy << 2) >> lowres;
2177 pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2179 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2180 uvsx = (uvsx << 2) >> lowres;
2181 uvsy = (uvsy << 2) >> lowres;
2182 if (h >> s->chroma_y_shift) {
2183 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2184 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2187 // FIXME h261 lowres loop filter
2190 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
2191 uint8_t *dest_cb, uint8_t *dest_cr,
2192 uint8_t **ref_picture,
2193 h264_chroma_mc_func * pix_op,
2196 const int lowres = s->avctx->lowres;
2197 const int op_index = FFMIN(lowres, 2);
2198 const int block_s = 8 >> lowres;
2199 const int s_mask = (2 << lowres) - 1;
2200 const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2201 const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2202 int emu = 0, src_x, src_y, offset, sx, sy;
2205 if (s->quarter_sample) {
2210 /* In case of 8X8, we construct a single chroma motion vector
2211 with a special rounding */
2212 mx = ff_h263_round_chroma(mx);
2213 my = ff_h263_round_chroma(my);
2217 src_x = s->mb_x * block_s + (mx >> lowres + 1);
2218 src_y = s->mb_y * block_s + (my >> lowres + 1);
2220 offset = src_y * s->uvlinesize + src_x;
2221 ptr = ref_picture[1] + offset;
2222 if (s->flags & CODEC_FLAG_EMU_EDGE) {
2223 if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2224 (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2225 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
2226 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2227 ptr = s->edge_emu_buffer;
2231 sx = (sx << 2) >> lowres;
2232 sy = (sy << 2) >> lowres;
2233 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2235 ptr = ref_picture[2] + offset;
2237 s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2238 src_x, src_y, h_edge_pos, v_edge_pos);
2239 ptr = s->edge_emu_buffer;
2241 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2245 * motion compensation of a single macroblock
2247 * @param dest_y luma destination pointer
2248 * @param dest_cb chroma cb/u destination pointer
2249 * @param dest_cr chroma cr/v destination pointer
2250 * @param dir direction (0->forward, 1->backward)
2251 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2252 * @param pix_op halfpel motion compensation function (average or put normally)
2253 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2255 static inline void MPV_motion_lowres(MpegEncContext *s,
2256 uint8_t *dest_y, uint8_t *dest_cb,
2258 int dir, uint8_t **ref_picture,
2259 h264_chroma_mc_func *pix_op)
2263 const int lowres = s->avctx->lowres;
2264 const int block_s = 8 >>lowres;
2269 switch (s->mv_type) {
2271 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2273 ref_picture, pix_op,
2274 s->mv[dir][0][0], s->mv[dir][0][1],
2280 for (i = 0; i < 4; i++) {
2281 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2282 s->linesize) * block_s,
2283 ref_picture[0], 0, 0,
2284 (2 * mb_x + (i & 1)) * block_s,
2285 (2 * mb_y + (i >> 1)) * block_s,
2286 s->width, s->height, s->linesize,
2287 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2288 block_s, block_s, pix_op,
2289 s->mv[dir][i][0], s->mv[dir][i][1]);
2291 mx += s->mv[dir][i][0];
2292 my += s->mv[dir][i][1];
2295 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2296 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2300 if (s->picture_structure == PICT_FRAME) {
2302 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2303 1, 0, s->field_select[dir][0],
2304 ref_picture, pix_op,
2305 s->mv[dir][0][0], s->mv[dir][0][1],
2308 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2309 1, 1, s->field_select[dir][1],
2310 ref_picture, pix_op,
2311 s->mv[dir][1][0], s->mv[dir][1][1],
2314 if (s->picture_structure != s->field_select[dir][0] + 1 &&
2315 s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2316 ref_picture = s->current_picture_ptr->f.data;
2319 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2320 0, 0, s->field_select[dir][0],
2321 ref_picture, pix_op,
2323 s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2327 for (i = 0; i < 2; i++) {
2328 uint8_t **ref2picture;
2330 if (s->picture_structure == s->field_select[dir][i] + 1 ||
2331 s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2332 ref2picture = ref_picture;
2334 ref2picture = s->current_picture_ptr->f.data;
2337 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2338 0, 0, s->field_select[dir][i],
2339 ref2picture, pix_op,
2340 s->mv[dir][i][0], s->mv[dir][i][1] +
2341 2 * block_s * i, block_s, mb_y >> 1);
2343 dest_y += 2 * block_s * s->linesize;
2344 dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2345 dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2349 if (s->picture_structure == PICT_FRAME) {
2350 for (i = 0; i < 2; i++) {
2352 for (j = 0; j < 2; j++) {
2353 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2355 ref_picture, pix_op,
2356 s->mv[dir][2 * i + j][0],
2357 s->mv[dir][2 * i + j][1],
2360 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2363 for (i = 0; i < 2; i++) {
2364 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2365 0, 0, s->picture_structure != i + 1,
2366 ref_picture, pix_op,
2367 s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2368 2 * block_s, mb_y >> 1);
2370 // after put we make avg of the same block
2371 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2373 // opposite parity is always in the same
2374 // frame if this is second field
2375 if (!s->first_field) {
2376 ref_picture = s->current_picture_ptr->f.data;
2387 * find the lowest MB row referenced in the MVs
2389 int ff_MPV_lowest_referenced_row(MpegEncContext *s, int dir)
2391 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2392 int my, off, i, mvs;
2394 if (s->picture_structure != PICT_FRAME || s->mcsel)
2397 switch (s->mv_type) {
2411 for (i = 0; i < mvs; i++) {
2412 my = s->mv[dir][i][1]<<qpel_shift;
2413 my_max = FFMAX(my_max, my);
2414 my_min = FFMIN(my_min, my);
2417 off = (FFMAX(-my_min, my_max) + 63) >> 6;
2419 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2421 return s->mb_height-1;
2424 /* put block[] to dest[] */
2425 static inline void put_dct(MpegEncContext *s,
2426 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2428 s->dct_unquantize_intra(s, block, i, qscale);
2429 s->dsp.idct_put (dest, line_size, block);
2432 /* add block[] to dest[] */
2433 static inline void add_dct(MpegEncContext *s,
2434 DCTELEM *block, int i, uint8_t *dest, int line_size)
2436 if (s->block_last_index[i] >= 0) {
2437 s->dsp.idct_add (dest, line_size, block);
2441 static inline void add_dequant_dct(MpegEncContext *s,
2442 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2444 if (s->block_last_index[i] >= 0) {
2445 s->dct_unquantize_inter(s, block, i, qscale);
2447 s->dsp.idct_add (dest, line_size, block);
2452 * Clean dc, ac, coded_block for the current non-intra MB.
2454 void ff_clean_intra_table_entries(MpegEncContext *s)
2456 int wrap = s->b8_stride;
2457 int xy = s->block_index[0];
2460 s->dc_val[0][xy + 1 ] =
2461 s->dc_val[0][xy + wrap] =
2462 s->dc_val[0][xy + 1 + wrap] = 1024;
2464 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2465 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2466 if (s->msmpeg4_version>=3) {
2467 s->coded_block[xy ] =
2468 s->coded_block[xy + 1 ] =
2469 s->coded_block[xy + wrap] =
2470 s->coded_block[xy + 1 + wrap] = 0;
2473 wrap = s->mb_stride;
2474 xy = s->mb_x + s->mb_y * wrap;
2476 s->dc_val[2][xy] = 1024;
2478 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2479 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2481 s->mbintra_table[xy]= 0;
2484 /* generic function called after a macroblock has been parsed by the
2485 decoder or after it has been encoded by the encoder.
2487 Important variables used:
2488 s->mb_intra : true if intra macroblock
2489 s->mv_dir : motion vector direction
2490 s->mv_type : motion vector type
2491 s->mv : motion vector
2492 s->interlaced_dct : true if interlaced dct used (mpeg2)
2494 static av_always_inline
2495 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2496 int lowres_flag, int is_mpeg12)
2498 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2499 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2500 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2504 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2505 /* save DCT coefficients */
2507 DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2508 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2510 for(j=0; j<64; j++){
2511 *dct++ = block[i][s->dsp.idct_permutation[j]];
2512 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2514 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2518 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2520 /* update DC predictors for P macroblocks */
2522 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2523 if(s->mbintra_table[mb_xy])
2524 ff_clean_intra_table_entries(s);
2528 s->last_dc[2] = 128 << s->intra_dc_precision;
2531 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2532 s->mbintra_table[mb_xy]=1;
2534 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
2535 uint8_t *dest_y, *dest_cb, *dest_cr;
2536 int dct_linesize, dct_offset;
2537 op_pixels_func (*op_pix)[4];
2538 qpel_mc_func (*op_qpix)[16];
2539 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2540 const int uvlinesize = s->current_picture.f.linesize[1];
2541 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2542 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2544 /* avoid copy if macroblock skipped in last frame too */
2545 /* skip only during decoding as we might trash the buffers during encoding a bit */
2547 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2549 if (s->mb_skipped) {
2551 av_assert2(s->pict_type!=AV_PICTURE_TYPE_I);
2553 } else if(!s->current_picture.f.reference) {
2556 *mbskip_ptr = 0; /* not skipped */
2560 dct_linesize = linesize << s->interlaced_dct;
2561 dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
2565 dest_cb= s->dest[1];
2566 dest_cr= s->dest[2];
2568 dest_y = s->b_scratchpad;
2569 dest_cb= s->b_scratchpad+16*linesize;
2570 dest_cr= s->b_scratchpad+32*linesize;
2574 /* motion handling */
2575 /* decoding or more than one mb_type (MC was already done otherwise) */
2578 if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2579 if (s->mv_dir & MV_DIR_FORWARD) {
2580 ff_thread_await_progress(&s->last_picture_ptr->f,
2581 ff_MPV_lowest_referenced_row(s, 0),
2584 if (s->mv_dir & MV_DIR_BACKWARD) {
2585 ff_thread_await_progress(&s->next_picture_ptr->f,
2586 ff_MPV_lowest_referenced_row(s, 1),
2592 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2594 if (s->mv_dir & MV_DIR_FORWARD) {
2595 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2596 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2598 if (s->mv_dir & MV_DIR_BACKWARD) {
2599 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2602 op_qpix= s->me.qpel_put;
2603 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2604 op_pix = s->dsp.put_pixels_tab;
2606 op_pix = s->dsp.put_no_rnd_pixels_tab;
2608 if (s->mv_dir & MV_DIR_FORWARD) {
2609 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2610 op_pix = s->dsp.avg_pixels_tab;
2611 op_qpix= s->me.qpel_avg;
2613 if (s->mv_dir & MV_DIR_BACKWARD) {
2614 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2619 /* skip dequant / idct if we are really late ;) */
2620 if(s->avctx->skip_idct){
2621 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2622 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2623 || s->avctx->skip_idct >= AVDISCARD_ALL)
2627 /* add dct residue */
2628 if(s->encoding || !( s->msmpeg4_version || s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO
2629 || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
2630 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2631 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2632 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2633 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2635 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2636 if (s->chroma_y_shift){
2637 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2638 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2642 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2643 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2644 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2645 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2648 } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
2649 add_dct(s, block[0], 0, dest_y , dct_linesize);
2650 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2651 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2652 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2654 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2655 if(s->chroma_y_shift){//Chroma420
2656 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2657 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2660 dct_linesize = uvlinesize << s->interlaced_dct;
2661 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
2663 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2664 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2665 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2666 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2667 if(!s->chroma_x_shift){//Chroma444
2668 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2669 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2670 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2671 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2676 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2677 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2680 /* dct only in intra block */
2681 if(s->encoding || !(s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO)){
2682 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2683 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2684 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2685 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2687 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2688 if(s->chroma_y_shift){
2689 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2690 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2694 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2695 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2696 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2697 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2701 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2702 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2703 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2704 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2706 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2707 if(s->chroma_y_shift){
2708 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2709 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2712 dct_linesize = uvlinesize << s->interlaced_dct;
2713 dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
2715 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2716 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2717 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2718 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2719 if(!s->chroma_x_shift){//Chroma444
2720 s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2721 s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2722 s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2723 s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2731 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2732 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2733 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2738 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2740 if(s->out_format == FMT_MPEG1) {
2741 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2742 else MPV_decode_mb_internal(s, block, 0, 1);
2745 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2746 else MPV_decode_mb_internal(s, block, 0, 0);
2750 * @param h is the normal height, this will be reduced automatically if needed for the last row
2752 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2753 const int field_pic= s->picture_structure != PICT_FRAME;
2759 if (!s->avctx->hwaccel
2760 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2761 && s->unrestricted_mv
2762 && s->current_picture.f.reference
2764 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2765 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
2766 int sides = 0, edge_h;
2767 int hshift = desc->log2_chroma_w;
2768 int vshift = desc->log2_chroma_h;
2769 if (y==0) sides |= EDGE_TOP;
2770 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2772 edge_h= FFMIN(h, s->v_edge_pos - y);
2774 s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2775 s->linesize, s->h_edge_pos, edge_h,
2776 EDGE_WIDTH, EDGE_WIDTH, sides);
2777 s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2778 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2779 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2780 s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2781 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2782 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2785 h= FFMIN(h, s->avctx->height - y);
2787 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2789 if (s->avctx->draw_horiz_band) {
2791 int offset[AV_NUM_DATA_POINTERS];
2794 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2795 src = &s->current_picture_ptr->f;
2796 else if(s->last_picture_ptr)
2797 src = &s->last_picture_ptr->f;
2801 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2802 for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2805 offset[0]= y * s->linesize;
2807 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2808 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2814 s->avctx->draw_horiz_band(s->avctx, src, offset,
2815 y, s->picture_structure, h);
2819 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2820 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2821 const int uvlinesize = s->current_picture.f.linesize[1];
2822 const int mb_size= 4 - s->avctx->lowres;
2824 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2825 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2826 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2827 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2828 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2829 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;
2830 //block_index is not used by mpeg2, so it is not affected by chroma_format
2832 s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2833 s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2834 s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2836 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2838 if(s->picture_structure==PICT_FRAME){
2839 s->dest[0] += s->mb_y * linesize << mb_size;
2840 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2841 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2843 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2844 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2845 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2846 av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2851 void ff_mpeg_flush(AVCodecContext *avctx){
2853 MpegEncContext *s = avctx->priv_data;
2855 if(s==NULL || s->picture==NULL)
2858 for(i=0; i<s->picture_count; i++){
2859 if (s->picture[i].f.data[0] &&
2860 (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2861 s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2862 free_frame_buffer(s, &s->picture[i]);
2864 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2866 s->mb_x= s->mb_y= 0;
2869 s->parse_context.state= -1;
2870 s->parse_context.frame_start_found= 0;
2871 s->parse_context.overread= 0;
2872 s->parse_context.overread_index= 0;
2873 s->parse_context.index= 0;
2874 s->parse_context.last_index= 0;
2875 s->bitstream_buffer_size=0;
2879 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2880 DCTELEM *block, int n, int qscale)
2882 int i, level, nCoeffs;
2883 const uint16_t *quant_matrix;
2885 nCoeffs= s->block_last_index[n];
2887 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2888 /* XXX: only mpeg1 */
2889 quant_matrix = s->intra_matrix;
2890 for(i=1;i<=nCoeffs;i++) {
2891 int j= s->intra_scantable.permutated[i];
2896 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2897 level = (level - 1) | 1;
2900 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2901 level = (level - 1) | 1;
2908 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2909 DCTELEM *block, int n, int qscale)
2911 int i, level, nCoeffs;
2912 const uint16_t *quant_matrix;
2914 nCoeffs= s->block_last_index[n];
2916 quant_matrix = s->inter_matrix;
2917 for(i=0; i<=nCoeffs; i++) {
2918 int j= s->intra_scantable.permutated[i];
2923 level = (((level << 1) + 1) * qscale *
2924 ((int) (quant_matrix[j]))) >> 4;
2925 level = (level - 1) | 1;
2928 level = (((level << 1) + 1) * qscale *
2929 ((int) (quant_matrix[j]))) >> 4;
2930 level = (level - 1) | 1;
2937 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2938 DCTELEM *block, int n, int qscale)
2940 int i, level, nCoeffs;
2941 const uint16_t *quant_matrix;
2943 if(s->alternate_scan) nCoeffs= 63;
2944 else nCoeffs= s->block_last_index[n];
2946 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2947 quant_matrix = s->intra_matrix;
2948 for(i=1;i<=nCoeffs;i++) {
2949 int j= s->intra_scantable.permutated[i];
2954 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2957 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2964 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2965 DCTELEM *block, int n, int qscale)
2967 int i, level, nCoeffs;
2968 const uint16_t *quant_matrix;
2971 if(s->alternate_scan) nCoeffs= 63;
2972 else nCoeffs= s->block_last_index[n];
2974 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2976 quant_matrix = s->intra_matrix;
2977 for(i=1;i<=nCoeffs;i++) {
2978 int j= s->intra_scantable.permutated[i];
2983 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2986 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2995 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2996 DCTELEM *block, int n, int qscale)
2998 int i, level, nCoeffs;
2999 const uint16_t *quant_matrix;
3002 if(s->alternate_scan) nCoeffs= 63;
3003 else nCoeffs= s->block_last_index[n];
3005 quant_matrix = s->inter_matrix;
3006 for(i=0; i<=nCoeffs; i++) {
3007 int j= s->intra_scantable.permutated[i];
3012 level = (((level << 1) + 1) * qscale *
3013 ((int) (quant_matrix[j]))) >> 4;
3016 level = (((level << 1) + 1) * qscale *
3017 ((int) (quant_matrix[j]))) >> 4;
3026 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
3027 DCTELEM *block, int n, int qscale)
3029 int i, level, qmul, qadd;
3032 assert(s->block_last_index[n]>=0);
3037 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
3038 qadd = (qscale - 1) | 1;
3045 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3047 for(i=1; i<=nCoeffs; i++) {
3051 level = level * qmul - qadd;
3053 level = level * qmul + qadd;
3060 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
3061 DCTELEM *block, int n, int qscale)
3063 int i, level, qmul, qadd;
3066 assert(s->block_last_index[n]>=0);
3068 qadd = (qscale - 1) | 1;
3071 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3073 for(i=0; i<=nCoeffs; i++) {
3077 level = level * qmul - qadd;
3079 level = level * qmul + qadd;
3087 * set qscale and update qscale dependent variables.
3089 void ff_set_qscale(MpegEncContext * s, int qscale)
3093 else if (qscale > 31)
3097 s->chroma_qscale= s->chroma_qscale_table[qscale];
3099 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3100 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3103 void ff_MPV_report_decode_progress(MpegEncContext *s)
3105 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred)
3106 ff_thread_report_progress(&s->current_picture_ptr->f, s->mb_y, 0);