As discussed in the ml, the high bitdept support in vpx allows to
specify the number of bits used.

Reported-by: Harfe Leier <astrat...@gmail.com>
---

 libavcodec/libvpx.c    | 28 +++++++++++++++++++++++-----
 libavcodec/libvpx.h    |  2 +-
 libavcodec/libvpxdec.c |  2 +-
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/libavcodec/libvpx.c b/libavcodec/libvpx.c
index 49f966d..c65f80d 100644
--- a/libavcodec/libvpx.c
+++ b/libavcodec/libvpx.c
@@ -22,9 +22,9 @@

 #include "libvpx.h"

-enum AVPixelFormat ff_vpx_imgfmt_to_pixfmt(vpx_img_fmt_t img)
+enum AVPixelFormat ff_vpx_image_to_pixfmt(vpx_image_t *img)
 {
-    switch (img) {
+    switch (img->fmt) {
     case VPX_IMG_FMT_RGB24:     return AV_PIX_FMT_RGB24;
     case VPX_IMG_FMT_RGB565:    return AV_PIX_FMT_RGB565BE;
     case VPX_IMG_FMT_RGB555:    return AV_PIX_FMT_RGB555BE;
@@ -42,9 +42,27 @@ enum AVPixelFormat ff_vpx_imgfmt_to_pixfmt(vpx_img_fmt_t img)
     case VPX_IMG_FMT_444A:      return AV_PIX_FMT_YUVA444P;
 #if VPX_IMAGE_ABI_VERSION >= 3
     case VPX_IMG_FMT_I440:      return AV_PIX_FMT_YUV440P;
-    case VPX_IMG_FMT_I42016:    return AV_PIX_FMT_YUV420P16BE;
-    case VPX_IMG_FMT_I42216:    return AV_PIX_FMT_YUV422P16BE;
-    case VPX_IMG_FMT_I44416:    return AV_PIX_FMT_YUV444P16BE;
+    case VPX_IMG_FMT_I42016:
+        switch (img->bit_depth) {
+        case  9: return AV_PIX_FMT_YUV420P9;
+        case 10: return AV_PIX_FMT_YUV420P10;
+        case 16: return AV_PIX_FMT_YUV420P16BE;
+        default: return AV_PIX_FMT_NONE;
+        }
+    case VPX_IMG_FMT_I42216:
+        switch (img->bit_depth) {
+        case  9: return AV_PIX_FMT_YUV422P9;
+        case 10: return AV_PIX_FMT_YUV422P10;
+        case 16: return AV_PIX_FMT_YUV422P16BE;
+        default: return AV_PIX_FMT_NONE;
+        }
+    case VPX_IMG_FMT_I44416:
+        switch (img->bit_depth) {
+        case  9: return AV_PIX_FMT_YUV444P9;
+        case 10: return AV_PIX_FMT_YUV444P10;
+        case 16: return AV_PIX_FMT_YUV444P16BE;
+        default: return AV_PIX_FMT_NONE;
+        }
 #endif
     default:                    return AV_PIX_FMT_NONE;
     }
diff --git a/libavcodec/libvpx.h b/libavcodec/libvpx.h
index b437f37..2b58ed4 100644
--- a/libavcodec/libvpx.h
+++ b/libavcodec/libvpx.h
@@ -25,7 +25,7 @@

 #include "avcodec.h"

-enum AVPixelFormat ff_vpx_imgfmt_to_pixfmt(vpx_img_fmt_t img);
+enum AVPixelFormat ff_vpx_image_to_pixfmt(vpx_image_t *img);
 vpx_img_fmt_t ff_vpx_pixfmt_to_imgfmt(enum AVPixelFormat pix);

 #endif /* AVCODEC_LIBVPX_H */
diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c
index 6d3b29f..214e1c5 100644
--- a/libavcodec/libvpxdec.c
+++ b/libavcodec/libvpxdec.c
@@ -81,7 +81,7 @@ static int vp8_decode(AVCodecContext *avctx,
     }

     if ((img = vpx_codec_get_frame(&ctx->decoder, &iter))) {
-        avctx->pix_fmt = ff_vpx_imgfmt_to_pixfmt(img->fmt);
+        avctx->pix_fmt = ff_vpx_image_to_pixfmt(img);
         if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
             av_log(avctx, AV_LOG_ERROR, "Unsupported output colorspace (%d)\n",
                    img->fmt);
--
2.9.2

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to