[vlc-devel] [PATCH] codec: aom: Handle extended color spaces
Alex Converse
alex.converse at gmail.com
Fri Dec 16 01:08:21 CET 2016
From: Jim Bankoski <jimbankoski at google.com>
Support 10/12-bit, full/partial color range and BT.601/709/2020.
Signed-off-by: Alex Converse <alex.converse at gmail.com>
---
modules/codec/aom.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 1 deletion(-)
diff --git a/modules/codec/aom.c b/modules/codec/aom.c
index e080f74..fb818f1 100644
--- a/modules/codec/aom.c
+++ b/modules/codec/aom.c
@@ -74,6 +74,61 @@ struct decoder_sys_t
aom_codec_ctx_t ctx;
};
+static const struct
+{
+ vlc_fourcc_t i_chroma;
+ enum aom_img_fmt i_chroma_id;
+ uint8_t i_bitdepth;
+ uint8_t i_needs_hack;
+
+} chroma_table[] =
+{
+ { VLC_CODEC_I420, AOM_IMG_FMT_I420, 8, 0 },
+ { VLC_CODEC_I422, AOM_IMG_FMT_I422, 8, 0 },
+ { VLC_CODEC_I444, AOM_IMG_FMT_I444, 8, 0 },
+ { VLC_CODEC_I440, AOM_IMG_FMT_I440, 8, 0 },
+
+ { VLC_CODEC_YV12, AOM_IMG_FMT_YV12, 8, 0 },
+ { VLC_CODEC_YUVA, AOM_IMG_FMT_444A, 8, 0 },
+ { VLC_CODEC_YUYV, AOM_IMG_FMT_YUY2, 8, 0 },
+ { VLC_CODEC_UYVY, AOM_IMG_FMT_UYVY, 8, 0 },
+ { VLC_CODEC_YVYU, AOM_IMG_FMT_YVYU, 8, 0 },
+
+ { VLC_CODEC_RGB15, AOM_IMG_FMT_RGB555, 8, 0 },
+ { VLC_CODEC_RGB16, AOM_IMG_FMT_RGB565, 8, 0 },
+ { VLC_CODEC_RGB24, AOM_IMG_FMT_RGB24, 8, 0 },
+ { VLC_CODEC_RGB32, AOM_IMG_FMT_RGB32, 8, 0 },
+
+ { VLC_CODEC_ARGB, AOM_IMG_FMT_ARGB, 8, 0 },
+ { VLC_CODEC_BGRA, AOM_IMG_FMT_ARGB_LE, 8, 0 },
+
+ { VLC_CODEC_GBR_PLANAR, AOM_IMG_FMT_I444, 8, 1 },
+ { VLC_CODEC_GBR_PLANAR_10L, AOM_IMG_FMT_I44416, 10, 1 },
+
+ { VLC_CODEC_I420_10L, AOM_IMG_FMT_I42016, 10, 0 },
+ { VLC_CODEC_I422_10L, AOM_IMG_FMT_I42216, 10, 0 },
+ { VLC_CODEC_I444_10L, AOM_IMG_FMT_I44416, 10, 0 },
+
+ { VLC_CODEC_I420_12L, AOM_IMG_FMT_I42016, 12, 0 },
+ { VLC_CODEC_I422_12L, AOM_IMG_FMT_I42216, 12, 0 },
+ { VLC_CODEC_I444_12L, AOM_IMG_FMT_I44416, 12, 0 },
+
+ { VLC_CODEC_I444_16L, AOM_IMG_FMT_I44416, 16, 0 },
+};
+
+static vlc_fourcc_t FindVlcChroma( struct aom_image *img )
+{
+ uint8_t hack = (img->fmt & AOM_IMG_FMT_I444) && (img->cs == AOM_CS_SRGB);
+
+ for( unsigned int i = 0; i < ARRAY_SIZE(chroma_table); i++ )
+ if( chroma_table[i].i_chroma_id == img->fmt &&
+ chroma_table[i].i_bitdepth == img->bit_depth &&
+ chroma_table[i].i_needs_hack == hack )
+ return chroma_table[i].i_chroma;
+
+ return 0;
+}
+
/****************************************************************************
* Decode: the whole thing
****************************************************************************/
@@ -124,7 +179,8 @@ static picture_t *Decode(decoder_t *dec, block_t **pp_block)
mtime_t pts = *pkt_pts;
free(pkt_pts);
- if (img->fmt != AOM_IMG_FMT_I420) {
+ dec->fmt_out.i_codec = FindVlcChroma(img);
+ if (dec->fmt_out.i_codec == 0) {
msg_Err(dec, "Unsupported output colorspace %d", img->fmt);
return NULL;
}
@@ -142,6 +198,26 @@ static picture_t *Decode(decoder_t *dec, block_t **pp_block)
dec->fmt_out.video.i_sar_den = 1;
}
+ v->b_color_range_full = img->range == AOM_CR_FULL_RANGE;
+
+ switch( img->cs )
+ {
+ case AOM_CS_SRGB:
+ case AOM_CS_BT_709:
+ v->space = COLOR_SPACE_BT709;
+ break;
+ case AOM_CS_BT_601:
+ case AOM_CS_SMPTE_170:
+ case AOM_CS_SMPTE_240:
+ v->space = COLOR_SPACE_BT601;
+ break;
+ case AOM_CS_BT_2020:
+ v->space = COLOR_SPACE_BT2020;
+ break;
+ default:
+ break;
+ }
+
if (decoder_UpdateVideoFormat(dec))
return NULL;
picture_t *pic = decoder_NewPicture(dec);
--
2.8.0.rc3.226.g39d4020
More information about the vlc-devel
mailing list