X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpeg12dec.c;h=3e5ef0e31ee23e66a6902aa0d2c1b1c133bb72ba;hb=76b81b10d90732a6609522b7b152395ae2c049bb;hp=73ebdfa88be0ee298bb4c4d40102cf1a8f51713e;hpb=b3e5d59537cbd375ca508fe2dfca30bcd2d201d3;p=ffmpeg diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 73ebdfa88be..3e5ef0e31ee 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1186,8 +1186,10 @@ static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = { #if CONFIG_MPEG1_XVMC_HWACCEL AV_PIX_FMT_XVMC, #endif -#if CONFIG_MPEG1_VDPAU_HWACCEL +#if CONFIG_MPEG1_VDPAU_DECODER && FF_API_VDPAU AV_PIX_FMT_VDPAU_MPEG1, +#endif +#if CONFIG_MPEG1_VDPAU_HWACCEL AV_PIX_FMT_VDPAU, #endif AV_PIX_FMT_YUV420P, @@ -1198,8 +1200,10 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = { #if CONFIG_MPEG2_XVMC_HWACCEL AV_PIX_FMT_XVMC, #endif -#if CONFIG_MPEG2_VDPAU_HWACCEL +#if CONFIG_MPEG_VDPAU_DECODER && FF_API_VDPAU AV_PIX_FMT_VDPAU_MPEG2, +#endif +#if CONFIG_MPEG2_VDPAU_HWACCEL AV_PIX_FMT_VDPAU, #endif #if CONFIG_MPEG2_DXVA2_HWACCEL @@ -1209,7 +1213,10 @@ static const enum AVPixelFormat mpeg2_hwaccel_pixfmt_list_420[] = { AV_PIX_FMT_D3D11VA_VLD, #endif #if CONFIG_MPEG2_VAAPI_HWACCEL - AV_PIX_FMT_VAAPI_VLD, + AV_PIX_FMT_VAAPI, +#endif +#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL + AV_PIX_FMT_VIDEOTOOLBOX, #endif AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE @@ -1225,9 +1232,11 @@ static const enum AVPixelFormat mpeg12_pixfmt_list_444[] = { AV_PIX_FMT_NONE }; +#if FF_API_VDPAU static inline int uses_vdpau(AVCodecContext *avctx) { return avctx->pix_fmt == AV_PIX_FMT_VDPAU_MPEG1 || avctx->pix_fmt == AV_PIX_FMT_VDPAU_MPEG2; } +#endif static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx) { @@ -1253,7 +1262,11 @@ static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx) static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx) { // until then pix_fmt may be changed right after codec init - if (avctx->hwaccel || uses_vdpau(avctx)) + if (avctx->hwaccel +#if FF_API_VDPAU + || uses_vdpau(avctx) +#endif + ) if (avctx->idct_algo == FF_IDCT_AUTO) avctx->idct_algo = FF_IDCT_SIMPLE; @@ -1381,6 +1394,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) case 1: avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; break; case 2: case 3: avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; break; + default: av_assert0(0); } } // MPEG-2 @@ -1463,6 +1477,12 @@ static void mpeg_decode_sequence_extension(Mpeg1Context *s1) s->avctx->level = get_bits(&s->gb, 4); s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ s->chroma_format = get_bits(&s->gb, 2); /* chroma_format 1=420, 2=422, 3=444 */ + + if (!s->chroma_format) { + s->chroma_format = 1; + av_log(s->avctx, AV_LOG_WARNING, "Chroma format invalid\n"); + } + horiz_size_ext = get_bits(&s->gb, 2); vert_size_ext = get_bits(&s->gb, 2); s->width |= (horiz_size_ext << 12); @@ -1720,9 +1740,11 @@ static int mpeg_field_start(MpegEncContext *s, const uint8_t *buf, int buf_size) if (s->avctx->hwaccel && (s->avctx->slice_flags & SLICE_FLAG_ALLOW_FIELD)) { - if (s->avctx->hwaccel->end_frame(s->avctx) < 0) + if ((ret = s->avctx->hwaccel->end_frame(s->avctx)) < 0) { av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode first field\n"); + return ret; + } } for (i = 0; i < 4; i++) { @@ -2079,9 +2101,12 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) return 0; if (s->avctx->hwaccel) { - if (s->avctx->hwaccel->end_frame(s->avctx) < 0) + int ret = s->avctx->hwaccel->end_frame(s->avctx); + if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "hardware accelerator failed to decode picture\n"); + return ret; + } } /* end of slice reached */ @@ -2445,9 +2470,11 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, s2->er.error_count += s2->thread_context[i]->er.error_count; } +#if FF_API_VDPAU if ((CONFIG_MPEG_VDPAU_DECODER || CONFIG_MPEG1_VDPAU_DECODER) && uses_vdpau(avctx)) ff_vdpau_mpeg_picture_complete(s2, buf, buf_size, s->slice_count); +#endif ret = slice_end(avctx, picture); if (ret < 0) @@ -2696,10 +2723,12 @@ static int decode_chunks(AVCodecContext *avctx, AVFrame *picture, return AVERROR_INVALIDDATA; } +#if FF_API_VDPAU if (uses_vdpau(avctx)) { s->slice_count++; break; } +#endif if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE) && @@ -2925,7 +2954,7 @@ AVCodec ff_mpeg_xvmc_decoder = { #endif #endif /* FF_API_XVMC */ -#if CONFIG_MPEG_VDPAU_DECODER +#if CONFIG_MPEG_VDPAU_DECODER && FF_API_VDPAU AVCodec ff_mpeg_vdpau_decoder = { .name = "mpegvideo_vdpau", .long_name = NULL_IF_CONFIG_SMALL("MPEG-1/2 video (VDPAU acceleration)"), @@ -2941,7 +2970,7 @@ AVCodec ff_mpeg_vdpau_decoder = { }; #endif -#if CONFIG_MPEG1_VDPAU_DECODER +#if CONFIG_MPEG1_VDPAU_DECODER && FF_API_VDPAU AVCodec ff_mpeg1_vdpau_decoder = { .name = "mpeg1video_vdpau", .long_name = NULL_IF_CONFIG_SMALL("MPEG-1 video (VDPAU acceleration)"),