vp9enc: Add color range support

When setting the colorspace, we now clear the range to reduced range,
the default, and then we also set the range so the VP9 encoder encodes
the right information in the bitstream.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/975>
This commit is contained in:
Nicolas Dufresne 2021-05-06 15:04:42 -04:00
parent 91da1c3c08
commit d9a0313aa0

View file

@ -312,10 +312,11 @@ gst_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value,
} }
static vpx_color_space_t static vpx_color_space_t
gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo, gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * in_cinfo,
GstVideoFormat format) GstVideoFormat format)
{ {
vpx_color_space_t colorspace = VPX_CS_UNKNOWN; vpx_color_space_t colorspace = VPX_CS_UNKNOWN;
GstVideoColorimetry cinfo = *in_cinfo;
gchar *colorimetry_str; gchar *colorimetry_str;
guint i; guint i;
@ -331,7 +332,9 @@ gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
GST_VIDEO_COLORIMETRY_BT2020, VPX_CS_BT_2020} GST_VIDEO_COLORIMETRY_BT2020, VPX_CS_BT_2020}
}; };
colorimetry_str = gst_video_colorimetry_to_string (cinfo); /* We support any range, all mapped CSC are by default reduced range. */
cinfo.range = GST_VIDEO_COLOR_RANGE_16_235;
colorimetry_str = gst_video_colorimetry_to_string (&cinfo);
if (colorimetry_str != NULL) { if (colorimetry_str != NULL) {
for (i = 0; i < G_N_ELEMENTS (colorimetry_map); ++i) { for (i = 0; i < G_N_ELEMENTS (colorimetry_map); ++i) {
@ -365,6 +368,17 @@ gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
return colorspace; return colorspace;
} }
static gint
gst_vp9_get_vpx_color_range (GstVideoColorimetry * colorimetry)
{
if (colorimetry->range == GST_VIDEO_COLOR_RANGE_0_255)
/* Full range (0..255 or HBD equivalent) */
return 1;
/* Limited range (16..235 or HBD equivalent) */
return 0;
}
static gboolean static gboolean
gst_vp9_enc_configure_encoder (GstVPXEnc * encoder, GstVideoCodecState * state) gst_vp9_enc_configure_encoder (GstVPXEnc * encoder, GstVideoCodecState * state)
{ {
@ -380,6 +394,13 @@ gst_vp9_enc_configure_encoder (GstVPXEnc * encoder, GstVideoCodecState * state)
"Failed to set VP9E_SET_COLOR_SPACE: %s", gst_vpx_error_name (status)); "Failed to set VP9E_SET_COLOR_SPACE: %s", gst_vpx_error_name (status));
} }
status = vpx_codec_control (&encoder->encoder, VP9E_SET_COLOR_RANGE,
gst_vp9_get_vpx_color_range (&GST_VIDEO_INFO_COLORIMETRY (info)));
if (status != VPX_CODEC_OK) {
GST_WARNING_OBJECT (encoder,
"Failed to set VP9E_SET_COLOR_RANGE: %s", gst_vpx_error_name (status));
}
status = status =
vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_COLUMNS, vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_COLUMNS,
vp9enc->tile_columns); vp9enc->tile_columns);