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);
61 /* enable all paranoid tests for rounding, overflows, etc... */
67 static const uint8_t ff_default_chroma_qscale_table[32] = {
68 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
69 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
70 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
73 const uint8_t ff_mpeg1_dc_scale_table[128] = {
74 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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,
80 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
81 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
82 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
85 static const uint8_t mpeg2_dc_scale_table1[128] = {
86 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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,
92 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
93 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
94 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
97 static const uint8_t mpeg2_dc_scale_table2[128] = {
98 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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,
104 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
105 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
106 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
109 static const uint8_t mpeg2_dc_scale_table3[128] = {
110 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
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,
116 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
117 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
118 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
121 const uint8_t *const ff_mpeg2_dc_scale_table[4] = {
122 ff_mpeg1_dc_scale_table,
123 mpeg2_dc_scale_table1,
124 mpeg2_dc_scale_table2,
125 mpeg2_dc_scale_table3,
128 const enum AVPixelFormat ff_pixfmt_list_420[] = {
133 const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[] = {
134 AV_PIX_FMT_DXVA2_VLD,
135 AV_PIX_FMT_VAAPI_VLD,
141 const uint8_t *avpriv_mpv_find_start_code(const uint8_t *av_restrict p,
143 uint32_t *av_restrict state)
151 for (i = 0; i < 3; i++) {
152 uint32_t tmp = *state << 8;
153 *state = tmp + *(p++);
154 if (tmp == 0x100 || p == end)
159 if (p[-1] > 1 ) p += 3;
160 else if (p[-2] ) p += 2;
161 else if (p[-3]|(p[-1]-1)) p++;
168 p = FFMIN(p, end) - 4;
174 /* init common dct for both encoder and decoder */
175 av_cold int ff_dct_common_init(MpegEncContext *s)
177 ff_dsputil_init(&s->dsp, s->avctx);
179 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
180 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
181 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
182 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
183 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
184 if (s->flags & CODEC_FLAG_BITEXACT)
185 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
186 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
189 ff_MPV_common_init_x86(s);
191 ff_MPV_common_init_axp(s);
193 ff_MPV_common_init_mmi(s);
195 ff_MPV_common_init_arm(s);
197 ff_MPV_common_init_altivec(s);
199 ff_MPV_common_init_bfin(s);
202 /* load & permutate scantables
203 * note: only wmv uses different ones
205 if (s->alternate_scan) {
206 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
207 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
209 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
210 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
212 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
213 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
218 void ff_copy_picture(Picture *dst, Picture *src)
221 dst->f.type = FF_BUFFER_TYPE_COPY;
225 * Release a frame buffer
227 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
229 /* WM Image / Screen codecs allocate internal buffers with different
230 * dimensions / colorspaces; ignore user-defined callbacks for these. */
231 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
232 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
233 s->codec_id != AV_CODEC_ID_MSS2)
234 ff_thread_release_buffer(s->avctx, &pic->f);
236 avcodec_default_release_buffer(s->avctx, &pic->f);
237 av_freep(&pic->f.hwaccel_picture_private);
241 * Allocate a frame buffer
243 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
247 if (s->avctx->hwaccel) {
248 assert(!pic->f.hwaccel_picture_private);
249 if (s->avctx->hwaccel->priv_data_size) {
250 pic->f.hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
251 if (!pic->f.hwaccel_picture_private) {
252 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
258 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
259 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
260 s->codec_id != AV_CODEC_ID_MSS2)
261 r = ff_thread_get_buffer(s->avctx, &pic->f);
263 r = avcodec_default_get_buffer(s->avctx, &pic->f);
265 if (r < 0 || !pic->f.type || !pic->f.data[0]) {
266 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n",
267 r, pic->f.type, pic->f.data[0]);
268 av_freep(&pic->f.hwaccel_picture_private);
272 if (s->linesize && (s->linesize != pic->f.linesize[0] ||
273 s->uvlinesize != pic->f.linesize[1])) {
274 av_log(s->avctx, AV_LOG_ERROR,
275 "get_buffer() failed (stride changed)\n");
276 free_frame_buffer(s, pic);
280 if (pic->f.linesize[1] != pic->f.linesize[2]) {
281 av_log(s->avctx, AV_LOG_ERROR,
282 "get_buffer() failed (uv stride mismatch)\n");
283 free_frame_buffer(s, pic);
291 * Allocate a Picture.
292 * The pixels are allocated/set by calling get_buffer() if shared = 0
294 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
296 const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
298 // the + 1 is needed so memset(,,stride*height) does not sig11
300 const int mb_array_size = s->mb_stride * s->mb_height;
301 const int b8_array_size = s->b8_stride * s->mb_height * 2;
302 const int b4_array_size = s->b4_stride * s->mb_height * 4;
307 assert(pic->f.data[0]);
308 assert(pic->f.type == 0 || pic->f.type == FF_BUFFER_TYPE_SHARED);
309 pic->f.type = FF_BUFFER_TYPE_SHARED;
311 assert(!pic->f.data[0]);
313 if (alloc_frame_buffer(s, pic) < 0)
316 s->linesize = pic->f.linesize[0];
317 s->uvlinesize = pic->f.linesize[1];
320 if (pic->f.qscale_table == NULL) {
322 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var,
323 mb_array_size * sizeof(int16_t), fail)
324 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var,
325 mb_array_size * sizeof(int16_t), fail)
326 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean,
327 mb_array_size * sizeof(int8_t ), fail)
330 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.mbskip_table,
331 mb_array_size * sizeof(uint8_t) + 2, fail)// the + 2 is for the slice end check
332 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table_base,
333 (big_mb_num + s->mb_stride) * sizeof(uint8_t),
335 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base,
336 (big_mb_num + s->mb_stride) * sizeof(uint32_t),
338 pic->f.mb_type = pic->mb_type_base + 2 * s->mb_stride + 1;
339 pic->f.qscale_table = pic->qscale_table_base + 2 * s->mb_stride + 1;
340 if (s->out_format == FMT_H264) {
341 for (i = 0; i < 2; i++) {
342 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
343 2 * (b4_array_size + 4) * sizeof(int16_t),
345 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
346 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
347 4 * mb_array_size * sizeof(uint8_t), fail)
349 pic->f.motion_subsample_log2 = 2;
350 } else if (s->out_format == FMT_H263 || s->encoding ||
351 (s->avctx->debug & FF_DEBUG_MV) || s->avctx->debug_mv) {
352 for (i = 0; i < 2; i++) {
353 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
354 2 * (b8_array_size + 4) * sizeof(int16_t),
356 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
357 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
358 4 * mb_array_size * sizeof(uint8_t), fail)
360 pic->f.motion_subsample_log2 = 3;
362 if (s->avctx->debug&FF_DEBUG_DCT_COEFF) {
363 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.dct_coeff,
364 64 * mb_array_size * sizeof(DCTELEM) * 6, fail)
366 pic->f.qstride = s->mb_stride;
367 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.pan_scan,
368 1 * sizeof(AVPanScan), fail)
374 fail: // for the FF_ALLOCZ_OR_GOTO macro
376 free_frame_buffer(s, pic);
381 * Deallocate a picture.
383 static void free_picture(MpegEncContext *s, Picture *pic)
387 if (pic->f.data[0] && pic->f.type != FF_BUFFER_TYPE_SHARED) {
388 free_frame_buffer(s, pic);
391 av_freep(&pic->mb_var);
392 av_freep(&pic->mc_mb_var);
393 av_freep(&pic->mb_mean);
394 av_freep(&pic->f.mbskip_table);
395 av_freep(&pic->qscale_table_base);
396 pic->f.qscale_table = NULL;
397 av_freep(&pic->mb_type_base);
398 pic->f.mb_type = NULL;
399 av_freep(&pic->f.dct_coeff);
400 av_freep(&pic->f.pan_scan);
401 pic->f.mb_type = NULL;
402 for (i = 0; i < 2; i++) {
403 av_freep(&pic->motion_val_base[i]);
404 av_freep(&pic->f.ref_index[i]);
405 pic->f.motion_val[i] = NULL;
408 if (pic->f.type == FF_BUFFER_TYPE_SHARED) {
409 for (i = 0; i < 4; i++) {
411 pic->f.data[i] = NULL;
417 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base)
419 int y_size = s->b8_stride * (2 * s->mb_height + 1);
420 int c_size = s->mb_stride * (s->mb_height + 1);
421 int yc_size = y_size + 2 * c_size;
424 // edge emu needs blocksize + filter length - 1
425 // (= 17x17 for halfpel / 21x21 for h264)
426 FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer,
427 (s->width + 95) * 2 * 21 * 4, fail); // (width + edge + align)*interlaced*MBsize*tolerance
429 // FIXME should be linesize instead of s->width * 2
430 // but that is not known before get_buffer()
431 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad,
432 (s->width + 95) * 4 * 16 * 2 * sizeof(uint8_t), fail)
433 s->me.temp = s->me.scratchpad;
434 s->rd_scratchpad = s->me.scratchpad;
435 s->b_scratchpad = s->me.scratchpad;
436 s->obmc_scratchpad = s->me.scratchpad + 16;
438 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map,
439 ME_MAP_SIZE * sizeof(uint32_t), fail)
440 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map,
441 ME_MAP_SIZE * sizeof(uint32_t), fail)
442 if (s->avctx->noise_reduction) {
443 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum,
444 2 * 64 * sizeof(int), fail)
447 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64 * 12 * 2 * sizeof(DCTELEM), fail)
448 s->block = s->blocks[0];
450 for (i = 0; i < 12; i++) {
451 s->pblocks[i] = &s->block[i];
454 if (s->out_format == FMT_H263) {
456 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base,
457 yc_size * sizeof(int16_t) * 16, fail);
458 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
459 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
460 s->ac_val[2] = s->ac_val[1] + c_size;
465 return -1; // free() through ff_MPV_common_end()
468 static void free_duplicate_context(MpegEncContext *s)
473 av_freep(&s->edge_emu_buffer);
474 av_freep(&s->me.scratchpad);
478 s->obmc_scratchpad = NULL;
480 av_freep(&s->dct_error_sum);
481 av_freep(&s->me.map);
482 av_freep(&s->me.score_map);
483 av_freep(&s->blocks);
484 av_freep(&s->ac_val_base);
488 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
490 #define COPY(a) bak->a = src->a
491 COPY(edge_emu_buffer);
496 COPY(obmc_scratchpad);
503 COPY(me.map_generation);
515 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
519 // FIXME copy only needed parts
521 backup_duplicate_context(&bak, dst);
522 memcpy(dst, src, sizeof(MpegEncContext));
523 backup_duplicate_context(dst, &bak);
524 for (i = 0; i < 12; i++) {
525 dst->pblocks[i] = &dst->block[i];
527 // STOP_TIMER("update_duplicate_context")
528 // about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
531 int ff_mpeg_update_thread_context(AVCodecContext *dst,
532 const AVCodecContext *src)
535 MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
540 // FIXME can parameters change on I-frames?
541 // in that case dst may need a reinit
542 if (!s->context_initialized) {
543 memcpy(s, s1, sizeof(MpegEncContext));
546 s->bitstream_buffer = NULL;
547 s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
549 if (s1->context_initialized){
550 s->picture_range_start += MAX_PICTURE_COUNT;
551 s->picture_range_end += MAX_PICTURE_COUNT;
552 ff_MPV_common_init(s);
556 if (s->height != s1->height || s->width != s1->width || s->context_reinit) {
558 s->context_reinit = 0;
559 s->height = s1->height;
560 s->width = s1->width;
561 if ((err = ff_MPV_common_frame_size_change(s)) < 0)
565 s->avctx->coded_height = s1->avctx->coded_height;
566 s->avctx->coded_width = s1->avctx->coded_width;
567 s->avctx->width = s1->avctx->width;
568 s->avctx->height = s1->avctx->height;
570 s->coded_picture_number = s1->coded_picture_number;
571 s->picture_number = s1->picture_number;
572 s->input_picture_number = s1->input_picture_number;
574 memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
575 memcpy(&s->last_picture, &s1->last_picture,
576 (char *) &s1->last_picture_ptr - (char *) &s1->last_picture);
578 // reset s->picture[].f.extended_data to s->picture[].f.data
579 for (i = 0; i < s->picture_count; i++)
580 s->picture[i].f.extended_data = s->picture[i].f.data;
582 s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
583 s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
584 s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
586 // Error/bug resilience
587 s->next_p_frame_damaged = s1->next_p_frame_damaged;
588 s->workaround_bugs = s1->workaround_bugs;
589 s->padding_bug_score = s1->padding_bug_score;
592 memcpy(&s->time_increment_bits, &s1->time_increment_bits,
593 (char *) &s1->shape - (char *) &s1->time_increment_bits);
596 s->max_b_frames = s1->max_b_frames;
597 s->low_delay = s1->low_delay;
598 s->dropable = s1->dropable;
600 // DivX handling (doesn't work)
601 s->divx_packed = s1->divx_packed;
603 if (s1->bitstream_buffer) {
604 if (s1->bitstream_buffer_size +
605 FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
606 av_fast_malloc(&s->bitstream_buffer,
607 &s->allocated_bitstream_buffer_size,
608 s1->allocated_bitstream_buffer_size);
609 s->bitstream_buffer_size = s1->bitstream_buffer_size;
610 memcpy(s->bitstream_buffer, s1->bitstream_buffer,
611 s1->bitstream_buffer_size);
612 memset(s->bitstream_buffer + s->bitstream_buffer_size, 0,
613 FF_INPUT_BUFFER_PADDING_SIZE);
616 // MPEG2/interlacing info
617 memcpy(&s->progressive_sequence, &s1->progressive_sequence,
618 (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
620 if (!s1->first_field) {
621 s->last_pict_type = s1->pict_type;
622 if (s1->current_picture_ptr)
623 s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality;
625 if (s1->pict_type != AV_PICTURE_TYPE_B) {
626 s->last_non_b_pict_type = s1->pict_type;
634 * Set the given MpegEncContext to common defaults
635 * (same for encoding and decoding).
636 * The changed fields will not depend upon the
637 * prior state of the MpegEncContext.
639 void ff_MPV_common_defaults(MpegEncContext *s)
641 s->y_dc_scale_table =
642 s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
643 s->chroma_qscale_table = ff_default_chroma_qscale_table;
644 s->progressive_frame = 1;
645 s->progressive_sequence = 1;
646 s->picture_structure = PICT_FRAME;
648 s->coded_picture_number = 0;
649 s->picture_number = 0;
650 s->input_picture_number = 0;
652 s->picture_in_gop_number = 0;
657 s->picture_range_start = 0;
658 s->picture_range_end = MAX_PICTURE_COUNT;
660 s->slice_context_count = 1;
664 * Set the given MpegEncContext to defaults for decoding.
665 * the changed fields will not depend upon
666 * the prior state of the MpegEncContext.
668 void ff_MPV_decode_defaults(MpegEncContext *s)
670 ff_MPV_common_defaults(s);
674 * Initialize and allocates MpegEncContext fields dependent on the resolution.
676 static int init_context_frame(MpegEncContext *s)
678 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
680 s->mb_width = (s->width + 15) / 16;
681 s->mb_stride = s->mb_width + 1;
682 s->b8_stride = s->mb_width * 2 + 1;
683 s->b4_stride = s->mb_width * 4 + 1;
684 mb_array_size = s->mb_height * s->mb_stride;
685 mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
687 /* set default edge pos, will be overriden
688 * in decode_header if needed */
689 s->h_edge_pos = s->mb_width * 16;
690 s->v_edge_pos = s->mb_height * 16;
692 s->mb_num = s->mb_width * s->mb_height;
697 s->block_wrap[3] = s->b8_stride;
699 s->block_wrap[5] = s->mb_stride;
701 y_size = s->b8_stride * (2 * s->mb_height + 1);
702 c_size = s->mb_stride * (s->mb_height + 1);
703 yc_size = y_size + 2 * c_size;
705 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
706 for (y = 0; y < s->mb_height; y++)
707 for (x = 0; x < s->mb_width; x++)
708 s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
710 s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
713 /* Allocate MV tables */
714 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
715 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
716 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
717 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
718 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
719 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
720 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
721 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
722 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
723 s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
724 s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base + s->mb_stride + 1;
725 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
727 /* Allocate MB type table */
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size * sizeof(uint16_t), fail) // needed for encoding
730 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
732 FF_ALLOC_OR_GOTO(s->avctx, s->cplx_tab,
733 mb_array_size * sizeof(float), fail);
734 FF_ALLOC_OR_GOTO(s->avctx, s->bits_tab,
735 mb_array_size * sizeof(float), fail);
739 FF_ALLOC_OR_GOTO(s->avctx, s->er_temp_buffer,
740 mb_array_size * sizeof(uint8_t), fail);
741 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table,
742 mb_array_size * sizeof(uint8_t), fail);
744 if (s->codec_id == AV_CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)) {
745 /* interlaced direct mode decoding tables */
746 for (i = 0; i < 2; i++) {
748 for (j = 0; j < 2; j++) {
749 for (k = 0; k < 2; k++) {
750 FF_ALLOCZ_OR_GOTO(s->avctx,
751 s->b_field_mv_table_base[i][j][k],
752 mv_table_size * 2 * sizeof(int16_t),
754 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
757 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
758 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
759 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
761 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
764 if (s->out_format == FMT_H263) {
766 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
767 s->coded_block = s->coded_block_base + s->b8_stride + 1;
769 /* cbp, ac_pred, pred_dir */
770 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail);
771 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
774 if (s->h263_pred || s->h263_plus || !s->encoding) {
776 // MN: we need these for error resilience of intra-frames
777 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
778 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
779 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
780 s->dc_val[2] = s->dc_val[1] + c_size;
781 for (i = 0; i < yc_size; i++)
782 s->dc_val_base[i] = 1024;
785 /* which mb is a intra block */
786 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
787 memset(s->mbintra_table, 1, mb_array_size);
789 /* init macroblock skip table */
790 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail);
791 // Note the + 1 is for a quicker mpeg4 slice_end detection
795 return AVERROR(ENOMEM);
799 * init common structure for both encoder and decoder.
800 * this assumes that some variables like width/height are already set
802 av_cold int ff_MPV_common_init(MpegEncContext *s)
805 int nb_slices = (HAVE_THREADS &&
806 s->avctx->active_thread_type & FF_THREAD_SLICE) ?
807 s->avctx->thread_count : 1;
809 if (s->encoding && s->avctx->slices)
810 nb_slices = s->avctx->slices;
812 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
813 s->mb_height = (s->height + 31) / 32 * 2;
814 else if (s->codec_id != AV_CODEC_ID_H264)
815 s->mb_height = (s->height + 15) / 16;
817 if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
818 av_log(s->avctx, AV_LOG_ERROR,
819 "decoding to AV_PIX_FMT_NONE is not supported.\n");
823 if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
826 max_slices = FFMIN(MAX_THREADS, s->mb_height);
828 max_slices = MAX_THREADS;
829 av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
830 " reducing to %d\n", nb_slices, max_slices);
831 nb_slices = max_slices;
834 if ((s->width || s->height) &&
835 av_image_check_size(s->width, s->height, 0, s->avctx))
838 ff_dct_common_init(s);
840 s->flags = s->avctx->flags;
841 s->flags2 = s->avctx->flags2;
843 /* set chroma shifts */
844 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift,
847 /* convert fourcc to upper case */
848 s->codec_tag = avpriv_toupper4(s->avctx->codec_tag);
849 s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
851 s->avctx->coded_frame = &s->current_picture.f;
854 if (s->msmpeg4_version) {
855 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
856 2 * 2 * (MAX_LEVEL + 1) *
857 (MAX_RUN + 1) * 2 * sizeof(int), fail);
859 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
861 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail)
862 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail)
863 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail)
864 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
865 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
866 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
867 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
868 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
870 if (s->avctx->noise_reduction) {
871 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail);
875 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
876 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture,
877 s->picture_count * sizeof(Picture), fail);
878 for (i = 0; i < s->picture_count; i++) {
879 avcodec_get_frame_defaults(&s->picture[i].f);
882 if ((err = init_context_frame(s)))
885 s->parse_context.state = -1;
887 s->context_initialized = 1;
888 s->thread_context[0] = s;
890 // if (s->width && s->height) {
892 for (i = 1; i < nb_slices; i++) {
893 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
894 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
897 for (i = 0; i < nb_slices; i++) {
898 if (init_duplicate_context(s->thread_context[i], s) < 0)
900 s->thread_context[i]->start_mb_y =
901 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
902 s->thread_context[i]->end_mb_y =
903 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
906 if (init_duplicate_context(s, s) < 0)
909 s->end_mb_y = s->mb_height;
911 s->slice_context_count = nb_slices;
916 ff_MPV_common_end(s);
921 * Frees and resets MpegEncContext fields depending on the resolution.
922 * Is used during resolution changes to avoid a full reinitialization of the
925 static int free_context_frame(MpegEncContext *s)
929 av_freep(&s->mb_type);
930 av_freep(&s->p_mv_table_base);
931 av_freep(&s->b_forw_mv_table_base);
932 av_freep(&s->b_back_mv_table_base);
933 av_freep(&s->b_bidir_forw_mv_table_base);
934 av_freep(&s->b_bidir_back_mv_table_base);
935 av_freep(&s->b_direct_mv_table_base);
936 s->p_mv_table = NULL;
937 s->b_forw_mv_table = NULL;
938 s->b_back_mv_table = NULL;
939 s->b_bidir_forw_mv_table = NULL;
940 s->b_bidir_back_mv_table = NULL;
941 s->b_direct_mv_table = NULL;
942 for (i = 0; i < 2; i++) {
943 for (j = 0; j < 2; j++) {
944 for (k = 0; k < 2; k++) {
945 av_freep(&s->b_field_mv_table_base[i][j][k]);
946 s->b_field_mv_table[i][j][k] = NULL;
948 av_freep(&s->b_field_select_table[i][j]);
949 av_freep(&s->p_field_mv_table_base[i][j]);
950 s->p_field_mv_table[i][j] = NULL;
952 av_freep(&s->p_field_select_table[i]);
955 av_freep(&s->dc_val_base);
956 av_freep(&s->coded_block_base);
957 av_freep(&s->mbintra_table);
958 av_freep(&s->cbp_table);
959 av_freep(&s->pred_dir_table);
961 av_freep(&s->mbskip_table);
963 av_freep(&s->error_status_table);
964 av_freep(&s->er_temp_buffer);
965 av_freep(&s->mb_index2xy);
966 av_freep(&s->lambda_table);
968 av_freep(&s->cplx_tab);
969 av_freep(&s->bits_tab);
971 s->linesize = s->uvlinesize = 0;
973 for (i = 0; i < 3; i++)
974 av_freep(&s->visualization_buffer[i]);
976 if (!(s->avctx->active_thread_type & FF_THREAD_FRAME))
977 avcodec_default_free_buffers(s->avctx);
982 int ff_MPV_common_frame_size_change(MpegEncContext *s)
986 if (s->slice_context_count > 1) {
987 for (i = 0; i < s->slice_context_count; i++) {
988 free_duplicate_context(s->thread_context[i]);
990 for (i = 1; i < s->slice_context_count; i++) {
991 av_freep(&s->thread_context[i]);
994 free_duplicate_context(s);
996 free_context_frame(s);
999 for (i = 0; i < s->picture_count; i++) {
1000 s->picture[i].needs_realloc = 1;
1003 s->last_picture_ptr =
1004 s->next_picture_ptr =
1005 s->current_picture_ptr = NULL;
1008 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
1009 s->mb_height = (s->height + 31) / 32 * 2;
1010 else if (s->codec_id != AV_CODEC_ID_H264)
1011 s->mb_height = (s->height + 15) / 16;
1013 if ((s->width || s->height) &&
1014 av_image_check_size(s->width, s->height, 0, s->avctx))
1015 return AVERROR_INVALIDDATA;
1017 if ((err = init_context_frame(s)))
1020 s->thread_context[0] = s;
1022 if (s->width && s->height) {
1023 int nb_slices = s->slice_context_count;
1024 if (nb_slices > 1) {
1025 for (i = 1; i < nb_slices; i++) {
1026 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1027 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1030 for (i = 0; i < nb_slices; i++) {
1031 if (init_duplicate_context(s->thread_context[i], s) < 0)
1033 s->thread_context[i]->start_mb_y =
1034 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1035 s->thread_context[i]->end_mb_y =
1036 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1039 if (init_duplicate_context(s, s) < 0)
1042 s->end_mb_y = s->mb_height;
1044 s->slice_context_count = nb_slices;
1049 ff_MPV_common_end(s);
1053 /* init common structure for both encoder and decoder */
1054 void ff_MPV_common_end(MpegEncContext *s)
1058 if (s->slice_context_count > 1) {
1059 for (i = 0; i < s->slice_context_count; i++) {
1060 free_duplicate_context(s->thread_context[i]);
1062 for (i = 1; i < s->slice_context_count; i++) {
1063 av_freep(&s->thread_context[i]);
1065 s->slice_context_count = 1;
1066 } else free_duplicate_context(s);
1068 av_freep(&s->parse_context.buffer);
1069 s->parse_context.buffer_size = 0;
1071 av_freep(&s->bitstream_buffer);
1072 s->allocated_bitstream_buffer_size = 0;
1074 av_freep(&s->avctx->stats_out);
1075 av_freep(&s->ac_stats);
1077 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
1078 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
1079 s->q_chroma_intra_matrix= NULL;
1080 s->q_chroma_intra_matrix16= NULL;
1081 av_freep(&s->q_intra_matrix);
1082 av_freep(&s->q_inter_matrix);
1083 av_freep(&s->q_intra_matrix16);
1084 av_freep(&s->q_inter_matrix16);
1085 av_freep(&s->input_picture);
1086 av_freep(&s->reordered_input_picture);
1087 av_freep(&s->dct_offset);
1089 if (s->picture && !s->avctx->internal->is_copy) {
1090 for (i = 0; i < s->picture_count; i++) {
1091 free_picture(s, &s->picture[i]);
1094 av_freep(&s->picture);
1096 free_context_frame(s);
1098 s->context_initialized = 0;
1099 s->last_picture_ptr =
1100 s->next_picture_ptr =
1101 s->current_picture_ptr = NULL;
1102 s->linesize = s->uvlinesize = 0;
1105 void ff_init_rl(RLTable *rl,
1106 uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3])
1108 int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1];
1109 uint8_t index_run[MAX_RUN + 1];
1110 int last, run, level, start, end, i;
1112 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1113 if (static_store && rl->max_level[0])
1116 /* compute max_level[], max_run[] and index_run[] */
1117 for (last = 0; last < 2; last++) {
1126 memset(max_level, 0, MAX_RUN + 1);
1127 memset(max_run, 0, MAX_LEVEL + 1);
1128 memset(index_run, rl->n, MAX_RUN + 1);
1129 for (i = start; i < end; i++) {
1130 run = rl->table_run[i];
1131 level = rl->table_level[i];
1132 if (index_run[run] == rl->n)
1134 if (level > max_level[run])
1135 max_level[run] = level;
1136 if (run > max_run[level])
1137 max_run[level] = run;
1140 rl->max_level[last] = static_store[last];
1142 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1143 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1145 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1147 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1148 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1150 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1152 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1153 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1157 void ff_init_vlc_rl(RLTable *rl)
1161 for (q = 0; q < 32; q++) {
1163 int qadd = (q - 1) | 1;
1169 for (i = 0; i < rl->vlc.table_size; i++) {
1170 int code = rl->vlc.table[i][0];
1171 int len = rl->vlc.table[i][1];
1174 if (len == 0) { // illegal code
1177 } else if (len < 0) { // more bits needed
1181 if (code == rl->n) { // esc
1185 run = rl->table_run[code] + 1;
1186 level = rl->table_level[code] * qmul + qadd;
1187 if (code >= rl->last) run += 192;
1190 rl->rl_vlc[q][i].len = len;
1191 rl->rl_vlc[q][i].level = level;
1192 rl->rl_vlc[q][i].run = run;
1197 void ff_release_unused_pictures(MpegEncContext*s, int remove_current)
1201 /* release non reference frames */
1202 for (i = 0; i < s->picture_count; i++) {
1203 if (s->picture[i].f.data[0] && !s->picture[i].f.reference &&
1204 (!s->picture[i].owner2 || s->picture[i].owner2 == s) &&
1205 (remove_current || &s->picture[i] != s->current_picture_ptr)
1206 /* && s->picture[i].type!= FF_BUFFER_TYPE_SHARED */) {
1207 free_frame_buffer(s, &s->picture[i]);
1212 static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
1214 if (pic->f.data[0] == NULL)
1216 if (pic->needs_realloc)
1217 if (!pic->owner2 || pic->owner2 == s)
1222 static int find_unused_picture(MpegEncContext *s, int shared)
1227 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1228 if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type == 0)
1232 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1233 if (pic_is_unused(s, &s->picture[i]) && s->picture[i].f.type != 0)
1236 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1237 if (pic_is_unused(s, &s->picture[i]))
1242 av_log(s->avctx, AV_LOG_FATAL,
1243 "Internal error, picture buffer overflow\n");
1244 /* We could return -1, but the codec would crash trying to draw into a
1245 * non-existing frame anyway. This is safer than waiting for a random crash.
1246 * Also the return of this is never useful, an encoder must only allocate
1247 * as much as allowed in the specification. This has no relationship to how
1248 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1249 * enough for such valid streams).
1250 * Plus, a decoder has to check stream validity and remove frames if too
1251 * many reference frames are around. Waiting for "OOM" is not correct at
1252 * all. Similarly, missing reference frames have to be replaced by
1253 * interpolated/MC frames, anything else is a bug in the codec ...
1259 int ff_find_unused_picture(MpegEncContext *s, int shared)
1261 int ret = find_unused_picture(s, shared);
1263 if (ret >= 0 && ret < s->picture_range_end) {
1264 if (s->picture[ret].needs_realloc) {
1265 s->picture[ret].needs_realloc = 0;
1266 free_picture(s, &s->picture[ret]);
1267 avcodec_get_frame_defaults(&s->picture[ret].f);
1273 static void update_noise_reduction(MpegEncContext *s)
1277 for (intra = 0; intra < 2; intra++) {
1278 if (s->dct_count[intra] > (1 << 16)) {
1279 for (i = 0; i < 64; i++) {
1280 s->dct_error_sum[intra][i] >>= 1;
1282 s->dct_count[intra] >>= 1;
1285 for (i = 0; i < 64; i++) {
1286 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1287 s->dct_count[intra] +
1288 s->dct_error_sum[intra][i] / 2) /
1289 (s->dct_error_sum[intra][i] + 1);
1295 * generic function for encode/decode called after coding/decoding
1296 * the header and before a frame is coded/decoded.
1298 int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1304 if (!ff_thread_can_start_frame(avctx)) {
1305 av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
1309 /* mark & release old frames */
1310 if (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3) {
1311 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1312 s->last_picture_ptr != s->next_picture_ptr &&
1313 s->last_picture_ptr->f.data[0]) {
1314 if (s->last_picture_ptr->owner2 == s)
1315 free_frame_buffer(s, s->last_picture_ptr);
1318 /* release forgotten pictures */
1319 /* if (mpeg124/h263) */
1321 for (i = 0; i < s->picture_count; i++) {
1322 if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
1323 &s->picture[i] != s->last_picture_ptr &&
1324 &s->picture[i] != s->next_picture_ptr &&
1325 s->picture[i].f.reference && !s->picture[i].needs_realloc) {
1326 if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1327 av_log(avctx, AV_LOG_ERROR,
1328 "releasing zombie picture\n");
1329 free_frame_buffer(s, &s->picture[i]);
1336 ff_release_unused_pictures(s, 1);
1338 if (s->current_picture_ptr &&
1339 s->current_picture_ptr->f.data[0] == NULL) {
1340 // we already have a unused image
1341 // (maybe it was set before reading the header)
1342 pic = s->current_picture_ptr;
1344 i = ff_find_unused_picture(s, 0);
1346 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1349 pic = &s->picture[i];
1352 pic->f.reference = 0;
1354 if (s->codec_id == AV_CODEC_ID_H264)
1355 pic->f.reference = s->picture_structure;
1356 else if (s->pict_type != AV_PICTURE_TYPE_B)
1357 pic->f.reference = 3;
1360 pic->f.coded_picture_number = s->coded_picture_number++;
1362 if (ff_alloc_picture(s, pic, 0) < 0)
1365 s->current_picture_ptr = pic;
1366 // FIXME use only the vars from current_pic
1367 s->current_picture_ptr->f.top_field_first = s->top_field_first;
1368 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
1369 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1370 if (s->picture_structure != PICT_FRAME)
1371 s->current_picture_ptr->f.top_field_first =
1372 (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1374 s->current_picture_ptr->f.interlaced_frame = !s->progressive_frame &&
1375 !s->progressive_sequence;
1376 s->current_picture_ptr->field_picture = s->picture_structure != PICT_FRAME;
1379 s->current_picture_ptr->f.pict_type = s->pict_type;
1380 // if (s->flags && CODEC_FLAG_QSCALE)
1381 // s->current_picture_ptr->quality = s->new_picture_ptr->quality;
1382 s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1384 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1386 if (s->pict_type != AV_PICTURE_TYPE_B) {
1387 s->last_picture_ptr = s->next_picture_ptr;
1389 s->next_picture_ptr = s->current_picture_ptr;
1391 av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
1392 s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1393 s->last_picture_ptr ? s->last_picture_ptr->f.data[0] : NULL,
1394 s->next_picture_ptr ? s->next_picture_ptr->f.data[0] : NULL,
1395 s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL,
1396 s->pict_type, s->dropable);
1398 if (s->codec_id != AV_CODEC_ID_H264) {
1399 if ((s->last_picture_ptr == NULL ||
1400 s->last_picture_ptr->f.data[0] == NULL) &&
1401 (s->pict_type != AV_PICTURE_TYPE_I ||
1402 s->picture_structure != PICT_FRAME)) {
1403 if (s->pict_type != AV_PICTURE_TYPE_I)
1404 av_log(avctx, AV_LOG_ERROR,
1405 "warning: first frame is no keyframe\n");
1406 else if (s->picture_structure != PICT_FRAME)
1407 av_log(avctx, AV_LOG_INFO,
1408 "allocate dummy last picture for field based first keyframe\n");
1410 /* Allocate a dummy frame */
1411 i = ff_find_unused_picture(s, 0);
1413 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1416 s->last_picture_ptr = &s->picture[i];
1417 s->last_picture_ptr->f.key_frame = 0;
1418 if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
1419 s->last_picture_ptr = NULL;
1423 if(s->codec_id == AV_CODEC_ID_FLV1 || s->codec_id == AV_CODEC_ID_H263){
1424 for(i=0; i<avctx->height; i++)
1425 memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width);
1428 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0);
1429 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1);
1430 s->last_picture_ptr->f.reference = 3;
1432 if ((s->next_picture_ptr == NULL ||
1433 s->next_picture_ptr->f.data[0] == NULL) &&
1434 s->pict_type == AV_PICTURE_TYPE_B) {
1435 /* Allocate a dummy frame */
1436 i = ff_find_unused_picture(s, 0);
1438 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1441 s->next_picture_ptr = &s->picture[i];
1442 s->next_picture_ptr->f.key_frame = 0;
1443 if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
1444 s->next_picture_ptr = NULL;
1447 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 0);
1448 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 1);
1449 s->next_picture_ptr->f.reference = 3;
1453 if (s->last_picture_ptr)
1454 ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1455 if (s->next_picture_ptr)
1456 ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1458 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME) &&
1459 (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3)) {
1460 if (s->next_picture_ptr)
1461 s->next_picture_ptr->owner2 = s;
1462 if (s->last_picture_ptr)
1463 s->last_picture_ptr->owner2 = s;
1466 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
1467 s->last_picture_ptr->f.data[0]));
1469 if (s->picture_structure!= PICT_FRAME && s->out_format != FMT_H264) {
1471 for (i = 0; i < 4; i++) {
1472 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1473 s->current_picture.f.data[i] +=
1474 s->current_picture.f.linesize[i];
1476 s->current_picture.f.linesize[i] *= 2;
1477 s->last_picture.f.linesize[i] *= 2;
1478 s->next_picture.f.linesize[i] *= 2;
1482 s->err_recognition = avctx->err_recognition;
1484 /* set dequantizer, we can't do it during init as
1485 * it might change for mpeg4 and we can't do it in the header
1486 * decode as init is not called for mpeg4 there yet */
1487 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1488 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1489 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1490 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1491 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1492 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1494 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1495 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1498 if (s->dct_error_sum) {
1499 assert(s->avctx->noise_reduction && s->encoding);
1500 update_noise_reduction(s);
1503 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1504 return ff_xvmc_field_start(s, avctx);
1509 /* generic function for encode/decode called after a
1510 * frame has been coded/decoded. */
1511 void ff_MPV_frame_end(MpegEncContext *s)
1514 /* redraw edges for the frame if decoding didn't complete */
1515 // just to make sure that all data is rendered.
1516 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
1517 ff_xvmc_field_end(s);
1518 } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
1519 !s->avctx->hwaccel &&
1520 !(s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&
1521 s->unrestricted_mv &&
1522 s->current_picture.f.reference &&
1524 !(s->flags & CODEC_FLAG_EMU_EDGE) &&
1527 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1528 int hshift = desc->log2_chroma_w;
1529 int vshift = desc->log2_chroma_h;
1530 s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
1531 s->h_edge_pos, s->v_edge_pos,
1532 EDGE_WIDTH, EDGE_WIDTH,
1533 EDGE_TOP | EDGE_BOTTOM);
1534 s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
1535 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1536 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1537 EDGE_TOP | EDGE_BOTTOM);
1538 s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
1539 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1540 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1541 EDGE_TOP | EDGE_BOTTOM);
1546 s->last_pict_type = s->pict_type;
1547 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality;
1548 if (s->pict_type!= AV_PICTURE_TYPE_B) {
1549 s->last_non_b_pict_type = s->pict_type;
1552 /* copy back current_picture variables */
1553 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1554 if (s->picture[i].f.data[0] == s->current_picture.f.data[0]) {
1555 s->picture[i] = s->current_picture;
1559 assert(i < MAX_PICTURE_COUNT);
1563 /* release non-reference frames */
1564 for (i = 0; i < s->picture_count; i++) {
1565 if (s->picture[i].f.data[0] && !s->picture[i].f.reference
1566 /* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */) {
1567 free_frame_buffer(s, &s->picture[i]);
1571 // clear copies, to avoid confusion
1573 memset(&s->last_picture, 0, sizeof(Picture));
1574 memset(&s->next_picture, 0, sizeof(Picture));
1575 memset(&s->current_picture, 0, sizeof(Picture));
1577 s->avctx->coded_frame = &s->current_picture_ptr->f;
1579 if (s->codec_id != AV_CODEC_ID_H264 && s->current_picture.f.reference) {
1580 ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
1585 * Draw a line from (ex, ey) -> (sx, sy).
1586 * @param w width of the image
1587 * @param h height of the image
1588 * @param stride stride/linesize of the image
1589 * @param color color of the arrow
1591 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
1592 int w, int h, int stride, int color)
1596 sx = av_clip(sx, 0, w - 1);
1597 sy = av_clip(sy, 0, h - 1);
1598 ex = av_clip(ex, 0, w - 1);
1599 ey = av_clip(ey, 0, h - 1);
1601 buf[sy * stride + sx] += color;
1603 if (FFABS(ex - sx) > FFABS(ey - sy)) {
1605 FFSWAP(int, sx, ex);
1606 FFSWAP(int, sy, ey);
1608 buf += sx + sy * stride;
1610 f = ((ey - sy) << 16) / ex;
1611 for(x= 0; x <= ex; x++){
1613 fr = (x * f) & 0xFFFF;
1614 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1615 if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
1619 FFSWAP(int, sx, ex);
1620 FFSWAP(int, sy, ey);
1622 buf += sx + sy * stride;
1625 f = ((ex - sx) << 16) / ey;
1628 for(y= 0; y <= ey; y++){
1630 fr = (y*f) & 0xFFFF;
1631 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1632 if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
1638 * Draw an arrow from (ex, ey) -> (sx, sy).
1639 * @param w width of the image
1640 * @param h height of the image
1641 * @param stride stride/linesize of the image
1642 * @param color color of the arrow
1644 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
1645 int ey, int w, int h, int stride, int color)
1649 sx = av_clip(sx, -100, w + 100);
1650 sy = av_clip(sy, -100, h + 100);
1651 ex = av_clip(ex, -100, w + 100);
1652 ey = av_clip(ey, -100, h + 100);
1657 if (dx * dx + dy * dy > 3 * 3) {
1660 int length = ff_sqrt((rx * rx + ry * ry) << 8);
1662 // FIXME subpixel accuracy
1663 rx = ROUNDED_DIV(rx * 3 << 4, length);
1664 ry = ROUNDED_DIV(ry * 3 << 4, length);
1666 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1667 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1669 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1673 * Print debugging info for the given picture.
1675 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict)
1677 if ( s->avctx->hwaccel || !pict || !pict->mb_type
1678 || (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU))
1682 if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
1685 av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
1686 av_get_picture_type_char(pict->pict_type));
1687 for (y = 0; y < s->mb_height; y++) {
1688 for (x = 0; x < s->mb_width; x++) {
1689 if (s->avctx->debug & FF_DEBUG_SKIP) {
1690 int count = s->mbskip_table[x + y * s->mb_stride];
1693 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1695 if (s->avctx->debug & FF_DEBUG_QP) {
1696 av_log(s->avctx, AV_LOG_DEBUG, "%2d",
1697 pict->qscale_table[x + y * s->mb_stride]);
1699 if (s->avctx->debug & FF_DEBUG_MB_TYPE) {
1700 int mb_type = pict->mb_type[x + y * s->mb_stride];
1701 // Type & MV direction
1702 if (IS_PCM(mb_type))
1703 av_log(s->avctx, AV_LOG_DEBUG, "P");
1704 else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1705 av_log(s->avctx, AV_LOG_DEBUG, "A");
1706 else if (IS_INTRA4x4(mb_type))
1707 av_log(s->avctx, AV_LOG_DEBUG, "i");
1708 else if (IS_INTRA16x16(mb_type))
1709 av_log(s->avctx, AV_LOG_DEBUG, "I");
1710 else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1711 av_log(s->avctx, AV_LOG_DEBUG, "d");
1712 else if (IS_DIRECT(mb_type))
1713 av_log(s->avctx, AV_LOG_DEBUG, "D");
1714 else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
1715 av_log(s->avctx, AV_LOG_DEBUG, "g");
1716 else if (IS_GMC(mb_type))
1717 av_log(s->avctx, AV_LOG_DEBUG, "G");
1718 else if (IS_SKIP(mb_type))
1719 av_log(s->avctx, AV_LOG_DEBUG, "S");
1720 else if (!USES_LIST(mb_type, 1))
1721 av_log(s->avctx, AV_LOG_DEBUG, ">");
1722 else if (!USES_LIST(mb_type, 0))
1723 av_log(s->avctx, AV_LOG_DEBUG, "<");
1725 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1726 av_log(s->avctx, AV_LOG_DEBUG, "X");
1730 if (IS_8X8(mb_type))
1731 av_log(s->avctx, AV_LOG_DEBUG, "+");
1732 else if (IS_16X8(mb_type))
1733 av_log(s->avctx, AV_LOG_DEBUG, "-");
1734 else if (IS_8X16(mb_type))
1735 av_log(s->avctx, AV_LOG_DEBUG, "|");
1736 else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
1737 av_log(s->avctx, AV_LOG_DEBUG, " ");
1739 av_log(s->avctx, AV_LOG_DEBUG, "?");
1742 if (IS_INTERLACED(mb_type))
1743 av_log(s->avctx, AV_LOG_DEBUG, "=");
1745 av_log(s->avctx, AV_LOG_DEBUG, " ");
1748 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1752 if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
1753 (s->avctx->debug_mv)) {
1754 const int shift = 1 + s->quarter_sample;
1758 int h_chroma_shift, v_chroma_shift, block_height;
1759 const int width = s->avctx->width;
1760 const int height = s->avctx->height;
1761 const int mv_sample_log2 = 4 - pict->motion_subsample_log2;
1762 const int mv_stride = (s->mb_width << mv_sample_log2) +
1763 (s->codec_id == AV_CODEC_ID_H264 ? 0 : 1);
1764 s->low_delay = 0; // needed to see the vectors without trashing the buffers
1766 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,
1767 &h_chroma_shift, &v_chroma_shift);
1768 for (i = 0; i < 3; i++) {
1769 size_t size= (i == 0) ? pict->linesize[i] * FFALIGN(height, 16):
1770 pict->linesize[i] * FFALIGN(height, 16) >> v_chroma_shift;
1771 s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
1772 memcpy(s->visualization_buffer[i], pict->data[i], size);
1773 pict->data[i] = s->visualization_buffer[i];
1775 pict->type = FF_BUFFER_TYPE_COPY;
1777 ptr = pict->data[0];
1778 block_height = 16 >> v_chroma_shift;
1780 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1782 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1783 const int mb_index = mb_x + mb_y * s->mb_stride;
1784 if ((s->avctx->debug_mv) && pict->motion_val) {
1786 for (type = 0; type < 3; type++) {
1790 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
1791 (pict->pict_type!= AV_PICTURE_TYPE_P))
1796 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
1797 (pict->pict_type!= AV_PICTURE_TYPE_B))
1802 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
1803 (pict->pict_type!= AV_PICTURE_TYPE_B))
1808 if (!USES_LIST(pict->mb_type[mb_index], direction))
1811 if (IS_8X8(pict->mb_type[mb_index])) {
1813 for (i = 0; i < 4; i++) {
1814 int sx = mb_x * 16 + 4 + 8 * (i & 1);
1815 int sy = mb_y * 16 + 4 + 8 * (i >> 1);
1816 int xy = (mb_x * 2 + (i & 1) +
1817 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1818 int mx = (pict->motion_val[direction][xy][0] >> shift) + sx;
1819 int my = (pict->motion_val[direction][xy][1] >> shift) + sy;
1820 draw_arrow(ptr, sx, sy, mx, my, width,
1821 height, s->linesize, 100);
1823 } else if (IS_16X8(pict->mb_type[mb_index])) {
1825 for (i = 0; i < 2; i++) {
1826 int sx = mb_x * 16 + 8;
1827 int sy = mb_y * 16 + 4 + 8 * i;
1828 int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
1829 int mx = (pict->motion_val[direction][xy][0] >> shift);
1830 int my = (pict->motion_val[direction][xy][1] >> shift);
1832 if (IS_INTERLACED(pict->mb_type[mb_index]))
1835 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1836 height, s->linesize, 100);
1838 } else if (IS_8X16(pict->mb_type[mb_index])) {
1840 for (i = 0; i < 2; i++) {
1841 int sx = mb_x * 16 + 4 + 8 * i;
1842 int sy = mb_y * 16 + 8;
1843 int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
1844 int mx = pict->motion_val[direction][xy][0] >> shift;
1845 int my = pict->motion_val[direction][xy][1] >> shift;
1847 if (IS_INTERLACED(pict->mb_type[mb_index]))
1850 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1851 height, s->linesize, 100);
1854 int sx= mb_x * 16 + 8;
1855 int sy= mb_y * 16 + 8;
1856 int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
1857 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1858 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1859 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1863 if ((s->avctx->debug & FF_DEBUG_VIS_QP) && pict->motion_val) {
1864 uint64_t c = (pict->qscale_table[mb_index] * 128 / 31) *
1865 0x0101010101010101ULL;
1867 for (y = 0; y < block_height; y++) {
1868 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1869 (block_height * mb_y + y) *
1870 pict->linesize[1]) = c;
1871 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1872 (block_height * mb_y + y) *
1873 pict->linesize[2]) = c;
1876 if ((s->avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
1878 int mb_type = pict->mb_type[mb_index];
1881 #define COLOR(theta, r) \
1882 u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
1883 v = (int)(128 + r * sin(theta * 3.141592 / 180));
1887 if (IS_PCM(mb_type)) {
1889 } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
1890 IS_INTRA16x16(mb_type)) {
1892 } else if (IS_INTRA4x4(mb_type)) {
1894 } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
1896 } else if (IS_DIRECT(mb_type)) {
1898 } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
1900 } else if (IS_GMC(mb_type)) {
1902 } else if (IS_SKIP(mb_type)) {
1904 } else if (!USES_LIST(mb_type, 1)) {
1906 } else if (!USES_LIST(mb_type, 0)) {
1909 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1913 u *= 0x0101010101010101ULL;
1914 v *= 0x0101010101010101ULL;
1915 for (y = 0; y < block_height; y++) {
1916 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1917 (block_height * mb_y + y) * pict->linesize[1]) = u;
1918 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1919 (block_height * mb_y + y) * pict->linesize[2]) = v;
1923 if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
1924 *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
1925 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1926 *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
1927 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1929 if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
1930 for (y = 0; y < 16; y++)
1931 pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
1932 pict->linesize[0]] ^= 0x80;
1934 if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
1935 int dm = 1 << (mv_sample_log2 - 2);
1936 for (i = 0; i < 4; i++) {
1937 int sx = mb_x * 16 + 8 * (i & 1);
1938 int sy = mb_y * 16 + 8 * (i >> 1);
1939 int xy = (mb_x * 2 + (i & 1) +
1940 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1942 int32_t *mv = (int32_t *) &pict->motion_val[0][xy];
1943 if (mv[0] != mv[dm] ||
1944 mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
1945 for (y = 0; y < 8; y++)
1946 pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
1947 if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
1948 *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
1949 pict->linesize[0]) ^= 0x8080808080808080ULL;
1953 if (IS_INTERLACED(mb_type) &&
1954 s->codec_id == AV_CODEC_ID_H264) {
1958 s->mbskip_table[mb_index] = 0;
1964 static inline int hpel_motion_lowres(MpegEncContext *s,
1965 uint8_t *dest, uint8_t *src,
1966 int field_based, int field_select,
1967 int src_x, int src_y,
1968 int width, int height, int stride,
1969 int h_edge_pos, int v_edge_pos,
1970 int w, int h, h264_chroma_mc_func *pix_op,
1971 int motion_x, int motion_y)
1973 const int lowres = s->avctx->lowres;
1974 const int op_index = FFMIN(lowres, 2);
1975 const int s_mask = (2 << lowres) - 1;
1979 if (s->quarter_sample) {
1984 sx = motion_x & s_mask;
1985 sy = motion_y & s_mask;
1986 src_x += motion_x >> lowres + 1;
1987 src_y += motion_y >> lowres + 1;
1989 src += src_y * stride + src_x;
1991 if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
1992 (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
1993 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
1994 (h + 1) << field_based, src_x,
1995 src_y << field_based,
1998 src = s->edge_emu_buffer;
2002 sx = (sx << 2) >> lowres;
2003 sy = (sy << 2) >> lowres;
2006 pix_op[op_index](dest, src, stride, h, sx, sy);
2010 /* apply one mpeg motion vector to the three components */
2011 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
2018 uint8_t **ref_picture,
2019 h264_chroma_mc_func *pix_op,
2020 int motion_x, int motion_y,
2023 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2024 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
2026 const int lowres = s->avctx->lowres;
2027 const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 2);
2028 const int block_s = 8>>lowres;
2029 const int s_mask = (2 << lowres) - 1;
2030 const int h_edge_pos = s->h_edge_pos >> lowres;
2031 const int v_edge_pos = s->v_edge_pos >> lowres;
2032 linesize = s->current_picture.f.linesize[0] << field_based;
2033 uvlinesize = s->current_picture.f.linesize[1] << field_based;
2035 // FIXME obviously not perfect but qpel will not work in lowres anyway
2036 if (s->quarter_sample) {
2042 motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2045 sx = motion_x & s_mask;
2046 sy = motion_y & s_mask;
2047 src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2048 src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2050 if (s->out_format == FMT_H263) {
2051 uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2052 uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2053 uvsrc_x = src_x >> 1;
2054 uvsrc_y = src_y >> 1;
2055 } else if (s->out_format == FMT_H261) {
2056 // even chroma mv's are full pel in H261
2059 uvsx = (2 * mx) & s_mask;
2060 uvsy = (2 * my) & s_mask;
2061 uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2062 uvsrc_y = mb_y * block_s + (my >> lowres);
2064 if(s->chroma_y_shift){
2069 uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2070 uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2072 if(s->chroma_x_shift){
2076 uvsy = motion_y & s_mask;
2078 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2081 uvsx = motion_x & s_mask;
2082 uvsy = motion_y & s_mask;
2089 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2090 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2091 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2093 if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) ||
2094 (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2095 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2096 s->linesize, 17, 17 + field_based,
2097 src_x, src_y << field_based, h_edge_pos,
2099 ptr_y = s->edge_emu_buffer;
2100 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2101 uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
2102 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9,
2104 uvsrc_x, uvsrc_y << field_based,
2105 h_edge_pos >> 1, v_edge_pos >> 1);
2106 s->dsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9,
2108 uvsrc_x, uvsrc_y << field_based,
2109 h_edge_pos >> 1, v_edge_pos >> 1);
2111 ptr_cr = uvbuf + 16;
2115 // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
2117 dest_y += s->linesize;
2118 dest_cb += s->uvlinesize;
2119 dest_cr += s->uvlinesize;
2123 ptr_y += s->linesize;
2124 ptr_cb += s->uvlinesize;
2125 ptr_cr += s->uvlinesize;
2128 sx = (sx << 2) >> lowres;
2129 sy = (sy << 2) >> lowres;
2130 pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2132 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2133 uvsx = (uvsx << 2) >> lowres;
2134 uvsy = (uvsy << 2) >> lowres;
2135 if (h >> s->chroma_y_shift) {
2136 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2137 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2140 // FIXME h261 lowres loop filter
2143 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
2144 uint8_t *dest_cb, uint8_t *dest_cr,
2145 uint8_t **ref_picture,
2146 h264_chroma_mc_func * pix_op,
2149 const int lowres = s->avctx->lowres;
2150 const int op_index = FFMIN(lowres, 2);
2151 const int block_s = 8 >> lowres;
2152 const int s_mask = (2 << lowres) - 1;
2153 const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2154 const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2155 int emu = 0, src_x, src_y, offset, sx, sy;
2158 if (s->quarter_sample) {
2163 /* In case of 8X8, we construct a single chroma motion vector
2164 with a special rounding */
2165 mx = ff_h263_round_chroma(mx);
2166 my = ff_h263_round_chroma(my);
2170 src_x = s->mb_x * block_s + (mx >> lowres + 1);
2171 src_y = s->mb_y * block_s + (my >> lowres + 1);
2173 offset = src_y * s->uvlinesize + src_x;
2174 ptr = ref_picture[1] + offset;
2175 if (s->flags & CODEC_FLAG_EMU_EDGE) {
2176 if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2177 (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2178 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
2179 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2180 ptr = s->edge_emu_buffer;
2184 sx = (sx << 2) >> lowres;
2185 sy = (sy << 2) >> lowres;
2186 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2188 ptr = ref_picture[2] + offset;
2190 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2191 src_x, src_y, h_edge_pos, v_edge_pos);
2192 ptr = s->edge_emu_buffer;
2194 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2198 * motion compensation of a single macroblock
2200 * @param dest_y luma destination pointer
2201 * @param dest_cb chroma cb/u destination pointer
2202 * @param dest_cr chroma cr/v destination pointer
2203 * @param dir direction (0->forward, 1->backward)
2204 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2205 * @param pix_op halfpel motion compensation function (average or put normally)
2206 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2208 static inline void MPV_motion_lowres(MpegEncContext *s,
2209 uint8_t *dest_y, uint8_t *dest_cb,
2211 int dir, uint8_t **ref_picture,
2212 h264_chroma_mc_func *pix_op)
2216 const int lowres = s->avctx->lowres;
2217 const int block_s = 8 >>lowres;
2222 switch (s->mv_type) {
2224 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2226 ref_picture, pix_op,
2227 s->mv[dir][0][0], s->mv[dir][0][1],
2233 for (i = 0; i < 4; i++) {
2234 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2235 s->linesize) * block_s,
2236 ref_picture[0], 0, 0,
2237 (2 * mb_x + (i & 1)) * block_s,
2238 (2 * mb_y + (i >> 1)) * block_s,
2239 s->width, s->height, s->linesize,
2240 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2241 block_s, block_s, pix_op,
2242 s->mv[dir][i][0], s->mv[dir][i][1]);
2244 mx += s->mv[dir][i][0];
2245 my += s->mv[dir][i][1];
2248 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2249 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2253 if (s->picture_structure == PICT_FRAME) {
2255 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2256 1, 0, s->field_select[dir][0],
2257 ref_picture, pix_op,
2258 s->mv[dir][0][0], s->mv[dir][0][1],
2261 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2262 1, 1, s->field_select[dir][1],
2263 ref_picture, pix_op,
2264 s->mv[dir][1][0], s->mv[dir][1][1],
2267 if (s->picture_structure != s->field_select[dir][0] + 1 &&
2268 s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2269 ref_picture = s->current_picture_ptr->f.data;
2272 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2273 0, 0, s->field_select[dir][0],
2274 ref_picture, pix_op,
2276 s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2280 for (i = 0; i < 2; i++) {
2281 uint8_t **ref2picture;
2283 if (s->picture_structure == s->field_select[dir][i] + 1 ||
2284 s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2285 ref2picture = ref_picture;
2287 ref2picture = s->current_picture_ptr->f.data;
2290 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2291 0, 0, s->field_select[dir][i],
2292 ref2picture, pix_op,
2293 s->mv[dir][i][0], s->mv[dir][i][1] +
2294 2 * block_s * i, block_s, mb_y >> 1);
2296 dest_y += 2 * block_s * s->linesize;
2297 dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2298 dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2302 if (s->picture_structure == PICT_FRAME) {
2303 for (i = 0; i < 2; i++) {
2305 for (j = 0; j < 2; j++) {
2306 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2308 ref_picture, pix_op,
2309 s->mv[dir][2 * i + j][0],
2310 s->mv[dir][2 * i + j][1],
2313 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2316 for (i = 0; i < 2; i++) {
2317 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2318 0, 0, s->picture_structure != i + 1,
2319 ref_picture, pix_op,
2320 s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2321 2 * block_s, mb_y >> 1);
2323 // after put we make avg of the same block
2324 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2326 // opposite parity is always in the same
2327 // frame if this is second field
2328 if (!s->first_field) {
2329 ref_picture = s->current_picture_ptr->f.data;
2340 * find the lowest MB row referenced in the MVs
2342 int ff_MPV_lowest_referenced_row(MpegEncContext *s, int dir)
2344 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2345 int my, off, i, mvs;
2347 if (s->picture_structure != PICT_FRAME || s->mcsel) goto unhandled;
2349 switch (s->mv_type) {
2363 for (i = 0; i < mvs; i++) {
2364 my = s->mv[dir][i][1]<<qpel_shift;
2365 my_max = FFMAX(my_max, my);
2366 my_min = FFMIN(my_min, my);
2369 off = (FFMAX(-my_min, my_max) + 63) >> 6;
2371 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2373 return s->mb_height-1;
2376 /* put block[] to dest[] */
2377 static inline void put_dct(MpegEncContext *s,
2378 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2380 s->dct_unquantize_intra(s, block, i, qscale);
2381 s->dsp.idct_put (dest, line_size, block);
2384 /* add block[] to dest[] */
2385 static inline void add_dct(MpegEncContext *s,
2386 DCTELEM *block, int i, uint8_t *dest, int line_size)
2388 if (s->block_last_index[i] >= 0) {
2389 s->dsp.idct_add (dest, line_size, block);
2393 static inline void add_dequant_dct(MpegEncContext *s,
2394 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2396 if (s->block_last_index[i] >= 0) {
2397 s->dct_unquantize_inter(s, block, i, qscale);
2399 s->dsp.idct_add (dest, line_size, block);
2404 * Clean dc, ac, coded_block for the current non-intra MB.
2406 void ff_clean_intra_table_entries(MpegEncContext *s)
2408 int wrap = s->b8_stride;
2409 int xy = s->block_index[0];
2412 s->dc_val[0][xy + 1 ] =
2413 s->dc_val[0][xy + wrap] =
2414 s->dc_val[0][xy + 1 + wrap] = 1024;
2416 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2417 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2418 if (s->msmpeg4_version>=3) {
2419 s->coded_block[xy ] =
2420 s->coded_block[xy + 1 ] =
2421 s->coded_block[xy + wrap] =
2422 s->coded_block[xy + 1 + wrap] = 0;
2425 wrap = s->mb_stride;
2426 xy = s->mb_x + s->mb_y * wrap;
2428 s->dc_val[2][xy] = 1024;
2430 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2431 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2433 s->mbintra_table[xy]= 0;
2436 /* generic function called after a macroblock has been parsed by the
2437 decoder or after it has been encoded by the encoder.
2439 Important variables used:
2440 s->mb_intra : true if intra macroblock
2441 s->mv_dir : motion vector direction
2442 s->mv_type : motion vector type
2443 s->mv : motion vector
2444 s->interlaced_dct : true if interlaced dct used (mpeg2)
2446 static av_always_inline
2447 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2448 int lowres_flag, int is_mpeg12)
2450 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2451 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2452 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2456 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2457 /* save DCT coefficients */
2459 DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2460 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2462 for(j=0; j<64; j++){
2463 *dct++ = block[i][s->dsp.idct_permutation[j]];
2464 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2466 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2470 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2472 /* update DC predictors for P macroblocks */
2474 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2475 if(s->mbintra_table[mb_xy])
2476 ff_clean_intra_table_entries(s);
2480 s->last_dc[2] = 128 << s->intra_dc_precision;
2483 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2484 s->mbintra_table[mb_xy]=1;
2486 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
2487 uint8_t *dest_y, *dest_cb, *dest_cr;
2488 int dct_linesize, dct_offset;
2489 op_pixels_func (*op_pix)[4];
2490 qpel_mc_func (*op_qpix)[16];
2491 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2492 const int uvlinesize = s->current_picture.f.linesize[1];
2493 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2494 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2496 /* avoid copy if macroblock skipped in last frame too */
2497 /* skip only during decoding as we might trash the buffers during encoding a bit */
2499 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2501 if (s->mb_skipped) {
2503 av_assert2(s->pict_type!=AV_PICTURE_TYPE_I);
2505 } else if(!s->current_picture.f.reference) {
2508 *mbskip_ptr = 0; /* not skipped */
2512 dct_linesize = linesize << s->interlaced_dct;
2513 dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
2517 dest_cb= s->dest[1];
2518 dest_cr= s->dest[2];
2520 dest_y = s->b_scratchpad;
2521 dest_cb= s->b_scratchpad+16*linesize;
2522 dest_cr= s->b_scratchpad+32*linesize;
2526 /* motion handling */
2527 /* decoding or more than one mb_type (MC was already done otherwise) */
2530 if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2531 if (s->mv_dir & MV_DIR_FORWARD) {
2532 ff_thread_await_progress(&s->last_picture_ptr->f,
2533 ff_MPV_lowest_referenced_row(s, 0),
2536 if (s->mv_dir & MV_DIR_BACKWARD) {
2537 ff_thread_await_progress(&s->next_picture_ptr->f,
2538 ff_MPV_lowest_referenced_row(s, 1),
2544 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2546 if (s->mv_dir & MV_DIR_FORWARD) {
2547 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2548 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2550 if (s->mv_dir & MV_DIR_BACKWARD) {
2551 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2554 op_qpix= s->me.qpel_put;
2555 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2556 op_pix = s->dsp.put_pixels_tab;
2558 op_pix = s->dsp.put_no_rnd_pixels_tab;
2560 if (s->mv_dir & MV_DIR_FORWARD) {
2561 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2562 op_pix = s->dsp.avg_pixels_tab;
2563 op_qpix= s->me.qpel_avg;
2565 if (s->mv_dir & MV_DIR_BACKWARD) {
2566 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2571 /* skip dequant / idct if we are really late ;) */
2572 if(s->avctx->skip_idct){
2573 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2574 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2575 || s->avctx->skip_idct >= AVDISCARD_ALL)
2579 /* add dct residue */
2580 if(s->encoding || !( s->msmpeg4_version || s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO
2581 || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
2582 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2583 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2584 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2585 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2587 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2588 if (s->chroma_y_shift){
2589 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2590 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2594 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2595 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2596 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2597 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2600 } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
2601 add_dct(s, block[0], 0, dest_y , dct_linesize);
2602 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2603 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2604 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2606 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2607 if(s->chroma_y_shift){//Chroma420
2608 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2609 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2612 dct_linesize = uvlinesize << s->interlaced_dct;
2613 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
2615 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2616 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2617 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2618 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2619 if(!s->chroma_x_shift){//Chroma444
2620 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2621 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2622 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2623 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2628 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2629 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2632 /* dct only in intra block */
2633 if(s->encoding || !(s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO)){
2634 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2635 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2636 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2637 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2639 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2640 if(s->chroma_y_shift){
2641 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2642 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2646 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2647 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2648 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2649 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2653 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2654 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2655 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2656 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2658 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2659 if(s->chroma_y_shift){
2660 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2661 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2664 dct_linesize = uvlinesize << s->interlaced_dct;
2665 dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
2667 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2668 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2669 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2670 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2671 if(!s->chroma_x_shift){//Chroma444
2672 s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2673 s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2674 s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2675 s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2683 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2684 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2685 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2690 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2692 if(s->out_format == FMT_MPEG1) {
2693 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2694 else MPV_decode_mb_internal(s, block, 0, 1);
2697 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2698 else MPV_decode_mb_internal(s, block, 0, 0);
2702 * @param h is the normal height, this will be reduced automatically if needed for the last row
2704 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2705 const int field_pic= s->picture_structure != PICT_FRAME;
2711 if (!s->avctx->hwaccel
2712 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2713 && s->unrestricted_mv
2714 && s->current_picture.f.reference
2716 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2717 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
2718 int sides = 0, edge_h;
2719 int hshift = desc->log2_chroma_w;
2720 int vshift = desc->log2_chroma_h;
2721 if (y==0) sides |= EDGE_TOP;
2722 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2724 edge_h= FFMIN(h, s->v_edge_pos - y);
2726 s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2727 s->linesize, s->h_edge_pos, edge_h,
2728 EDGE_WIDTH, EDGE_WIDTH, sides);
2729 s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2730 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2731 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2732 s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2733 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2734 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2737 h= FFMIN(h, s->avctx->height - y);
2739 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2741 if (s->avctx->draw_horiz_band) {
2743 int offset[AV_NUM_DATA_POINTERS];
2746 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2747 src = &s->current_picture_ptr->f;
2748 else if(s->last_picture_ptr)
2749 src = &s->last_picture_ptr->f;
2753 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2754 for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2757 offset[0]= y * s->linesize;
2759 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2760 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2766 s->avctx->draw_horiz_band(s->avctx, src, offset,
2767 y, s->picture_structure, h);
2771 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2772 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2773 const int uvlinesize = s->current_picture.f.linesize[1];
2774 const int mb_size= 4 - s->avctx->lowres;
2776 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2777 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2778 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2779 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2780 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2781 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;
2782 //block_index is not used by mpeg2, so it is not affected by chroma_format
2784 s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2785 s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2786 s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2788 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2790 if(s->picture_structure==PICT_FRAME){
2791 s->dest[0] += s->mb_y * linesize << mb_size;
2792 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2793 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2795 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2796 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2797 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2798 av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2803 void ff_mpeg_flush(AVCodecContext *avctx){
2805 MpegEncContext *s = avctx->priv_data;
2807 if(s==NULL || s->picture==NULL)
2810 for(i=0; i<s->picture_count; i++){
2811 if (s->picture[i].f.data[0] &&
2812 (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2813 s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2814 free_frame_buffer(s, &s->picture[i]);
2816 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2818 s->mb_x= s->mb_y= 0;
2821 s->parse_context.state= -1;
2822 s->parse_context.frame_start_found= 0;
2823 s->parse_context.overread= 0;
2824 s->parse_context.overread_index= 0;
2825 s->parse_context.index= 0;
2826 s->parse_context.last_index= 0;
2827 s->bitstream_buffer_size=0;
2831 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2832 DCTELEM *block, int n, int qscale)
2834 int i, level, nCoeffs;
2835 const uint16_t *quant_matrix;
2837 nCoeffs= s->block_last_index[n];
2839 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2840 /* XXX: only mpeg1 */
2841 quant_matrix = s->intra_matrix;
2842 for(i=1;i<=nCoeffs;i++) {
2843 int j= s->intra_scantable.permutated[i];
2848 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2849 level = (level - 1) | 1;
2852 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2853 level = (level - 1) | 1;
2860 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2861 DCTELEM *block, int n, int qscale)
2863 int i, level, nCoeffs;
2864 const uint16_t *quant_matrix;
2866 nCoeffs= s->block_last_index[n];
2868 quant_matrix = s->inter_matrix;
2869 for(i=0; i<=nCoeffs; i++) {
2870 int j= s->intra_scantable.permutated[i];
2875 level = (((level << 1) + 1) * qscale *
2876 ((int) (quant_matrix[j]))) >> 4;
2877 level = (level - 1) | 1;
2880 level = (((level << 1) + 1) * qscale *
2881 ((int) (quant_matrix[j]))) >> 4;
2882 level = (level - 1) | 1;
2889 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2890 DCTELEM *block, int n, int qscale)
2892 int i, level, nCoeffs;
2893 const uint16_t *quant_matrix;
2895 if(s->alternate_scan) nCoeffs= 63;
2896 else nCoeffs= s->block_last_index[n];
2898 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2899 quant_matrix = s->intra_matrix;
2900 for(i=1;i<=nCoeffs;i++) {
2901 int j= s->intra_scantable.permutated[i];
2906 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2909 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2916 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2917 DCTELEM *block, int n, int qscale)
2919 int i, level, nCoeffs;
2920 const uint16_t *quant_matrix;
2923 if(s->alternate_scan) nCoeffs= 63;
2924 else nCoeffs= s->block_last_index[n];
2926 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2928 quant_matrix = s->intra_matrix;
2929 for(i=1;i<=nCoeffs;i++) {
2930 int j= s->intra_scantable.permutated[i];
2935 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2938 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2947 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2948 DCTELEM *block, int n, int qscale)
2950 int i, level, nCoeffs;
2951 const uint16_t *quant_matrix;
2954 if(s->alternate_scan) nCoeffs= 63;
2955 else nCoeffs= s->block_last_index[n];
2957 quant_matrix = s->inter_matrix;
2958 for(i=0; i<=nCoeffs; i++) {
2959 int j= s->intra_scantable.permutated[i];
2964 level = (((level << 1) + 1) * qscale *
2965 ((int) (quant_matrix[j]))) >> 4;
2968 level = (((level << 1) + 1) * qscale *
2969 ((int) (quant_matrix[j]))) >> 4;
2978 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2979 DCTELEM *block, int n, int qscale)
2981 int i, level, qmul, qadd;
2984 assert(s->block_last_index[n]>=0);
2989 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2990 qadd = (qscale - 1) | 1;
2997 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2999 for(i=1; i<=nCoeffs; i++) {
3003 level = level * qmul - qadd;
3005 level = level * qmul + qadd;
3012 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
3013 DCTELEM *block, int n, int qscale)
3015 int i, level, qmul, qadd;
3018 assert(s->block_last_index[n]>=0);
3020 qadd = (qscale - 1) | 1;
3023 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3025 for(i=0; i<=nCoeffs; i++) {
3029 level = level * qmul - qadd;
3031 level = level * qmul + qadd;
3039 * set qscale and update qscale dependent variables.
3041 void ff_set_qscale(MpegEncContext * s, int qscale)
3045 else if (qscale > 31)
3049 s->chroma_qscale= s->chroma_qscale_table[qscale];
3051 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3052 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3055 void ff_MPV_report_decode_progress(MpegEncContext *s)
3057 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred)
3058 ff_thread_report_progress(&s->current_picture_ptr->f, s->mb_y, 0);