]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/libaomdec.c
avcodec/videotoolbox: fix decoding of some HEVC videos
[ffmpeg] / libavcodec / libaomdec.c
index 05e476c342448aa6790b729f293e6cabba0afad5..6a2de6d47a760431982e02818454c302de22d502 100644 (file)
@@ -61,9 +61,10 @@ static av_cold int aom_init(AVCodecContext *avctx,
 
 static void image_copy_16_to_8(AVFrame *pic, struct aom_image *img)
 {
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pic->format);
     int i;
 
-    for (i = 0; i < 3; i++) {
+    for (i = 0; i < desc->nb_components; i++) {
         int w = img->d_w;
         int h = img->d_h;
         int x, y;
@@ -85,47 +86,36 @@ static void image_copy_16_to_8(AVFrame *pic, struct aom_image *img)
 // returns 0 on success, AVERROR_INVALIDDATA otherwise
 static int set_pix_fmt(AVCodecContext *avctx, struct aom_image *img)
 {
-    static const enum AVColorSpace colorspaces[10] = {
-        AVCOL_SPC_UNSPECIFIED, AVCOL_SPC_BT470BG, AVCOL_SPC_BT709, AVCOL_SPC_SMPTE170M,
-        AVCOL_SPC_SMPTE240M, AVCOL_SPC_BT2020_NCL, AVCOL_SPC_BT2020_CL, AVCOL_SPC_RGB,
-        AVCOL_SPC_ICTCP, AVCOL_SPC_RESERVED
-    };
     static const enum AVColorRange color_ranges[] = {
         AVCOL_RANGE_MPEG, AVCOL_RANGE_JPEG
     };
     avctx->color_range = color_ranges[img->range];
-    avctx->colorspace = colorspaces[img->cs];
+    avctx->color_primaries = img->cp;
+    avctx->colorspace  = img->mc;
+    avctx->color_trc   = img->tc;
 
     switch (img->fmt) {
     case AOM_IMG_FMT_I420:
-        avctx->pix_fmt = AV_PIX_FMT_YUV420P;
-        avctx->profile = FF_PROFILE_AV1_MAIN;
-        return 0;
-    case AOM_IMG_FMT_I422:
-        avctx->pix_fmt = AV_PIX_FMT_YUV422P;
-        avctx->profile = FF_PROFILE_AV1_PROFESSIONAL;
-        return 0;
-    case AOM_IMG_FMT_I444:
-        avctx->pix_fmt = avctx->colorspace == AVCOL_SPC_RGB ?
-                         AV_PIX_FMT_GBRP : AV_PIX_FMT_YUV444P;
-        avctx->profile = FF_PROFILE_AV1_HIGH;
-        return 0;
     case AOM_IMG_FMT_I42016:
         if (img->bit_depth == 8) {
-            avctx->pix_fmt = AV_PIX_FMT_YUV420P;
+            avctx->pix_fmt = img->monochrome ?
+                             AV_PIX_FMT_GRAY8 : AV_PIX_FMT_YUV420P;
             avctx->profile = FF_PROFILE_AV1_MAIN;
             return 0;
         } else if (img->bit_depth == 10) {
-            avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
+            avctx->pix_fmt = img->monochrome ?
+                             AV_PIX_FMT_GRAY10 : AV_PIX_FMT_YUV420P10;
             avctx->profile = FF_PROFILE_AV1_MAIN;
             return 0;
         } else if (img->bit_depth == 12) {
-            avctx->pix_fmt = AV_PIX_FMT_YUV420P12;
+            avctx->pix_fmt = img->monochrome ?
+                             AV_PIX_FMT_GRAY12 : AV_PIX_FMT_YUV420P12;
             avctx->profile = FF_PROFILE_AV1_PROFESSIONAL;
             return 0;
         } else {
             return AVERROR_INVALIDDATA;
         }
+    case AOM_IMG_FMT_I422:
     case AOM_IMG_FMT_I42216:
         if (img->bit_depth == 8) {
             avctx->pix_fmt = AV_PIX_FMT_YUV422P;
@@ -142,20 +132,18 @@ static int set_pix_fmt(AVCodecContext *avctx, struct aom_image *img)
         } else {
             return AVERROR_INVALIDDATA;
         }
+    case AOM_IMG_FMT_I444:
     case AOM_IMG_FMT_I44416:
         if (img->bit_depth == 8) {
-            avctx->pix_fmt = avctx->colorspace == AVCOL_SPC_RGB ?
-                             AV_PIX_FMT_GBRP : AV_PIX_FMT_YUV444P;
+            avctx->pix_fmt = AV_PIX_FMT_YUV444P;
             avctx->profile = FF_PROFILE_AV1_HIGH;
             return 0;
         } else if (img->bit_depth == 10) {
-            avctx->pix_fmt = avctx->colorspace == AVCOL_SPC_RGB ?
-                             AV_PIX_FMT_GBRP10 : AV_PIX_FMT_YUV444P10;
+            avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
             avctx->profile = FF_PROFILE_AV1_HIGH;
             return 0;
         } else if (img->bit_depth == 12) {
-            avctx->pix_fmt = avctx->colorspace == AVCOL_SPC_RGB ?
-                             AV_PIX_FMT_GBRP12 : AV_PIX_FMT_YUV444P12;
+            avctx->pix_fmt = AV_PIX_FMT_YUV444P12;
             avctx->profile = FF_PROFILE_AV1_PROFESSIONAL;
             return 0;
         } else {