mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
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:
parent
91da1c3c08
commit
d9a0313aa0
1 changed files with 23 additions and 2 deletions
|
@ -312,10 +312,11 @@ gst_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value,
|
|||
}
|
||||
|
||||
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)
|
||||
{
|
||||
vpx_color_space_t colorspace = VPX_CS_UNKNOWN;
|
||||
GstVideoColorimetry cinfo = *in_cinfo;
|
||||
gchar *colorimetry_str;
|
||||
guint i;
|
||||
|
||||
|
@ -331,7 +332,9 @@ gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
|
|||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
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
|
||||
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));
|
||||
}
|
||||
|
||||
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 =
|
||||
vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_COLUMNS,
|
||||
vp9enc->tile_columns);
|
||||
|
|
Loading…
Reference in a new issue