X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fh263dec.c;h=921ff5fb985576f5cc15e29dc62309446644422f;hb=58d87e0f49bcbbc6f426328f53b657bae7430cd2;hp=cfb77b078f237038cb591f56818da5ca68adc4c1;hpb=4b1f5e5090abed6c618c8ba380cd7d28d140f867;p=ffmpeg diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index cfb77b078f2..921ff5fb985 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -35,10 +35,20 @@ #include "mpeg_er.h" #include "mpeg4video.h" #include "mpeg4video_parser.h" +#include "mpegutils.h" #include "mpegvideo.h" #include "msmpeg4.h" #include "qpeldsp.h" #include "thread.h" +#include "wmv2.h" + +static enum AVPixelFormat h263_get_format(AVCodecContext *avctx) +{ + if (avctx->codec->id == AV_CODEC_ID_MSS2) + return AV_PIX_FMT_YUV420P; + + return avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); +} av_cold int ff_h263_decode_init(AVCodecContext *avctx) { @@ -56,10 +66,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) s->quant_precision = 5; s->decode_mb = ff_h263_decode_mb; s->low_delay = 1; - if (avctx->codec->id == AV_CODEC_ID_MSS2) - avctx->pix_fmt = AV_PIX_FMT_YUV420P; - else - avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts); s->unrestricted_mv = 1; /* select sub codec */ @@ -111,9 +117,10 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) } s->codec_id = avctx->codec->id; - /* for h263, we allocate the images after having read the header */ + /* for H.263, we allocate the images after having read the header */ if (avctx->codec->id != AV_CODEC_ID_H263 && avctx->codec->id != AV_CODEC_ID_MPEG4) { + avctx->pix_fmt = h263_get_format(avctx); ff_mpv_idct_init(s); if ((ret = ff_mpv_common_init(s)) < 0) return ret; @@ -145,7 +152,7 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size) /* We would have to scan through the whole buf to handle the weird * reordering ... */ return buf_size; - } else if (s->flags & CODEC_FLAG_TRUNCATED) { + } else if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) { pos -= s->parse_context.last_index; // padding is not really read so this might be -1 if (pos < 0) @@ -229,8 +236,8 @@ static int decode_slice(MpegEncContext *s) s->mv_dir = MV_DIR_FORWARD; s->mv_type = MV_TYPE_16X16; - av_dlog(s, "%d %d %06X\n", - ret, get_bits_count(&s->gb), show_bits(&s->gb, 24)); + ff_dlog(s, "%d %06X\n", + get_bits_count(&s->gb), show_bits(&s->gb, 24)); ret = s->decode_mb(s, s->block); if (s->pict_type != AV_PICTURE_TYPE_B) @@ -316,7 +323,8 @@ static int decode_slice(MpegEncContext *s) } if (s->workaround_bugs & FF_BUG_AUTODETECT) { - if (s->padding_bug_score > -2 && !s->data_partitioning) + if (s->codec_id == AV_CODEC_ID_H263 || + (s->padding_bug_score > -2 && !s->data_partitioning)) s->workaround_bugs |= FF_BUG_NO_PADDING; else s->workaround_bugs &= ~FF_BUG_NO_PADDING; @@ -334,7 +342,7 @@ static int decode_slice(MpegEncContext *s) /* buggy padding but the frame should still end approximately at * the bitstream end */ if ((s->workaround_bugs & FF_BUG_NO_PADDING) && - (s->err_recognition & AV_EF_BUFFER)) + (s->avctx->err_recognition & AV_EF_BUFFER)) max_extra += 48; else if ((s->workaround_bugs & FF_BUG_NO_PADDING)) max_extra += 256 * 256 * 256 * 64; @@ -371,9 +379,6 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, int ret; AVFrame *pict = data; - s->flags = avctx->flags; - s->flags2 = avctx->flags2; - /* no supplementary picture */ if (buf_size == 0) { /* special case for last picture */ @@ -388,7 +393,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return 0; } - if (s->flags & CODEC_FLAG_TRUNCATED) { + if (s->avctx->flags & AV_CODEC_FLAG_TRUNCATED) { int next; if (CONFIG_MPEG4_DECODER && s->codec_id == AV_CODEC_ID_MPEG4) { @@ -417,7 +422,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return ret; if (!s->context_initialized) - // we need the idct permutaton for reading a custom matrix + // we need the idct permutation for reading a custom matrix ff_mpv_idct_init(s); /* let's go :-) */ @@ -453,12 +458,14 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, return ret; } - if (!s->context_initialized) + if (!s->context_initialized) { + avctx->pix_fmt = h263_get_format(avctx); if ((ret = ff_mpv_common_init(s)) < 0) return ret; + } if (!s->current_picture_ptr || s->current_picture_ptr->f->data[0]) { - int i = ff_find_unused_picture(s, 0); + int i = ff_find_unused_picture(s->avctx, s->picture, 0); if (i < 0) return i; s->current_picture_ptr = &s->picture[i]; @@ -487,9 +494,9 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c) } - /* After H263 & mpeg4 header decode we have the height, width, + /* After H.263 & MPEG-4 header decode we have the height, width, * and other parameters. So then we could init the picture. - * FIXME: By the way H263 decoder is evolving it should have + * FIXME: By the way H.263 decoder is evolving it should have * an H263EncContext */ if (s->width != avctx->coded_width || s->height != avctx->coded_height || @@ -505,12 +512,18 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if ((ret = ff_mpv_common_frame_size_change(s))) return ret; + + if (avctx->pix_fmt != h263_get_format(avctx)) { + av_log(avctx, AV_LOG_ERROR, "format change not supported\n"); + avctx->pix_fmt = AV_PIX_FMT_NONE; + return AVERROR_UNKNOWN; + } } if (s->codec_id == AV_CODEC_ID_H263 || s->codec_id == AV_CODEC_ID_H263P || s->codec_id == AV_CODEC_ID_H263I) - s->gob_index = ff_h263_get_gob_height(s); + s->gob_index = H263_GOB_HEIGHT(s->height); // for skipping the frame s->current_picture.f->pict_type = s->pict_type; @@ -545,7 +558,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if ((ret = ff_mpv_frame_start(s, avctx)) < 0) return ret; - if (!s->divx_packed && !avctx->hwaccel) + if (!s->divx_packed) ff_thread_finish_setup(avctx); if (avctx->hwaccel) { @@ -642,9 +655,9 @@ intrax8_decoded: const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = { #if CONFIG_H263_VAAPI_HWACCEL || CONFIG_MPEG4_VAAPI_HWACCEL - AV_PIX_FMT_VAAPI_VLD, + AV_PIX_FMT_VAAPI, #endif -#if CONFIG_H263_VDPAU_HWACCEL || CONFIG_MPEG4_VDPAU_HWACCEL +#if CONFIG_MPEG4_VDPAU_HWACCEL AV_PIX_FMT_VDPAU, #endif AV_PIX_FMT_YUV420P, @@ -660,8 +673,8 @@ AVCodec ff_h263_decoder = { .init = ff_h263_decode_init, .close = ff_h263_decode_end, .decode = ff_h263_decode_frame, - .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | - CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, + .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 | + AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY, .flush = ff_mpeg_flush, .pix_fmts = ff_h263_hwaccel_pixfmt_list_420, };