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_arm(s);
195 ff_MPV_common_init_altivec(s);
197 ff_MPV_common_init_bfin(s);
200 /* load & permutate scantables
201 * note: only wmv uses different ones
203 if (s->alternate_scan) {
204 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan);
205 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan);
207 ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct);
208 ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct);
210 ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan);
211 ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
216 void ff_copy_picture(Picture *dst, Picture *src)
219 dst->f.type = FF_BUFFER_TYPE_COPY;
223 * Release a frame buffer
225 static void free_frame_buffer(MpegEncContext *s, Picture *pic)
227 /* WM Image / Screen codecs allocate internal buffers with different
228 * dimensions / colorspaces; ignore user-defined callbacks for these. */
229 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
230 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
231 s->codec_id != AV_CODEC_ID_MSS2)
232 ff_thread_release_buffer(s->avctx, &pic->f);
234 avcodec_default_release_buffer(s->avctx, &pic->f);
235 av_freep(&pic->f.hwaccel_picture_private);
239 * Allocate a frame buffer
241 static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
245 if (s->avctx->hwaccel) {
246 assert(!pic->f.hwaccel_picture_private);
247 if (s->avctx->hwaccel->priv_data_size) {
248 pic->f.hwaccel_picture_private = av_mallocz(s->avctx->hwaccel->priv_data_size);
249 if (!pic->f.hwaccel_picture_private) {
250 av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n");
256 if (s->codec_id != AV_CODEC_ID_WMV3IMAGE &&
257 s->codec_id != AV_CODEC_ID_VC1IMAGE &&
258 s->codec_id != AV_CODEC_ID_MSS2)
259 r = ff_thread_get_buffer(s->avctx, &pic->f);
261 r = avcodec_default_get_buffer(s->avctx, &pic->f);
263 if (r < 0 || !pic->f.type || !pic->f.data[0]) {
264 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n",
265 r, pic->f.type, pic->f.data[0]);
266 av_freep(&pic->f.hwaccel_picture_private);
270 if (s->linesize && (s->linesize != pic->f.linesize[0] ||
271 s->uvlinesize != pic->f.linesize[1])) {
272 av_log(s->avctx, AV_LOG_ERROR,
273 "get_buffer() failed (stride changed)\n");
274 free_frame_buffer(s, pic);
278 if (pic->f.linesize[1] != pic->f.linesize[2]) {
279 av_log(s->avctx, AV_LOG_ERROR,
280 "get_buffer() failed (uv stride mismatch)\n");
281 free_frame_buffer(s, pic);
289 * Allocate a Picture.
290 * The pixels are allocated/set by calling get_buffer() if shared = 0
292 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
294 const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1;
296 // the + 1 is needed so memset(,,stride*height) does not sig11
298 const int mb_array_size = s->mb_stride * s->mb_height;
299 const int b8_array_size = s->b8_stride * s->mb_height * 2;
300 const int b4_array_size = s->b4_stride * s->mb_height * 4;
305 assert(pic->f.data[0]);
306 assert(pic->f.type == 0 || pic->f.type == FF_BUFFER_TYPE_SHARED);
307 pic->f.type = FF_BUFFER_TYPE_SHARED;
309 assert(!pic->f.data[0]);
311 if (alloc_frame_buffer(s, pic) < 0)
314 s->linesize = pic->f.linesize[0];
315 s->uvlinesize = pic->f.linesize[1];
318 if (pic->f.qscale_table == NULL) {
320 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_var,
321 mb_array_size * sizeof(int16_t), fail)
322 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mc_mb_var,
323 mb_array_size * sizeof(int16_t), fail)
324 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_mean,
325 mb_array_size * sizeof(int8_t ), fail)
328 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.mbskip_table,
329 mb_array_size * sizeof(uint8_t) + 2, fail)// the + 2 is for the slice end check
330 FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table_base,
331 (big_mb_num + s->mb_stride) * sizeof(uint8_t),
333 FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base,
334 (big_mb_num + s->mb_stride) * sizeof(uint32_t),
336 pic->f.mb_type = pic->mb_type_base + 2 * s->mb_stride + 1;
337 pic->f.qscale_table = pic->qscale_table_base + 2 * s->mb_stride + 1;
338 if (s->out_format == FMT_H264) {
339 for (i = 0; i < 2; i++) {
340 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
341 2 * (b4_array_size + 4) * sizeof(int16_t),
343 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
344 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
345 4 * mb_array_size * sizeof(uint8_t), fail)
347 pic->f.motion_subsample_log2 = 2;
348 } else if (s->out_format == FMT_H263 || s->encoding ||
349 (s->avctx->debug & FF_DEBUG_MV) || s->avctx->debug_mv) {
350 for (i = 0; i < 2; i++) {
351 FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i],
352 2 * (b8_array_size + 4) * sizeof(int16_t),
354 pic->f.motion_val[i] = pic->motion_val_base[i] + 4;
355 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.ref_index[i],
356 4 * mb_array_size * sizeof(uint8_t), fail)
358 pic->f.motion_subsample_log2 = 3;
360 if (s->avctx->debug&FF_DEBUG_DCT_COEFF) {
361 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.dct_coeff,
362 64 * mb_array_size * sizeof(DCTELEM) * 6, fail)
364 pic->f.qstride = s->mb_stride;
365 FF_ALLOCZ_OR_GOTO(s->avctx, pic->f.pan_scan,
366 1 * sizeof(AVPanScan), fail)
372 fail: // for the FF_ALLOCZ_OR_GOTO macro
374 free_frame_buffer(s, pic);
379 * Deallocate a picture.
381 static void free_picture(MpegEncContext *s, Picture *pic)
385 if (pic->f.data[0] && pic->f.type != FF_BUFFER_TYPE_SHARED) {
386 free_frame_buffer(s, pic);
389 av_freep(&pic->mb_var);
390 av_freep(&pic->mc_mb_var);
391 av_freep(&pic->mb_mean);
392 av_freep(&pic->f.mbskip_table);
393 av_freep(&pic->qscale_table_base);
394 pic->f.qscale_table = NULL;
395 av_freep(&pic->mb_type_base);
396 pic->f.mb_type = NULL;
397 av_freep(&pic->f.dct_coeff);
398 av_freep(&pic->f.pan_scan);
399 pic->f.mb_type = NULL;
400 for (i = 0; i < 2; i++) {
401 av_freep(&pic->motion_val_base[i]);
402 av_freep(&pic->f.ref_index[i]);
403 pic->f.motion_val[i] = NULL;
406 if (pic->f.type == FF_BUFFER_TYPE_SHARED) {
407 for (i = 0; i < 4; i++) {
409 pic->f.data[i] = NULL;
415 static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base)
417 int y_size = s->b8_stride * (2 * s->mb_height + 1);
418 int c_size = s->mb_stride * (s->mb_height + 1);
419 int yc_size = y_size + 2 * c_size;
422 // edge emu needs blocksize + filter length - 1
423 // (= 17x17 for halfpel / 21x21 for h264)
424 FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer,
425 (s->width + 95) * 2 * 21 * 4, fail); // (width + edge + align)*interlaced*MBsize*tolerance
427 // FIXME should be linesize instead of s->width * 2
428 // but that is not known before get_buffer()
429 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad,
430 (s->width + 95) * 4 * 16 * 2 * sizeof(uint8_t), fail)
431 s->me.temp = s->me.scratchpad;
432 s->rd_scratchpad = s->me.scratchpad;
433 s->b_scratchpad = s->me.scratchpad;
434 s->obmc_scratchpad = s->me.scratchpad + 16;
436 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map,
437 ME_MAP_SIZE * sizeof(uint32_t), fail)
438 FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map,
439 ME_MAP_SIZE * sizeof(uint32_t), fail)
440 if (s->avctx->noise_reduction) {
441 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum,
442 2 * 64 * sizeof(int), fail)
445 FF_ALLOCZ_OR_GOTO(s->avctx, s->blocks, 64 * 12 * 2 * sizeof(DCTELEM), fail)
446 s->block = s->blocks[0];
448 for (i = 0; i < 12; i++) {
449 s->pblocks[i] = &s->block[i];
452 if (s->out_format == FMT_H263) {
454 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_val_base,
455 yc_size * sizeof(int16_t) * 16, fail);
456 s->ac_val[0] = s->ac_val_base + s->b8_stride + 1;
457 s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1;
458 s->ac_val[2] = s->ac_val[1] + c_size;
463 return -1; // free() through ff_MPV_common_end()
466 static void free_duplicate_context(MpegEncContext *s)
471 av_freep(&s->edge_emu_buffer);
472 av_freep(&s->me.scratchpad);
476 s->obmc_scratchpad = NULL;
478 av_freep(&s->dct_error_sum);
479 av_freep(&s->me.map);
480 av_freep(&s->me.score_map);
481 av_freep(&s->blocks);
482 av_freep(&s->ac_val_base);
486 static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src)
488 #define COPY(a) bak->a = src->a
489 COPY(edge_emu_buffer);
494 COPY(obmc_scratchpad);
501 COPY(me.map_generation);
513 void ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
517 // FIXME copy only needed parts
519 backup_duplicate_context(&bak, dst);
520 memcpy(dst, src, sizeof(MpegEncContext));
521 backup_duplicate_context(dst, &bak);
522 for (i = 0; i < 12; i++) {
523 dst->pblocks[i] = &dst->block[i];
525 // STOP_TIMER("update_duplicate_context")
526 // about 10k cycles / 0.01 sec for 1000frames on 1ghz with 2 threads
529 int ff_mpeg_update_thread_context(AVCodecContext *dst,
530 const AVCodecContext *src)
533 MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
538 // FIXME can parameters change on I-frames?
539 // in that case dst may need a reinit
540 if (!s->context_initialized) {
541 memcpy(s, s1, sizeof(MpegEncContext));
544 s->bitstream_buffer = NULL;
545 s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
547 if (s1->context_initialized){
548 s->picture_range_start += MAX_PICTURE_COUNT;
549 s->picture_range_end += MAX_PICTURE_COUNT;
550 ff_MPV_common_init(s);
554 if (s->height != s1->height || s->width != s1->width || s->context_reinit) {
556 s->context_reinit = 0;
557 s->height = s1->height;
558 s->width = s1->width;
559 if ((err = ff_MPV_common_frame_size_change(s)) < 0)
563 s->avctx->coded_height = s1->avctx->coded_height;
564 s->avctx->coded_width = s1->avctx->coded_width;
565 s->avctx->width = s1->avctx->width;
566 s->avctx->height = s1->avctx->height;
568 s->coded_picture_number = s1->coded_picture_number;
569 s->picture_number = s1->picture_number;
570 s->input_picture_number = s1->input_picture_number;
572 memcpy(s->picture, s1->picture, s1->picture_count * sizeof(Picture));
573 memcpy(&s->last_picture, &s1->last_picture,
574 (char *) &s1->last_picture_ptr - (char *) &s1->last_picture);
576 // reset s->picture[].f.extended_data to s->picture[].f.data
577 for (i = 0; i < s->picture_count; i++)
578 s->picture[i].f.extended_data = s->picture[i].f.data;
580 s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1);
581 s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1);
582 s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1);
584 // Error/bug resilience
585 s->next_p_frame_damaged = s1->next_p_frame_damaged;
586 s->workaround_bugs = s1->workaround_bugs;
587 s->padding_bug_score = s1->padding_bug_score;
590 memcpy(&s->time_increment_bits, &s1->time_increment_bits,
591 (char *) &s1->shape - (char *) &s1->time_increment_bits);
594 s->max_b_frames = s1->max_b_frames;
595 s->low_delay = s1->low_delay;
596 s->dropable = s1->dropable;
598 // DivX handling (doesn't work)
599 s->divx_packed = s1->divx_packed;
601 if (s1->bitstream_buffer) {
602 if (s1->bitstream_buffer_size +
603 FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size)
604 av_fast_malloc(&s->bitstream_buffer,
605 &s->allocated_bitstream_buffer_size,
606 s1->allocated_bitstream_buffer_size);
607 s->bitstream_buffer_size = s1->bitstream_buffer_size;
608 memcpy(s->bitstream_buffer, s1->bitstream_buffer,
609 s1->bitstream_buffer_size);
610 memset(s->bitstream_buffer + s->bitstream_buffer_size, 0,
611 FF_INPUT_BUFFER_PADDING_SIZE);
614 // MPEG2/interlacing info
615 memcpy(&s->progressive_sequence, &s1->progressive_sequence,
616 (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence);
618 if (!s1->first_field) {
619 s->last_pict_type = s1->pict_type;
620 if (s1->current_picture_ptr)
621 s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality;
623 if (s1->pict_type != AV_PICTURE_TYPE_B) {
624 s->last_non_b_pict_type = s1->pict_type;
632 * Set the given MpegEncContext to common defaults
633 * (same for encoding and decoding).
634 * The changed fields will not depend upon the
635 * prior state of the MpegEncContext.
637 void ff_MPV_common_defaults(MpegEncContext *s)
639 s->y_dc_scale_table =
640 s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
641 s->chroma_qscale_table = ff_default_chroma_qscale_table;
642 s->progressive_frame = 1;
643 s->progressive_sequence = 1;
644 s->picture_structure = PICT_FRAME;
646 s->coded_picture_number = 0;
647 s->picture_number = 0;
648 s->input_picture_number = 0;
650 s->picture_in_gop_number = 0;
655 s->picture_range_start = 0;
656 s->picture_range_end = MAX_PICTURE_COUNT;
658 s->slice_context_count = 1;
662 * Set the given MpegEncContext to defaults for decoding.
663 * the changed fields will not depend upon
664 * the prior state of the MpegEncContext.
666 void ff_MPV_decode_defaults(MpegEncContext *s)
668 ff_MPV_common_defaults(s);
672 * Initialize and allocates MpegEncContext fields dependent on the resolution.
674 static int init_context_frame(MpegEncContext *s)
676 int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
678 s->mb_width = (s->width + 15) / 16;
679 s->mb_stride = s->mb_width + 1;
680 s->b8_stride = s->mb_width * 2 + 1;
681 s->b4_stride = s->mb_width * 4 + 1;
682 mb_array_size = s->mb_height * s->mb_stride;
683 mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
685 /* set default edge pos, will be overriden
686 * in decode_header if needed */
687 s->h_edge_pos = s->mb_width * 16;
688 s->v_edge_pos = s->mb_height * 16;
690 s->mb_num = s->mb_width * s->mb_height;
695 s->block_wrap[3] = s->b8_stride;
697 s->block_wrap[5] = s->mb_stride;
699 y_size = s->b8_stride * (2 * s->mb_height + 1);
700 c_size = s->mb_stride * (s->mb_height + 1);
701 yc_size = y_size + 2 * c_size;
703 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
704 for (y = 0; y < s->mb_height; y++)
705 for (x = 0; x < s->mb_width; x++)
706 s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
708 s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
711 /* Allocate MV tables */
712 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
713 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
714 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
715 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
716 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
717 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base, mv_table_size * 2 * sizeof(int16_t), fail)
718 s->p_mv_table = s->p_mv_table_base + s->mb_stride + 1;
719 s->b_forw_mv_table = s->b_forw_mv_table_base + s->mb_stride + 1;
720 s->b_back_mv_table = s->b_back_mv_table_base + s->mb_stride + 1;
721 s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
722 s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base + s->mb_stride + 1;
723 s->b_direct_mv_table = s->b_direct_mv_table_base + s->mb_stride + 1;
725 /* Allocate MB type table */
726 FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size * sizeof(uint16_t), fail) // needed for encoding
728 FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
730 FF_ALLOC_OR_GOTO(s->avctx, s->cplx_tab,
731 mb_array_size * sizeof(float), fail);
732 FF_ALLOC_OR_GOTO(s->avctx, s->bits_tab,
733 mb_array_size * sizeof(float), fail);
737 FF_ALLOC_OR_GOTO(s->avctx, s->er_temp_buffer,
738 mb_array_size * sizeof(uint8_t), fail);
739 FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table,
740 mb_array_size * sizeof(uint8_t), fail);
742 if (s->codec_id == AV_CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)) {
743 /* interlaced direct mode decoding tables */
744 for (i = 0; i < 2; i++) {
746 for (j = 0; j < 2; j++) {
747 for (k = 0; k < 2; k++) {
748 FF_ALLOCZ_OR_GOTO(s->avctx,
749 s->b_field_mv_table_base[i][j][k],
750 mv_table_size * 2 * sizeof(int16_t),
752 s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
755 FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
756 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
757 s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
759 FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
762 if (s->out_format == FMT_H263) {
764 FF_ALLOCZ_OR_GOTO(s->avctx, s->coded_block_base, y_size, fail);
765 s->coded_block = s->coded_block_base + s->b8_stride + 1;
767 /* cbp, ac_pred, pred_dir */
768 FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table , mb_array_size * sizeof(uint8_t), fail);
769 FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
772 if (s->h263_pred || s->h263_plus || !s->encoding) {
774 // MN: we need these for error resilience of intra-frames
775 FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
776 s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
777 s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
778 s->dc_val[2] = s->dc_val[1] + c_size;
779 for (i = 0; i < yc_size; i++)
780 s->dc_val_base[i] = 1024;
783 /* which mb is a intra block */
784 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbintra_table, mb_array_size, fail);
785 memset(s->mbintra_table, 1, mb_array_size);
787 /* init macroblock skip table */
788 FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail);
789 // Note the + 1 is for a quicker mpeg4 slice_end detection
793 return AVERROR(ENOMEM);
797 * init common structure for both encoder and decoder.
798 * this assumes that some variables like width/height are already set
800 av_cold int ff_MPV_common_init(MpegEncContext *s)
803 int nb_slices = (HAVE_THREADS &&
804 s->avctx->active_thread_type & FF_THREAD_SLICE) ?
805 s->avctx->thread_count : 1;
807 if (s->encoding && s->avctx->slices)
808 nb_slices = s->avctx->slices;
810 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
811 s->mb_height = (s->height + 31) / 32 * 2;
812 else if (s->codec_id != AV_CODEC_ID_H264)
813 s->mb_height = (s->height + 15) / 16;
815 if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
816 av_log(s->avctx, AV_LOG_ERROR,
817 "decoding to AV_PIX_FMT_NONE is not supported.\n");
821 if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
824 max_slices = FFMIN(MAX_THREADS, s->mb_height);
826 max_slices = MAX_THREADS;
827 av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
828 " reducing to %d\n", nb_slices, max_slices);
829 nb_slices = max_slices;
832 if ((s->width || s->height) &&
833 av_image_check_size(s->width, s->height, 0, s->avctx))
836 ff_dct_common_init(s);
838 s->flags = s->avctx->flags;
839 s->flags2 = s->avctx->flags2;
841 /* set chroma shifts */
842 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift,
845 /* convert fourcc to upper case */
846 s->codec_tag = avpriv_toupper4(s->avctx->codec_tag);
847 s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
849 s->avctx->coded_frame = &s->current_picture.f;
852 if (s->msmpeg4_version) {
853 FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
854 2 * 2 * (MAX_LEVEL + 1) *
855 (MAX_RUN + 1) * 2 * sizeof(int), fail);
857 FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
859 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix, 64 * 32 * sizeof(int), fail)
860 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix, 64 * 32 * sizeof(int), fail)
861 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix, 64 * 32 * sizeof(int), fail)
862 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
863 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
864 FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16, 64 * 32 * 2 * sizeof(uint16_t), fail)
865 FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
866 FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture *), fail)
868 if (s->avctx->noise_reduction) {
869 FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail);
873 s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
874 FF_ALLOCZ_OR_GOTO(s->avctx, s->picture,
875 s->picture_count * sizeof(Picture), fail);
876 for (i = 0; i < s->picture_count; i++) {
877 avcodec_get_frame_defaults(&s->picture[i].f);
880 if (init_context_frame(s))
883 s->parse_context.state = -1;
885 s->context_initialized = 1;
886 s->thread_context[0] = s;
888 // if (s->width && s->height) {
890 for (i = 1; i < nb_slices; i++) {
891 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
892 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
895 for (i = 0; i < nb_slices; i++) {
896 if (init_duplicate_context(s->thread_context[i], s) < 0)
898 s->thread_context[i]->start_mb_y =
899 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
900 s->thread_context[i]->end_mb_y =
901 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
904 if (init_duplicate_context(s, s) < 0)
907 s->end_mb_y = s->mb_height;
909 s->slice_context_count = nb_slices;
914 ff_MPV_common_end(s);
919 * Frees and resets MpegEncContext fields depending on the resolution.
920 * Is used during resolution changes to avoid a full reinitialization of the
923 static int free_context_frame(MpegEncContext *s)
927 av_freep(&s->mb_type);
928 av_freep(&s->p_mv_table_base);
929 av_freep(&s->b_forw_mv_table_base);
930 av_freep(&s->b_back_mv_table_base);
931 av_freep(&s->b_bidir_forw_mv_table_base);
932 av_freep(&s->b_bidir_back_mv_table_base);
933 av_freep(&s->b_direct_mv_table_base);
934 s->p_mv_table = NULL;
935 s->b_forw_mv_table = NULL;
936 s->b_back_mv_table = NULL;
937 s->b_bidir_forw_mv_table = NULL;
938 s->b_bidir_back_mv_table = NULL;
939 s->b_direct_mv_table = NULL;
940 for (i = 0; i < 2; i++) {
941 for (j = 0; j < 2; j++) {
942 for (k = 0; k < 2; k++) {
943 av_freep(&s->b_field_mv_table_base[i][j][k]);
944 s->b_field_mv_table[i][j][k] = NULL;
946 av_freep(&s->b_field_select_table[i][j]);
947 av_freep(&s->p_field_mv_table_base[i][j]);
948 s->p_field_mv_table[i][j] = NULL;
950 av_freep(&s->p_field_select_table[i]);
953 av_freep(&s->dc_val_base);
954 av_freep(&s->coded_block_base);
955 av_freep(&s->mbintra_table);
956 av_freep(&s->cbp_table);
957 av_freep(&s->pred_dir_table);
959 av_freep(&s->mbskip_table);
961 av_freep(&s->error_status_table);
962 av_freep(&s->er_temp_buffer);
963 av_freep(&s->mb_index2xy);
964 av_freep(&s->lambda_table);
966 av_freep(&s->cplx_tab);
967 av_freep(&s->bits_tab);
969 s->linesize = s->uvlinesize = 0;
971 for (i = 0; i < 3; i++)
972 av_freep(&s->visualization_buffer[i]);
974 if (!(s->avctx->active_thread_type & FF_THREAD_FRAME))
975 avcodec_default_free_buffers(s->avctx);
980 int ff_MPV_common_frame_size_change(MpegEncContext *s)
984 if (s->slice_context_count > 1) {
985 for (i = 0; i < s->slice_context_count; i++) {
986 free_duplicate_context(s->thread_context[i]);
988 for (i = 1; i < s->slice_context_count; i++) {
989 av_freep(&s->thread_context[i]);
992 free_duplicate_context(s);
994 free_context_frame(s);
997 for (i = 0; i < s->picture_count; i++) {
998 s->picture[i].needs_realloc = 1;
1001 s->last_picture_ptr =
1002 s->next_picture_ptr =
1003 s->current_picture_ptr = NULL;
1006 if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
1007 s->mb_height = (s->height + 31) / 32 * 2;
1008 else if (s->codec_id != AV_CODEC_ID_H264)
1009 s->mb_height = (s->height + 15) / 16;
1011 if ((s->width || s->height) &&
1012 av_image_check_size(s->width, s->height, 0, s->avctx))
1013 return AVERROR_INVALIDDATA;
1015 if ((err = init_context_frame(s)))
1018 s->thread_context[0] = s;
1020 if (s->width && s->height) {
1021 int nb_slices = s->slice_context_count;
1022 if (nb_slices > 1) {
1023 for (i = 1; i < nb_slices; i++) {
1024 s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
1025 memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
1028 for (i = 0; i < nb_slices; i++) {
1029 if (init_duplicate_context(s->thread_context[i], s) < 0)
1031 s->thread_context[i]->start_mb_y =
1032 (s->mb_height * (i) + nb_slices / 2) / nb_slices;
1033 s->thread_context[i]->end_mb_y =
1034 (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
1037 if (init_duplicate_context(s, s) < 0)
1040 s->end_mb_y = s->mb_height;
1042 s->slice_context_count = nb_slices;
1047 ff_MPV_common_end(s);
1051 /* init common structure for both encoder and decoder */
1052 void ff_MPV_common_end(MpegEncContext *s)
1056 if (s->slice_context_count > 1) {
1057 for (i = 0; i < s->slice_context_count; i++) {
1058 free_duplicate_context(s->thread_context[i]);
1060 for (i = 1; i < s->slice_context_count; i++) {
1061 av_freep(&s->thread_context[i]);
1063 s->slice_context_count = 1;
1064 } else free_duplicate_context(s);
1066 av_freep(&s->parse_context.buffer);
1067 s->parse_context.buffer_size = 0;
1069 av_freep(&s->bitstream_buffer);
1070 s->allocated_bitstream_buffer_size = 0;
1072 av_freep(&s->avctx->stats_out);
1073 av_freep(&s->ac_stats);
1075 if(s->q_chroma_intra_matrix != s->q_intra_matrix ) av_freep(&s->q_chroma_intra_matrix);
1076 if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
1077 s->q_chroma_intra_matrix= NULL;
1078 s->q_chroma_intra_matrix16= NULL;
1079 av_freep(&s->q_intra_matrix);
1080 av_freep(&s->q_inter_matrix);
1081 av_freep(&s->q_intra_matrix16);
1082 av_freep(&s->q_inter_matrix16);
1083 av_freep(&s->input_picture);
1084 av_freep(&s->reordered_input_picture);
1085 av_freep(&s->dct_offset);
1087 if (s->picture && !s->avctx->internal->is_copy) {
1088 for (i = 0; i < s->picture_count; i++) {
1089 free_picture(s, &s->picture[i]);
1092 av_freep(&s->picture);
1094 free_context_frame(s);
1096 s->context_initialized = 0;
1097 s->last_picture_ptr =
1098 s->next_picture_ptr =
1099 s->current_picture_ptr = NULL;
1100 s->linesize = s->uvlinesize = 0;
1103 void ff_init_rl(RLTable *rl,
1104 uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3])
1106 int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1];
1107 uint8_t index_run[MAX_RUN + 1];
1108 int last, run, level, start, end, i;
1110 /* If table is static, we can quit if rl->max_level[0] is not NULL */
1111 if (static_store && rl->max_level[0])
1114 /* compute max_level[], max_run[] and index_run[] */
1115 for (last = 0; last < 2; last++) {
1124 memset(max_level, 0, MAX_RUN + 1);
1125 memset(max_run, 0, MAX_LEVEL + 1);
1126 memset(index_run, rl->n, MAX_RUN + 1);
1127 for (i = start; i < end; i++) {
1128 run = rl->table_run[i];
1129 level = rl->table_level[i];
1130 if (index_run[run] == rl->n)
1132 if (level > max_level[run])
1133 max_level[run] = level;
1134 if (run > max_run[level])
1135 max_run[level] = run;
1138 rl->max_level[last] = static_store[last];
1140 rl->max_level[last] = av_malloc(MAX_RUN + 1);
1141 memcpy(rl->max_level[last], max_level, MAX_RUN + 1);
1143 rl->max_run[last] = static_store[last] + MAX_RUN + 1;
1145 rl->max_run[last] = av_malloc(MAX_LEVEL + 1);
1146 memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1);
1148 rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2;
1150 rl->index_run[last] = av_malloc(MAX_RUN + 1);
1151 memcpy(rl->index_run[last], index_run, MAX_RUN + 1);
1155 void ff_init_vlc_rl(RLTable *rl)
1159 for (q = 0; q < 32; q++) {
1161 int qadd = (q - 1) | 1;
1167 for (i = 0; i < rl->vlc.table_size; i++) {
1168 int code = rl->vlc.table[i][0];
1169 int len = rl->vlc.table[i][1];
1172 if (len == 0) { // illegal code
1175 } else if (len < 0) { // more bits needed
1179 if (code == rl->n) { // esc
1183 run = rl->table_run[code] + 1;
1184 level = rl->table_level[code] * qmul + qadd;
1185 if (code >= rl->last) run += 192;
1188 rl->rl_vlc[q][i].len = len;
1189 rl->rl_vlc[q][i].level = level;
1190 rl->rl_vlc[q][i].run = run;
1195 void ff_release_unused_pictures(MpegEncContext*s, int remove_current)
1199 /* release non reference frames */
1200 for (i = 0; i < s->picture_count; i++) {
1201 if (s->picture[i].f.data[0] && !s->picture[i].f.reference &&
1202 (!s->picture[i].owner2 || s->picture[i].owner2 == s) &&
1203 (remove_current || &s->picture[i] != s->current_picture_ptr)
1204 /* && s->picture[i].type!= FF_BUFFER_TYPE_SHARED */) {
1205 free_frame_buffer(s, &s->picture[i]);
1210 static inline int pic_is_unused(MpegEncContext *s, Picture *pic)
1212 if (pic->f.data[0] == NULL)
1214 if (pic->needs_realloc)
1215 if (!pic->owner2 || pic->owner2 == s)
1220 static int find_unused_picture(MpegEncContext *s, int shared)
1225 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1226 if (s->picture[i].f.data[0] == NULL && s->picture[i].f.type == 0)
1230 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1231 if (pic_is_unused(s, &s->picture[i]) && s->picture[i].f.type != 0)
1234 for (i = s->picture_range_start; i < s->picture_range_end; i++) {
1235 if (pic_is_unused(s, &s->picture[i]))
1240 av_log(s->avctx, AV_LOG_FATAL,
1241 "Internal error, picture buffer overflow\n");
1242 /* We could return -1, but the codec would crash trying to draw into a
1243 * non-existing frame anyway. This is safer than waiting for a random crash.
1244 * Also the return of this is never useful, an encoder must only allocate
1245 * as much as allowed in the specification. This has no relationship to how
1246 * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
1247 * enough for such valid streams).
1248 * Plus, a decoder has to check stream validity and remove frames if too
1249 * many reference frames are around. Waiting for "OOM" is not correct at
1250 * all. Similarly, missing reference frames have to be replaced by
1251 * interpolated/MC frames, anything else is a bug in the codec ...
1257 int ff_find_unused_picture(MpegEncContext *s, int shared)
1259 int ret = find_unused_picture(s, shared);
1261 if (ret >= 0 && ret < s->picture_range_end) {
1262 if (s->picture[ret].needs_realloc) {
1263 s->picture[ret].needs_realloc = 0;
1264 free_picture(s, &s->picture[ret]);
1265 avcodec_get_frame_defaults(&s->picture[ret].f);
1271 static void update_noise_reduction(MpegEncContext *s)
1275 for (intra = 0; intra < 2; intra++) {
1276 if (s->dct_count[intra] > (1 << 16)) {
1277 for (i = 0; i < 64; i++) {
1278 s->dct_error_sum[intra][i] >>= 1;
1280 s->dct_count[intra] >>= 1;
1283 for (i = 0; i < 64; i++) {
1284 s->dct_offset[intra][i] = (s->avctx->noise_reduction *
1285 s->dct_count[intra] +
1286 s->dct_error_sum[intra][i] / 2) /
1287 (s->dct_error_sum[intra][i] + 1);
1293 * generic function for encode/decode called after coding/decoding
1294 * the header and before a frame is coded/decoded.
1296 int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
1302 if (!ff_thread_can_start_frame(avctx)) {
1303 av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
1307 /* mark & release old frames */
1308 if (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3) {
1309 if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
1310 s->last_picture_ptr != s->next_picture_ptr &&
1311 s->last_picture_ptr->f.data[0]) {
1312 if (s->last_picture_ptr->owner2 == s)
1313 free_frame_buffer(s, s->last_picture_ptr);
1316 /* release forgotten pictures */
1317 /* if (mpeg124/h263) */
1319 for (i = 0; i < s->picture_count; i++) {
1320 if (s->picture[i].owner2 == s && s->picture[i].f.data[0] &&
1321 &s->picture[i] != s->last_picture_ptr &&
1322 &s->picture[i] != s->next_picture_ptr &&
1323 s->picture[i].f.reference && !s->picture[i].needs_realloc) {
1324 if (!(avctx->active_thread_type & FF_THREAD_FRAME))
1325 av_log(avctx, AV_LOG_ERROR,
1326 "releasing zombie picture\n");
1327 free_frame_buffer(s, &s->picture[i]);
1334 ff_release_unused_pictures(s, 1);
1336 if (s->current_picture_ptr &&
1337 s->current_picture_ptr->f.data[0] == NULL) {
1338 // we already have a unused image
1339 // (maybe it was set before reading the header)
1340 pic = s->current_picture_ptr;
1342 i = ff_find_unused_picture(s, 0);
1344 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1347 pic = &s->picture[i];
1350 pic->f.reference = 0;
1352 if (s->codec_id == AV_CODEC_ID_H264)
1353 pic->f.reference = s->picture_structure;
1354 else if (s->pict_type != AV_PICTURE_TYPE_B)
1355 pic->f.reference = 3;
1358 pic->f.coded_picture_number = s->coded_picture_number++;
1360 if (ff_alloc_picture(s, pic, 0) < 0)
1363 s->current_picture_ptr = pic;
1364 // FIXME use only the vars from current_pic
1365 s->current_picture_ptr->f.top_field_first = s->top_field_first;
1366 if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO ||
1367 s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1368 if (s->picture_structure != PICT_FRAME)
1369 s->current_picture_ptr->f.top_field_first =
1370 (s->picture_structure == PICT_TOP_FIELD) == s->first_field;
1372 s->current_picture_ptr->f.interlaced_frame = !s->progressive_frame &&
1373 !s->progressive_sequence;
1374 s->current_picture_ptr->field_picture = s->picture_structure != PICT_FRAME;
1377 s->current_picture_ptr->f.pict_type = s->pict_type;
1378 // if (s->flags && CODEC_FLAG_QSCALE)
1379 // s->current_picture_ptr->quality = s->new_picture_ptr->quality;
1380 s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I;
1382 ff_copy_picture(&s->current_picture, s->current_picture_ptr);
1384 if (s->pict_type != AV_PICTURE_TYPE_B) {
1385 s->last_picture_ptr = s->next_picture_ptr;
1387 s->next_picture_ptr = s->current_picture_ptr;
1389 av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
1390 s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
1391 s->last_picture_ptr ? s->last_picture_ptr->f.data[0] : NULL,
1392 s->next_picture_ptr ? s->next_picture_ptr->f.data[0] : NULL,
1393 s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL,
1394 s->pict_type, s->dropable);
1396 if (s->codec_id != AV_CODEC_ID_H264) {
1397 if ((s->last_picture_ptr == NULL ||
1398 s->last_picture_ptr->f.data[0] == NULL) &&
1399 (s->pict_type != AV_PICTURE_TYPE_I ||
1400 s->picture_structure != PICT_FRAME)) {
1401 if (s->pict_type != AV_PICTURE_TYPE_I)
1402 av_log(avctx, AV_LOG_ERROR,
1403 "warning: first frame is no keyframe\n");
1404 else if (s->picture_structure != PICT_FRAME)
1405 av_log(avctx, AV_LOG_INFO,
1406 "allocate dummy last picture for field based first keyframe\n");
1408 /* Allocate a dummy frame */
1409 i = ff_find_unused_picture(s, 0);
1411 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1414 s->last_picture_ptr = &s->picture[i];
1415 s->last_picture_ptr->f.key_frame = 0;
1416 if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
1417 s->last_picture_ptr = NULL;
1421 if(s->codec_id == AV_CODEC_ID_FLV1 || s->codec_id == AV_CODEC_ID_H263){
1422 for(i=0; i<avctx->height; i++)
1423 memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width);
1426 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0);
1427 ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1);
1428 s->last_picture_ptr->f.reference = 3;
1430 if ((s->next_picture_ptr == NULL ||
1431 s->next_picture_ptr->f.data[0] == NULL) &&
1432 s->pict_type == AV_PICTURE_TYPE_B) {
1433 /* Allocate a dummy frame */
1434 i = ff_find_unused_picture(s, 0);
1436 av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n");
1439 s->next_picture_ptr = &s->picture[i];
1440 s->next_picture_ptr->f.key_frame = 0;
1441 if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
1442 s->next_picture_ptr = NULL;
1445 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 0);
1446 ff_thread_report_progress(&s->next_picture_ptr->f, INT_MAX, 1);
1447 s->next_picture_ptr->f.reference = 3;
1451 if (s->last_picture_ptr)
1452 ff_copy_picture(&s->last_picture, s->last_picture_ptr);
1453 if (s->next_picture_ptr)
1454 ff_copy_picture(&s->next_picture, s->next_picture_ptr);
1456 if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_FRAME) &&
1457 (s->out_format != FMT_H264 || s->codec_id == AV_CODEC_ID_SVQ3)) {
1458 if (s->next_picture_ptr)
1459 s->next_picture_ptr->owner2 = s;
1460 if (s->last_picture_ptr)
1461 s->last_picture_ptr->owner2 = s;
1464 assert(s->pict_type == AV_PICTURE_TYPE_I || (s->last_picture_ptr &&
1465 s->last_picture_ptr->f.data[0]));
1467 if (s->picture_structure!= PICT_FRAME && s->out_format != FMT_H264) {
1469 for (i = 0; i < 4; i++) {
1470 if (s->picture_structure == PICT_BOTTOM_FIELD) {
1471 s->current_picture.f.data[i] +=
1472 s->current_picture.f.linesize[i];
1474 s->current_picture.f.linesize[i] *= 2;
1475 s->last_picture.f.linesize[i] *= 2;
1476 s->next_picture.f.linesize[i] *= 2;
1480 s->err_recognition = avctx->err_recognition;
1482 /* set dequantizer, we can't do it during init as
1483 * it might change for mpeg4 and we can't do it in the header
1484 * decode as init is not called for mpeg4 there yet */
1485 if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1486 s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
1487 s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
1488 } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
1489 s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
1490 s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
1492 s->dct_unquantize_intra = s->dct_unquantize_mpeg1_intra;
1493 s->dct_unquantize_inter = s->dct_unquantize_mpeg1_inter;
1496 if (s->dct_error_sum) {
1497 assert(s->avctx->noise_reduction && s->encoding);
1498 update_noise_reduction(s);
1501 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration)
1502 return ff_xvmc_field_start(s, avctx);
1507 /* generic function for encode/decode called after a
1508 * frame has been coded/decoded. */
1509 void ff_MPV_frame_end(MpegEncContext *s)
1512 /* redraw edges for the frame if decoding didn't complete */
1513 // just to make sure that all data is rendered.
1514 if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
1515 ff_xvmc_field_end(s);
1516 } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
1517 !s->avctx->hwaccel &&
1518 !(s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&
1519 s->unrestricted_mv &&
1520 s->current_picture.f.reference &&
1522 !(s->flags & CODEC_FLAG_EMU_EDGE) &&
1525 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
1526 int hshift = desc->log2_chroma_w;
1527 int vshift = desc->log2_chroma_h;
1528 s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
1529 s->h_edge_pos, s->v_edge_pos,
1530 EDGE_WIDTH, EDGE_WIDTH,
1531 EDGE_TOP | EDGE_BOTTOM);
1532 s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
1533 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1534 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1535 EDGE_TOP | EDGE_BOTTOM);
1536 s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
1537 s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
1538 EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
1539 EDGE_TOP | EDGE_BOTTOM);
1544 s->last_pict_type = s->pict_type;
1545 s->last_lambda_for [s->pict_type] = s->current_picture_ptr->f.quality;
1546 if (s->pict_type!= AV_PICTURE_TYPE_B) {
1547 s->last_non_b_pict_type = s->pict_type;
1550 /* copy back current_picture variables */
1551 for (i = 0; i < MAX_PICTURE_COUNT; i++) {
1552 if (s->picture[i].f.data[0] == s->current_picture.f.data[0]) {
1553 s->picture[i] = s->current_picture;
1557 assert(i < MAX_PICTURE_COUNT);
1561 /* release non-reference frames */
1562 for (i = 0; i < s->picture_count; i++) {
1563 if (s->picture[i].f.data[0] && !s->picture[i].f.reference
1564 /* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */) {
1565 free_frame_buffer(s, &s->picture[i]);
1569 // clear copies, to avoid confusion
1571 memset(&s->last_picture, 0, sizeof(Picture));
1572 memset(&s->next_picture, 0, sizeof(Picture));
1573 memset(&s->current_picture, 0, sizeof(Picture));
1575 s->avctx->coded_frame = &s->current_picture_ptr->f;
1577 if (s->codec_id != AV_CODEC_ID_H264 && s->current_picture.f.reference) {
1578 ff_thread_report_progress(&s->current_picture_ptr->f, INT_MAX, 0);
1583 * Draw a line from (ex, ey) -> (sx, sy).
1584 * @param w width of the image
1585 * @param h height of the image
1586 * @param stride stride/linesize of the image
1587 * @param color color of the arrow
1589 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey,
1590 int w, int h, int stride, int color)
1594 sx = av_clip(sx, 0, w - 1);
1595 sy = av_clip(sy, 0, h - 1);
1596 ex = av_clip(ex, 0, w - 1);
1597 ey = av_clip(ey, 0, h - 1);
1599 buf[sy * stride + sx] += color;
1601 if (FFABS(ex - sx) > FFABS(ey - sy)) {
1603 FFSWAP(int, sx, ex);
1604 FFSWAP(int, sy, ey);
1606 buf += sx + sy * stride;
1608 f = ((ey - sy) << 16) / ex;
1609 for(x= 0; x <= ex; x++){
1611 fr = (x * f) & 0xFFFF;
1612 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1613 if(fr) buf[(y + 1) * stride + x] += (color * fr ) >> 16;
1617 FFSWAP(int, sx, ex);
1618 FFSWAP(int, sy, ey);
1620 buf += sx + sy * stride;
1623 f = ((ex - sx) << 16) / ey;
1626 for(y= 0; y <= ey; y++){
1628 fr = (y*f) & 0xFFFF;
1629 buf[y * stride + x] += (color * (0x10000 - fr)) >> 16;
1630 if(fr) buf[y * stride + x + 1] += (color * fr ) >> 16;
1636 * Draw an arrow from (ex, ey) -> (sx, sy).
1637 * @param w width of the image
1638 * @param h height of the image
1639 * @param stride stride/linesize of the image
1640 * @param color color of the arrow
1642 static void draw_arrow(uint8_t *buf, int sx, int sy, int ex,
1643 int ey, int w, int h, int stride, int color)
1647 sx = av_clip(sx, -100, w + 100);
1648 sy = av_clip(sy, -100, h + 100);
1649 ex = av_clip(ex, -100, w + 100);
1650 ey = av_clip(ey, -100, h + 100);
1655 if (dx * dx + dy * dy > 3 * 3) {
1658 int length = ff_sqrt((rx * rx + ry * ry) << 8);
1660 // FIXME subpixel accuracy
1661 rx = ROUNDED_DIV(rx * 3 << 4, length);
1662 ry = ROUNDED_DIV(ry * 3 << 4, length);
1664 draw_line(buf, sx, sy, sx + rx, sy + ry, w, h, stride, color);
1665 draw_line(buf, sx, sy, sx - ry, sy + rx, w, h, stride, color);
1667 draw_line(buf, sx, sy, ex, ey, w, h, stride, color);
1671 * Print debugging info for the given picture.
1673 void ff_print_debug_info(MpegEncContext *s, AVFrame *pict)
1675 if ( s->avctx->hwaccel || !pict || !pict->mb_type
1676 || (s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU))
1680 if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
1683 av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
1684 av_get_picture_type_char(pict->pict_type));
1685 for (y = 0; y < s->mb_height; y++) {
1686 for (x = 0; x < s->mb_width; x++) {
1687 if (s->avctx->debug & FF_DEBUG_SKIP) {
1688 int count = s->mbskip_table[x + y * s->mb_stride];
1691 av_log(s->avctx, AV_LOG_DEBUG, "%1d", count);
1693 if (s->avctx->debug & FF_DEBUG_QP) {
1694 av_log(s->avctx, AV_LOG_DEBUG, "%2d",
1695 pict->qscale_table[x + y * s->mb_stride]);
1697 if (s->avctx->debug & FF_DEBUG_MB_TYPE) {
1698 int mb_type = pict->mb_type[x + y * s->mb_stride];
1699 // Type & MV direction
1700 if (IS_PCM(mb_type))
1701 av_log(s->avctx, AV_LOG_DEBUG, "P");
1702 else if (IS_INTRA(mb_type) && IS_ACPRED(mb_type))
1703 av_log(s->avctx, AV_LOG_DEBUG, "A");
1704 else if (IS_INTRA4x4(mb_type))
1705 av_log(s->avctx, AV_LOG_DEBUG, "i");
1706 else if (IS_INTRA16x16(mb_type))
1707 av_log(s->avctx, AV_LOG_DEBUG, "I");
1708 else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type))
1709 av_log(s->avctx, AV_LOG_DEBUG, "d");
1710 else if (IS_DIRECT(mb_type))
1711 av_log(s->avctx, AV_LOG_DEBUG, "D");
1712 else if (IS_GMC(mb_type) && IS_SKIP(mb_type))
1713 av_log(s->avctx, AV_LOG_DEBUG, "g");
1714 else if (IS_GMC(mb_type))
1715 av_log(s->avctx, AV_LOG_DEBUG, "G");
1716 else if (IS_SKIP(mb_type))
1717 av_log(s->avctx, AV_LOG_DEBUG, "S");
1718 else if (!USES_LIST(mb_type, 1))
1719 av_log(s->avctx, AV_LOG_DEBUG, ">");
1720 else if (!USES_LIST(mb_type, 0))
1721 av_log(s->avctx, AV_LOG_DEBUG, "<");
1723 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1724 av_log(s->avctx, AV_LOG_DEBUG, "X");
1728 if (IS_8X8(mb_type))
1729 av_log(s->avctx, AV_LOG_DEBUG, "+");
1730 else if (IS_16X8(mb_type))
1731 av_log(s->avctx, AV_LOG_DEBUG, "-");
1732 else if (IS_8X16(mb_type))
1733 av_log(s->avctx, AV_LOG_DEBUG, "|");
1734 else if (IS_INTRA(mb_type) || IS_16X16(mb_type))
1735 av_log(s->avctx, AV_LOG_DEBUG, " ");
1737 av_log(s->avctx, AV_LOG_DEBUG, "?");
1740 if (IS_INTERLACED(mb_type))
1741 av_log(s->avctx, AV_LOG_DEBUG, "=");
1743 av_log(s->avctx, AV_LOG_DEBUG, " ");
1746 av_log(s->avctx, AV_LOG_DEBUG, "\n");
1750 if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
1751 (s->avctx->debug_mv)) {
1752 const int shift = 1 + s->quarter_sample;
1756 int h_chroma_shift, v_chroma_shift, block_height;
1757 const int width = s->avctx->width;
1758 const int height = s->avctx->height;
1759 const int mv_sample_log2 = 4 - pict->motion_subsample_log2;
1760 const int mv_stride = (s->mb_width << mv_sample_log2) +
1761 (s->codec_id == AV_CODEC_ID_H264 ? 0 : 1);
1762 s->low_delay = 0; // needed to see the vectors without trashing the buffers
1764 avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,
1765 &h_chroma_shift, &v_chroma_shift);
1766 for (i = 0; i < 3; i++) {
1767 size_t size= (i == 0) ? pict->linesize[i] * FFALIGN(height, 16):
1768 pict->linesize[i] * FFALIGN(height, 16) >> v_chroma_shift;
1769 s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
1770 memcpy(s->visualization_buffer[i], pict->data[i], size);
1771 pict->data[i] = s->visualization_buffer[i];
1773 pict->type = FF_BUFFER_TYPE_COPY;
1775 ptr = pict->data[0];
1776 block_height = 16 >> v_chroma_shift;
1778 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1780 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1781 const int mb_index = mb_x + mb_y * s->mb_stride;
1782 if ((s->avctx->debug_mv) && pict->motion_val) {
1784 for (type = 0; type < 3; type++) {
1788 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_P_FOR)) ||
1789 (pict->pict_type!= AV_PICTURE_TYPE_P))
1794 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_FOR)) ||
1795 (pict->pict_type!= AV_PICTURE_TYPE_B))
1800 if ((!(s->avctx->debug_mv & FF_DEBUG_VIS_MV_B_BACK)) ||
1801 (pict->pict_type!= AV_PICTURE_TYPE_B))
1806 if (!USES_LIST(pict->mb_type[mb_index], direction))
1809 if (IS_8X8(pict->mb_type[mb_index])) {
1811 for (i = 0; i < 4; i++) {
1812 int sx = mb_x * 16 + 4 + 8 * (i & 1);
1813 int sy = mb_y * 16 + 4 + 8 * (i >> 1);
1814 int xy = (mb_x * 2 + (i & 1) +
1815 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1816 int mx = (pict->motion_val[direction][xy][0] >> shift) + sx;
1817 int my = (pict->motion_val[direction][xy][1] >> shift) + sy;
1818 draw_arrow(ptr, sx, sy, mx, my, width,
1819 height, s->linesize, 100);
1821 } else if (IS_16X8(pict->mb_type[mb_index])) {
1823 for (i = 0; i < 2; i++) {
1824 int sx = mb_x * 16 + 8;
1825 int sy = mb_y * 16 + 4 + 8 * i;
1826 int xy = (mb_x * 2 + (mb_y * 2 + i) * mv_stride) << (mv_sample_log2 - 1);
1827 int mx = (pict->motion_val[direction][xy][0] >> shift);
1828 int my = (pict->motion_val[direction][xy][1] >> shift);
1830 if (IS_INTERLACED(pict->mb_type[mb_index]))
1833 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1834 height, s->linesize, 100);
1836 } else if (IS_8X16(pict->mb_type[mb_index])) {
1838 for (i = 0; i < 2; i++) {
1839 int sx = mb_x * 16 + 4 + 8 * i;
1840 int sy = mb_y * 16 + 8;
1841 int xy = (mb_x * 2 + i + mb_y * 2 * mv_stride) << (mv_sample_log2 - 1);
1842 int mx = pict->motion_val[direction][xy][0] >> shift;
1843 int my = pict->motion_val[direction][xy][1] >> shift;
1845 if (IS_INTERLACED(pict->mb_type[mb_index]))
1848 draw_arrow(ptr, sx, sy, mx + sx, my + sy, width,
1849 height, s->linesize, 100);
1852 int sx= mb_x * 16 + 8;
1853 int sy= mb_y * 16 + 8;
1854 int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
1855 int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
1856 int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
1857 draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
1861 if ((s->avctx->debug & FF_DEBUG_VIS_QP) && pict->motion_val) {
1862 uint64_t c = (pict->qscale_table[mb_index] * 128 / 31) *
1863 0x0101010101010101ULL;
1865 for (y = 0; y < block_height; y++) {
1866 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1867 (block_height * mb_y + y) *
1868 pict->linesize[1]) = c;
1869 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1870 (block_height * mb_y + y) *
1871 pict->linesize[2]) = c;
1874 if ((s->avctx->debug & FF_DEBUG_VIS_MB_TYPE) &&
1876 int mb_type = pict->mb_type[mb_index];
1879 #define COLOR(theta, r) \
1880 u = (int)(128 + r * cos(theta * 3.141592 / 180)); \
1881 v = (int)(128 + r * sin(theta * 3.141592 / 180));
1885 if (IS_PCM(mb_type)) {
1887 } else if ((IS_INTRA(mb_type) && IS_ACPRED(mb_type)) ||
1888 IS_INTRA16x16(mb_type)) {
1890 } else if (IS_INTRA4x4(mb_type)) {
1892 } else if (IS_DIRECT(mb_type) && IS_SKIP(mb_type)) {
1894 } else if (IS_DIRECT(mb_type)) {
1896 } else if (IS_GMC(mb_type) && IS_SKIP(mb_type)) {
1898 } else if (IS_GMC(mb_type)) {
1900 } else if (IS_SKIP(mb_type)) {
1902 } else if (!USES_LIST(mb_type, 1)) {
1904 } else if (!USES_LIST(mb_type, 0)) {
1907 av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
1911 u *= 0x0101010101010101ULL;
1912 v *= 0x0101010101010101ULL;
1913 for (y = 0; y < block_height; y++) {
1914 *(uint64_t *)(pict->data[1] + 8 * mb_x +
1915 (block_height * mb_y + y) * pict->linesize[1]) = u;
1916 *(uint64_t *)(pict->data[2] + 8 * mb_x +
1917 (block_height * mb_y + y) * pict->linesize[2]) = v;
1921 if (IS_8X8(mb_type) || IS_16X8(mb_type)) {
1922 *(uint64_t *)(pict->data[0] + 16 * mb_x + 0 +
1923 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1924 *(uint64_t *)(pict->data[0] + 16 * mb_x + 8 +
1925 (16 * mb_y + 8) * pict->linesize[0]) ^= 0x8080808080808080ULL;
1927 if (IS_8X8(mb_type) || IS_8X16(mb_type)) {
1928 for (y = 0; y < 16; y++)
1929 pict->data[0][16 * mb_x + 8 + (16 * mb_y + y) *
1930 pict->linesize[0]] ^= 0x80;
1932 if (IS_8X8(mb_type) && mv_sample_log2 >= 2) {
1933 int dm = 1 << (mv_sample_log2 - 2);
1934 for (i = 0; i < 4; i++) {
1935 int sx = mb_x * 16 + 8 * (i & 1);
1936 int sy = mb_y * 16 + 8 * (i >> 1);
1937 int xy = (mb_x * 2 + (i & 1) +
1938 (mb_y * 2 + (i >> 1)) * mv_stride) << (mv_sample_log2 - 1);
1940 int32_t *mv = (int32_t *) &pict->motion_val[0][xy];
1941 if (mv[0] != mv[dm] ||
1942 mv[dm * mv_stride] != mv[dm * (mv_stride + 1)])
1943 for (y = 0; y < 8; y++)
1944 pict->data[0][sx + 4 + (sy + y) * pict->linesize[0]] ^= 0x80;
1945 if (mv[0] != mv[dm * mv_stride] || mv[dm] != mv[dm * (mv_stride + 1)])
1946 *(uint64_t *)(pict->data[0] + sx + (sy + 4) *
1947 pict->linesize[0]) ^= 0x8080808080808080ULL;
1951 if (IS_INTERLACED(mb_type) &&
1952 s->codec_id == AV_CODEC_ID_H264) {
1956 s->mbskip_table[mb_index] = 0;
1962 static inline int hpel_motion_lowres(MpegEncContext *s,
1963 uint8_t *dest, uint8_t *src,
1964 int field_based, int field_select,
1965 int src_x, int src_y,
1966 int width, int height, int stride,
1967 int h_edge_pos, int v_edge_pos,
1968 int w, int h, h264_chroma_mc_func *pix_op,
1969 int motion_x, int motion_y)
1971 const int lowres = s->avctx->lowres;
1972 const int op_index = FFMIN(lowres, 2);
1973 const int s_mask = (2 << lowres) - 1;
1977 if (s->quarter_sample) {
1982 sx = motion_x & s_mask;
1983 sy = motion_y & s_mask;
1984 src_x += motion_x >> lowres + 1;
1985 src_y += motion_y >> lowres + 1;
1987 src += src_y * stride + src_x;
1989 if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w, 0) ||
1990 (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
1991 s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
1992 (h + 1) << field_based, src_x,
1993 src_y << field_based,
1996 src = s->edge_emu_buffer;
2000 sx = (sx << 2) >> lowres;
2001 sy = (sy << 2) >> lowres;
2004 pix_op[op_index](dest, src, stride, h, sx, sy);
2008 /* apply one mpeg motion vector to the three components */
2009 static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
2016 uint8_t **ref_picture,
2017 h264_chroma_mc_func *pix_op,
2018 int motion_x, int motion_y,
2021 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2022 int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
2024 const int lowres = s->avctx->lowres;
2025 const int op_index = FFMIN(lowres-1+s->chroma_x_shift, 2);
2026 const int block_s = 8>>lowres;
2027 const int s_mask = (2 << lowres) - 1;
2028 const int h_edge_pos = s->h_edge_pos >> lowres;
2029 const int v_edge_pos = s->v_edge_pos >> lowres;
2030 linesize = s->current_picture.f.linesize[0] << field_based;
2031 uvlinesize = s->current_picture.f.linesize[1] << field_based;
2033 // FIXME obviously not perfect but qpel will not work in lowres anyway
2034 if (s->quarter_sample) {
2040 motion_y += (bottom_field - field_select)*((1 << lowres)-1);
2043 sx = motion_x & s_mask;
2044 sy = motion_y & s_mask;
2045 src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
2046 src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
2048 if (s->out_format == FMT_H263) {
2049 uvsx = ((motion_x >> 1) & s_mask) | (sx & 1);
2050 uvsy = ((motion_y >> 1) & s_mask) | (sy & 1);
2051 uvsrc_x = src_x >> 1;
2052 uvsrc_y = src_y >> 1;
2053 } else if (s->out_format == FMT_H261) {
2054 // even chroma mv's are full pel in H261
2057 uvsx = (2 * mx) & s_mask;
2058 uvsy = (2 * my) & s_mask;
2059 uvsrc_x = s->mb_x * block_s + (mx >> lowres);
2060 uvsrc_y = mb_y * block_s + (my >> lowres);
2062 if(s->chroma_y_shift){
2067 uvsrc_x = s->mb_x * block_s + (mx >> lowres + 1);
2068 uvsrc_y = (mb_y * block_s >> field_based) + (my >> lowres + 1);
2070 if(s->chroma_x_shift){
2074 uvsy = motion_y & s_mask;
2076 uvsrc_x = s->mb_x*block_s + (mx >> (lowres+1));
2079 uvsx = motion_x & s_mask;
2080 uvsy = motion_y & s_mask;
2087 ptr_y = ref_picture[0] + src_y * linesize + src_x;
2088 ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
2089 ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
2091 if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s, 0) ||
2092 (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
2093 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
2094 s->linesize, 17, 17 + field_based,
2095 src_x, src_y << field_based, h_edge_pos,
2097 ptr_y = s->edge_emu_buffer;
2098 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2099 uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
2100 s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9,
2102 uvsrc_x, uvsrc_y << field_based,
2103 h_edge_pos >> 1, v_edge_pos >> 1);
2104 s->dsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9,
2106 uvsrc_x, uvsrc_y << field_based,
2107 h_edge_pos >> 1, v_edge_pos >> 1);
2109 ptr_cr = uvbuf + 16;
2113 // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
2115 dest_y += s->linesize;
2116 dest_cb += s->uvlinesize;
2117 dest_cr += s->uvlinesize;
2121 ptr_y += s->linesize;
2122 ptr_cb += s->uvlinesize;
2123 ptr_cr += s->uvlinesize;
2126 sx = (sx << 2) >> lowres;
2127 sy = (sy << 2) >> lowres;
2128 pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
2130 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
2131 uvsx = (uvsx << 2) >> lowres;
2132 uvsy = (uvsy << 2) >> lowres;
2133 if (h >> s->chroma_y_shift) {
2134 pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2135 pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
2138 // FIXME h261 lowres loop filter
2141 static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
2142 uint8_t *dest_cb, uint8_t *dest_cr,
2143 uint8_t **ref_picture,
2144 h264_chroma_mc_func * pix_op,
2147 const int lowres = s->avctx->lowres;
2148 const int op_index = FFMIN(lowres, 2);
2149 const int block_s = 8 >> lowres;
2150 const int s_mask = (2 << lowres) - 1;
2151 const int h_edge_pos = s->h_edge_pos >> lowres + 1;
2152 const int v_edge_pos = s->v_edge_pos >> lowres + 1;
2153 int emu = 0, src_x, src_y, offset, sx, sy;
2156 if (s->quarter_sample) {
2161 /* In case of 8X8, we construct a single chroma motion vector
2162 with a special rounding */
2163 mx = ff_h263_round_chroma(mx);
2164 my = ff_h263_round_chroma(my);
2168 src_x = s->mb_x * block_s + (mx >> lowres + 1);
2169 src_y = s->mb_y * block_s + (my >> lowres + 1);
2171 offset = src_y * s->uvlinesize + src_x;
2172 ptr = ref_picture[1] + offset;
2173 if (s->flags & CODEC_FLAG_EMU_EDGE) {
2174 if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
2175 (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
2176 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
2177 9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
2178 ptr = s->edge_emu_buffer;
2182 sx = (sx << 2) >> lowres;
2183 sy = (sy << 2) >> lowres;
2184 pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
2186 ptr = ref_picture[2] + offset;
2188 s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
2189 src_x, src_y, h_edge_pos, v_edge_pos);
2190 ptr = s->edge_emu_buffer;
2192 pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
2196 * motion compensation of a single macroblock
2198 * @param dest_y luma destination pointer
2199 * @param dest_cb chroma cb/u destination pointer
2200 * @param dest_cr chroma cr/v destination pointer
2201 * @param dir direction (0->forward, 1->backward)
2202 * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
2203 * @param pix_op halfpel motion compensation function (average or put normally)
2204 * the motion vectors are taken from s->mv and the MV type from s->mv_type
2206 static inline void MPV_motion_lowres(MpegEncContext *s,
2207 uint8_t *dest_y, uint8_t *dest_cb,
2209 int dir, uint8_t **ref_picture,
2210 h264_chroma_mc_func *pix_op)
2214 const int lowres = s->avctx->lowres;
2215 const int block_s = 8 >>lowres;
2220 switch (s->mv_type) {
2222 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2224 ref_picture, pix_op,
2225 s->mv[dir][0][0], s->mv[dir][0][1],
2231 for (i = 0; i < 4; i++) {
2232 hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
2233 s->linesize) * block_s,
2234 ref_picture[0], 0, 0,
2235 (2 * mb_x + (i & 1)) * block_s,
2236 (2 * mb_y + (i >> 1)) * block_s,
2237 s->width, s->height, s->linesize,
2238 s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
2239 block_s, block_s, pix_op,
2240 s->mv[dir][i][0], s->mv[dir][i][1]);
2242 mx += s->mv[dir][i][0];
2243 my += s->mv[dir][i][1];
2246 if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
2247 chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
2251 if (s->picture_structure == PICT_FRAME) {
2253 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2254 1, 0, s->field_select[dir][0],
2255 ref_picture, pix_op,
2256 s->mv[dir][0][0], s->mv[dir][0][1],
2259 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2260 1, 1, s->field_select[dir][1],
2261 ref_picture, pix_op,
2262 s->mv[dir][1][0], s->mv[dir][1][1],
2265 if (s->picture_structure != s->field_select[dir][0] + 1 &&
2266 s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
2267 ref_picture = s->current_picture_ptr->f.data;
2270 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2271 0, 0, s->field_select[dir][0],
2272 ref_picture, pix_op,
2274 s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
2278 for (i = 0; i < 2; i++) {
2279 uint8_t **ref2picture;
2281 if (s->picture_structure == s->field_select[dir][i] + 1 ||
2282 s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
2283 ref2picture = ref_picture;
2285 ref2picture = s->current_picture_ptr->f.data;
2288 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2289 0, 0, s->field_select[dir][i],
2290 ref2picture, pix_op,
2291 s->mv[dir][i][0], s->mv[dir][i][1] +
2292 2 * block_s * i, block_s, mb_y >> 1);
2294 dest_y += 2 * block_s * s->linesize;
2295 dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2296 dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
2300 if (s->picture_structure == PICT_FRAME) {
2301 for (i = 0; i < 2; i++) {
2303 for (j = 0; j < 2; j++) {
2304 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2306 ref_picture, pix_op,
2307 s->mv[dir][2 * i + j][0],
2308 s->mv[dir][2 * i + j][1],
2311 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2314 for (i = 0; i < 2; i++) {
2315 mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
2316 0, 0, s->picture_structure != i + 1,
2317 ref_picture, pix_op,
2318 s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
2319 2 * block_s, mb_y >> 1);
2321 // after put we make avg of the same block
2322 pix_op = s->dsp.avg_h264_chroma_pixels_tab;
2324 // opposite parity is always in the same
2325 // frame if this is second field
2326 if (!s->first_field) {
2327 ref_picture = s->current_picture_ptr->f.data;
2338 * find the lowest MB row referenced in the MVs
2340 int ff_MPV_lowest_referenced_row(MpegEncContext *s, int dir)
2342 int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample;
2343 int my, off, i, mvs;
2345 if (s->picture_structure != PICT_FRAME || s->mcsel) goto unhandled;
2347 switch (s->mv_type) {
2361 for (i = 0; i < mvs; i++) {
2362 my = s->mv[dir][i][1]<<qpel_shift;
2363 my_max = FFMAX(my_max, my);
2364 my_min = FFMIN(my_min, my);
2367 off = (FFMAX(-my_min, my_max) + 63) >> 6;
2369 return FFMIN(FFMAX(s->mb_y + off, 0), s->mb_height-1);
2371 return s->mb_height-1;
2374 /* put block[] to dest[] */
2375 static inline void put_dct(MpegEncContext *s,
2376 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2378 s->dct_unquantize_intra(s, block, i, qscale);
2379 s->dsp.idct_put (dest, line_size, block);
2382 /* add block[] to dest[] */
2383 static inline void add_dct(MpegEncContext *s,
2384 DCTELEM *block, int i, uint8_t *dest, int line_size)
2386 if (s->block_last_index[i] >= 0) {
2387 s->dsp.idct_add (dest, line_size, block);
2391 static inline void add_dequant_dct(MpegEncContext *s,
2392 DCTELEM *block, int i, uint8_t *dest, int line_size, int qscale)
2394 if (s->block_last_index[i] >= 0) {
2395 s->dct_unquantize_inter(s, block, i, qscale);
2397 s->dsp.idct_add (dest, line_size, block);
2402 * Clean dc, ac, coded_block for the current non-intra MB.
2404 void ff_clean_intra_table_entries(MpegEncContext *s)
2406 int wrap = s->b8_stride;
2407 int xy = s->block_index[0];
2410 s->dc_val[0][xy + 1 ] =
2411 s->dc_val[0][xy + wrap] =
2412 s->dc_val[0][xy + 1 + wrap] = 1024;
2414 memset(s->ac_val[0][xy ], 0, 32 * sizeof(int16_t));
2415 memset(s->ac_val[0][xy + wrap], 0, 32 * sizeof(int16_t));
2416 if (s->msmpeg4_version>=3) {
2417 s->coded_block[xy ] =
2418 s->coded_block[xy + 1 ] =
2419 s->coded_block[xy + wrap] =
2420 s->coded_block[xy + 1 + wrap] = 0;
2423 wrap = s->mb_stride;
2424 xy = s->mb_x + s->mb_y * wrap;
2426 s->dc_val[2][xy] = 1024;
2428 memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t));
2429 memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t));
2431 s->mbintra_table[xy]= 0;
2434 /* generic function called after a macroblock has been parsed by the
2435 decoder or after it has been encoded by the encoder.
2437 Important variables used:
2438 s->mb_intra : true if intra macroblock
2439 s->mv_dir : motion vector direction
2440 s->mv_type : motion vector type
2441 s->mv : motion vector
2442 s->interlaced_dct : true if interlaced dct used (mpeg2)
2444 static av_always_inline
2445 void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
2446 int lowres_flag, int is_mpeg12)
2448 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
2449 if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
2450 ff_xvmc_decode_mb(s);//xvmc uses pblocks
2454 if(s->avctx->debug&FF_DEBUG_DCT_COEFF) {
2455 /* save DCT coefficients */
2457 DCTELEM *dct = &s->current_picture.f.dct_coeff[mb_xy * 64 * 6];
2458 av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y);
2460 for(j=0; j<64; j++){
2461 *dct++ = block[i][s->dsp.idct_permutation[j]];
2462 av_log(s->avctx, AV_LOG_DEBUG, "%5d", dct[-1]);
2464 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2468 s->current_picture.f.qscale_table[mb_xy] = s->qscale;
2470 /* update DC predictors for P macroblocks */
2472 if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) {
2473 if(s->mbintra_table[mb_xy])
2474 ff_clean_intra_table_entries(s);
2478 s->last_dc[2] = 128 << s->intra_dc_precision;
2481 else if (!is_mpeg12 && (s->h263_pred || s->h263_aic))
2482 s->mbintra_table[mb_xy]=1;
2484 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
2485 uint8_t *dest_y, *dest_cb, *dest_cr;
2486 int dct_linesize, dct_offset;
2487 op_pixels_func (*op_pix)[4];
2488 qpel_mc_func (*op_qpix)[16];
2489 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2490 const int uvlinesize = s->current_picture.f.linesize[1];
2491 const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
2492 const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
2494 /* avoid copy if macroblock skipped in last frame too */
2495 /* skip only during decoding as we might trash the buffers during encoding a bit */
2497 uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy];
2499 if (s->mb_skipped) {
2501 av_assert2(s->pict_type!=AV_PICTURE_TYPE_I);
2503 } else if(!s->current_picture.f.reference) {
2506 *mbskip_ptr = 0; /* not skipped */
2510 dct_linesize = linesize << s->interlaced_dct;
2511 dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
2515 dest_cb= s->dest[1];
2516 dest_cr= s->dest[2];
2518 dest_y = s->b_scratchpad;
2519 dest_cb= s->b_scratchpad+16*linesize;
2520 dest_cr= s->b_scratchpad+32*linesize;
2524 /* motion handling */
2525 /* decoding or more than one mb_type (MC was already done otherwise) */
2528 if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) {
2529 if (s->mv_dir & MV_DIR_FORWARD) {
2530 ff_thread_await_progress(&s->last_picture_ptr->f,
2531 ff_MPV_lowest_referenced_row(s, 0),
2534 if (s->mv_dir & MV_DIR_BACKWARD) {
2535 ff_thread_await_progress(&s->next_picture_ptr->f,
2536 ff_MPV_lowest_referenced_row(s, 1),
2542 h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
2544 if (s->mv_dir & MV_DIR_FORWARD) {
2545 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
2546 op_pix = s->dsp.avg_h264_chroma_pixels_tab;
2548 if (s->mv_dir & MV_DIR_BACKWARD) {
2549 MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
2552 op_qpix= s->me.qpel_put;
2553 if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
2554 op_pix = s->dsp.put_pixels_tab;
2556 op_pix = s->dsp.put_no_rnd_pixels_tab;
2558 if (s->mv_dir & MV_DIR_FORWARD) {
2559 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
2560 op_pix = s->dsp.avg_pixels_tab;
2561 op_qpix= s->me.qpel_avg;
2563 if (s->mv_dir & MV_DIR_BACKWARD) {
2564 ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
2569 /* skip dequant / idct if we are really late ;) */
2570 if(s->avctx->skip_idct){
2571 if( (s->avctx->skip_idct >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
2572 ||(s->avctx->skip_idct >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
2573 || s->avctx->skip_idct >= AVDISCARD_ALL)
2577 /* add dct residue */
2578 if(s->encoding || !( s->msmpeg4_version || s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO
2579 || (s->codec_id==AV_CODEC_ID_MPEG4 && !s->mpeg_quant))){
2580 add_dequant_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2581 add_dequant_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2582 add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2583 add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2585 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2586 if (s->chroma_y_shift){
2587 add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2588 add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2592 add_dequant_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2593 add_dequant_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2594 add_dequant_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2595 add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2598 } else if(is_mpeg12 || (s->codec_id != AV_CODEC_ID_WMV2)){
2599 add_dct(s, block[0], 0, dest_y , dct_linesize);
2600 add_dct(s, block[1], 1, dest_y + block_size, dct_linesize);
2601 add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize);
2602 add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize);
2604 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2605 if(s->chroma_y_shift){//Chroma420
2606 add_dct(s, block[4], 4, dest_cb, uvlinesize);
2607 add_dct(s, block[5], 5, dest_cr, uvlinesize);
2610 dct_linesize = uvlinesize << s->interlaced_dct;
2611 dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
2613 add_dct(s, block[4], 4, dest_cb, dct_linesize);
2614 add_dct(s, block[5], 5, dest_cr, dct_linesize);
2615 add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
2616 add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
2617 if(!s->chroma_x_shift){//Chroma444
2618 add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
2619 add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
2620 add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
2621 add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
2626 else if (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) {
2627 ff_wmv2_add_mb(s, block, dest_y, dest_cb, dest_cr);
2630 /* dct only in intra block */
2631 if(s->encoding || !(s->codec_id==AV_CODEC_ID_MPEG1VIDEO || s->codec_id==AV_CODEC_ID_MPEG2VIDEO)){
2632 put_dct(s, block[0], 0, dest_y , dct_linesize, s->qscale);
2633 put_dct(s, block[1], 1, dest_y + block_size, dct_linesize, s->qscale);
2634 put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale);
2635 put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale);
2637 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2638 if(s->chroma_y_shift){
2639 put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale);
2640 put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale);
2644 put_dct(s, block[4], 4, dest_cb, dct_linesize, s->chroma_qscale);
2645 put_dct(s, block[5], 5, dest_cr, dct_linesize, s->chroma_qscale);
2646 put_dct(s, block[6], 6, dest_cb + dct_offset, dct_linesize, s->chroma_qscale);
2647 put_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale);
2651 s->dsp.idct_put(dest_y , dct_linesize, block[0]);
2652 s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]);
2653 s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]);
2654 s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]);
2656 if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2657 if(s->chroma_y_shift){
2658 s->dsp.idct_put(dest_cb, uvlinesize, block[4]);
2659 s->dsp.idct_put(dest_cr, uvlinesize, block[5]);
2662 dct_linesize = uvlinesize << s->interlaced_dct;
2663 dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
2665 s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
2666 s->dsp.idct_put(dest_cr, dct_linesize, block[5]);
2667 s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
2668 s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
2669 if(!s->chroma_x_shift){//Chroma444
2670 s->dsp.idct_put(dest_cb + block_size, dct_linesize, block[8]);
2671 s->dsp.idct_put(dest_cr + block_size, dct_linesize, block[9]);
2672 s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
2673 s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
2681 s->dsp.put_pixels_tab[0][0](s->dest[0], dest_y , linesize,16);
2682 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[1], dest_cb, uvlinesize,16 >> s->chroma_y_shift);
2683 s->dsp.put_pixels_tab[s->chroma_x_shift][0](s->dest[2], dest_cr, uvlinesize,16 >> s->chroma_y_shift);
2688 void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
2690 if(s->out_format == FMT_MPEG1) {
2691 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
2692 else MPV_decode_mb_internal(s, block, 0, 1);
2695 if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
2696 else MPV_decode_mb_internal(s, block, 0, 0);
2700 * @param h is the normal height, this will be reduced automatically if needed for the last row
2702 void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
2703 const int field_pic= s->picture_structure != PICT_FRAME;
2709 if (!s->avctx->hwaccel
2710 && !(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
2711 && s->unrestricted_mv
2712 && s->current_picture.f.reference
2714 && !(s->flags&CODEC_FLAG_EMU_EDGE)) {
2715 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
2716 int sides = 0, edge_h;
2717 int hshift = desc->log2_chroma_w;
2718 int vshift = desc->log2_chroma_h;
2719 if (y==0) sides |= EDGE_TOP;
2720 if (y + h >= s->v_edge_pos) sides |= EDGE_BOTTOM;
2722 edge_h= FFMIN(h, s->v_edge_pos - y);
2724 s->dsp.draw_edges(s->current_picture_ptr->f.data[0] + y *s->linesize,
2725 s->linesize, s->h_edge_pos, edge_h,
2726 EDGE_WIDTH, EDGE_WIDTH, sides);
2727 s->dsp.draw_edges(s->current_picture_ptr->f.data[1] + (y>>vshift)*s->uvlinesize,
2728 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2729 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2730 s->dsp.draw_edges(s->current_picture_ptr->f.data[2] + (y>>vshift)*s->uvlinesize,
2731 s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
2732 EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
2735 h= FFMIN(h, s->avctx->height - y);
2737 if(field_pic && s->first_field && !(s->avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return;
2739 if (s->avctx->draw_horiz_band) {
2741 int offset[AV_NUM_DATA_POINTERS];
2744 if(s->pict_type==AV_PICTURE_TYPE_B || s->low_delay || (s->avctx->slice_flags&SLICE_FLAG_CODED_ORDER))
2745 src = &s->current_picture_ptr->f;
2746 else if(s->last_picture_ptr)
2747 src = &s->last_picture_ptr->f;
2751 if(s->pict_type==AV_PICTURE_TYPE_B && s->picture_structure == PICT_FRAME && s->out_format != FMT_H264){
2752 for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
2755 offset[0]= y * s->linesize;
2757 offset[2]= (y >> s->chroma_y_shift) * s->uvlinesize;
2758 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
2764 s->avctx->draw_horiz_band(s->avctx, src, offset,
2765 y, s->picture_structure, h);
2769 void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
2770 const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
2771 const int uvlinesize = s->current_picture.f.linesize[1];
2772 const int mb_size= 4 - s->avctx->lowres;
2774 s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2;
2775 s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2;
2776 s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2;
2777 s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2;
2778 s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1;
2779 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;
2780 //block_index is not used by mpeg2, so it is not affected by chroma_format
2782 s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size);
2783 s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2784 s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift));
2786 if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME))
2788 if(s->picture_structure==PICT_FRAME){
2789 s->dest[0] += s->mb_y * linesize << mb_size;
2790 s->dest[1] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2791 s->dest[2] += s->mb_y * uvlinesize << (mb_size - s->chroma_y_shift);
2793 s->dest[0] += (s->mb_y>>1) * linesize << mb_size;
2794 s->dest[1] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2795 s->dest[2] += (s->mb_y>>1) * uvlinesize << (mb_size - s->chroma_y_shift);
2796 av_assert1((s->mb_y&1) == (s->picture_structure == PICT_BOTTOM_FIELD));
2801 void ff_mpeg_flush(AVCodecContext *avctx){
2803 MpegEncContext *s = avctx->priv_data;
2805 if(s==NULL || s->picture==NULL)
2808 for(i=0; i<s->picture_count; i++){
2809 if (s->picture[i].f.data[0] &&
2810 (s->picture[i].f.type == FF_BUFFER_TYPE_INTERNAL ||
2811 s->picture[i].f.type == FF_BUFFER_TYPE_USER))
2812 free_frame_buffer(s, &s->picture[i]);
2814 s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
2816 s->mb_x= s->mb_y= 0;
2819 s->parse_context.state= -1;
2820 s->parse_context.frame_start_found= 0;
2821 s->parse_context.overread= 0;
2822 s->parse_context.overread_index= 0;
2823 s->parse_context.index= 0;
2824 s->parse_context.last_index= 0;
2825 s->bitstream_buffer_size=0;
2829 static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
2830 DCTELEM *block, int n, int qscale)
2832 int i, level, nCoeffs;
2833 const uint16_t *quant_matrix;
2835 nCoeffs= s->block_last_index[n];
2837 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2838 /* XXX: only mpeg1 */
2839 quant_matrix = s->intra_matrix;
2840 for(i=1;i<=nCoeffs;i++) {
2841 int j= s->intra_scantable.permutated[i];
2846 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2847 level = (level - 1) | 1;
2850 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2851 level = (level - 1) | 1;
2858 static void dct_unquantize_mpeg1_inter_c(MpegEncContext *s,
2859 DCTELEM *block, int n, int qscale)
2861 int i, level, nCoeffs;
2862 const uint16_t *quant_matrix;
2864 nCoeffs= s->block_last_index[n];
2866 quant_matrix = s->inter_matrix;
2867 for(i=0; i<=nCoeffs; i++) {
2868 int j= s->intra_scantable.permutated[i];
2873 level = (((level << 1) + 1) * qscale *
2874 ((int) (quant_matrix[j]))) >> 4;
2875 level = (level - 1) | 1;
2878 level = (((level << 1) + 1) * qscale *
2879 ((int) (quant_matrix[j]))) >> 4;
2880 level = (level - 1) | 1;
2887 static void dct_unquantize_mpeg2_intra_c(MpegEncContext *s,
2888 DCTELEM *block, int n, int qscale)
2890 int i, level, nCoeffs;
2891 const uint16_t *quant_matrix;
2893 if(s->alternate_scan) nCoeffs= 63;
2894 else nCoeffs= s->block_last_index[n];
2896 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2897 quant_matrix = s->intra_matrix;
2898 for(i=1;i<=nCoeffs;i++) {
2899 int j= s->intra_scantable.permutated[i];
2904 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2907 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2914 static void dct_unquantize_mpeg2_intra_bitexact(MpegEncContext *s,
2915 DCTELEM *block, int n, int qscale)
2917 int i, level, nCoeffs;
2918 const uint16_t *quant_matrix;
2921 if(s->alternate_scan) nCoeffs= 63;
2922 else nCoeffs= s->block_last_index[n];
2924 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2926 quant_matrix = s->intra_matrix;
2927 for(i=1;i<=nCoeffs;i++) {
2928 int j= s->intra_scantable.permutated[i];
2933 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2936 level = (int)(level * qscale * quant_matrix[j]) >> 3;
2945 static void dct_unquantize_mpeg2_inter_c(MpegEncContext *s,
2946 DCTELEM *block, int n, int qscale)
2948 int i, level, nCoeffs;
2949 const uint16_t *quant_matrix;
2952 if(s->alternate_scan) nCoeffs= 63;
2953 else nCoeffs= s->block_last_index[n];
2955 quant_matrix = s->inter_matrix;
2956 for(i=0; i<=nCoeffs; i++) {
2957 int j= s->intra_scantable.permutated[i];
2962 level = (((level << 1) + 1) * qscale *
2963 ((int) (quant_matrix[j]))) >> 4;
2966 level = (((level << 1) + 1) * qscale *
2967 ((int) (quant_matrix[j]))) >> 4;
2976 static void dct_unquantize_h263_intra_c(MpegEncContext *s,
2977 DCTELEM *block, int n, int qscale)
2979 int i, level, qmul, qadd;
2982 assert(s->block_last_index[n]>=0);
2987 block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
2988 qadd = (qscale - 1) | 1;
2995 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
2997 for(i=1; i<=nCoeffs; i++) {
3001 level = level * qmul - qadd;
3003 level = level * qmul + qadd;
3010 static void dct_unquantize_h263_inter_c(MpegEncContext *s,
3011 DCTELEM *block, int n, int qscale)
3013 int i, level, qmul, qadd;
3016 assert(s->block_last_index[n]>=0);
3018 qadd = (qscale - 1) | 1;
3021 nCoeffs= s->inter_scantable.raster_end[ s->block_last_index[n] ];
3023 for(i=0; i<=nCoeffs; i++) {
3027 level = level * qmul - qadd;
3029 level = level * qmul + qadd;
3037 * set qscale and update qscale dependent variables.
3039 void ff_set_qscale(MpegEncContext * s, int qscale)
3043 else if (qscale > 31)
3047 s->chroma_qscale= s->chroma_qscale_table[qscale];
3049 s->y_dc_scale= s->y_dc_scale_table[ qscale ];
3050 s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ];
3053 void ff_MPV_report_decode_progress(MpegEncContext *s)
3055 if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->error_occurred)
3056 ff_thread_report_progress(&s->current_picture_ptr->f, s->mb_y, 0);