Seems you didn't see another post above....

I tested this patch with videos encoded by aomenc, and found that for
10/12-bit av1 videos this patch decodes incorrectly. I found that
ff_aom_imgfmt_to_pixfmt might not work as supposed for high bit depth. Like
libvpx, avctx->pix_fmt should be set by both img->fmt and img->bit_depth.
Also it seems that AV_PIX_FMT_YUV4XXP10/12/16 should use LE instead of BE.
So after I change ff_aom_imgfmt_to_pixfmt to the following one:

+enum AVPixelFormat ff_aom_imgfmt_to_pixfmt(aom_img_fmt_t img, unsigned int
bit_depth)
+{
+    switch (img) {
+    case AOM_IMG_FMT_RGB24:     return AV_PIX_FMT_RGB24;
+    case AOM_IMG_FMT_RGB565:    return AV_PIX_FMT_RGB565BE;
+    case AOM_IMG_FMT_RGB555:    return AV_PIX_FMT_RGB555BE;
+    case AOM_IMG_FMT_UYVY:      return AV_PIX_FMT_UYVY422;
+    case AOM_IMG_FMT_YUY2:      return AV_PIX_FMT_YUYV422;
+    case AOM_IMG_FMT_YVYU:      return AV_PIX_FMT_YVYU422;
+    case AOM_IMG_FMT_BGR24:     return AV_PIX_FMT_BGR24;
+    case AOM_IMG_FMT_ARGB:      return AV_PIX_FMT_ARGB;
+    case AOM_IMG_FMT_ARGB_LE:   return AV_PIX_FMT_BGRA;
+    case AOM_IMG_FMT_RGB565_LE: return AV_PIX_FMT_RGB565LE;
+    case AOM_IMG_FMT_RGB555_LE: return AV_PIX_FMT_RGB555LE;
+    case AOM_IMG_FMT_I420:      return AV_PIX_FMT_YUV420P;
+    case AOM_IMG_FMT_I422:      return AV_PIX_FMT_YUV422P;
+    case AOM_IMG_FMT_I444:      return AV_PIX_FMT_YUV444P;
+    case AOM_IMG_FMT_444A:      return AV_PIX_FMT_YUVA444P;
+#if AOM_IMAGE_ABI_VERSION >= 3
+    case AOM_IMG_FMT_I440:      return AV_PIX_FMT_YUV440P;
+    case AOM_IMG_FMT_I42016:
+        switch (bit_depth) {
+            case 10: return AV_PIX_FMT_YUV420P10;
+            case 12: return AV_PIX_FMT_YUV420P12;
+        }
+    case AOM_IMG_FMT_I42216:
+        switch (bit_depth) {
+            case 10: return AV_PIX_FMT_YUV422P10;
+            case 12: return AV_PIX_FMT_YUV422P12;
+        }
+    case AOM_IMG_FMT_I44416:
+        switch (bit_depth) {
+            case 10: return AV_PIX_FMT_YUV444P10;
+            case 12: return AV_PIX_FMT_YUV444P12;
+        }
+#endif
+    default:                    return AV_PIX_FMT_NONE;
+    }
+}

and use
+        avctx->pix_fmt = ff_aom_imgfmt_to_pixfmt(img->fmt, img->bit_depth);
in libaomdec, the decoding result is identical to aomdec.

If it is correct to do this, ff_aom_pixfmt_to_imgfmt might also need to be
re-defined. While libaom can be built with or without high bit depth
support (--enable/disable-aom-highbitdepth), it does not expose a macro
like AOM_IMG_FMT_HIGHBITDEPTH. It only defines CONFIG_AOM_HIGHBITDEPTH in
aom_config.h which is used for building aom reference tools only. I'm not
sure if we should add further check on the pixel format conversion above.

Lucien
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to