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);
176 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
177 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
178 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
179 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
180 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
181 if (s->flags & CODEC_FLAG_BITEXACT)
182 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
183 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
186 ff_MPV_common_init_x86(s);
188 ff_MPV_common_init_axp(s);
190 ff_MPV_common_init_arm(s);
192 ff_MPV_common_init_altivec(s);
194 ff_MPV_common_init_bfin(s);
197 /* load & permutate scantables
198 * note: only wmv uses different ones
200 if (s->alternate_scan) {
201 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
202 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
204 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
205 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
207 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
208 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
213 void ff_copy_picture(Picture *dst, Picture *src)
216 dst->f.type = FF_BUFFER_TYPE_COPY;
220 * Release a frame buffer
222 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
224 /* WM Image / Screen codecs allocate internal buffers with different
225 * dimensions / colorspaces; ignore user-defined callbacks for these. */
226 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
227 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
228 s->codec_id != AV_CODEC_ID_MSS2)
229 ff_thread_release_buffer(s->avctx, &pic->f);
231 avcodec_default_release_buffer(s->avctx, &pic->f);
232 av_freep(&pic->f.hwaccel_picture_private);
235 int ff_mpv_frame_size_alloc(MpegEncContext *s, int linesize)
237 int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
239 // edge emu needs blocksize + filter length - 1
240 // (= 17x17 for halfpel / 21x21 for h264)
241 // linesize * interlaced * MBsize
242 FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size * 4 * 21,
245 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size * 2 * 16 * 2,
247 s->me.temp = s->me.scratchpad;
248 s->rd_scratchpad = s->me.scratchpad;
249 s->b_scratchpad = s->me.scratchpad;
250 s->obmc_scratchpad = s->me.scratchpad + 16;
254 av_freep(&s->edge_emu_buffer);
255 return AVERROR(ENOMEM);
259 * Allocate a frame buffer
261 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
265 if (s->avctx->hwaccel) {
266 assert(!pic->f.hwaccel_picture_private);
267 if (s->avctx->hwaccel->priv_data_size) {
268 pic->f.hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
269 if (!pic->f.hwaccel_picture_private) {
270 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
276 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
277 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
278 s->codec_id != AV_CODEC_ID_MSS2)
279 r = ff_thread_get_buffer(s->avctx, &pic->f);
281 r = avcodec_default_get_buffer(s->avctx, &pic->f);
283 if (r < 0 || !pic->f.type || !pic->f.data[0]) {
284 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n",
285 r, pic->f.type, pic->f.data[0]);
286 av_freep(&pic->f.hwaccel_picture_private);
290 if (s->linesize && (s->linesize != pic->f.linesize[0] ||
291 s->uvlinesize != pic->f.linesize[1])) {
292 av_log(s->avctx, AV_LOG_ERROR,
293 "get_buffer() failed (stride changed)\n");
294 free_frame_buffer(s, pic);
298 if (pic->f.linesize[1] != pic->f.linesize[2]) {
299 av_log(s->avctx, AV_LOG_ERROR,
300 "get_buffer() failed (uv stride mismatch)\n");
301 free_frame_buffer(s, pic);
305 if (!s->edge_emu_buffer &&
306 (ret = ff_mpv_frame_size_alloc(s, pic->f.linesize[0])) < 0) {
307 av_log(s->avctx, AV_LOG_ERROR,
308 "get_buffer() failed to allocate context scratch buffers.\n");
309 free_frame_buffer(s, pic);
317 * Allocate a Picture.
318 * The pixels are allocated/set by calling get_buffer() if shared = 0
320 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
322 const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
324 // the + 1 is needed so memset(,,stride*height) does not sig11
326 const int mb_array_size = s->mb_stride * s->mb_height;
327 const int b8_array_size = s->b8_stride * s->mb_height * 2;
328 const int b4_array_size = s->b4_stride * s->mb_height * 4;
333 assert(pic->f.data[0]);
334 assert(pic->f.type == 0 || pic->f.type == FF_BUFFER_TYPE_SHARED);
335 pic->f.type = FF_BUFFER_TYPE_SHARED;
337 assert(!pic->f.data[0]);
339 if (alloc_frame_buffer(s, pic) < 0)
342 s->linesize = pic->f.linesize[0];
343 s->uvlinesize = pic->f.linesize[1];
346 if (pic->f.qscale_table == NULL) {
348 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var,
349 mb_array_size * sizeof(int16_t), fail)
350 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var,
351 mb_array_size * sizeof(int16_t), fail)
352 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean,
353 mb_array_size * sizeof(int8_t ), fail)
356 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.mbskip_table,
357 mb_array_size * sizeof(uint8_t) + 2, fail)// the + 2 is for the slice end check
358 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table_base,
359 (big_mb_num + s->mb_stride) * sizeof(uint8_t),
361 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base,
362 (big_mb_num + s->mb_stride) * sizeof(uint32_t),
364 pic->f.mb_type = pic->mb_type_base + 2 * s->mb_stride + 1;
365 pic->f.qscale_table = pic->qscale_table_base + 2 * s->mb_stride + 1;
366 if (s->out_format == FMT_H264) {
367 for (i = 0; i < 2; i++) {
368 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
369 2 * (b4_array_size + 4) * sizeof(int16_t),
371 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
372 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
373 4 * mb_array_size * sizeof(uint8_t), fail)
375 pic->f.motion_subsample_log2 = 2;
376 } else if (s->out_format == FMT_H263 || s->encoding ||
377 (s->avctx->debug & FF_DEBUG_MV) || s->avctx->debug_mv) {
378 for (i = 0; i < 2; i++) {
379 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
380 2 * (b8_array_size + 4) * sizeof(int16_t),
382 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
383 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
384 4 * mb_array_size * sizeof(uint8_t), fail)
386 pic->f.motion_subsample_log2 = 3;
388 if (s->avctx->debug&FF_DEBUG_DCT_COEFF) {
389 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.dct_coeff,
390 64 * mb_array_size * sizeof(DCTELEM) * 6, fail)
392 pic->f.qstride = s->mb_stride;
393 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.pan_scan,
394 1 * sizeof(AVPanScan), fail)
400 fail: // for the FF_ALLOCZ_OR_GOTO macro
402 free_frame_buffer(s, pic);
407 * Deallocate a picture.
409 static void free_picture(MpegEncContext *s, Picture *pic)
413 if (pic->f.data[0] && pic->f.type != FF_BUFFER_TYPE_SHARED) {
414 free_frame_buffer(s, pic);
417 av_freep(&pic->mb_var);
418 av_freep(&pic->mc_mb_var);
419 av_freep(&pic->mb_mean);
420 av_freep(&pic->f.mbskip_table);
421 av_freep(&pic->qscale_table_base);
422 pic->f.qscale_table = NULL;
423 av_freep(&pic->mb_type_base);
424 pic->f.mb_type = NULL;
425 av_freep(&pic->f.dct_coeff);
426 av_freep(&pic->f.pan_scan);
427 pic->f.mb_type = NULL;
428 for (i = 0; i < 2; i++) {
429 av_freep(&pic->motion_val_base[i]);
430 av_freep(&pic->f.ref_index[i]);
431 pic->f.motion_val[i] = NULL;
434 if (pic->f.type == FF_BUFFER_TYPE_SHARED) {
435 for (i = 0; i < 4; i++) {
437 pic->f.data[i] = NULL;
443 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base)
445 int y_size = s->b8_stride * (2 * s->mb_height + 1);
446 int c_size = s->mb_stride * (s->mb_height + 1);
447 int yc_size = y_size + 2 * c_size;
455 s->obmc_scratchpad = NULL;
458 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map,
459 ME_MAP_SIZE * sizeof(uint32_t), fail)
460 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map,
461 ME_MAP_SIZE * sizeof(uint32_t), fail)
462 if (s->avctx->noise_reduction) {
463 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum,
464 2 * 64 * sizeof(int), fail)
467 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64 * 12 * 2 * sizeof(DCTELEM), fail)
468 s->block = s->blocks[0];
470 for (i = 0; i < 12; i++) {
471 s->pblocks[i] = &s->block[i];
474 if (s->out_format == FMT_H263) {
476 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base,
477 yc_size * sizeof(int16_t) * 16, fail);
478 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
479 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
480 s->ac_val[2] = s->ac_val[1] + c_size;
485 return -1; // free() through ff_MPV_common_end()
488 static void free_duplicate_context(MpegEncContext *s)
493 av_freep(&s->edge_emu_buffer);
494 av_freep(&s->me.scratchpad);
498 s->obmc_scratchpad = NULL;
500 av_freep(&s->dct_error_sum);
501 av_freep(&s->me.map);
502 av_freep(&s->me.score_map);
503 av_freep(&s->blocks);
504 av_freep(&s->ac_val_base);
508 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
510 #define COPY(a) bak->a = src->a
511 COPY(edge_emu_buffer);
516 COPY(obmc_scratchpad);
523 COPY(me.map_generation);
535 int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
539 // FIXME copy only needed parts
541 backup_duplicate_context(&bak, dst);
542 memcpy(dst, src, sizeof(MpegEncContext));
543 backup_duplicate_context(dst, &bak);
544 for (i = 0; i < 12; i++) {
545 dst->pblocks[i] = &dst->block[i];
547 if (!dst->edge_emu_buffer &&
548 (ret = ff_mpv_frame_size_alloc(dst, dst->linesize)) < 0) {
549 av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
550 "scratch buffers.\n");
553 // STOP_TIMER("update_duplicate_context")
554 // about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
558 int ff_mpeg_update_thread_context(AVCodecContext *dst,
559 const AVCodecContext *src)
563 MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
570 // FIXME can parameters change on I-frames?
571 // in that case dst may need a reinit
572 if (!s->context_initialized) {
573 memcpy(s, s1, sizeof(MpegEncContext));
576 s->bitstream_buffer = NULL;
577 s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
579 if (s1->context_initialized){
580 s->picture_range_start += MAX_PICTURE_COUNT;
581 s->picture_range_end += MAX_PICTURE_COUNT;
582 if((err = ff_MPV_common_init(s)) < 0)
587 if (s->height != s1->height || s->width != s1->width || s->context_reinit) {
588 s->context_reinit = 0;
589 s->height = s1->height;
590 s->width = s1->width;
591 if ((err = ff_MPV_common_frame_size_change(s)) < 0)
595 s->avctx->coded_height = s1->avctx->coded_height;
596 s->avctx->coded_width = s1->avctx->coded_width;
597 s->avctx->width = s1->avctx->width;
598 s->avctx->height = s1->avctx->height;
600 s->coded_picture_number = s1->coded_picture_number;
601 s->picture_number = s1->picture_number;
602 s->input_picture_number = s1->input_picture_number;
604 av_assert0(!s->picture || s->picture != s1->picture);
605 memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
606 memcpy(&s->last_picture, &s1->last_picture,
607 (char *) &s1->last_picture_ptr - (char *) &s1->last_picture);
609 // reset s->picture[].f.extended_data to s->picture[].f.data
610 for (i = 0; i < s->picture_count; i++)
611 s->picture[i].f.extended_data = s->picture[i].f.data;
613 s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
614 s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
615 s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
617 // Error/bug resilience
618 s->next_p_frame_damaged = s1->next_p_frame_damaged;
619 s->workaround_bugs = s1->workaround_bugs;
620 s->padding_bug_score = s1->padding_bug_score;
623 memcpy(&s->time_increment_bits, &s1->time_increment_bits,
624 (char *) &s1->shape - (char *) &s1->time_increment_bits);
627 s->max_b_frames = s1->max_b_frames;
628 s->low_delay = s1->low_delay;
629 s->droppable = s1->droppable;
631 // DivX handling (doesn't work)
632 s->divx_packed = s1->divx_packed;
634 if (s1->bitstream_buffer) {
635 if (s1->bitstream_buffer_size +
636 FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
637 av_fast_malloc(&s->bitstream_buffer,
638 &s->allocated_bitstream_buffer_size,
639 s1->allocated_bitstream_buffer_size);
640 s->bitstream_buffer_size = s1->bitstream_buffer_size;
641 memcpy(s->bitstream_buffer, s1->bitstream_buffer,
642 s1->bitstream_buffer_size);
643 memset(s->bitstream_buffer + s->bitstream_buffer_size, 0,
644 FF_INPUT_BUFFER_PADDING_SIZE);
647 // linesize dependend scratch buffer allocation
648 if (!s->edge_emu_buffer)
650 if (ff_mpv_frame_size_alloc(s, s1->linesize) < 0) {
651 av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context "
652 "scratch buffers.\n");
653 return AVERROR(ENOMEM);
656 av_log(s->avctx, AV_LOG_ERROR, "Context scratch buffers could not "
657 "be allocated due to unknown size.\n");
660 // MPEG2/interlacing info
661 memcpy(&s->progressive_sequence, &s1->progressive_sequence,
662 (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
664 if (!s1->first_field) {
665 s->last_pict_type = s1->pict_type;
666 if (s1->current_picture_ptr)
667 s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality;
669 if (s1->pict_type != AV_PICTURE_TYPE_B) {
670 s->last_non_b_pict_type = s1->pict_type;
678 * Set the given MpegEncContext to common defaults
679 * (same for encoding and decoding).
680 * The changed fields will not depend upon the
681 * prior state of the MpegEncContext.
683 void ff_MPV_common_defaults(MpegEncContext *s)
685 s->y_dc_scale_table =
686 s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
687 s->chroma_qscale_table = ff_default_chroma_qscale_table;
688 s->progressive_frame = 1;
689 s->progressive_sequence = 1;
690 s->picture_structure = PICT_FRAME;
692 s->coded_picture_number = 0;
693 s->picture_number = 0;
694 s->input_picture_number = 0;
696 s->picture_in_gop_number = 0;
701 s->picture_range_start = 0;
702 s->picture_range_end = MAX_PICTURE_COUNT;
704 s->slice_context_count = 1;
708 * Set the given MpegEncContext to defaults for decoding.
709 * the changed fields will not depend upon
710 * the prior state of the MpegEncContext.
712 void ff_MPV_decode_defaults(MpegEncContext *s)
714 ff_MPV_common_defaults(s);
718 * Initialize and allocates MpegEncContext fields dependent on the resolution.
720 static int init_context_frame(MpegEncContext *s)
722 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
724 s->mb_width = (s->width + 15) / 16;
725 s->mb_stride = s->mb_width + 1;
726 s->b8_stride = s->mb_width * 2 + 1;
727 s->b4_stride = s->mb_width * 4 + 1;
728 mb_array_size = s->mb_height * s->mb_stride;
729 mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
731 /* set default edge pos, will be overriden
732 * in decode_header if needed */
733 s->h_edge_pos = s->mb_width * 16;
734 s->v_edge_pos = s->mb_height * 16;
736 s->mb_num = s->mb_width * s->mb_height;
741 s->block_wrap[3] = s->b8_stride;
743 s->block_wrap[5] = s->mb_stride;
745 y_size = s->b8_stride * (2 * s->mb_height + 1);
746 c_size = s->mb_stride * (s->mb_height + 1);
747 yc_size = y_size + 2 * c_size;
749 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
750 for (y = 0; y < s->mb_height; y++)
751 for (x = 0; x < s->mb_width; x++)
752 s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
754 s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
757 /* Allocate MV tables */
758 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
759 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
760 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
761 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
762 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
763 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
764 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
765 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
766 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
767 s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
768 s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base + s->mb_stride + 1;
769 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
771 /* Allocate MB type table */
772 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size * sizeof(uint16_t), fail) // needed for encoding
774 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
776 FF_ALLOC_OR_GOTO(s->avctx, s->cplx_tab,
777 mb_array_size * sizeof(float), fail);
778 FF_ALLOC_OR_GOTO(s->avctx, s->bits_tab,
779 mb_array_size * sizeof(float), fail);
783 FF_ALLOC_OR_GOTO(s->avctx, s->er_temp_buffer,
784 mb_array_size * sizeof(uint8_t), fail);
785 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table,
786 mb_array_size * sizeof(uint8_t), fail);
788 if (s->codec_id == AV_CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)) {
789 /* interlaced direct mode decoding tables */
790 for (i = 0; i < 2; i++) {
792 for (j = 0; j < 2; j++) {
793 for (k = 0; k < 2; k++) {
794 FF_ALLOCZ_OR_GOTO(s->avctx,
795 s->b_field_mv_table_base[i][j][k],
796 mv_table_size * 2 * sizeof(int16_t),
798 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
801 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
802 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
803 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
805 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
808 if (s->out_format == FMT_H263) {
810 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
811 s->coded_block = s->coded_block_base + s->b8_stride + 1;
813 /* cbp, ac_pred, pred_dir */
814 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail);
815 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
818 if (s->h263_pred || s->h263_plus || !s->encoding) {
820 // MN: we need these for error resilience of intra-frames
821 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
822 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
823 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
824 s->dc_val[2] = s->dc_val[1] + c_size;
825 for (i = 0; i < yc_size; i++)
826 s->dc_val_base[i] = 1024;
829 /* which mb is a intra block */
830 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
831 memset(s->mbintra_table, 1, mb_array_size);
833 /* init macroblock skip table */
834 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail);
835 // Note the + 1 is for a quicker mpeg4 slice_end detection
839 return AVERROR(ENOMEM);
843 * init common structure for both encoder and decoder.
844 * this assumes that some variables like width/height are already set
846 av_cold int ff_MPV_common_init(MpegEncContext *s)
849 int nb_slices = (HAVE_THREADS &&
850 s->avctx->active_thread_type & FF_THREAD_SLICE) ?
851 s->avctx->thread_count : 1;
853 if (s->encoding && s->avctx->slices)
854 nb_slices = s->avctx->slices;
856 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
857 s->mb_height = (s->height + 31) / 32 * 2;
858 else if (s->codec_id != AV_CODEC_ID_H264)
859 s->mb_height = (s->height + 15) / 16;
861 if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
862 av_log(s->avctx, AV_LOG_ERROR,
863 "decoding to AV_PIX_FMT_NONE is not supported.\n");
867 if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
870 max_slices = FFMIN(MAX_THREADS, s->mb_height);
872 max_slices = MAX_THREADS;
873 av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
874 " reducing to %d\n", nb_slices, max_slices);
875 nb_slices = max_slices;
878 if ((s->width || s->height) &&
879 av_image_check_size(s->width, s->height, 0, s->avctx))
882 ff_dct_common_init(s);
884 s->flags = s->avctx->flags;
885 s->flags2 = s->avctx->flags2;
887 /* set chroma shifts */
888 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
890 /* convert fourcc to upper case */
891 s->codec_tag = avpriv_toupper4(s->avctx->codec_tag);
892 s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
894 s->avctx->coded_frame = &s->current_picture.f;
897 if (s->msmpeg4_version) {
898 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
899 2 * 2 * (MAX_LEVEL + 1) *
900 (MAX_RUN + 1) * 2 * sizeof(int), fail);
902 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
904 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail)
905 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail)
906 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail)
907 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
908 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
909 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
910 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
911 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
913 if (s->avctx->noise_reduction) {
914 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail);
918 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
919 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture,
920 s->picture_count * sizeof(Picture), fail);
921 for (i = 0; i < s->picture_count; i++) {
922 avcodec_get_frame_defaults(&s->picture[i].f);
925 if (init_context_frame(s))
928 s->parse_context.state = -1;
930 s->context_initialized = 1;
931 s->thread_context[0] = s;
933 // if (s->width && s->height) {
935 for (i = 1; i < nb_slices; i++) {
936 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
937 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
940 for (i = 0; i < nb_slices; i++) {
941 if (init_duplicate_context(s->thread_context[i], s) < 0)
943 s->thread_context[i]->start_mb_y =
944 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
945 s->thread_context[i]->end_mb_y =
946 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
949 if (init_duplicate_context(s, s) < 0)
952 s->end_mb_y = s->mb_height;
954 s->slice_context_count = nb_slices;
959 ff_MPV_common_end(s);
964 * Frees and resets MpegEncContext fields depending on the resolution.
965 * Is used during resolution changes to avoid a full reinitialization of the
968 static int free_context_frame(MpegEncContext *s)
972 av_freep(&s->mb_type);
973 av_freep(&s->p_mv_table_base);
974 av_freep(&s->b_forw_mv_table_base);
975 av_freep(&s->b_back_mv_table_base);
976 av_freep(&s->b_bidir_forw_mv_table_base);
977 av_freep(&s->b_bidir_back_mv_table_base);
978 av_freep(&s->b_direct_mv_table_base);
979 s->p_mv_table = NULL;
980 s->b_forw_mv_table = NULL;
981 s->b_back_mv_table = NULL;
982 s->b_bidir_forw_mv_table = NULL;
983 s->b_bidir_back_mv_table = NULL;
984 s->b_direct_mv_table = NULL;
985 for (i = 0; i < 2; i++) {
986 for (j = 0; j < 2; j++) {
987 for (k = 0; k < 2; k++) {
988 av_freep(&s->b_field_mv_table_base[i][j][k]);
989 s->b_field_mv_table[i][j][k] = NULL;
991 av_freep(&s->b_field_select_table[i][j]);
992 av_freep(&s->p_field_mv_table_base[i][j]);
993 s->p_field_mv_table[i][j] = NULL;
995 av_freep(&s->p_field_select_table[i]);
998 av_freep(&s->dc_val_base);
999 av_freep(&s->coded_block_base);
1000 av_freep(&s->mbintra_table);
1001 av_freep(&s->cbp_table);
1002 av_freep(&s->pred_dir_table);
1004 av_freep(&s->mbskip_table);
1006 av_freep(&s->error_status_table);
1007 av_freep(&s->er_temp_buffer);
1008 av_freep(&s->mb_index2xy);
1009 av_freep(&s->lambda_table);
1011 av_freep(&s->cplx_tab);
1012 av_freep(&s->bits_tab);
1014 s->linesize = s->uvlinesize = 0;
1016 for (i = 0; i < 3; i++)
1017 av_freep(&s->visualization_buffer[i]);
1022 int ff_MPV_common_frame_size_change(MpegEncContext *s)
1026 if (s->slice_context_count > 1) {
1027 for (i = 0; i < s->slice_context_count; i++) {
1028 free_duplicate_context(s->thread_context[i]);
1030 for (i = 1; i < s->slice_context_count; i++) {
1031 av_freep(&s->thread_context[i]);
1034 free_duplicate_context(s);
1036 free_context_frame(s);
1039 for (i = 0; i < s->picture_count; i++) {
1040 s->picture[i].needs_realloc = 1;
1043 s->last_picture_ptr =
1044 s->next_picture_ptr =
1045 s->current_picture_ptr = NULL;
1048 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
1049 s->mb_height = (s->height + 31) / 32 * 2;
1050 else if (s->codec_id != AV_CODEC_ID_H264)
1051 s->mb_height = (s->height + 15) / 16;
1053 if ((s->width || s->height) &&
1054 av_image_check_size(s->width, s->height, 0, s->avctx))
1055 return AVERROR_INVALIDDATA;
1057 if ((err = init_context_frame(s)))
1060 s->thread_context[0] = s;
1062 if (s->width && s->height) {
1063 int nb_slices = s->slice_context_count;
1064 if (nb_slices > 1) {
1065 for (i = 1; i < nb_slices; i++) {
1066 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1067 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1070 for (i = 0; i < nb_slices; i++) {
1071 if (init_duplicate_context(s->thread_context[i], s) < 0)
1073 s->thread_context[i]->start_mb_y =
1074 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1075 s->thread_context[i]->end_mb_y =
1076 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1079 if (init_duplicate_context(s, s) < 0)
1082 s->end_mb_y = s->mb_height;
1084 s->slice_context_count = nb_slices;
1089 ff_MPV_common_end(s);
1093 /* init common structure for both encoder and decoder */
1094 void ff_MPV_common_end(MpegEncContext *s)
1098 if (s->slice_context_count > 1) {
1099 for (i = 0; i < s->slice_context_count; i++) {
1100 free_duplicate_context(s->thread_context[i]);
1102 for (i = 1; i < s->slice_context_count; i++) {
1103 av_freep(&s->thread_context[i]);
1105 s->slice_context_count = 1;
1106 } else free_duplicate_context(s);
1108 av_freep(&s->parse_context.buffer);
1109 s->parse_context.buffer_size = 0;
1111 av_freep(&s->bitstream_buffer);
1112 s->allocated_bitstream_buffer_size = 0;
1114 av_freep(&s->avctx->stats_out);
1115 av_freep(&s->ac_stats);
1117 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
1118 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
1119 s->q_chroma_intra_matrix= NULL;
1120 s->q_chroma_intra_matrix16= NULL;
1121 av_freep(&s->q_intra_matrix);
1122 av_freep(&s->q_inter_matrix);
1123 av_freep(&s->q_intra_matrix16);
1124 av_freep(&s->q_inter_matrix16);
1125 av_freep(&s->input_picture);
1126 av_freep(&s->reordered_input_picture);
1127 av_freep(&s->dct_offset);
1129 if (s->picture && !s->avctx->internal->is_copy) {
1130 for (i = 0; i < s->picture_count; i++) {
1131 free_picture(s, &s->picture[i]);
1134 av_freep(&s->picture);
1136 free_context_frame(s);
1138 if (!(s->avctx->active_thread_type & FF_THREAD_FRAME))
1139 avcodec_default_free_buffers(s->avctx);
1141 s->context_initialized = 0;
1142 s->last_picture_ptr =
1143 s->next_picture_ptr =
1144 s->current_picture_ptr = NULL;
1145 s->linesize = s->uvlinesize = 0;
1148 void ff_init_rl(RLTable *rl,
1149 uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3])
1151 int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1];
1152 uint8_t index_run[MAX_RUN + 1];
1153 int last, run, level, start, end, i;
1155 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1156 if (static_store && rl->max_level[0])
1159 /* compute max_level[], max_run[] and index_run[] */
1160 for (last = 0; last < 2; last++) {
1169 memset(max_level, 0, MAX_RUN + 1);
1170 memset(max_run, 0, MAX_LEVEL + 1);
1171 memset(index_run, rl->n, MAX_RUN + 1);
1172 for (i = start; i < end; i++) {
1173 run = rl->table_run[i];
1174 level = rl->table_level[i];
1175 if (index_run[run] == rl->n)
1177 if (level > max_level[run])
1178 max_level[run] = level;
1179 if (run > max_run[level])
1180 max_run[level] = run;
1183 rl->max_level[last] = static_store[last];
1185 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1186 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1188 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1190 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1191 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1193 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1195 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1196 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1200 void ff_init_vlc_rl(RLTable *rl)
1204 for (q = 0; q < 32; q++) {
1206 int qadd = (q - 1) | 1;
1212 for (i = 0; i < rl->vlc.table_size; i++) {
1213 int code = rl->vlc.table[i][0];
1214 int len = rl->vlc.table[i][1];
1217 if (len == 0) { // illegal code
1220 } else if (len < 0) { // more bits needed
1224 if (code == rl->n) { // esc
1228 run = rl->table_run[code] + 1;
1229 level = rl->table_level[code] * qmul + qadd;
1230 if (code >= rl->last) run += 192;
1233 rl->rl_vlc[q][i].len = len;
1234 rl->rl_vlc[q][i].level = level;
1235 rl->rl_vlc[q][i].run = run;
1240 void ff_release_unused_pictures(MpegEncContext*s, int remove_current)
1244 /* release non reference frames */
1245 for (i = 0; i < s->picture_count; i++) {
1246 if (s->picture[i].f.data[0] && !s->picture[i].f.reference &&
1247 (!s->picture[i].owner2 || s->picture[i].owner2 == s) &&
1248 (remove_current || &s->picture[i] != s->current_picture_ptr)
1249 /* && s->picture[i].type!= FF_BUFFER_TYPE_SHARED */) {
1250 free_frame_buffer(s, &s->picture[i]);
1255 static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
1257 if (pic->f.data[0] == NULL)
1259 if (pic->needs_realloc && !(pic->f.reference & DELAYED_PIC_REF))
1260 if (!pic->owner2 || pic->owner2 == s)
1265 static int find_unused_picture(MpegEncContext *s, int shared)
1270 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1271 if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type == 0)
1275 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1276 if (pic_is_unused(s, &s->picture[i]) && s->picture[i].f.type != 0)
1279 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1280 if (pic_is_unused(s, &s->picture[i]))
1285 av_log(s->avctx, AV_LOG_FATAL,
1286 "Internal error, picture buffer overflow\n");
1287 /* We could return -1, but the codec would crash trying to draw into a
1288 * non-existing frame anyway. This is safer than waiting for a random crash.
1289 * Also the return of this is never useful, an encoder must only allocate
1290 * as much as allowed in the specification. This has no relationship to how
1291 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1292 * enough for such valid streams).
1293 * Plus, a decoder has to check stream validity and remove frames if too
1294 * many reference frames are around. Waiting for "OOM" is not correct at
1295 * all. Similarly, missing reference frames have to be replaced by
1296 * interpolated/MC frames, anything else is a bug in the codec ...
1302 int ff_find_unused_picture(MpegEncContext *s, int shared)
1304 int ret = find_unused_picture(s, shared);
1306 if (ret >= 0 && ret < s->picture_range_end) {
1307 if (s->picture[ret].needs_realloc) {
1308 s->picture[ret].needs_realloc = 0;
1309 free_picture(s, &s->picture[ret]);
1310 avcodec_get_frame_defaults(&s->picture[ret].f);
1316 static void update_noise_reduction(MpegEncContext *s)
1320 for (intra = 0; intra < 2; intra++) {
1321 if (s->dct_count[intra] > (1 << 16)) {
1322 for (i = 0; i < 64; i++) {
1323 s->dct_error_sum[intra][i] >>= 1;
1325 s->dct_count[intra] >>= 1;
1328 for (i = 0; i < 64; i++) {
1329 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1330 s->dct_count[intra] +
1331 s->dct_error_sum[intra][i] / 2) /
1332 (s->dct_error_sum[intra][i] + 1);
1338 * generic function for encode/decode called after coding/decoding
1339 * the header and before a frame is coded/decoded.
1341 int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1347 if (!ff_thread_can_start_frame(avctx)) {
1348 av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
1352 /* mark & release old frames */
1353 if (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3) {
1354 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1355 s->last_picture_ptr != s->next_picture_ptr &&
1356 s->last_picture_ptr->f.data[0]) {
1357 if (s->last_picture_ptr->owner2 == s)
1358 free_frame_buffer(s, s->last_picture_ptr);
1361 /* release forgotten pictures */
1362 /* if (mpeg124/h263) */
1364 for (i = 0; i < s->picture_count; i++) {
1365 if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
1366 &s->picture[i] != s->last_picture_ptr &&
1367 &s->picture[i] != s->next_picture_ptr &&
1368 s->picture[i].f.reference && !s->picture[i].needs_realloc) {
1369 if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1370 av_log(avctx, AV_LOG_ERROR,
1371 "releasing zombie picture\n");
1372 free_frame_buffer(s, &s->picture[i]);
1379 ff_release_unused_pictures(s, 1);
1381 if (s->current_picture_ptr &&
1382 s->current_picture_ptr->f.data[0] == NULL) {
1383 // we already have a unused image
1384 // (maybe it was set before reading the header)
1385 pic = s->current_picture_ptr;
1387 i = ff_find_unused_picture(s, 0);
1389 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1392 pic = &s->picture[i];
1395 pic->f.reference = 0;
1396 if (!s->droppable) {
1397 if (s->codec_id == AV_CODEC_ID_H264)
1398 pic->f.reference = s->picture_structure;
1399 else if (s->pict_type != AV_PICTURE_TYPE_B)
1400 pic->f.reference = 3;
1403 pic->f.coded_picture_number = s->coded_picture_number++;
1405 if (ff_alloc_picture(s, pic, 0) < 0)
1408 s->current_picture_ptr = pic;
1409 // FIXME use only the vars from current_pic
1410 s->current_picture_ptr->f.top_field_first = s->top_field_first;
1411 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
1412 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1413 if (s->picture_structure != PICT_FRAME)
1414 s->current_picture_ptr->f.top_field_first =
1415 (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1417 s->current_picture_ptr->f.interlaced_frame = !s->progressive_frame &&
1418 !s->progressive_sequence;
1419 s->current_picture_ptr->field_picture = s->picture_structure != PICT_FRAME;
1422 s->current_picture_ptr->f.pict_type = s->pict_type;
1423 // if (s->flags && CODEC_FLAG_QSCALE)
1424 // s->current_picture_ptr->quality = s->new_picture_ptr->quality;
1425 s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1427 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1429 if (s->pict_type != AV_PICTURE_TYPE_B) {
1430 s->last_picture_ptr = s->next_picture_ptr;
1432 s->next_picture_ptr = s->current_picture_ptr;
1434 av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
1435 s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1436 s->last_picture_ptr ? s->last_picture_ptr->f.data[0] : NULL,
1437 s->next_picture_ptr ? s->next_picture_ptr->f.data[0] : NULL,
1438 s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL,
1439 s->pict_type, s->droppable);
1441 if (s->codec_id != AV_CODEC_ID_H264) {
1442 if ((s->last_picture_ptr == NULL ||
1443 s->last_picture_ptr->f.data[0] == NULL) &&
1444 (s->pict_type != AV_PICTURE_TYPE_I ||
1445 s->picture_structure != PICT_FRAME)) {
1446 if (s->pict_type != AV_PICTURE_TYPE_I)
1447 av_log(avctx, AV_LOG_ERROR,
1448 "warning: first frame is no keyframe\n");
1449 else if (s->picture_structure != PICT_FRAME)
1450 av_log(avctx, AV_LOG_INFO,
1451 "allocate dummy last picture for field based first keyframe\n");
1453 /* Allocate a dummy frame */
1454 i = ff_find_unused_picture(s, 0);
1456 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1459 s->last_picture_ptr = &s->picture[i];
1460 s->last_picture_ptr->f.key_frame = 0;
1461 if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
1462 s->last_picture_ptr = NULL;
1466 if(s->codec_id == AV_CODEC_ID_FLV1 || s->codec_id == AV_CODEC_ID_H263){
1467 for(i=0; i<avctx->height; i++)
1468 memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width);
1471 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0);
1472 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1);
1473 s->last_picture_ptr->f.reference = 3;
1475 if ((s->next_picture_ptr == NULL ||
1476 s->next_picture_ptr->f.data[0] == NULL) &&
1477 s->pict_type == AV_PICTURE_TYPE_B) {
1478 /* Allocate a dummy frame */
1479 i = ff_find_unused_picture(s, 0);
1481 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1484 s->next_picture_ptr = &s->picture[i];
1485 s->next_picture_ptr->f.key_frame = 0;
1486 if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
1487 s->next_picture_ptr = NULL;
1490 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 0);
1491 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 1);
1492 s->next_picture_ptr->f.reference = 3;
1496 if (s->last_picture_ptr)
1497 ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1498 if (s->next_picture_ptr)
1499 ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1501 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME)) {
1502 if (s->next_picture_ptr)
1503 s->next_picture_ptr->owner2 = s;
1504 if (s->last_picture_ptr)
1505 s->last_picture_ptr->owner2 = s;
1508 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
1509 s->last_picture_ptr->f.data[0]));
1511 if (s->picture_structure!= PICT_FRAME && s->out_format != FMT_H264) {
1513 for (i = 0; i < 4; i++) {
1514 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1515 s->current_picture.f.data[i] +=
1516 s->current_picture.f.linesize[i];
1518 s->current_picture.f.linesize[i] *= 2;
1519 s->last_picture.f.linesize[i] *= 2;
1520 s->next_picture.f.linesize[i] *= 2;
1524 s->err_recognition = avctx->err_recognition;
1526 /* set dequantizer, we can't do it during init as
1527 * it might change for mpeg4 and we can't do it in the header
1528 * decode as init is not called for mpeg4 there yet */
1529 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1530 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1531 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1532 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1533 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1534 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1536 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1537 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1540 if (s->dct_error_sum) {
1541 assert(s->avctx->noise_reduction && s->encoding);
1542 update_noise_reduction(s);
1545 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1546 return ff_xvmc_field_start(s, avctx);
1551 /* generic function for encode/decode called after a
1552 * frame has been coded/decoded. */
1553 void ff_MPV_frame_end(MpegEncContext *s)
1556 /* redraw edges for the frame if decoding didn't complete */
1557 // just to make sure that all data is rendered.
1558 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
1559 ff_xvmc_field_end(s);
1560 } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
1561 !s->avctx->hwaccel &&
1562 !(s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&
1563 s->unrestricted_mv &&
1564 s->current_picture.f.reference &&
1566 !(s->flags & CODEC_FLAG_EMU_EDGE) &&
1569 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1570 int hshift = desc->log2_chroma_w;
1571 int vshift = desc->log2_chroma_h;
1572 s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
1573 s->h_edge_pos, s->v_edge_pos,
1574 EDGE_WIDTH, EDGE_WIDTH,
1575 EDGE_TOP | EDGE_BOTTOM);
1576 s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
1577 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1578 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1579 EDGE_TOP | EDGE_BOTTOM);
1580 s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
1581 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1582 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1583 EDGE_TOP | EDGE_BOTTOM);
1588 s->last_pict_type = s->pict_type;
1589 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality;
1590 if (s->pict_type!= AV_PICTURE_TYPE_B) {
1591 s->last_non_b_pict_type = s->pict_type;
1594 /* copy back current_picture variables */
1595 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1596 if (s->picture[i].f.data[0] == s->current_picture.f.data[0]) {
1597 s->picture[i] = s->current_picture;
1601 assert(i < MAX_PICTURE_COUNT);
1605 /* release non-reference frames */
1606 for (i = 0; i < s->picture_count; i++) {
1607 if (s->picture[i].f.data[0] && !s->picture[i].f.reference
1608 /* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */) {
1609 free_frame_buffer(s, &s->picture[i]);
1613 // clear copies, to avoid confusion
1615 memset(&s->last_picture, 0, sizeof(Picture));
1616 memset(&s->next_picture, 0, sizeof(Picture));
1617 memset(&s->current_picture, 0, sizeof(Picture));
1619 s->avctx->coded_frame = &s->current_picture_ptr->f;
1621 if (s->codec_id != AV_CODEC_ID_H264 && s->current_picture.f.reference) {
1622 ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
1627 * Draw a line from (ex, ey) -> (sx, sy).
1628 * @param w width of the image
1629 * @param h height of the image
1630 * @param stride stride/linesize of the image
1631 * @param color color of the arrow
1633 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
1634 int w, int h, int stride, int color)
1638 sx = av_clip(sx, 0, w - 1);
1639 sy = av_clip(sy, 0, h - 1);
1640 ex = av_clip(ex, 0, w - 1);
1641 ey = av_clip(ey, 0, h - 1);
1643 buf[sy * stride + sx] += color;
1645 if (FFABS(ex - sx) > FFABS(ey - sy)) {
1647 FFSWAP(int, sx, ex);
1648 FFSWAP(int, sy, ey);
1650 buf += sx + sy * stride;
1652 f = ((ey - sy) << 16) / ex;
1653 for(x= 0; x <= ex; x++){
1655 fr = (x * f) & 0xFFFF;
1656 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1657 if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
1661 FFSWAP(int, sx, ex);
1662 FFSWAP(int, sy, ey);
1664 buf += sx + sy * stride;
1667 f = ((ex - sx) << 16) / ey;
1670 for(y= 0; y <= ey; y++){
1672 fr = (y*f) & 0xFFFF;
1673 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1674 if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
1680 * Draw an arrow from (ex, ey) -> (sx, sy).
1681 * @param w width of the image
1682 * @param h height of the image
1683 * @param stride stride/linesize of the image
1684 * @param color color of the arrow
1686 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
1687 int ey, int w, int h, int stride, int color)
1691 sx = av_clip(sx, -100, w + 100);
1692 sy = av_clip(sy, -100, h + 100);
1693 ex = av_clip(ex, -100, w + 100);
1694 ey = av_clip(ey, -100, h + 100);
1699 if (dx * dx + dy * dy > 3 * 3) {
1702 int length = ff_sqrt((rx * rx + ry * ry) << 8);
1704 // FIXME subpixel accuracy
1705 rx = ROUNDED_DIV(rx * 3 << 4, length);
1706 ry = ROUNDED_DIV(ry * 3 << 4, length);
1708 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1709 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1711 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1715 * Print debugging info for the given picture.
1717 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict)
1719 if ( s->avctx->hwaccel || !pict || !pict->mb_type
1720 || (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU))
1724 if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
1727 av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
1728 av_get_picture_type_char(pict->pict_type));
1729 for (y = 0; y < s->mb_height; y++) {
1730 for (x = 0; x < s->mb_width; x++) {
1731 if (s->avctx->debug & FF_DEBUG_SKIP) {
1732 int count = s->mbskip_table[x + y * s->mb_stride];
1735 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1737 if (s->avctx->debug & FF_DEBUG_QP) {
1738 av_log(s->avctx, AV_LOG_DEBUG, "%2d",
1739 pict->qscale_table[x + y * s->mb_stride]);
1741 if (s->avctx->debug & FF_DEBUG_MB_TYPE) {
1742 int mb_type = pict->mb_type[x + y * s->mb_stride];
1743 // Type & MV direction
1744 if (IS_PCM(mb_type))
1745 av_log(s->avctx, AV_LOG_DEBUG, "P");
1746 else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1747 av_log(s->avctx, AV_LOG_DEBUG, "A");
1748 else if (IS_INTRA4x4(mb_type))
1749 av_log(s->avctx, AV_LOG_DEBUG, "i");
1750 else if (IS_INTRA16x16(mb_type))
1751 av_log(s->avctx, AV_LOG_DEBUG, "I");
1752 else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1753 av_log(s->avctx, AV_LOG_DEBUG, "d");
1754 else if (IS_DIRECT(mb_type))
1755 av_log(s->avctx, AV_LOG_DEBUG, "D");
1756 else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
1757 av_log(s->avctx, AV_LOG_DEBUG, "g");
1758 else if (IS_GMC(mb_type))
1759 av_log(s->avctx, AV_LOG_DEBUG, "G");
1760 else if (IS_SKIP(mb_type))
1761 av_log(s->avctx, AV_LOG_DEBUG, "S");
1762 else if (!USES_LIST(mb_type, 1))
1763 av_log(s->avctx, AV_LOG_DEBUG, ">");
1764 else if (!USES_LIST(mb_type, 0))
1765 av_log(s->avctx, AV_LOG_DEBUG, "<");
1767 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1768 av_log(s->avctx, AV_LOG_DEBUG, "X");
1772 if (IS_8X8(mb_type))
1773 av_log(s->avctx, AV_LOG_DEBUG, "+");
1774 else if (IS_16X8(mb_type))
1775 av_log(s->avctx, AV_LOG_DEBUG, "-");
1776 else if (IS_8X16(mb_type))
1777 av_log(s->avctx, AV_LOG_DEBUG, "|");
1778 else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
1779 av_log(s->avctx, AV_LOG_DEBUG, " ");
1781 av_log(s->avctx, AV_LOG_DEBUG, "?");
1784 if (IS_INTERLACED(mb_type))
1785 av_log(s->avctx, AV_LOG_DEBUG, "=");
1787 av_log(s->avctx, AV_LOG_DEBUG, " ");
1790 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1794 if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
1795 (s->avctx->debug_mv)) {
1796 const int shift = 1 + s->quarter_sample;
1800 int h_chroma_shift, v_chroma_shift, block_height;
1801 const int width = s->avctx->width;
1802 const int height = s->avctx->height;
1803 const int mv_sample_log2 = 4 - pict->motion_subsample_log2;
1804 const int mv_stride = (s->mb_width << mv_sample_log2) +
1805 (s->codec_id == AV_CODEC_ID_H264 ? 0 : 1);
1806 s->low_delay = 0; // needed to see the vectors without trashing the buffers
1808 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &h_chroma_shift, &v_chroma_shift);
1810 for (i = 0; i < 3; i++) {
1811 size_t size= (i == 0) ? pict->linesize[i] * FFALIGN(height, 16):
1812 pict->linesize[i] * FFALIGN(height, 16) >> v_chroma_shift;
1813 s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
1814 memcpy(s->visualization_buffer[i], pict->data[i], size);
1815 pict->data[i] = s->visualization_buffer[i];
1817 pict->type = FF_BUFFER_TYPE_COPY;
1819 ptr = pict->data[0];
1820 block_height = 16 >> v_chroma_shift;
1822 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1824 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1825 const int mb_index = mb_x + mb_y * s->mb_stride;
1826 if ((s->avctx->debug_mv) && pict->motion_val[0]) {
1828 for (type = 0; type < 3; type++) {
1832 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
1833 (pict->pict_type!= AV_PICTURE_TYPE_P))
1838 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
1839 (pict->pict_type!= AV_PICTURE_TYPE_B))
1844 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
1845 (pict->pict_type!= AV_PICTURE_TYPE_B))
1850 if (!USES_LIST(pict->mb_type[mb_index], direction))
1853 if (IS_8X8(pict->mb_type[mb_index])) {
1855 for (i = 0; i < 4; i++) {
1856 int sx = mb_x * 16 + 4 + 8 * (i & 1);
1857 int sy = mb_y * 16 + 4 + 8 * (i >> 1);
1858 int xy = (mb_x * 2 + (i & 1) +
1859 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1860 int mx = (pict->motion_val[direction][xy][0] >> shift) + sx;
1861 int my = (pict->motion_val[direction][xy][1] >> shift) + sy;
1862 draw_arrow(ptr, sx, sy, mx, my, width,
1863 height, s->linesize, 100);
1865 } else if (IS_16X8(pict->mb_type[mb_index])) {
1867 for (i = 0; i < 2; i++) {
1868 int sx = mb_x * 16 + 8;
1869 int sy = mb_y * 16 + 4 + 8 * i;
1870 int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
1871 int mx = (pict->motion_val[direction][xy][0] >> shift);
1872 int my = (pict->motion_val[direction][xy][1] >> shift);
1874 if (IS_INTERLACED(pict->mb_type[mb_index]))
1877 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1878 height, s->linesize, 100);
1880 } else if (IS_8X16(pict->mb_type[mb_index])) {
1882 for (i = 0; i < 2; i++) {
1883 int sx = mb_x * 16 + 4 + 8 * i;
1884 int sy = mb_y * 16 + 8;
1885 int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
1886 int mx = pict->motion_val[direction][xy][0] >> shift;
1887 int my = pict->motion_val[direction][xy][1] >> shift;
1889 if (IS_INTERLACED(pict->mb_type[mb_index]))
1892 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1893 height, s->linesize, 100);
1896 int sx= mb_x * 16 + 8;
1897 int sy= mb_y * 16 + 8;
1898 int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
1899 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1900 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1901 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1905 if ((s->avctx->debug & FF_DEBUG_VIS_QP)) {
1906 uint64_t c = (pict->qscale_table[mb_index] * 128 / 31) *
1907 0x0101010101010101ULL;
1909 for (y = 0; y < block_height; y++) {
1910 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1911 (block_height * mb_y + y) *
1912 pict->linesize[1]) = c;
1913 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1914 (block_height * mb_y + y) *
1915 pict->linesize[2]) = c;
1918 if ((s->avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
1919 pict->motion_val[0]) {
1920 int mb_type = pict->mb_type[mb_index];
1923 #define COLOR(theta, r) \
1924 u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
1925 v = (int)(128 + r * sin(theta * 3.141592 / 180));
1929 if (IS_PCM(mb_type)) {
1931 } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
1932 IS_INTRA16x16(mb_type)) {
1934 } else if (IS_INTRA4x4(mb_type)) {
1936 } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
1938 } else if (IS_DIRECT(mb_type)) {
1940 } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
1942 } else if (IS_GMC(mb_type)) {
1944 } else if (IS_SKIP(mb_type)) {
1946 } else if (!USES_LIST(mb_type, 1)) {
1948 } else if (!USES_LIST(mb_type, 0)) {
1951 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1955 u *= 0x0101010101010101ULL;
1956 v *= 0x0101010101010101ULL;
1957 for (y = 0; y < block_height; y++) {
1958 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1959 (block_height * mb_y + y) * pict->linesize[1]) = u;
1960 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1961 (block_height * mb_y + y) * pict->linesize[2]) = v;
1965 if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
1966 *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
1967 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1968 *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
1969 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1971 if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
1972 for (y = 0; y < 16; y++)
1973 pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
1974 pict->linesize[0]] ^= 0x80;
1976 if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
1977 int dm = 1 << (mv_sample_log2 - 2);
1978 for (i = 0; i < 4; i++) {
1979 int sx = mb_x * 16 + 8 * (i & 1);
1980 int sy = mb_y * 16 + 8 * (i >> 1);
1981 int xy = (mb_x * 2 + (i & 1) +
1982 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1984 int32_t *mv = (int32_t *) &pict->motion_val[0][xy];
1985 if (mv[0] != mv[dm] ||
1986 mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
1987 for (y = 0; y < 8; y++)
1988 pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
1989 if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
1990 *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
1991 pict->linesize[0]) ^= 0x8080808080808080ULL;
1995 if (IS_INTERLACED(mb_type) &&
1996 s->codec_id == AV_CODEC_ID_H264) {
2000 s->mbskip_table[mb_index] = 0;
2006 static inline int hpel_motion_lowres(MpegEncContext *s,
2007 uint8_t *dest, uint8_t *src,
2008 int field_based, int field_select,
2009 int src_x, int src_y,
2010 int width, int height, int stride,
2011 int h_edge_pos, int v_edge_pos,
2012 int w, int h, h264_chroma_mc_func *pix_op,
2013 int motion_x, int motion_y)
2015 const int lowres = s->avctx->lowres;
2016 const int op_index = FFMIN(lowres, 2);
2017 const int s_mask = (2 << lowres) - 1;
2021 if (s->quarter_sample) {
2026 sx = motion_x & s_mask;
2027 sy = motion_y & s_mask;
2028 src_x += motion_x >> lowres + 1;
2029 src_y += motion_y >> lowres + 1;
2031 src += src_y * stride + src_x;
2033 if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
2034 (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2035 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
2036 (h + 1) << field_based, src_x,
2037 src_y << field_based,
2040 src = s->edge_emu_buffer;
2044 sx = (sx << 2) >> lowres;
2045 sy = (sy << 2) >> lowres;
2048 pix_op[op_index](dest, src, stride, h, sx, sy);
2052 /* apply one mpeg motion vector to the three components */
2053 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
2060 uint8_t **ref_picture,
2061 h264_chroma_mc_func *pix_op,
2062 int motion_x, int motion_y,
2065 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2066 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
2068 const int lowres = s->avctx->lowres;
2069 const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 2);
2070 const int block_s = 8>>lowres;
2071 const int s_mask = (2 << lowres) - 1;
2072 const int h_edge_pos = s->h_edge_pos >> lowres;
2073 const int v_edge_pos = s->v_edge_pos >> lowres;
2074 linesize = s->current_picture.f.linesize[0] << field_based;
2075 uvlinesize = s->current_picture.f.linesize[1] << field_based;
2077 // FIXME obviously not perfect but qpel will not work in lowres anyway
2078 if (s->quarter_sample) {
2084 motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2087 sx = motion_x & s_mask;
2088 sy = motion_y & s_mask;
2089 src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2090 src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2092 if (s->out_format == FMT_H263) {
2093 uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2094 uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2095 uvsrc_x = src_x >> 1;
2096 uvsrc_y = src_y >> 1;
2097 } else if (s->out_format == FMT_H261) {
2098 // even chroma mv's are full pel in H261
2101 uvsx = (2 * mx) & s_mask;
2102 uvsy = (2 * my) & s_mask;
2103 uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2104 uvsrc_y = mb_y * block_s + (my >> lowres);
2106 if(s->chroma_y_shift){
2111 uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2112 uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2114 if(s->chroma_x_shift){
2118 uvsy = motion_y & s_mask;
2120 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2123 uvsx = motion_x & s_mask;
2124 uvsy = motion_y & s_mask;
2131 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2132 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2133 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2135 if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) ||
2136 (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2137 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2138 linesize >> field_based, 17, 17 + field_based,
2139 src_x, src_y << field_based, h_edge_pos,
2141 ptr_y = s->edge_emu_buffer;
2142 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2143 uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
2144 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, uvlinesize >> field_based, 9,
2146 uvsrc_x, uvsrc_y << field_based,
2147 h_edge_pos >> 1, v_edge_pos >> 1);
2148 s->dsp.emulated_edge_mc(uvbuf + 16, ptr_cr, uvlinesize >> field_based, 9,
2150 uvsrc_x, uvsrc_y << field_based,
2151 h_edge_pos >> 1, v_edge_pos >> 1);
2153 ptr_cr = uvbuf + 16;
2157 // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
2159 dest_y += s->linesize;
2160 dest_cb += s->uvlinesize;
2161 dest_cr += s->uvlinesize;
2165 ptr_y += s->linesize;
2166 ptr_cb += s->uvlinesize;
2167 ptr_cr += s->uvlinesize;
2170 sx = (sx << 2) >> lowres;
2171 sy = (sy << 2) >> lowres;
2172 pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2174 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2175 uvsx = (uvsx << 2) >> lowres;
2176 uvsy = (uvsy << 2) >> lowres;
2177 if (h >> s->chroma_y_shift) {
2178 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2179 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2182 // FIXME h261 lowres loop filter
2185 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
2186 uint8_t *dest_cb, uint8_t *dest_cr,
2187 uint8_t **ref_picture,
2188 h264_chroma_mc_func * pix_op,
2191 const int lowres = s->avctx->lowres;
2192 const int op_index = FFMIN(lowres, 2);
2193 const int block_s = 8 >> lowres;
2194 const int s_mask = (2 << lowres) - 1;
2195 const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2196 const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2197 int emu = 0, src_x, src_y, offset, sx, sy;
2200 if (s->quarter_sample) {
2205 /* In case of 8X8, we construct a single chroma motion vector
2206 with a special rounding */
2207 mx = ff_h263_round_chroma(mx);
2208 my = ff_h263_round_chroma(my);
2212 src_x = s->mb_x * block_s + (mx >> lowres + 1);
2213 src_y = s->mb_y * block_s + (my >> lowres + 1);
2215 offset = src_y * s->uvlinesize + src_x;
2216 ptr = ref_picture[1] + offset;
2217 if (s->flags & CODEC_FLAG_EMU_EDGE) {
2218 if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2219 (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2220 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
2221 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2222 ptr = s->edge_emu_buffer;
2226 sx = (sx << 2) >> lowres;
2227 sy = (sy << 2) >> lowres;
2228 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2230 ptr = ref_picture[2] + offset;
2232 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2233 src_x, src_y, h_edge_pos, v_edge_pos);
2234 ptr = s->edge_emu_buffer;
2236 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2240 * motion compensation of a single macroblock
2242 * @param dest_y luma destination pointer
2243 * @param dest_cb chroma cb/u destination pointer
2244 * @param dest_cr chroma cr/v destination pointer
2245 * @param dir direction (0->forward, 1->backward)
2246 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2247 * @param pix_op halfpel motion compensation function (average or put normally)
2248 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2250 static inline void MPV_motion_lowres(MpegEncContext *s,
2251 uint8_t *dest_y, uint8_t *dest_cb,
2253 int dir, uint8_t **ref_picture,
2254 h264_chroma_mc_func *pix_op)
2258 const int lowres = s->avctx->lowres;
2259 const int block_s = 8 >>lowres;
2264 switch (s->mv_type) {
2266 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2268 ref_picture, pix_op,
2269 s->mv[dir][0][0], s->mv[dir][0][1],
2275 for (i = 0; i < 4; i++) {
2276 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2277 s->linesize) * block_s,
2278 ref_picture[0], 0, 0,
2279 (2 * mb_x + (i & 1)) * block_s,
2280 (2 * mb_y + (i >> 1)) * block_s,
2281 s->width, s->height, s->linesize,
2282 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2283 block_s, block_s, pix_op,
2284 s->mv[dir][i][0], s->mv[dir][i][1]);
2286 mx += s->mv[dir][i][0];
2287 my += s->mv[dir][i][1];
2290 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2291 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2295 if (s->picture_structure == PICT_FRAME) {
2297 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2298 1, 0, s->field_select[dir][0],
2299 ref_picture, pix_op,
2300 s->mv[dir][0][0], s->mv[dir][0][1],
2303 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2304 1, 1, s->field_select[dir][1],
2305 ref_picture, pix_op,
2306 s->mv[dir][1][0], s->mv[dir][1][1],
2309 if (s->picture_structure != s->field_select[dir][0] + 1 &&
2310 s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2311 ref_picture = s->current_picture_ptr->f.data;
2314 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2315 0, 0, s->field_select[dir][0],
2316 ref_picture, pix_op,
2318 s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2322 for (i = 0; i < 2; i++) {
2323 uint8_t **ref2picture;
2325 if (s->picture_structure == s->field_select[dir][i] + 1 ||
2326 s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2327 ref2picture = ref_picture;
2329 ref2picture = s->current_picture_ptr->f.data;
2332 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2333 0, 0, s->field_select[dir][i],
2334 ref2picture, pix_op,
2335 s->mv[dir][i][0], s->mv[dir][i][1] +
2336 2 * block_s * i, block_s, mb_y >> 1);
2338 dest_y += 2 * block_s * s->linesize;
2339 dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2340 dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2344 if (s->picture_structure == PICT_FRAME) {
2345 for (i = 0; i < 2; i++) {
2347 for (j = 0; j < 2; j++) {
2348 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2350 ref_picture, pix_op,
2351 s->mv[dir][2 * i + j][0],
2352 s->mv[dir][2 * i + j][1],
2355 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2358 for (i = 0; i < 2; i++) {
2359 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2360 0, 0, s->picture_structure != i + 1,
2361 ref_picture, pix_op,
2362 s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2363 2 * block_s, mb_y >> 1);
2365 // after put we make avg of the same block
2366 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2368 // opposite parity is always in the same
2369 // frame if this is second field
2370 if (!s->first_field) {
2371 ref_picture = s->current_picture_ptr->f.data;
2382 * find the lowest MB row referenced in the MVs
2384 int ff_MPV_lowest_referenced_row(MpegEncContext *s, int dir)
2386 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2387 int my, off, i, mvs;
2389 if (s->picture_structure != PICT_FRAME || s->mcsel)
2392 switch (s->mv_type) {
2406 for (i = 0; i < mvs; i++) {
2407 my = s->mv[dir][i][1]<<qpel_shift;
2408 my_max = FFMAX(my_max, my);
2409 my_min = FFMIN(my_min, my);
2412 off = (FFMAX(-my_min, my_max) + 63) >> 6;
2414 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2416 return s->mb_height-1;
2419 /* put block[] to dest[] */
2420 static inline void put_dct(MpegEncContext *s,
2421 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2423 s->dct_unquantize_intra(s, block, i, qscale);
2424 s->dsp.idct_put (dest, line_size, block);
2427 /* add block[] to dest[] */
2428 static inline void add_dct(MpegEncContext *s,
2429 DCTELEM *block, int i, uint8_t *dest, int line_size)
2431 if (s->block_last_index[i] >= 0) {
2432 s->dsp.idct_add (dest, line_size, block);
2436 static inline void add_dequant_dct(MpegEncContext *s,
2437 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2439 if (s->block_last_index[i] >= 0) {
2440 s->dct_unquantize_inter(s, block, i, qscale);
2442 s->dsp.idct_add (dest, line_size, block);
2447 * Clean dc, ac, coded_block for the current non-intra MB.
2449 void ff_clean_intra_table_entries(MpegEncContext *s)
2451 int wrap = s->b8_stride;
2452 int xy = s->block_index[0];
2455 s->dc_val[0][xy + 1 ] =
2456 s->dc_val[0][xy + wrap] =
2457 s->dc_val[0][xy + 1 + wrap] = 1024;
2459 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2460 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2461 if (s->msmpeg4_version>=3) {
2462 s->coded_block[xy ] =
2463 s->coded_block[xy + 1 ] =
2464 s->coded_block[xy + wrap] =
2465 s->coded_block[xy + 1 + wrap] = 0;
2468 wrap = s->mb_stride;
2469 xy = s->mb_x + s->mb_y * wrap;
2471 s->dc_val[2][xy] = 1024;
2473 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2474 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2476 s->mbintra_table[xy]= 0;
2479 /* generic function called after a macroblock has been parsed by the
2480 decoder or after it has been encoded by the encoder.
2482 Important variables used:
2483 s->mb_intra : true if intra macroblock
2484 s->mv_dir : motion vector direction
2485 s->mv_type : motion vector type
2486 s->mv : motion vector
2487 s->interlaced_dct : true if interlaced dct used (mpeg2)
2489 static av_always_inline
2490 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2491 int lowres_flag, int is_mpeg12)
2493 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2494 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2495 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2499 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2500 /* save DCT coefficients */
2502 DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2503 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2505 for(j=0; j<64; j++){
2506 *dct++ = block[i][s->dsp.idct_permutation[j]];
2507 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2509 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2513 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2515 /* update DC predictors for P macroblocks */
2517 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2518 if(s->mbintra_table[mb_xy])
2519 ff_clean_intra_table_entries(s);
2523 s->last_dc[2] = 128 << s->intra_dc_precision;
2526 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2527 s->mbintra_table[mb_xy]=1;
2529 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
2530 uint8_t *dest_y, *dest_cb, *dest_cr;
2531 int dct_linesize, dct_offset;
2532 op_pixels_func (*op_pix)[4];
2533 qpel_mc_func (*op_qpix)[16];
2534 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2535 const int uvlinesize = s->current_picture.f.linesize[1];
2536 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2537 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2539 /* avoid copy if macroblock skipped in last frame too */
2540 /* skip only during decoding as we might trash the buffers during encoding a bit */
2542 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2544 if (s->mb_skipped) {
2546 av_assert2(s->pict_type!=AV_PICTURE_TYPE_I);
2548 } else if(!s->current_picture.f.reference) {
2551 *mbskip_ptr = 0; /* not skipped */
2555 dct_linesize = linesize << s->interlaced_dct;
2556 dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
2560 dest_cb= s->dest[1];
2561 dest_cr= s->dest[2];
2563 dest_y = s->b_scratchpad;
2564 dest_cb= s->b_scratchpad+16*linesize;
2565 dest_cr= s->b_scratchpad+32*linesize;
2569 /* motion handling */
2570 /* decoding or more than one mb_type (MC was already done otherwise) */
2573 if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2574 if (s->mv_dir & MV_DIR_FORWARD) {
2575 ff_thread_await_progress(&s->last_picture_ptr->f,
2576 ff_MPV_lowest_referenced_row(s, 0),
2579 if (s->mv_dir & MV_DIR_BACKWARD) {
2580 ff_thread_await_progress(&s->next_picture_ptr->f,
2581 ff_MPV_lowest_referenced_row(s, 1),
2587 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2589 if (s->mv_dir & MV_DIR_FORWARD) {
2590 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2591 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2593 if (s->mv_dir & MV_DIR_BACKWARD) {
2594 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2597 op_qpix= s->me.qpel_put;
2598 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2599 op_pix = s->dsp.put_pixels_tab;
2601 op_pix = s->dsp.put_no_rnd_pixels_tab;
2603 if (s->mv_dir & MV_DIR_FORWARD) {
2604 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2605 op_pix = s->dsp.avg_pixels_tab;
2606 op_qpix= s->me.qpel_avg;
2608 if (s->mv_dir & MV_DIR_BACKWARD) {
2609 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2614 /* skip dequant / idct if we are really late ;) */
2615 if(s->avctx->skip_idct){
2616 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2617 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2618 || s->avctx->skip_idct >= AVDISCARD_ALL)
2622 /* add dct residue */
2623 if(s->encoding || !( s->msmpeg4_version || s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO
2624 || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
2625 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2626 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2627 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2628 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2630 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2631 if (s->chroma_y_shift){
2632 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2633 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2637 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2638 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2639 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2640 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2643 } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
2644 add_dct(s, block[0], 0, dest_y , dct_linesize);
2645 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2646 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2647 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2649 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2650 if(s->chroma_y_shift){//Chroma420
2651 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2652 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2655 dct_linesize = uvlinesize << s->interlaced_dct;
2656 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
2658 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2659 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2660 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2661 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2662 if(!s->chroma_x_shift){//Chroma444
2663 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2664 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2665 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2666 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2671 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2672 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2675 /* dct only in intra block */
2676 if(s->encoding || !(s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO)){
2677 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2678 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2679 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2680 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2682 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2683 if(s->chroma_y_shift){
2684 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2685 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2689 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2690 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2691 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2692 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2696 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2697 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2698 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2699 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2701 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2702 if(s->chroma_y_shift){
2703 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2704 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2707 dct_linesize = uvlinesize << s->interlaced_dct;
2708 dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
2710 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2711 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2712 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2713 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2714 if(!s->chroma_x_shift){//Chroma444
2715 s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2716 s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2717 s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2718 s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2726 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2727 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2728 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2733 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2735 if(s->out_format == FMT_MPEG1) {
2736 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2737 else MPV_decode_mb_internal(s, block, 0, 1);
2740 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2741 else MPV_decode_mb_internal(s, block, 0, 0);
2745 * @param h is the normal height, this will be reduced automatically if needed for the last row
2747 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2748 const int field_pic= s->picture_structure != PICT_FRAME;
2754 if (!s->avctx->hwaccel
2755 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2756 && s->unrestricted_mv
2757 && s->current_picture.f.reference
2759 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2760 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
2761 int sides = 0, edge_h;
2762 int hshift = desc->log2_chroma_w;
2763 int vshift = desc->log2_chroma_h;
2764 if (y==0) sides |= EDGE_TOP;
2765 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2767 edge_h= FFMIN(h, s->v_edge_pos - y);
2769 s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2770 s->linesize, s->h_edge_pos, edge_h,
2771 EDGE_WIDTH, EDGE_WIDTH, sides);
2772 s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2773 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2774 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2775 s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2776 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2777 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2780 h= FFMIN(h, s->avctx->height - y);
2782 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2784 if (s->avctx->draw_horiz_band) {
2786 int offset[AV_NUM_DATA_POINTERS];
2789 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2790 src = &s->current_picture_ptr->f;
2791 else if(s->last_picture_ptr)
2792 src = &s->last_picture_ptr->f;
2796 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2797 for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2800 offset[0]= y * s->linesize;
2802 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2803 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2809 s->avctx->draw_horiz_band(s->avctx, src, offset,
2810 y, s->picture_structure, h);
2814 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2815 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2816 const int uvlinesize = s->current_picture.f.linesize[1];
2817 const int mb_size= 4 - s->avctx->lowres;
2819 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2820 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2821 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2822 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2823 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2824 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;
2825 //block_index is not used by mpeg2, so it is not affected by chroma_format
2827 s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2828 s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2829 s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2831 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2833 if(s->picture_structure==PICT_FRAME){
2834 s->dest[0] += s->mb_y * linesize << mb_size;
2835 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2836 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2838 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2839 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2840 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2841 av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2846 void ff_mpeg_flush(AVCodecContext *avctx){
2848 MpegEncContext *s = avctx->priv_data;
2850 if(s==NULL || s->picture==NULL)
2853 for(i=0; i<s->picture_count; i++){
2854 if (s->picture[i].f.data[0] &&
2855 (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2856 s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2857 free_frame_buffer(s, &s->picture[i]);
2859 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2861 s->mb_x= s->mb_y= 0;
2864 s->parse_context.state= -1;
2865 s->parse_context.frame_start_found= 0;
2866 s->parse_context.overread= 0;
2867 s->parse_context.overread_index= 0;
2868 s->parse_context.index= 0;
2869 s->parse_context.last_index= 0;
2870 s->bitstream_buffer_size=0;
2874 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2875 DCTELEM *block, int n, int qscale)
2877 int i, level, nCoeffs;
2878 const uint16_t *quant_matrix;
2880 nCoeffs= s->block_last_index[n];
2882 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2883 /* XXX: only mpeg1 */
2884 quant_matrix = s->intra_matrix;
2885 for(i=1;i<=nCoeffs;i++) {
2886 int j= s->intra_scantable.permutated[i];
2891 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2892 level = (level - 1) | 1;
2895 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2896 level = (level - 1) | 1;
2903 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2904 DCTELEM *block, int n, int qscale)
2906 int i, level, nCoeffs;
2907 const uint16_t *quant_matrix;
2909 nCoeffs= s->block_last_index[n];
2911 quant_matrix = s->inter_matrix;
2912 for(i=0; i<=nCoeffs; i++) {
2913 int j= s->intra_scantable.permutated[i];
2918 level = (((level << 1) + 1) * qscale *
2919 ((int) (quant_matrix[j]))) >> 4;
2920 level = (level - 1) | 1;
2923 level = (((level << 1) + 1) * qscale *
2924 ((int) (quant_matrix[j]))) >> 4;
2925 level = (level - 1) | 1;
2932 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2933 DCTELEM *block, int n, int qscale)
2935 int i, level, nCoeffs;
2936 const uint16_t *quant_matrix;
2938 if(s->alternate_scan) nCoeffs= 63;
2939 else nCoeffs= s->block_last_index[n];
2941 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2942 quant_matrix = s->intra_matrix;
2943 for(i=1;i<=nCoeffs;i++) {
2944 int j= s->intra_scantable.permutated[i];
2949 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2952 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2959 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2960 DCTELEM *block, int n, int qscale)
2962 int i, level, nCoeffs;
2963 const uint16_t *quant_matrix;
2966 if(s->alternate_scan) nCoeffs= 63;
2967 else nCoeffs= s->block_last_index[n];
2969 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2971 quant_matrix = s->intra_matrix;
2972 for(i=1;i<=nCoeffs;i++) {
2973 int j= s->intra_scantable.permutated[i];
2978 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2981 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2990 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2991 DCTELEM *block, int n, int qscale)
2993 int i, level, nCoeffs;
2994 const uint16_t *quant_matrix;
2997 if(s->alternate_scan) nCoeffs= 63;
2998 else nCoeffs= s->block_last_index[n];
3000 quant_matrix = s->inter_matrix;
3001 for(i=0; i<=nCoeffs; i++) {
3002 int j= s->intra_scantable.permutated[i];
3007 level = (((level << 1) + 1) * qscale *
3008 ((int) (quant_matrix[j]))) >> 4;
3011 level = (((level << 1) + 1) * qscale *
3012 ((int) (quant_matrix[j]))) >> 4;
3021 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
3022 DCTELEM *block, int n, int qscale)
3024 int i, level, qmul, qadd;
3027 assert(s->block_last_index[n]>=0);
3032 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
3033 qadd = (qscale - 1) | 1;
3040 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3042 for(i=1; i<=nCoeffs; i++) {
3046 level = level * qmul - qadd;
3048 level = level * qmul + qadd;
3055 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
3056 DCTELEM *block, int n, int qscale)
3058 int i, level, qmul, qadd;
3061 assert(s->block_last_index[n]>=0);
3063 qadd = (qscale - 1) | 1;
3066 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3068 for(i=0; i<=nCoeffs; i++) {
3072 level = level * qmul - qadd;
3074 level = level * qmul + qadd;
3082 * set qscale and update qscale dependent variables.
3084 void ff_set_qscale(MpegEncContext * s, int qscale)
3088 else if (qscale > 31)
3092 s->chroma_qscale= s->chroma_qscale_table[qscale];
3094 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3095 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3098 void ff_MPV_report_decode_progress(MpegEncContext *s)
3100 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred)
3101 ff_thread_report_progress(&s->current_picture_ptr->f, s->mb_y, 0);