X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpegvideo.c;h=230154f02cf880886df8d5dda55394ace46c60b8;hb=081961f819c0b16c7a860d7da7d39f1fd91bd2f0;hp=a80f737e05bc15492f115fc008eb73f11c58ed53;hpb=024db24912a39316b0ef0b7d793307d62da038f4;p=ffmpeg diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index a80f737e05b..230154f02cf 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -31,83 +31,24 @@ #include "libavutil/avassert.h" #include "libavutil/imgutils.h" #include "libavutil/internal.h" +#include "libavutil/timer.h" #include "avcodec.h" -#include "dsputil.h" +#include "blockdsp.h" +#include "idctdsp.h" #include "internal.h" #include "mathops.h" +#include "mpeg_er.h" +#include "mpegutils.h" #include "mpegvideo.h" +#include "mpegvideodata.h" #include "mjpegenc.h" #include "msmpeg4.h" +#include "qpeldsp.h" #include "xvmc_internal.h" #include "thread.h" +#include "wmv2.h" #include -static const uint8_t ff_default_chroma_qscale_table[32] = { -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 -}; - -const uint8_t ff_mpeg1_dc_scale_table[128] = { -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const uint8_t mpeg2_dc_scale_table1[128] = { -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const uint8_t mpeg2_dc_scale_table2[128] = { -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -}; - -static const uint8_t mpeg2_dc_scale_table3[128] = { -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -}; - -const uint8_t *const ff_mpeg2_dc_scale_table[4] = { - ff_mpeg1_dc_scale_table, - mpeg2_dc_scale_table1, - mpeg2_dc_scale_table2, - mpeg2_dc_scale_table3, -}; - -const enum AVPixelFormat ff_pixfmt_list_420[] = { - AV_PIX_FMT_YUV420P, - AV_PIX_FMT_NONE -}; - static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, int16_t *block, int n, int qscale) { @@ -120,7 +61,7 @@ static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s, block[0] = block[0] * s->y_dc_scale; else block[0] = block[0] * s->c_dc_scale; - /* XXX: only mpeg1 */ + /* XXX: only MPEG-1 */ quant_matrix = s->intra_matrix; for(i=1;i<=nCoeffs;i++) { int j= s->intra_scantable.permutated[i]; @@ -326,38 +267,12 @@ static void dct_unquantize_h263_inter_c(MpegEncContext *s, } } -static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, - int (*mv)[2][4][2], - int mb_x, int mb_y, int mb_intra, int mb_skipped) -{ - MpegEncContext *s = opaque; - - s->mv_dir = mv_dir; - s->mv_type = mv_type; - s->mb_intra = mb_intra; - s->mb_skipped = mb_skipped; - s->mb_x = mb_x; - s->mb_y = mb_y; - memcpy(s->mv, mv, sizeof(*mv)); - - ff_init_block_index(s); - ff_update_block_index(s); - - s->dsp.clear_blocks(s->block[0]); - - s->dest[0] = s->current_picture.f.data[0] + (s->mb_y * 16 * s->linesize) + s->mb_x * 16; - s->dest[1] = s->current_picture.f.data[1] + (s->mb_y * (16 >> s->chroma_y_shift) * s->uvlinesize) + s->mb_x * (16 >> s->chroma_x_shift); - s->dest[2] = s->current_picture.f.data[2] + (s->mb_y * (16 >> s->chroma_y_shift) * s->uvlinesize) + s->mb_x * (16 >> s->chroma_x_shift); - - assert(ref == 0); - ff_MPV_decode_mb(s, s->block); -} - /* init common dct for both encoder and decoder */ -av_cold int ff_dct_common_init(MpegEncContext *s) +static av_cold int dct_init(MpegEncContext *s) { - ff_dsputil_init(&s->dsp, s->avctx); + ff_blockdsp_init(&s->bdsp, s->avctx); ff_hpeldsp_init(&s->hdsp, s->avctx->flags); + ff_mpegvideodsp_init(&s->mdsp); ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample); s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c; @@ -365,385 +280,47 @@ av_cold int ff_dct_common_init(MpegEncContext *s) s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c; s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c; - if (s->flags & CODEC_FLAG_BITEXACT) + if (s->avctx->flags & AV_CODEC_FLAG_BITEXACT) s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact; s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c; + if (HAVE_INTRINSICS_NEON) + ff_mpv_common_init_neon(s); + if (ARCH_ARM) - ff_MPV_common_init_arm(s); + ff_mpv_common_init_arm(s); if (ARCH_PPC) - ff_MPV_common_init_ppc(s); + ff_mpv_common_init_ppc(s); if (ARCH_X86) - ff_MPV_common_init_x86(s); - - /* load & permutate scantables - * note: only wmv uses different ones - */ - if (s->alternate_scan) { - ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_alternate_vertical_scan); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_alternate_vertical_scan); - } else { - ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable , ff_zigzag_direct); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable , ff_zigzag_direct); - } - ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); - - return 0; -} - -static int frame_size_alloc(MpegEncContext *s, int linesize) -{ - int alloc_size = FFALIGN(FFABS(linesize) + 32, 32); - - // edge emu needs blocksize + filter length - 1 - // (= 17x17 for halfpel / 21x21 for h264) - // VC1 computes luma and chroma simultaneously and needs 19X19 + 9x9 - // at uvlinesize. It supports only YUV420 so 24x24 is enough - // linesize * interlaced * MBsize - FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, alloc_size * 2 * 24, - fail); - - FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size * 2 * 16 * 3, - fail) - s->me.temp = s->me.scratchpad; - s->rd_scratchpad = s->me.scratchpad; - s->b_scratchpad = s->me.scratchpad; - s->obmc_scratchpad = s->me.scratchpad + 16; - - return 0; -fail: - av_freep(&s->edge_emu_buffer); - return AVERROR(ENOMEM); -} - -/** - * Allocate a frame buffer - */ -static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) -{ - int edges_needed = av_codec_is_encoder(s->avctx->codec); - int r, ret; - - pic->tf.f = &pic->f; - if (s->codec_id != AV_CODEC_ID_WMV3IMAGE && - s->codec_id != AV_CODEC_ID_VC1IMAGE && - s->codec_id != AV_CODEC_ID_MSS2) { - if (edges_needed) { - pic->f.width = s->avctx->width + 2 * EDGE_WIDTH; - pic->f.height = s->avctx->height + 2 * EDGE_WIDTH; - } - - r = ff_thread_get_buffer(s->avctx, &pic->tf, - pic->reference ? AV_GET_BUFFER_FLAG_REF : 0); - } else { - pic->f.width = s->avctx->width; - pic->f.height = s->avctx->height; - pic->f.format = s->avctx->pix_fmt; - r = avcodec_default_get_buffer2(s->avctx, &pic->f, 0); - } - - if (r < 0 || !pic->f.buf[0]) { - av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %p)\n", - r, pic->f.data[0]); - return -1; - } - - if (edges_needed) { - int i; - for (i = 0; pic->f.data[i]; i++) { - int offset = (EDGE_WIDTH >> (i ? s->chroma_y_shift : 0)) * - pic->f.linesize[i] + - (EDGE_WIDTH >> (i ? s->chroma_x_shift : 0)); - pic->f.data[i] += offset; - } - pic->f.width = s->avctx->width; - pic->f.height = s->avctx->height; - } - - if (s->avctx->hwaccel) { - assert(!pic->hwaccel_picture_private); - if (s->avctx->hwaccel->priv_data_size) { - pic->hwaccel_priv_buf = av_buffer_allocz(s->avctx->hwaccel->priv_data_size); - if (!pic->hwaccel_priv_buf) { - av_log(s->avctx, AV_LOG_ERROR, "alloc_frame_buffer() failed (hwaccel private data allocation)\n"); - return -1; - } - pic->hwaccel_picture_private = pic->hwaccel_priv_buf->data; - } - } - - if (s->linesize && (s->linesize != pic->f.linesize[0] || - s->uvlinesize != pic->f.linesize[1])) { - av_log(s->avctx, AV_LOG_ERROR, - "get_buffer() failed (stride changed)\n"); - ff_mpeg_unref_picture(s, pic); - return -1; - } - - if (pic->f.linesize[1] != pic->f.linesize[2]) { - av_log(s->avctx, AV_LOG_ERROR, - "get_buffer() failed (uv stride mismatch)\n"); - ff_mpeg_unref_picture(s, pic); - return -1; - } - - if (!s->edge_emu_buffer && - (ret = frame_size_alloc(s, pic->f.linesize[0])) < 0) { - av_log(s->avctx, AV_LOG_ERROR, - "get_buffer() failed to allocate context scratch buffers.\n"); - ff_mpeg_unref_picture(s, pic); - return ret; - } - - return 0; -} - -void ff_free_picture_tables(Picture *pic) -{ - int i; - - av_buffer_unref(&pic->mb_var_buf); - av_buffer_unref(&pic->mc_mb_var_buf); - av_buffer_unref(&pic->mb_mean_buf); - av_buffer_unref(&pic->mbskip_table_buf); - av_buffer_unref(&pic->qscale_table_buf); - av_buffer_unref(&pic->mb_type_buf); - - for (i = 0; i < 2; i++) { - av_buffer_unref(&pic->motion_val_buf[i]); - av_buffer_unref(&pic->ref_index_buf[i]); - } -} - -static int alloc_picture_tables(MpegEncContext *s, Picture *pic) -{ - const int big_mb_num = s->mb_stride * (s->mb_height + 1) + 1; - const int mb_array_size = s->mb_stride * s->mb_height; - const int b8_array_size = s->b8_stride * s->mb_height * 2; - int i; - - - pic->mbskip_table_buf = av_buffer_allocz(mb_array_size + 2); - pic->qscale_table_buf = av_buffer_allocz(big_mb_num + s->mb_stride); - pic->mb_type_buf = av_buffer_allocz((big_mb_num + s->mb_stride) * - sizeof(uint32_t)); - if (!pic->mbskip_table_buf || !pic->qscale_table_buf || !pic->mb_type_buf) - return AVERROR(ENOMEM); - - if (s->encoding) { - pic->mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t)); - pic->mc_mb_var_buf = av_buffer_allocz(mb_array_size * sizeof(int16_t)); - pic->mb_mean_buf = av_buffer_allocz(mb_array_size); - if (!pic->mb_var_buf || !pic->mc_mb_var_buf || !pic->mb_mean_buf) - return AVERROR(ENOMEM); - } - - if (s->out_format == FMT_H263 || s->encoding) { - int mv_size = 2 * (b8_array_size + 4) * sizeof(int16_t); - int ref_index_size = 4 * mb_array_size; - - for (i = 0; mv_size && i < 2; i++) { - pic->motion_val_buf[i] = av_buffer_allocz(mv_size); - pic->ref_index_buf[i] = av_buffer_allocz(ref_index_size); - if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i]) - return AVERROR(ENOMEM); - } - } - - return 0; -} - -static int make_tables_writable(Picture *pic) -{ - int ret, i; -#define MAKE_WRITABLE(table) \ -do {\ - if (pic->table &&\ - (ret = av_buffer_make_writable(&pic->table)) < 0)\ - return ret;\ -} while (0) - - MAKE_WRITABLE(mb_var_buf); - MAKE_WRITABLE(mc_mb_var_buf); - MAKE_WRITABLE(mb_mean_buf); - MAKE_WRITABLE(mbskip_table_buf); - MAKE_WRITABLE(qscale_table_buf); - MAKE_WRITABLE(mb_type_buf); - - for (i = 0; i < 2; i++) { - MAKE_WRITABLE(motion_val_buf[i]); - MAKE_WRITABLE(ref_index_buf[i]); - } + ff_mpv_common_init_x86(s); return 0; } -/** - * Allocate a Picture. - * The pixels are allocated/set by calling get_buffer() if shared = 0 - */ -int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared) +av_cold void ff_mpv_idct_init(MpegEncContext *s) { - int i, ret; + ff_idctdsp_init(&s->idsp, s->avctx); - if (shared) { - assert(pic->f.data[0]); - pic->shared = 1; + /* load & permutate scantables + * note: only wmv uses different ones + */ + if (s->alternate_scan) { + ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan); } else { - assert(!pic->f.buf[0]); - - if (alloc_frame_buffer(s, pic) < 0) - return -1; - - s->linesize = pic->f.linesize[0]; - s->uvlinesize = pic->f.linesize[1]; - } - - if (!pic->qscale_table_buf) - ret = alloc_picture_tables(s, pic); - else - ret = make_tables_writable(pic); - if (ret < 0) - goto fail; - - if (s->encoding) { - pic->mb_var = (uint16_t*)pic->mb_var_buf->data; - pic->mc_mb_var = (uint16_t*)pic->mc_mb_var_buf->data; - pic->mb_mean = pic->mb_mean_buf->data; - } - - pic->mbskip_table = pic->mbskip_table_buf->data; - pic->qscale_table = pic->qscale_table_buf->data + 2 * s->mb_stride + 1; - pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * s->mb_stride + 1; - - if (pic->motion_val_buf[0]) { - for (i = 0; i < 2; i++) { - pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4; - pic->ref_index[i] = pic->ref_index_buf[i]->data; - } - } - - return 0; -fail: - av_log(s->avctx, AV_LOG_ERROR, "Error allocating a picture.\n"); - ff_mpeg_unref_picture(s, pic); - ff_free_picture_tables(pic); - return AVERROR(ENOMEM); -} - -/** - * Deallocate a picture. - */ -void ff_mpeg_unref_picture(MpegEncContext *s, Picture *pic) -{ - int off = offsetof(Picture, mb_mean) + sizeof(pic->mb_mean); - - pic->tf.f = &pic->f; - /* WM Image / Screen codecs allocate internal buffers with different - * dimensions / colorspaces; ignore user-defined callbacks for these. */ - if (s->codec_id != AV_CODEC_ID_WMV3IMAGE && - s->codec_id != AV_CODEC_ID_VC1IMAGE && - s->codec_id != AV_CODEC_ID_MSS2) - ff_thread_release_buffer(s->avctx, &pic->tf); - else - av_frame_unref(&pic->f); - - av_buffer_unref(&pic->hwaccel_priv_buf); - - if (pic->needs_realloc) - ff_free_picture_tables(pic); - - memset((uint8_t*)pic + off, 0, sizeof(*pic) - off); -} - -static int update_picture_tables(Picture *dst, Picture *src) -{ - int i; - -#define UPDATE_TABLE(table)\ -do {\ - if (src->table &&\ - (!dst->table || dst->table->buffer != src->table->buffer)) {\ - av_buffer_unref(&dst->table);\ - dst->table = av_buffer_ref(src->table);\ - if (!dst->table) {\ - ff_free_picture_tables(dst);\ - return AVERROR(ENOMEM);\ - }\ - }\ -} while (0) - - UPDATE_TABLE(mb_var_buf); - UPDATE_TABLE(mc_mb_var_buf); - UPDATE_TABLE(mb_mean_buf); - UPDATE_TABLE(mbskip_table_buf); - UPDATE_TABLE(qscale_table_buf); - UPDATE_TABLE(mb_type_buf); - for (i = 0; i < 2; i++) { - UPDATE_TABLE(motion_val_buf[i]); - UPDATE_TABLE(ref_index_buf[i]); - } - - dst->mb_var = src->mb_var; - dst->mc_mb_var = src->mc_mb_var; - dst->mb_mean = src->mb_mean; - dst->mbskip_table = src->mbskip_table; - dst->qscale_table = src->qscale_table; - dst->mb_type = src->mb_type; - for (i = 0; i < 2; i++) { - dst->motion_val[i] = src->motion_val[i]; - dst->ref_index[i] = src->ref_index[i]; - } - - return 0; -} - -int ff_mpeg_ref_picture(MpegEncContext *s, Picture *dst, Picture *src) -{ - int ret; - - av_assert0(!dst->f.buf[0]); - av_assert0(src->f.buf[0]); - - src->tf.f = &src->f; - dst->tf.f = &dst->f; - ret = ff_thread_ref_frame(&dst->tf, &src->tf); - if (ret < 0) - goto fail; - - ret = update_picture_tables(dst, src); - if (ret < 0) - goto fail; - - if (src->hwaccel_picture_private) { - dst->hwaccel_priv_buf = av_buffer_ref(src->hwaccel_priv_buf); - if (!dst->hwaccel_priv_buf) - goto fail; - dst->hwaccel_picture_private = dst->hwaccel_priv_buf->data; + ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct); } - - dst->field_picture = src->field_picture; - dst->mb_var_sum = src->mb_var_sum; - dst->mc_mb_var_sum = src->mc_mb_var_sum; - dst->b_frame_score = src->b_frame_score; - dst->needs_realloc = src->needs_realloc; - dst->reference = src->reference; - dst->shared = src->shared; - - return 0; -fail: - ff_mpeg_unref_picture(s, dst); - return ret; + ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); } -static void exchange_uv(MpegEncContext *s) +static int alloc_picture(MpegEncContext *s, Picture *pic, int shared) { - int16_t (*tmp)[64]; - - tmp = s->pblocks[4]; - s->pblocks[4] = s->pblocks[5]; - s->pblocks[5] = tmp; + return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 0, + s->chroma_x_shift, s->chroma_y_shift, s->out_format, + s->mb_stride, s->mb_height, s->b8_stride, + &s->linesize, &s->uvlinesize); } static int init_duplicate_context(MpegEncContext *s) @@ -753,19 +330,19 @@ static int init_duplicate_context(MpegEncContext *s) int yc_size = y_size + 2 * c_size; int i; - s->edge_emu_buffer = + s->sc.edge_emu_buffer = s->me.scratchpad = s->me.temp = - s->rd_scratchpad = - s->b_scratchpad = - s->obmc_scratchpad = NULL; + s->sc.rd_scratchpad = + s->sc.b_scratchpad = + s->sc.obmc_scratchpad = NULL; if (s->encoding) { FF_ALLOCZ_OR_GOTO(s->avctx, s->me.map, ME_MAP_SIZE * sizeof(uint32_t), fail) FF_ALLOCZ_OR_GOTO(s->avctx, s->me.score_map, ME_MAP_SIZE * sizeof(uint32_t), fail) - if (s->avctx->noise_reduction) { + if (s->noise_reduction) { FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_error_sum, 2 * 64 * sizeof(int), fail) } @@ -776,8 +353,13 @@ static int init_duplicate_context(MpegEncContext *s) for (i = 0; i < 12; i++) { s->pblocks[i] = &s->block[i]; } - if (s->avctx->codec_tag == AV_RL32("VCR2")) - exchange_uv(s); + if (s->avctx->codec_tag == AV_RL32("VCR2")) { + // exchange uv + int16_t (*tmp)[64]; + tmp = s->pblocks[4]; + s->pblocks[4] = s->pblocks[5]; + s->pblocks[5] = tmp; + } if (s->out_format == FMT_H263) { /* ac values */ @@ -790,20 +372,20 @@ static int init_duplicate_context(MpegEncContext *s) return 0; fail: - return -1; // free() through ff_MPV_common_end() + return -1; // free() through ff_mpv_common_end() } static void free_duplicate_context(MpegEncContext *s) { - if (s == NULL) + if (!s) return; - av_freep(&s->edge_emu_buffer); + av_freep(&s->sc.edge_emu_buffer); av_freep(&s->me.scratchpad); s->me.temp = - s->rd_scratchpad = - s->b_scratchpad = - s->obmc_scratchpad = NULL; + s->sc.rd_scratchpad = + s->sc.b_scratchpad = + s->sc.obmc_scratchpad = NULL; av_freep(&s->dct_error_sum); av_freep(&s->me.map); @@ -816,12 +398,12 @@ static void free_duplicate_context(MpegEncContext *s) static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src) { #define COPY(a) bak->a = src->a - COPY(edge_emu_buffer); + COPY(sc.edge_emu_buffer); COPY(me.scratchpad); COPY(me.temp); - COPY(rd_scratchpad); - COPY(b_scratchpad); - COPY(obmc_scratchpad); + COPY(sc.rd_scratchpad); + COPY(sc.b_scratchpad); + COPY(sc.obmc_scratchpad); COPY(me.map); COPY(me.score_map); COPY(blocks); @@ -852,10 +434,16 @@ int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src) for (i = 0; i < 12; i++) { dst->pblocks[i] = &dst->block[i]; } - if (dst->avctx->codec_tag == AV_RL32("VCR2")) - exchange_uv(dst); - if (!dst->edge_emu_buffer && - (ret = frame_size_alloc(dst, dst->linesize)) < 0) { + if (dst->avctx->codec_tag == AV_RL32("VCR2")) { + // exchange uv + int16_t (*tmp)[64]; + tmp = dst->pblocks[4]; + dst->pblocks[4] = dst->pblocks[5]; + dst->pblocks[5] = tmp; + } + if (!dst->sc.edge_emu_buffer && + (ret = ff_mpeg_framesize_alloc(dst->avctx, &dst->me, + &dst->sc, dst->linesize)) < 0) { av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context " "scratch buffers.\n"); return ret; @@ -877,13 +465,16 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, // FIXME can parameters change on I-frames? // in that case dst may need a reinit if (!s->context_initialized) { + int err; memcpy(s, s1, sizeof(MpegEncContext)); s->avctx = dst; s->bitstream_buffer = NULL; s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0; - ff_MPV_common_init(s); + ff_mpv_idct_init(s); + if ((err = ff_mpv_common_init(s)) < 0) + return err; } if (s->height != s1->height || s->width != s1->width || s->context_reinit) { @@ -891,7 +482,7 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, s->context_reinit = 0; s->height = s1->height; s->width = s1->width; - if ((err = ff_MPV_common_frame_size_change(s)) < 0) + if ((err = ff_mpv_common_frame_size_change(s)) < 0) return err; } @@ -904,19 +495,19 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, s->picture_number = s1->picture_number; for (i = 0; i < MAX_PICTURE_COUNT; i++) { - ff_mpeg_unref_picture(s, &s->picture[i]); - if (s1->picture[i].f.buf[0] && - (ret = ff_mpeg_ref_picture(s, &s->picture[i], &s1->picture[i])) < 0) + ff_mpeg_unref_picture(s->avctx, &s->picture[i]); + if (s1->picture[i].f->buf[0] && + (ret = ff_mpeg_ref_picture(s->avctx, &s->picture[i], &s1->picture[i])) < 0) return ret; } #define UPDATE_PICTURE(pic)\ do {\ - ff_mpeg_unref_picture(s, &s->pic);\ - if (s1->pic.f.buf[0])\ - ret = ff_mpeg_ref_picture(s, &s->pic, &s1->pic);\ + ff_mpeg_unref_picture(s->avctx, &s->pic);\ + if (s1->pic.f->buf[0])\ + ret = ff_mpeg_ref_picture(s->avctx, &s->pic, &s1->pic);\ else\ - ret = update_picture_tables(&s->pic, &s1->pic);\ + ret = ff_update_picture_tables(&s->pic, &s1->pic);\ if (ret < 0)\ return ret;\ } while (0) @@ -925,6 +516,11 @@ do {\ UPDATE_PICTURE(last_picture); UPDATE_PICTURE(next_picture); +#define REBASE_PICTURE(pic, new_ctx, old_ctx) \ + ((pic && pic >= old_ctx->picture && \ + pic < old_ctx->picture + MAX_PICTURE_COUNT) ? \ + &new_ctx->picture[pic - old_ctx->picture] : NULL) + s->last_picture_ptr = REBASE_PICTURE(s1->last_picture_ptr, s, s1); s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1); s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1); @@ -933,7 +529,7 @@ do {\ s->next_p_frame_damaged = s1->next_p_frame_damaged; s->workaround_bugs = s1->workaround_bugs; - // MPEG4 timing info + // MPEG-4 timing info memcpy(&s->last_time_base, &s1->last_time_base, (char *) &s1->pb_field_time + sizeof(s1->pb_field_time) - (char *) &s1->last_time_base); @@ -948,7 +544,7 @@ do {\ if (s1->bitstream_buffer) { if (s1->bitstream_buffer_size + - FF_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size) + AV_INPUT_BUFFER_PADDING_SIZE > s->allocated_bitstream_buffer_size) av_fast_malloc(&s->bitstream_buffer, &s->allocated_bitstream_buffer_size, s1->allocated_bitstream_buffer_size); @@ -956,13 +552,14 @@ do {\ memcpy(s->bitstream_buffer, s1->bitstream_buffer, s1->bitstream_buffer_size); memset(s->bitstream_buffer + s->bitstream_buffer_size, 0, - FF_INPUT_BUFFER_PADDING_SIZE); + AV_INPUT_BUFFER_PADDING_SIZE); } - // linesize dependend scratch buffer allocation - if (!s->edge_emu_buffer) + // linesize-dependent scratch buffer allocation + if (!s->sc.edge_emu_buffer) if (s1->linesize) { - if (frame_size_alloc(s, s1->linesize) < 0) { + if (ff_mpeg_framesize_alloc(s->avctx, &s->me, + &s->sc, s1->linesize) < 0) { av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context " "scratch buffers.\n"); return AVERROR(ENOMEM); @@ -973,14 +570,14 @@ do {\ return AVERROR_BUG; } - // MPEG2/interlacing info + // MPEG-2/interlacing info memcpy(&s->progressive_sequence, &s1->progressive_sequence, (char *) &s1->rtp_mode - (char *) &s1->progressive_sequence); if (!s1->first_field) { s->last_pict_type = s1->pict_type; if (s1->current_picture_ptr) - s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f.quality; + s->last_lambda_for[s1->pict_type] = s1->current_picture_ptr->f->quality; } return 0; @@ -992,7 +589,7 @@ do {\ * The changed fields will not depend upon the * prior state of the MpegEncContext. */ -void ff_MPV_common_defaults(MpegEncContext *s) +void ff_mpv_common_defaults(MpegEncContext *s) { s->y_dc_scale_table = s->c_dc_scale_table = ff_mpeg1_dc_scale_table; @@ -1015,46 +612,9 @@ void ff_MPV_common_defaults(MpegEncContext *s) * the changed fields will not depend upon * the prior state of the MpegEncContext. */ -void ff_MPV_decode_defaults(MpegEncContext *s) +void ff_mpv_decode_defaults(MpegEncContext *s) { - ff_MPV_common_defaults(s); -} - -static int init_er(MpegEncContext *s) -{ - ERContext *er = &s->er; - int mb_array_size = s->mb_height * s->mb_stride; - int i; - - er->avctx = s->avctx; - er->dsp = &s->dsp; - - er->mb_index2xy = s->mb_index2xy; - er->mb_num = s->mb_num; - er->mb_width = s->mb_width; - er->mb_height = s->mb_height; - er->mb_stride = s->mb_stride; - er->b8_stride = s->b8_stride; - - er->er_temp_buffer = av_malloc(s->mb_height * s->mb_stride); - er->error_status_table = av_mallocz(mb_array_size); - if (!er->er_temp_buffer || !er->error_status_table) - goto fail; - - er->mbskip_table = s->mbskip_table; - er->mbintra_table = s->mbintra_table; - - for (i = 0; i < FF_ARRAY_ELEMS(s->dc_val); i++) - er->dc_val[i] = s->dc_val[i]; - - er->decode_mb = mpeg_er_decode_mb; - er->opaque = s; - - return 0; -fail: - av_freep(&er->er_temp_buffer); - av_freep(&er->error_status_table); - return AVERROR(ENOMEM); + ff_mpv_common_defaults(s); } /** @@ -1067,11 +627,10 @@ static int init_context_frame(MpegEncContext *s) s->mb_width = (s->width + 15) / 16; s->mb_stride = s->mb_width + 1; s->b8_stride = s->mb_width * 2 + 1; - s->b4_stride = s->mb_width * 4 + 1; mb_array_size = s->mb_height * s->mb_stride; mv_table_size = (s->mb_height + 2) * s->mb_stride + 1; - /* set default edge pos, will be overriden + /* set default edge pos, will be overridden * in decode_header if needed */ s->h_edge_pos = s->mb_width * 16; s->v_edge_pos = s->mb_height * 16; @@ -1090,7 +649,7 @@ static int init_context_frame(MpegEncContext *s) yc_size = y_size + 2 * c_size; FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), - fail); // error ressilience code looks cleaner with this + fail); // error resilience code looks cleaner with this for (y = 0; y < s->mb_height; y++) for (x = 0; x < s->mb_width; x++) s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride; @@ -1136,7 +695,7 @@ static int init_context_frame(MpegEncContext *s) } if (s->codec_id == AV_CODEC_ID_MPEG4 || - (s->flags & CODEC_FLAG_INTERLACED_ME)) { + (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)) { /* interlaced direct mode decoding tables */ for (i = 0; i < 2; i++) { int j, k; @@ -1190,9 +749,9 @@ static int init_context_frame(MpegEncContext *s) /* init macroblock skip table */ FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, fail); - // Note the + 1 is for a quicker mpeg4 slice_end detection + // Note the + 1 is for a quicker MPEG-4 slice_end detection - return init_er(s); + return ff_mpeg_er_init(s); fail: return AVERROR(ENOMEM); } @@ -1201,7 +760,7 @@ fail: * init common structure for both encoder and decoder. * this assumes that some variables like width/height are already set */ -av_cold int ff_MPV_common_init(MpegEncContext *s) +av_cold int ff_mpv_common_init(MpegEncContext *s) { int i; int nb_slices = (HAVE_THREADS && @@ -1237,10 +796,7 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) av_image_check_size(s->width, s->height, 0, s->avctx)) return -1; - ff_dct_common_init(s); - - s->flags = s->avctx->flags; - s->flags2 = s->avctx->flags2; + dct_init(s); /* set chroma shifts */ av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, @@ -1250,19 +806,29 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) /* convert fourcc to upper case */ s->codec_tag = avpriv_toupper4(s->avctx->codec_tag); - s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag); - FF_ALLOCZ_OR_GOTO(s->avctx, s->picture, MAX_PICTURE_COUNT * sizeof(Picture), fail); for (i = 0; i < MAX_PICTURE_COUNT; i++) { - av_frame_unref(&s->picture[i].f); + s->picture[i].f = av_frame_alloc(); + if (!s->picture[i].f) + goto fail; } memset(&s->next_picture, 0, sizeof(s->next_picture)); memset(&s->last_picture, 0, sizeof(s->last_picture)); memset(&s->current_picture, 0, sizeof(s->current_picture)); - av_frame_unref(&s->next_picture.f); - av_frame_unref(&s->last_picture.f); - av_frame_unref(&s->current_picture.f); + memset(&s->new_picture, 0, sizeof(s->new_picture)); + s->next_picture.f = av_frame_alloc(); + if (!s->next_picture.f) + goto fail; + s->last_picture.f = av_frame_alloc(); + if (!s->last_picture.f) + goto fail; + s->current_picture.f = av_frame_alloc(); + if (!s->current_picture.f) + goto fail; + s->new_picture.f = av_frame_alloc(); + if (!s->new_picture.f) + goto fail; if (s->width && s->height) { if (init_context_frame(s)) @@ -1300,7 +866,7 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) return 0; fail: - ff_MPV_common_end(s); + ff_mpv_common_end(s); return -1; } @@ -1309,7 +875,7 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) * Is used during resolution changes to avoid a full reinitialization of the * codec. */ -static int free_context_frame(MpegEncContext *s) +static void free_context_frame(MpegEncContext *s) { int i, j, k; @@ -1355,11 +921,9 @@ static int free_context_frame(MpegEncContext *s) av_freep(&s->bits_tab); s->linesize = s->uvlinesize = 0; - - return 0; } -int ff_MPV_common_frame_size_change(MpegEncContext *s) +int ff_mpv_common_frame_size_change(MpegEncContext *s) { int i, err = 0; @@ -1373,8 +937,7 @@ int ff_MPV_common_frame_size_change(MpegEncContext *s) } else free_duplicate_context(s); - if ((err = free_context_frame(s)) < 0) - return err; + free_context_frame(s); if (s->picture) for (i = 0; i < MAX_PICTURE_COUNT; i++) { @@ -1392,8 +955,8 @@ int ff_MPV_common_frame_size_change(MpegEncContext *s) s->mb_height = (s->height + 15) / 16; if ((s->width || s->height) && - av_image_check_size(s->width, s->height, 0, s->avctx)) - return AVERROR_INVALIDDATA; + (err = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0) + goto fail; if ((err = init_context_frame(s))) goto fail; @@ -1409,7 +972,7 @@ int ff_MPV_common_frame_size_change(MpegEncContext *s) } for (i = 0; i < nb_slices; i++) { - if (init_duplicate_context(s->thread_context[i]) < 0) + if ((err = init_duplicate_context(s->thread_context[i])) < 0) goto fail; s->thread_context[i]->start_mb_y = (s->mb_height * (i) + nb_slices / 2) / nb_slices; @@ -1427,12 +990,12 @@ int ff_MPV_common_frame_size_change(MpegEncContext *s) return 0; fail: - ff_MPV_common_end(s); + ff_mpv_common_end(s); return err; } /* init common structure for both encoder and decoder */ -void ff_MPV_common_end(MpegEncContext *s) +void ff_mpv_common_end(MpegEncContext *s) { int i; @@ -1455,16 +1018,23 @@ void ff_MPV_common_end(MpegEncContext *s) if (s->picture) { for (i = 0; i < MAX_PICTURE_COUNT; i++) { ff_free_picture_tables(&s->picture[i]); - ff_mpeg_unref_picture(s, &s->picture[i]); + ff_mpeg_unref_picture(s->avctx, &s->picture[i]); + av_frame_free(&s->picture[i].f); } } av_freep(&s->picture); ff_free_picture_tables(&s->last_picture); - ff_mpeg_unref_picture(s, &s->last_picture); + ff_mpeg_unref_picture(s->avctx, &s->last_picture); + av_frame_free(&s->last_picture.f); ff_free_picture_tables(&s->current_picture); - ff_mpeg_unref_picture(s, &s->current_picture); + ff_mpeg_unref_picture(s->avctx, &s->current_picture); + av_frame_free(&s->current_picture.f); ff_free_picture_tables(&s->next_picture); - ff_mpeg_unref_picture(s, &s->next_picture); + ff_mpeg_unref_picture(s->avctx, &s->next_picture); + av_frame_free(&s->next_picture.f); + ff_free_picture_tables(&s->new_picture); + ff_mpeg_unref_picture(s->avctx, &s->new_picture); + av_frame_free(&s->new_picture.f); free_context_frame(s); @@ -1475,156 +1045,11 @@ void ff_MPV_common_end(MpegEncContext *s) s->linesize = s->uvlinesize = 0; } -av_cold void ff_init_rl(RLTable *rl, - uint8_t static_store[2][2 * MAX_RUN + MAX_LEVEL + 3]) -{ - int8_t max_level[MAX_RUN + 1], max_run[MAX_LEVEL + 1]; - uint8_t index_run[MAX_RUN + 1]; - int last, run, level, start, end, i; - - /* If table is static, we can quit if rl->max_level[0] is not NULL */ - if (static_store && rl->max_level[0]) - return; - - /* compute max_level[], max_run[] and index_run[] */ - for (last = 0; last < 2; last++) { - if (last == 0) { - start = 0; - end = rl->last; - } else { - start = rl->last; - end = rl->n; - } - - memset(max_level, 0, MAX_RUN + 1); - memset(max_run, 0, MAX_LEVEL + 1); - memset(index_run, rl->n, MAX_RUN + 1); - for (i = start; i < end; i++) { - run = rl->table_run[i]; - level = rl->table_level[i]; - if (index_run[run] == rl->n) - index_run[run] = i; - if (level > max_level[run]) - max_level[run] = level; - if (run > max_run[level]) - max_run[level] = run; - } - if (static_store) - rl->max_level[last] = static_store[last]; - else - rl->max_level[last] = av_malloc(MAX_RUN + 1); - memcpy(rl->max_level[last], max_level, MAX_RUN + 1); - if (static_store) - rl->max_run[last] = static_store[last] + MAX_RUN + 1; - else - rl->max_run[last] = av_malloc(MAX_LEVEL + 1); - memcpy(rl->max_run[last], max_run, MAX_LEVEL + 1); - if (static_store) - rl->index_run[last] = static_store[last] + MAX_RUN + MAX_LEVEL + 2; - else - rl->index_run[last] = av_malloc(MAX_RUN + 1); - memcpy(rl->index_run[last], index_run, MAX_RUN + 1); - } -} - -av_cold void ff_init_vlc_rl(RLTable *rl) -{ - int i, q; - - for (q = 0; q < 32; q++) { - int qmul = q * 2; - int qadd = (q - 1) | 1; - - if (q == 0) { - qmul = 1; - qadd = 0; - } - for (i = 0; i < rl->vlc.table_size; i++) { - int code = rl->vlc.table[i][0]; - int len = rl->vlc.table[i][1]; - int level, run; - - if (len == 0) { // illegal code - run = 66; - level = MAX_LEVEL; - } else if (len < 0) { // more bits needed - run = 0; - level = code; - } else { - if (code == rl->n) { // esc - run = 66; - level = 0; - } else { - run = rl->table_run[code] + 1; - level = rl->table_level[code] * qmul + qadd; - if (code >= rl->last) run += 192; - } - } - rl->rl_vlc[q][i].len = len; - rl->rl_vlc[q][i].level = level; - rl->rl_vlc[q][i].run = run; - } - } -} - -static void release_unused_pictures(MpegEncContext *s) -{ - int i; - - /* release non reference frames */ - for (i = 0; i < MAX_PICTURE_COUNT; i++) { - if (!s->picture[i].reference) - ff_mpeg_unref_picture(s, &s->picture[i]); - } -} - -static inline int pic_is_unused(MpegEncContext *s, Picture *pic) -{ - if (pic->f.buf[0] == NULL) - return 1; - if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF)) - return 1; - return 0; -} - -static int find_unused_picture(MpegEncContext *s, int shared) -{ - int i; - - if (shared) { - for (i = 0; i < MAX_PICTURE_COUNT; i++) { - if (s->picture[i].f.buf[0] == NULL) - return i; - } - } else { - for (i = 0; i < MAX_PICTURE_COUNT; i++) { - if (pic_is_unused(s, &s->picture[i])) - return i; - } - } - - return AVERROR_INVALIDDATA; -} - -int ff_find_unused_picture(MpegEncContext *s, int shared) -{ - int ret = find_unused_picture(s, shared); - - if (ret >= 0 && ret < MAX_PICTURE_COUNT) { - if (s->picture[ret].needs_realloc) { - s->picture[ret].needs_realloc = 0; - ff_free_picture_tables(&s->picture[ret]); - ff_mpeg_unref_picture(s, &s->picture[ret]); - } - } - return ret; -} - /** * generic function called after decoding * the header and before a frame is decoded. */ -int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) +int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx) { int i, ret; Picture *pic; @@ -1633,34 +1058,34 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) /* mark & release old frames */ if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && - s->last_picture_ptr->f.buf[0]) { - ff_mpeg_unref_picture(s, s->last_picture_ptr); + s->last_picture_ptr->f->buf[0]) { + ff_mpeg_unref_picture(s->avctx, s->last_picture_ptr); } /* release forgotten pictures */ - /* if (mpeg124/h263) */ + /* if (MPEG-124 / H.263) */ for (i = 0; i < MAX_PICTURE_COUNT; i++) { if (&s->picture[i] != s->last_picture_ptr && &s->picture[i] != s->next_picture_ptr && s->picture[i].reference && !s->picture[i].needs_realloc) { - if (!(avctx->active_thread_type & FF_THREAD_FRAME)) - av_log(avctx, AV_LOG_ERROR, - "releasing zombie picture\n"); - ff_mpeg_unref_picture(s, &s->picture[i]); + ff_mpeg_unref_picture(s->avctx, &s->picture[i]); } } - ff_mpeg_unref_picture(s, &s->current_picture); + ff_mpeg_unref_picture(s->avctx, &s->current_picture); - release_unused_pictures(s); + /* release non reference frames */ + for (i = 0; i < MAX_PICTURE_COUNT; i++) { + if (!s->picture[i].reference) + ff_mpeg_unref_picture(s->avctx, &s->picture[i]); + } - if (s->current_picture_ptr && - s->current_picture_ptr->f.buf[0] == NULL) { + if (s->current_picture_ptr && !s->current_picture_ptr->f->buf[0]) { // we already have a unused image // (maybe it was set before reading the header) pic = s->current_picture_ptr; } else { - i = ff_find_unused_picture(s, 0); + i = ff_find_unused_picture(s->avctx, s->picture, 0); if (i < 0) { av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); return i; @@ -1674,30 +1099,30 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) pic->reference = 3; } - pic->f.coded_picture_number = s->coded_picture_number++; + pic->f->coded_picture_number = s->coded_picture_number++; - if (ff_alloc_picture(s, pic, 0) < 0) + if (alloc_picture(s, pic, 0) < 0) return -1; s->current_picture_ptr = pic; // FIXME use only the vars from current_pic - s->current_picture_ptr->f.top_field_first = s->top_field_first; + s->current_picture_ptr->f->top_field_first = s->top_field_first; if (s->codec_id == AV_CODEC_ID_MPEG1VIDEO || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { if (s->picture_structure != PICT_FRAME) - s->current_picture_ptr->f.top_field_first = + s->current_picture_ptr->f->top_field_first = (s->picture_structure == PICT_TOP_FIELD) == s->first_field; } - s->current_picture_ptr->f.interlaced_frame = !s->progressive_frame && + s->current_picture_ptr->f->interlaced_frame = !s->progressive_frame && !s->progressive_sequence; s->current_picture_ptr->field_picture = s->picture_structure != PICT_FRAME; - s->current_picture_ptr->f.pict_type = s->pict_type; - // if (s->flags && CODEC_FLAG_QSCALE) + s->current_picture_ptr->f->pict_type = s->pict_type; + // if (s->avctx->flags && AV_CODEC_FLAG_QSCALE) // s->current_picture_ptr->quality = s->new_picture_ptr->quality; - s->current_picture_ptr->f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; + s->current_picture_ptr->f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; - if ((ret = ff_mpeg_ref_picture(s, &s->current_picture, + if ((ret = ff_mpeg_ref_picture(s->avctx, &s->current_picture, s->current_picture_ptr)) < 0) return ret; @@ -1706,15 +1131,14 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) if (!s->droppable) s->next_picture_ptr = s->current_picture_ptr; } - av_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", + ff_dlog(s->avctx, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr, - s->last_picture_ptr ? s->last_picture_ptr->f.data[0] : NULL, - s->next_picture_ptr ? s->next_picture_ptr->f.data[0] : NULL, - s->current_picture_ptr ? s->current_picture_ptr->f.data[0] : NULL, + s->last_picture_ptr ? s->last_picture_ptr->f->data[0] : NULL, + s->next_picture_ptr ? s->next_picture_ptr->f->data[0] : NULL, + s->current_picture_ptr ? s->current_picture_ptr->f->data[0] : NULL, s->pict_type, s->droppable); - if ((s->last_picture_ptr == NULL || - s->last_picture_ptr->f.buf[0] == NULL) && + if ((!s->last_picture_ptr || !s->last_picture_ptr->f->buf[0]) && (s->pict_type != AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)) { int h_chroma_shift, v_chroma_shift; @@ -1728,7 +1152,7 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) "allocate dummy last picture for field based first keyframe\n"); /* Allocate a dummy frame */ - i = ff_find_unused_picture(s, 0); + i = ff_find_unused_picture(s->avctx, s->picture, 0); if (i < 0) { av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); return i; @@ -1736,30 +1160,29 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) s->last_picture_ptr = &s->picture[i]; s->last_picture_ptr->reference = 3; - s->last_picture_ptr->f.pict_type = AV_PICTURE_TYPE_I; + s->last_picture_ptr->f->pict_type = AV_PICTURE_TYPE_I; - if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) { + if (alloc_picture(s, s->last_picture_ptr, 0) < 0) { s->last_picture_ptr = NULL; return -1; } - memset(s->last_picture_ptr->f.data[0], 0, - avctx->height * s->last_picture_ptr->f.linesize[0]); - memset(s->last_picture_ptr->f.data[1], 0x80, + memset(s->last_picture_ptr->f->data[0], 0, + avctx->height * s->last_picture_ptr->f->linesize[0]); + memset(s->last_picture_ptr->f->data[1], 0x80, (avctx->height >> v_chroma_shift) * - s->last_picture_ptr->f.linesize[1]); - memset(s->last_picture_ptr->f.data[2], 0x80, + s->last_picture_ptr->f->linesize[1]); + memset(s->last_picture_ptr->f->data[2], 0x80, (avctx->height >> v_chroma_shift) * - s->last_picture_ptr->f.linesize[2]); + s->last_picture_ptr->f->linesize[2]); ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 0); ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 1); } - if ((s->next_picture_ptr == NULL || - s->next_picture_ptr->f.buf[0] == NULL) && + if ((!s->next_picture_ptr || !s->next_picture_ptr->f->buf[0]) && s->pict_type == AV_PICTURE_TYPE_B) { /* Allocate a dummy frame */ - i = ff_find_unused_picture(s, 0); + i = ff_find_unused_picture(s->avctx, s->picture, 0); if (i < 0) { av_log(s->avctx, AV_LOG_ERROR, "no frame buffer available\n"); return i; @@ -1767,9 +1190,9 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) s->next_picture_ptr = &s->picture[i]; s->next_picture_ptr->reference = 3; - s->next_picture_ptr->f.pict_type = AV_PICTURE_TYPE_I; + s->next_picture_ptr->f->pict_type = AV_PICTURE_TYPE_I; - if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) { + if (alloc_picture(s, s->next_picture_ptr, 0) < 0) { s->next_picture_ptr = NULL; return -1; } @@ -1778,22 +1201,22 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) } if (s->last_picture_ptr) { - ff_mpeg_unref_picture(s, &s->last_picture); - if (s->last_picture_ptr->f.buf[0] && - (ret = ff_mpeg_ref_picture(s, &s->last_picture, + ff_mpeg_unref_picture(s->avctx, &s->last_picture); + if (s->last_picture_ptr->f->buf[0] && + (ret = ff_mpeg_ref_picture(s->avctx, &s->last_picture, s->last_picture_ptr)) < 0) return ret; } if (s->next_picture_ptr) { - ff_mpeg_unref_picture(s, &s->next_picture); - if (s->next_picture_ptr->f.buf[0] && - (ret = ff_mpeg_ref_picture(s, &s->next_picture, + ff_mpeg_unref_picture(s->avctx, &s->next_picture); + if (s->next_picture_ptr->f->buf[0] && + (ret = ff_mpeg_ref_picture(s->avctx, &s->next_picture, s->next_picture_ptr)) < 0) return ret; } if (s->pict_type != AV_PICTURE_TYPE_I && - !(s->last_picture_ptr && s->last_picture_ptr->f.buf[0])) { + !(s->last_picture_ptr && s->last_picture_ptr->f->buf[0])) { av_log(s, AV_LOG_ERROR, "Non-reference picture received and no reference available\n"); return AVERROR_INVALIDDATA; @@ -1803,20 +1226,18 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) int i; for (i = 0; i < 4; i++) { if (s->picture_structure == PICT_BOTTOM_FIELD) { - s->current_picture.f.data[i] += - s->current_picture.f.linesize[i]; + s->current_picture.f->data[i] += + s->current_picture.f->linesize[i]; } - s->current_picture.f.linesize[i] *= 2; - s->last_picture.f.linesize[i] *= 2; - s->next_picture.f.linesize[i] *= 2; + s->current_picture.f->linesize[i] *= 2; + s->last_picture.f->linesize[i] *= 2; + s->next_picture.f->linesize[i] *= 2; } } - s->err_recognition = avctx->err_recognition; - /* set dequantizer, we can't do it during init as - * it might change for mpeg4 and we can't do it in the header - * decode as init is not called for mpeg4 there yet */ + * it might change for MPEG-4 and we can't do it in the header + * decode as init is not called for MPEG-4 there yet */ if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra; s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter; @@ -1839,7 +1260,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } /* called after a frame has been decoded. */ -void ff_MPV_frame_end(MpegEncContext *s) +void ff_mpv_frame_end(MpegEncContext *s) { #if FF_API_XVMC FF_DISABLE_DEPRECATION_WARNINGS @@ -1865,7 +1286,7 @@ void ff_print_debug_info(MpegEncContext *s, Picture *p) AVFrame *pict; if (s->avctx->hwaccel || !p || !p->mb_type) return; - pict = &p->f; + pict = p->f; if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) { int x,y; @@ -1960,7 +1381,7 @@ void ff_print_debug_info(MpegEncContext *s, Picture *p) /** * find the lowest MB row referenced in the MVs */ -int ff_MPV_lowest_referenced_row(MpegEncContext *s, int dir) +static int lowest_referenced_row(MpegEncContext *s, int dir) { int my_max = INT_MIN, my_min = INT_MAX, qpel_shift = !s->quarter_sample; int my, off, i, mvs; @@ -2000,7 +1421,7 @@ static inline void put_dct(MpegEncContext *s, int16_t *block, int i, uint8_t *dest, int line_size, int qscale) { s->dct_unquantize_intra(s, block, i, qscale); - s->dsp.idct_put (dest, line_size, block); + s->idsp.idct_put(dest, line_size, block); } /* add block[] to dest[] */ @@ -2008,7 +1429,7 @@ static inline void add_dct(MpegEncContext *s, int16_t *block, int i, uint8_t *dest, int line_size) { if (s->block_last_index[i] >= 0) { - s->dsp.idct_add (dest, line_size, block); + s->idsp.idct_add(dest, line_size, block); } } @@ -2018,7 +1439,7 @@ static inline void add_dequant_dct(MpegEncContext *s, if (s->block_last_index[i] >= 0) { s->dct_unquantize_inter(s, block, i, qscale); - s->dsp.idct_add (dest, line_size, block); + s->idsp.idct_add(dest, line_size, block); } } @@ -2066,7 +1487,7 @@ void ff_clean_intra_table_entries(MpegEncContext *s) s->interlaced_dct : true if interlaced dct used (mpeg2) */ static av_always_inline -void MPV_decode_mb_internal(MpegEncContext *s, int16_t block[12][64], +void mpv_decode_mb_internal(MpegEncContext *s, int16_t block[12][64], int is_mpeg12) { const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; @@ -2086,7 +1507,8 @@ FF_ENABLE_DEPRECATION_WARNINGS av_log(s->avctx, AV_LOG_DEBUG, "DCT coeffs of MB at %dx%d:\n", s->mb_x, s->mb_y); for(i=0; i<6; i++){ for(j=0; j<64; j++){ - av_log(s->avctx, AV_LOG_DEBUG, "%5d", block[i][s->dsp.idct_permutation[j]]); + av_log(s->avctx, AV_LOG_DEBUG, "%5d", + block[i][s->idsp.idct_permutation[j]]); } av_log(s->avctx, AV_LOG_DEBUG, "\n"); } @@ -2108,13 +1530,15 @@ FF_ENABLE_DEPRECATION_WARNINGS else if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) s->mbintra_table[mb_xy]=1; - 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 + if ((s->avctx->flags & AV_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 uint8_t *dest_y, *dest_cb, *dest_cr; int dct_linesize, dct_offset; op_pixels_func (*op_pix)[4]; qpel_mc_func (*op_qpix)[16]; - const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics - const int uvlinesize = s->current_picture.f.linesize[1]; + const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics + const int uvlinesize = s->current_picture.f->linesize[1]; const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band; const int block_size = 8; @@ -2142,9 +1566,9 @@ FF_ENABLE_DEPRECATION_WARNINGS dest_cb= s->dest[1]; dest_cr= s->dest[2]; }else{ - dest_y = s->b_scratchpad; - dest_cb= s->b_scratchpad+16*linesize; - dest_cr= s->b_scratchpad+32*linesize; + dest_y = s->sc.b_scratchpad; + dest_cb= s->sc.b_scratchpad+16*linesize; + dest_cr= s->sc.b_scratchpad+32*linesize; } if (!s->mb_intra) { @@ -2155,12 +1579,12 @@ FF_ENABLE_DEPRECATION_WARNINGS if(HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_FRAME) { if (s->mv_dir & MV_DIR_FORWARD) { ff_thread_await_progress(&s->last_picture_ptr->tf, - ff_MPV_lowest_referenced_row(s, 0), + lowest_referenced_row(s, 0), 0); } if (s->mv_dir & MV_DIR_BACKWARD) { ff_thread_await_progress(&s->next_picture_ptr->tf, - ff_MPV_lowest_referenced_row(s, 1), + lowest_referenced_row(s, 1), 0); } } @@ -2172,12 +1596,12 @@ FF_ENABLE_DEPRECATION_WARNINGS op_pix = s->hdsp.put_no_rnd_pixels_tab; } if (s->mv_dir & MV_DIR_FORWARD) { - ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix); + ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f->data, op_pix, op_qpix); op_pix = s->hdsp.avg_pixels_tab; op_qpix= s->me.qpel_avg; } if (s->mv_dir & MV_DIR_BACKWARD) { - ff_MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix); + ff_mpv_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f->data, op_pix, op_qpix); } } @@ -2197,7 +1621,7 @@ FF_ENABLE_DEPRECATION_WARNINGS add_dequant_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); add_dequant_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); - if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { if (s->chroma_y_shift){ add_dequant_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); add_dequant_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); @@ -2216,7 +1640,7 @@ FF_ENABLE_DEPRECATION_WARNINGS add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize); add_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize); - if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { if(s->chroma_y_shift){//Chroma420 add_dct(s, block[4], 4, dest_cb, uvlinesize); add_dct(s, block[5], 5, dest_cr, uvlinesize); @@ -2249,7 +1673,7 @@ FF_ENABLE_DEPRECATION_WARNINGS put_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize, s->qscale); put_dct(s, block[3], 3, dest_y + dct_offset + block_size, dct_linesize, s->qscale); - if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { if(s->chroma_y_shift){ put_dct(s, block[4], 4, dest_cb, uvlinesize, s->chroma_qscale); put_dct(s, block[5], 5, dest_cr, uvlinesize, s->chroma_qscale); @@ -2263,29 +1687,29 @@ FF_ENABLE_DEPRECATION_WARNINGS } } }else{ - s->dsp.idct_put(dest_y , dct_linesize, block[0]); - s->dsp.idct_put(dest_y + block_size, dct_linesize, block[1]); - s->dsp.idct_put(dest_y + dct_offset , dct_linesize, block[2]); - s->dsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]); + s->idsp.idct_put(dest_y, dct_linesize, block[0]); + s->idsp.idct_put(dest_y + block_size, dct_linesize, block[1]); + s->idsp.idct_put(dest_y + dct_offset, dct_linesize, block[2]); + s->idsp.idct_put(dest_y + dct_offset + block_size, dct_linesize, block[3]); - if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ + if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) { if(s->chroma_y_shift){ - s->dsp.idct_put(dest_cb, uvlinesize, block[4]); - s->dsp.idct_put(dest_cr, uvlinesize, block[5]); + s->idsp.idct_put(dest_cb, uvlinesize, block[4]); + s->idsp.idct_put(dest_cr, uvlinesize, block[5]); }else{ dct_linesize = uvlinesize << s->interlaced_dct; dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize * 8; - s->dsp.idct_put(dest_cb, dct_linesize, block[4]); - s->dsp.idct_put(dest_cr, dct_linesize, block[5]); - s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]); - s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]); + s->idsp.idct_put(dest_cb, dct_linesize, block[4]); + s->idsp.idct_put(dest_cr, dct_linesize, block[5]); + s->idsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]); + s->idsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]); if(!s->chroma_x_shift){//Chroma444 - s->dsp.idct_put(dest_cb + 8, dct_linesize, block[8]); - s->dsp.idct_put(dest_cr + 8, dct_linesize, block[9]); - s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]); - s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]); + s->idsp.idct_put(dest_cb + 8, dct_linesize, block[8]); + s->idsp.idct_put(dest_cr + 8, dct_linesize, block[9]); + s->idsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]); + s->idsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]); } } }//gray @@ -2300,79 +1724,26 @@ skip_idct: } } -void ff_MPV_decode_mb(MpegEncContext *s, int16_t block[12][64]){ +void ff_mpv_decode_mb(MpegEncContext *s, int16_t block[12][64]) +{ #if !CONFIG_SMALL if(s->out_format == FMT_MPEG1) { - MPV_decode_mb_internal(s, block, 1); + mpv_decode_mb_internal(s, block, 1); } else #endif - MPV_decode_mb_internal(s, block, 0); -} - -/** - * @param h is the normal height, this will be reduced automatically if needed for the last row - */ -void ff_draw_horiz_band(AVCodecContext *avctx, DSPContext *dsp, Picture *cur, - Picture *last, int y, int h, int picture_structure, - int first_field, int low_delay, - int v_edge_pos, int h_edge_pos) -{ - const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt); - int vshift = desc->log2_chroma_h; - const int field_pic = picture_structure != PICT_FRAME; - if(field_pic){ - h <<= 1; - y <<= 1; - } - - h = FFMIN(h, avctx->height - y); - - if(field_pic && first_field && !(avctx->slice_flags&SLICE_FLAG_ALLOW_FIELD)) return; - - if (avctx->draw_horiz_band) { - AVFrame *src; - int offset[AV_NUM_DATA_POINTERS]; - int i; - - if(cur->f.pict_type == AV_PICTURE_TYPE_B || low_delay || - (avctx->slice_flags & SLICE_FLAG_CODED_ORDER)) - src = &cur->f; - else if (last) - src = &last->f; - else - return; - - if (cur->f.pict_type == AV_PICTURE_TYPE_B && - picture_structure == PICT_FRAME && - avctx->codec_id != AV_CODEC_ID_SVQ3) { - for (i = 0; i < AV_NUM_DATA_POINTERS; i++) - offset[i] = 0; - }else{ - offset[0]= y * src->linesize[0]; - offset[1]= - offset[2]= (y >> vshift) * src->linesize[1]; - for (i = 3; i < AV_NUM_DATA_POINTERS; i++) - offset[i] = 0; - } - - emms_c(); - - avctx->draw_horiz_band(avctx, src, offset, - y, picture_structure, h); - } + mpv_decode_mb_internal(s, block, 0); } void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h) { - ff_draw_horiz_band(s->avctx, &s->dsp, &s->current_picture, - &s->last_picture, y, h, s->picture_structure, - s->first_field, s->low_delay, - s->v_edge_pos, s->h_edge_pos); + ff_draw_horiz_band(s->avctx, s->current_picture.f, + s->last_picture.f, y, h, s->picture_structure, + s->first_field, s->low_delay); } void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename - const int linesize = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics - const int uvlinesize = s->current_picture.f.linesize[1]; + const int linesize = s->current_picture.f->linesize[0]; //not s->linesize as this would be wrong for field pics + const int uvlinesize = s->current_picture.f->linesize[1]; const int mb_size= 4; s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2; @@ -2383,9 +1754,9 @@ void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename 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; //block_index is not used by mpeg2, so it is not affected by chroma_format - s->dest[0] = s->current_picture.f.data[0] + ((s->mb_x - 1) << mb_size); - s->dest[1] = s->current_picture.f.data[1] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift)); - s->dest[2] = s->current_picture.f.data[2] + ((s->mb_x - 1) << (mb_size - s->chroma_x_shift)); + s->dest[0] = s->current_picture.f->data[0] + (s->mb_x - 1) * (1 << mb_size); + s->dest[1] = s->current_picture.f->data[1] + (s->mb_x - 1) * (1 << (mb_size - s->chroma_x_shift)); + s->dest[2] = s->current_picture.f->data[2] + (s->mb_x - 1) * (1 << (mb_size - s->chroma_x_shift)); if(!(s->pict_type==AV_PICTURE_TYPE_B && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME)) { @@ -2402,49 +1773,20 @@ void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename } } -/** - * Permute an 8x8 block. - * @param block the block which will be permuted according to the given permutation vector - * @param permutation the permutation vector - * @param last the last non zero coefficient in scantable order, used to speed the permutation up - * @param scantable the used scantable, this is only used to speed the permutation up, the block is not - * (inverse) permutated to scantable order! - */ -void ff_block_permute(int16_t *block, uint8_t *permutation, const uint8_t *scantable, int last) -{ - int i; - int16_t temp[64]; - - if(last<=0) return; - //if(permutation[1]==1) return; //FIXME it is ok but not clean and might fail for some permutations - - for(i=0; i<=last; i++){ - const int j= scantable[i]; - temp[j]= block[j]; - block[j]=0; - } - - for(i=0; i<=last; i++){ - const int j= scantable[i]; - const int perm_j= permutation[j]; - block[perm_j]= temp[j]; - } -} - void ff_mpeg_flush(AVCodecContext *avctx){ int i; MpegEncContext *s = avctx->priv_data; - if(s==NULL || s->picture==NULL) + if (!s || !s->picture) return; for (i = 0; i < MAX_PICTURE_COUNT; i++) - ff_mpeg_unref_picture(s, &s->picture[i]); + ff_mpeg_unref_picture(s->avctx, &s->picture[i]); s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL; - ff_mpeg_unref_picture(s, &s->current_picture); - ff_mpeg_unref_picture(s, &s->last_picture); - ff_mpeg_unref_picture(s, &s->next_picture); + ff_mpeg_unref_picture(s->avctx, &s->current_picture); + ff_mpeg_unref_picture(s->avctx, &s->last_picture); + ff_mpeg_unref_picture(s->avctx, &s->next_picture); s->mb_x= s->mb_y= 0; @@ -2475,26 +1817,8 @@ void ff_set_qscale(MpegEncContext * s, int qscale) s->c_dc_scale= s->c_dc_scale_table[ s->chroma_qscale ]; } -void ff_MPV_report_decode_progress(MpegEncContext *s) +void ff_mpv_report_decode_progress(MpegEncContext *s) { if (s->pict_type != AV_PICTURE_TYPE_B && !s->partitioned_frame && !s->er.error_occurred) ff_thread_report_progress(&s->current_picture_ptr->tf, s->mb_y, 0); } - -#if CONFIG_ERROR_RESILIENCE -void ff_mpeg_er_frame_start(MpegEncContext *s) -{ - ERContext *er = &s->er; - - er->cur_pic = s->current_picture_ptr; - er->last_pic = s->last_picture_ptr; - er->next_pic = s->next_picture_ptr; - - er->pp_time = s->pp_time; - er->pb_time = s->pb_time; - er->quarter_sample = s->quarter_sample; - er->partitioned_frame = s->partitioned_frame; - - ff_er_frame_start(er); -} -#endif /* CONFIG_ERROR_RESILIENCE */