From 539c39fbe13a291e4ca7df8768e8cfea390bef2b Mon Sep 17 00:00:00 2001 From: He Junyan Date: Mon, 1 Apr 2019 12:56:28 +0800 Subject: [PATCH] libs: encoder: h264_fei: Use gst_param_spec_array for view-ids GValueArray is deprecated. Use GstValueArray instead. --- gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c | 60 +++++++++++++++++++-------- gst-libs/gst/vaapi/gstvaapifeienc_h264.c | 60 +++++++++++++++++++-------- gst-libs/gst/vaapi/gstvaapifeipak_h264.c | 58 +++++++++++++++++++------- 3 files changed, 128 insertions(+), 50 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c index f899b05..b4d41c6 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264_fei.c @@ -3414,6 +3414,46 @@ gst_vaapi_encoder_h264_fei_finalize (GstVaapiEncoder * base_encoder) } } +static void +set_view_ids (GstVaapiEncoderH264Fei * const encoder, const GValue * value) +{ + guint i, j; + guint len = gst_value_array_get_size (value); + + if (len == 0) + goto set_default_ids; + + if (len != encoder->num_views) { + GST_WARNING ("The view number is %d, but %d view IDs are provided. Just " + "fallback to use default view IDs.", encoder->num_views, len); + goto set_default_ids; + } + + for (i = 0; i < len; i++) { + const GValue *val = gst_value_array_get_value (value, i); + encoder->view_ids[i] = g_value_get_uint (val); + } + + /* check whether duplicated ID */ + for (i = 0; i < len; i++) { + for (j = i + 1; j < len; j++) { + if (encoder->view_ids[i] == encoder->view_ids[j]) { + GST_WARNING ("The view %d and view %d have same view ID %d. Just " + "fallback to use default view IDs.", i, j, encoder->view_ids[i]); + goto set_default_ids; + } + } + } + + return; + +set_default_ids: + { + for (i = 0; i < encoder->num_views; i++) + encoder->view_ids[i] = i; + } +} + static GstVaapiEncoderStatus gst_vaapi_encoder_h264_fei_set_property (GstVaapiEncoder * base_encoder, gint prop_id, const GValue * value) @@ -3448,23 +3488,9 @@ gst_vaapi_encoder_h264_fei_set_property (GstVaapiEncoder * base_encoder, case GST_VAAPI_ENCODER_H264_FEI_PROP_NUM_VIEWS: encoder->num_views = g_value_get_uint (value); break; - case GST_VAAPI_ENCODER_H264_FEI_PROP_VIEW_IDS:{ - guint i; - GValueArray *view_ids = g_value_get_boxed (value); - - if (view_ids == NULL) { - for (i = 0; i < encoder->num_views; i++) - encoder->view_ids[i] = i; - } else { - g_assert (view_ids->n_values <= encoder->num_views); - - for (i = 0; i < encoder->num_views; i++) { - GValue *val = g_value_array_get_nth (view_ids, i); - encoder->view_ids[i] = g_value_get_uint (val); - } - } + case GST_VAAPI_ENCODER_H264_FEI_PROP_VIEW_IDS: + set_view_ids (encoder, value); break; - } case GST_VAAPI_ENCODER_H264_PROP_FEI_DISABLE: encoder->is_fei_disabled = g_value_get_boolean (value); if (!encoder->is_fei_disabled) @@ -4108,7 +4134,7 @@ gst_vaapi_encoder_h264_fei_get_default_properties (void) */ GST_VAAPI_ENCODER_PROPERTIES_APPEND (props, GST_VAAPI_ENCODER_H264_FEI_PROP_VIEW_IDS, - g_param_spec_value_array ("view-ids", + gst_param_spec_array ("view-ids", "View IDs", "Set of View Ids used for MVC encoding", g_param_spec_uint ("view-id-value", "View id value", "view id values used for mvc encoding", 0, MAX_VIEW_ID, 0, diff --git a/gst-libs/gst/vaapi/gstvaapifeienc_h264.c b/gst-libs/gst/vaapi/gstvaapifeienc_h264.c index edbab13..df88215 100644 --- a/gst-libs/gst/vaapi/gstvaapifeienc_h264.c +++ b/gst-libs/gst/vaapi/gstvaapifeienc_h264.c @@ -1700,6 +1700,46 @@ gst_vaapi_feienc_h264_finalize (GstVaapiEncoder * base_encoder) } } +static void +set_view_ids (GstVaapiFeiEncH264 * const encoder, const GValue * value) +{ + guint i, j; + guint len = gst_value_array_get_size (value); + + if (len == 0) + goto set_default_ids; + + if (len != encoder->num_views) { + GST_WARNING ("The view number is %d, but %d view IDs are provided. Just " + "fallback to use default view IDs.", encoder->num_views, len); + goto set_default_ids; + } + + for (i = 0; i < len; i++) { + const GValue *val = gst_value_array_get_value (value, i); + encoder->view_ids[i] = g_value_get_uint (val); + } + + /* check whether duplicated ID */ + for (i = 0; i < len; i++) { + for (j = i + 1; j < len; j++) { + if (encoder->view_ids[i] == encoder->view_ids[j]) { + GST_WARNING ("The view %d and view %d have same view ID %d. Just " + "fallback to use default view IDs.", i, j, encoder->view_ids[i]); + goto set_default_ids; + } + } + } + + return; + +set_default_ids: + { + for (i = 0; i < encoder->num_views; i++) + encoder->view_ids[i] = i; + } +} + GstVaapiEncoderStatus gst_vaapi_feienc_h264_set_property (GstVaapiEncoder * base_encoder, gint prop_id, const GValue * value) @@ -1731,23 +1771,9 @@ gst_vaapi_feienc_h264_set_property (GstVaapiEncoder * base_encoder, case GST_VAAPI_FEI_H264_ENC_PROP_NUM_VIEWS: feienc->num_views = g_value_get_uint (value); break; - case GST_VAAPI_FEI_H264_ENC_PROP_VIEW_IDS:{ - guint i; - GValueArray *view_ids = g_value_get_boxed (value); - - if (view_ids == NULL) { - for (i = 0; i < feienc->num_views; i++) - feienc->view_ids[i] = i; - } else { - g_assert (view_ids->n_values <= feienc->num_views); - - for (i = 0; i < feienc->num_views; i++) { - GValue *val = g_value_array_get_nth (view_ids, i); - feienc->view_ids[i] = g_value_get_uint (val); - } - } + case GST_VAAPI_FEI_H264_ENC_PROP_VIEW_IDS: + set_view_ids (feienc, value); break; - } case GST_VAAPI_FEI_H264_ENC_PROP_NUM_REF: feienc->num_ref_frames = g_value_get_uint (value); break; @@ -2156,7 +2182,7 @@ gst_vaapi_feienc_h264_get_default_properties (void) */ GST_VAAPI_ENCODER_PROPERTIES_APPEND (props, GST_VAAPI_FEI_H264_ENC_PROP_VIEW_IDS, - g_param_spec_value_array ("view-ids", + gst_param_spec_array ("view-ids", "View IDs", "Set of View Ids used for MVC encoding", g_param_spec_uint ("view-id-value", "View id value", "view id values used for mvc encoding", 0, MAX_VIEW_ID, 0, diff --git a/gst-libs/gst/vaapi/gstvaapifeipak_h264.c b/gst-libs/gst/vaapi/gstvaapifeipak_h264.c index e58d69d..ceb821b 100644 --- a/gst-libs/gst/vaapi/gstvaapifeipak_h264.c +++ b/gst-libs/gst/vaapi/gstvaapifeipak_h264.c @@ -1799,6 +1799,46 @@ gst_vaapi_feipak_h264_finalize (GstVaapiFEIPakH264 * feipak) } +static void +set_view_ids (GstVaapiFEIPakH264 * feipak, const GValue * value) +{ + guint i, j; + guint len = gst_value_array_get_size (value); + + if (len == 0) + goto set_default_ids; + + if (len != feipak->num_views) { + GST_WARNING ("The view number is %d, but %d view IDs are provided. Just " + "fallback to use default view IDs.", feipak->num_views, len); + goto set_default_ids; + } + + for (i = 0; i < len; i++) { + const GValue *val = gst_value_array_get_value (value, i); + feipak->view_ids[i] = g_value_get_uint (val); + } + + /* check whether duplicated ID */ + for (i = 0; i < len; i++) { + for (j = i + 1; j < len; j++) { + if (feipak->view_ids[i] == feipak->view_ids[j]) { + GST_WARNING ("The view %d and view %d have same view ID %d. Just " + "fallback to use default view IDs.", i, j, feipak->view_ids[i]); + goto set_default_ids; + } + } + } + + return; + +set_default_ids: + { + for (i = 0; i < feipak->num_views; i++) + feipak->view_ids[i] = i; + } +} + GstVaapiEncoderStatus gst_vaapi_feipak_h264_set_property (GstVaapiFEIPakH264 * feipak, gint prop_id, const GValue * value) @@ -1811,23 +1851,9 @@ gst_vaapi_feipak_h264_set_property (GstVaapiFEIPakH264 * feipak, case GST_VAAPI_FEIPAK_H264_PROP_NUM_VIEWS: feipak->num_views = g_value_get_uint (value); break; - case GST_VAAPI_FEIPAK_H264_PROP_VIEW_IDS:{ - guint i; - GValueArray *view_ids = g_value_get_boxed (value); - - if (view_ids == NULL) { - for (i = 0; i < feipak->num_views; i++) - feipak->view_ids[i] = i; - } else { - g_assert (view_ids->n_values <= feipak->num_views); - - for (i = 0; i < feipak->num_views; i++) { - GValue *val = g_value_array_get_nth (view_ids, i); - feipak->view_ids[i] = g_value_get_uint (val); - } - } + case GST_VAAPI_FEIPAK_H264_PROP_VIEW_IDS: + set_view_ids (feipak, value); break; - } default: return GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_PARAMETER; } -- 2.7.4