summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2021-05-06 14:51:31 -0400
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2021-05-06 16:00:47 -0400
commit91da1c3c08883a4b873b0a8704181ba1a3d0b113 (patch)
treef9bf4a72736b3655fdfe3a43d668d44100ec8c49
parent3e9723684416eb623d30168b0b902bf04bdf90b3 (diff)
downloadgstreamer-plugins-good-91da1c3c08883a4b873b0a8704181ba1a3d0b113.tar.gz
vp9enc: Move colorspace configuration in VP9 enc
This is not supported by VP8 and was causing a warning. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/975>
-rw-r--r--ext/vpx/gstvp9enc.c66
-rw-r--r--ext/vpx/gstvpxenc.c61
2 files changed, 65 insertions, 62 deletions
diff --git a/ext/vpx/gstvp9enc.c b/ext/vpx/gstvp9enc.c
index e7522f5ac..fca6e1168 100644
--- a/ext/vpx/gstvp9enc.c
+++ b/ext/vpx/gstvp9enc.c
@@ -119,7 +119,8 @@ static void gst_vp9_enc_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_vp9_enc_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static gboolean gst_vp9_enc_configure_encoder (GstVPXEnc * encoder);
+static gboolean gst_vp9_enc_configure_encoder (GstVPXEnc * encoder,
+ GstVideoCodecState * state);
#define DEFAULT_BITS_PER_PIXEL 0.0289
@@ -310,12 +311,75 @@ gst_vp9_enc_get_property (GObject * object, guint prop_id, GValue * value,
g_mutex_unlock (&gst_vpx_enc->encoder_lock);
}
+static vpx_color_space_t
+gst_vp9_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
+ GstVideoFormat format)
+{
+ vpx_color_space_t colorspace = VPX_CS_UNKNOWN;
+ gchar *colorimetry_str;
+ guint i;
+
+ static const struct
+ {
+ const gchar *str;
+ vpx_color_space_t vpx_color_space;
+ } colorimetry_map[] = {
+ {
+ GST_VIDEO_COLORIMETRY_BT601, VPX_CS_BT_601}, {
+ GST_VIDEO_COLORIMETRY_BT709, VPX_CS_BT_709}, {
+ GST_VIDEO_COLORIMETRY_SMPTE240M, VPX_CS_SMPTE_240}, {
+ GST_VIDEO_COLORIMETRY_BT2020, VPX_CS_BT_2020}
+ };
+
+ colorimetry_str = gst_video_colorimetry_to_string (cinfo);
+
+ if (colorimetry_str != NULL) {
+ for (i = 0; i < G_N_ELEMENTS (colorimetry_map); ++i) {
+ if (g_strcmp0 (colorimetry_map[i].str, colorimetry_str) == 0) {
+ colorspace = colorimetry_map[i].vpx_color_space;
+ break;
+ }
+ }
+ }
+
+ if (colorspace == VPX_CS_UNKNOWN) {
+ if (format == GST_VIDEO_FORMAT_GBR
+ || format == GST_VIDEO_FORMAT_GBR_10BE
+ || format == GST_VIDEO_FORMAT_GBR_10LE
+ || format == GST_VIDEO_FORMAT_GBR_12BE
+ || format == GST_VIDEO_FORMAT_GBR_12LE) {
+ /* Currently has no effect because vp*enc elements only accept YUV video
+ * formats.
+ *
+ * FIXME: Support encoding GST_VIDEO_FORMAT_GBR and its high bits variants.
+ */
+ colorspace = VPX_CS_SRGB;
+ } else {
+ GST_WARNING_OBJECT (encoder, "Unsupported colorspace \"%s\"",
+ GST_STR_NULL (colorimetry_str));
+ }
+ }
+
+ g_free (colorimetry_str);
+
+ return colorspace;
+}
+
static gboolean
gst_vp9_enc_configure_encoder (GstVPXEnc * encoder, GstVideoCodecState * state)
{
GstVP9Enc *vp9enc = GST_VP9_ENC (encoder);
+ GstVideoInfo *info = &state->info;
vpx_codec_err_t status;
+ status = vpx_codec_control (&encoder->encoder, VP9E_SET_COLOR_SPACE,
+ gst_vp9_get_vpx_colorspace (encoder, &GST_VIDEO_INFO_COLORIMETRY (info),
+ GST_VIDEO_INFO_FORMAT (info)));
+ if (status != VPX_CODEC_OK) {
+ GST_WARNING_OBJECT (encoder,
+ "Failed to set VP9E_SET_COLOR_SPACE: %s", gst_vpx_error_name (status));
+ }
+
status =
vpx_codec_control (&encoder->encoder, VP9E_SET_TILE_COLUMNS,
vp9enc->tile_columns);
diff --git a/ext/vpx/gstvpxenc.c b/ext/vpx/gstvpxenc.c
index b817ba40a..0fe0f7a98 100644
--- a/ext/vpx/gstvpxenc.c
+++ b/ext/vpx/gstvpxenc.c
@@ -1710,60 +1710,6 @@ gst_vpx_enc_get_downstream_profile (GstVPXEnc * encoder, GstVideoInfo * info)
return profile;
}
-static vpx_color_space_t
-gst_vpx_get_vpx_colorspace (GstVPXEnc * encoder, GstVideoColorimetry * cinfo,
- GstVideoFormat format)
-{
- vpx_color_space_t colorspace = VPX_CS_UNKNOWN;
- gchar *colorimetry_str;
- guint i;
-
- static const struct
- {
- const gchar *str;
- vpx_color_space_t vpx_color_space;
- } colorimetry_map[] = {
- {
- GST_VIDEO_COLORIMETRY_BT601, VPX_CS_BT_601}, {
- GST_VIDEO_COLORIMETRY_BT709, VPX_CS_BT_709}, {
- GST_VIDEO_COLORIMETRY_SMPTE240M, VPX_CS_SMPTE_240}, {
- GST_VIDEO_COLORIMETRY_BT2020, VPX_CS_BT_2020}
- };
-
- colorimetry_str = gst_video_colorimetry_to_string (cinfo);
-
- if (colorimetry_str != NULL) {
- for (i = 0; i < G_N_ELEMENTS (colorimetry_map); ++i) {
- if (g_strcmp0 (colorimetry_map[i].str, colorimetry_str) == 0) {
- colorspace = colorimetry_map[i].vpx_color_space;
- break;
- }
- }
- }
-
- if (colorspace == VPX_CS_UNKNOWN) {
- if (format == GST_VIDEO_FORMAT_GBR
- || format == GST_VIDEO_FORMAT_GBR_10BE
- || format == GST_VIDEO_FORMAT_GBR_10LE
- || format == GST_VIDEO_FORMAT_GBR_12BE
- || format == GST_VIDEO_FORMAT_GBR_12LE) {
- /* Currently has no effect because vp*enc elements only accept YUV video
- * formats.
- *
- * FIXME: Support encoding GST_VIDEO_FORMAT_GBR and its high bits variants.
- */
- colorspace = VPX_CS_SRGB;
- } else {
- GST_WARNING_OBJECT (encoder, "Unsupported colorspace \"%s\"",
- GST_STR_NULL (colorimetry_str));
- }
- }
-
- g_free (colorimetry_str);
-
- return colorspace;
-}
-
static gboolean
gst_vpx_enc_set_format (GstVideoEncoder * video_encoder,
GstVideoCodecState * state)
@@ -1968,13 +1914,6 @@ gst_vpx_enc_set_format (GstVideoEncoder * video_encoder,
"Failed to set VP8E_SET_MAX_INTRA_BITRATE_PCT: %s",
gst_vpx_error_name (status));
}
- status = vpx_codec_control (&encoder->encoder, VP9E_SET_COLOR_SPACE,
- gst_vpx_get_vpx_colorspace (encoder, &GST_VIDEO_INFO_COLORIMETRY (info),
- GST_VIDEO_INFO_FORMAT (info)));
- if (status != VPX_CODEC_OK) {
- GST_WARNING_OBJECT (encoder,
- "Failed to set VP9E_SET_COLOR_SPACE: %s", gst_vpx_error_name (status));
- }
if (vpx_enc_class->configure_encoder
&& !vpx_enc_class->configure_encoder (encoder, state)) {