X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibvpxdec.c;h=6d3b29fefaf5e7c7586557afbb7f149e82c30ce5;hb=189157c3fc8eeb691e3684b09d971eb5ddb47d5b;hp=d19dd6fd12db3cafd51237d4f704c382e08e529c;hpb=b2bed9325dbd6be0da1d91ffed3f513c40274fd2;p=ffmpeg diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c index d19dd6fd12d..6d3b29fefaf 100644 --- a/libavcodec/libvpxdec.c +++ b/libavcodec/libvpxdec.c @@ -31,6 +31,7 @@ #include "libavutil/imgutils.h" #include "avcodec.h" #include "internal.h" +#include "libvpx.h" typedef struct VP8DecoderContext { struct vpx_codec_ctx decoder; @@ -55,7 +56,6 @@ static av_cold int vpx_init(AVCodecContext *avctx, return AVERROR(EINVAL); } - avctx->pix_fmt = AV_PIX_FMT_YUV420P; return 0; } @@ -81,7 +81,8 @@ static int vp8_decode(AVCodecContext *avctx, } if ((img = vpx_codec_get_frame(&ctx->decoder, &iter))) { - if (img->fmt != VPX_IMG_FMT_I420) { + avctx->pix_fmt = ff_vpx_imgfmt_to_pixfmt(img->fmt); + if (avctx->pix_fmt == AV_PIX_FMT_NONE) { av_log(avctx, AV_LOG_ERROR, "Unsupported output colorspace (%d)\n", img->fmt); return AVERROR_INVALIDDATA; @@ -90,14 +91,24 @@ static int vp8_decode(AVCodecContext *avctx, if ((int) img->d_w != avctx->width || (int) img->d_h != avctx->height) { av_log(avctx, AV_LOG_INFO, "dimension change! %dx%d -> %dx%d\n", avctx->width, avctx->height, img->d_w, img->d_h); - if (av_image_check_size(img->d_w, img->d_h, 0, avctx)) - return AVERROR_INVALIDDATA; - avcodec_set_dimensions(avctx, img->d_w, img->d_h); + ret = ff_set_dimensions(avctx, img->d_w, img->d_h); + if (ret < 0) + return ret; } if ((ret = ff_get_buffer(avctx, picture, 0)) < 0) return ret; - av_image_copy(picture->data, picture->linesize, img->planes, + av_image_copy(picture->data, picture->linesize, (const uint8_t **) img->planes, img->stride, avctx->pix_fmt, img->d_w, img->d_h); +#if VPX_IMAGE_ABI_VERSION >= 4 + switch (img->range) { + case VPX_CR_STUDIO_RANGE: + picture->color_range = AVCOL_RANGE_MPEG; + break; + case VPX_CR_FULL_RANGE: + picture->color_range = AVCOL_RANGE_JPEG; + break; + } +#endif *got_frame = 1; } return avpkt->size; @@ -125,7 +136,7 @@ AVCodec ff_libvpx_vp8_decoder = { .init = vp8_init, .close = vp8_free, .decode = vp8_decode, - .capabilities = CODEC_CAP_AUTO_THREADS | CODEC_CAP_DR1, + .capabilities = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1, }; #endif /* CONFIG_LIBVPX_VP8_DECODER */ @@ -144,6 +155,6 @@ AVCodec ff_libvpx_vp9_decoder = { .init = vp9_init, .close = vp8_free, .decode = vp8_decode, - .capabilities = CODEC_CAP_AUTO_THREADS | CODEC_CAP_EXPERIMENTAL, + .capabilities = AV_CODEC_CAP_AUTO_THREADS, }; #endif /* CONFIG_LIBVPX_VP9_DECODER */