#define INI_ITEM_VIDEO_ENCODED_FMT_SUPPORT "video encoded format support" /* source element supports encoded format */
#define INI_ITEM_VIDEO_CODECS "video codecs"
#define INI_ITEM_VIDEO_HW_ENCODER_ELEMENT "video hw encoder element"
+#define INI_ITEM_VIDEO_HW_ENCODER_CAPS_EXT "video hw encoder caps ext"
#define INI_ITEM_AUDIO_RAW_FORMAT "audio raw format"
#define INI_ITEM_AUDIO_SAMPLERATE "audio samplerate"
#define INI_ITEM_AUDIO_CHANNELS "audio channels"
__dump_item(INI_ITEM_VIDEO_ENCODED_FMT_SUPPORT, INI_ITEM_TYPE_BOOL, &source->v_encoded_fmt_support);
__dump_item(INI_ITEM_VIDEO_CODECS, INI_ITEM_TYPE_STRINGS, (void *)source->v_codecs);
__dump_item(INI_ITEM_VIDEO_HW_ENCODER_ELEMENT, INI_ITEM_TYPE_STRING, (void *)source->v_hw_encoder_element);
+ __dump_item(INI_ITEM_VIDEO_HW_ENCODER_CAPS_EXT, INI_ITEM_TYPE_STRINGS, (void *)source->v_hw_encoder_caps_ext);
__dump_item(INI_ITEM_AUDIO_RAW_FORMAT, INI_ITEM_TYPE_STRING, (void *)source->a_raw_format);
__dump_item(INI_ITEM_AUDIO_SAMPLERATE, INI_ITEM_TYPE_INT, &source->a_samplerate);
__dump_item(INI_ITEM_AUDIO_CHANNELS, INI_ITEM_TYPE_INT, &source->a_channels);
source->source_element_properties = NULL;
}
+ if (source->v_hw_encoder_caps_ext) {
+ g_strfreev(source->v_hw_encoder_caps_ext);
+ source->v_hw_encoder_caps_ext = NULL;
+ }
+
g_free(source);
}
if (!is_default) {
source->source_element = __ini_get_string(ini->dict, category, INI_ITEM_SOURCE_ELEMENT, NULL);
__ini_read_list(ini->dict, category, INI_ITEM_SOURCE_ELEMENT_PROPERTIES, &source->source_element_properties, NULL);
+ __ini_read_list(ini->dict, category, INI_ITEM_VIDEO_HW_ENCODER_CAPS_EXT, &source->v_hw_encoder_caps_ext, NULL);
}
source->v_raw_format = __ini_get_string(ini->dict, category, INI_ITEM_VIDEO_RAW_FORMAT,
else
return ini_source->v_codecs;
}
+
+//LCOV_EXCL_START
+GStrv _get_v_hw_encoder_caps_ext_fields_from_ini(webrtc_ini_s *ini, int src_type)
+{
+ const ini_item_media_source_s *ini_source;
+
+ RET_VAL_IF(ini == NULL, NULL, "ini is NULL");
+
+ if (!(ini_source = _ini_get_source_by_type(ini, src_type)))
+ return NULL;
+
+ return ini_source->v_hw_encoder_caps_ext;
+}
+//LCOV_EXCL_STOP
+
void _unload_ini(webrtc_s *webrtc)
{
RET_IF(webrtc == NULL, "webrtc is NULL");
_media_type = _get_video_media_type(source->av[AV_IDX_VIDEO].codec);
RET_VAL_IF(_media_type == NULL, NULL, "_media_type is NULL");
caps = _get_caps_from_encoded_video_media_type(_media_type, source->video_info.width, source->video_info.height);
+ if (source->zerocopy_enabled)
+ caps = _gst_set_caps_additional_fields(caps, _get_v_hw_encoder_caps_ext_fields_from_ini(ini, source->type));
break;
case WEBRTC_MEDIA_SOURCE_TYPE_AUDIOTEST:
if (media_type)
*media_type = g_strdup(_media_type);
+ PRINT_CAPS(caps, "default encoded");
+
return caps;
}
GstElement *encoder = NULL;
GstElement *payloader;
GstElement *queue;
- GstElement *capsfilter2;
+ GstElement *encoder_capsfilter = NULL;
+ GstElement *rtp_capsfilter;
GstElement *videocrop;
GstCaps *sink_caps;
element_info_s elem_info;
int idx;
GstPad *pad_for_render = NULL;
GstCaps *caps_for_render = NULL;
+ GstCaps *caps_for_encoder = NULL;
RET_VAL_IF(webrtc == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "webrtc is NULL");
RET_VAL_IF(source == NULL, WEBRTC_ERROR_INVALID_PARAMETER, "source is NULL");
if (!(encoder = __prepare_encoder(webrtc, source, is_audio)))
goto error;
-
APPEND_ELEMENT(*element_list, encoder);
_set_need_decoding_for_loopback(source, idx, false);
+
+ if (!(encoder_capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_ENCODER_CAPSFILTER)))
+ goto error;
+ APPEND_ELEMENT(*element_list, encoder_capsfilter);
+
skip_encoder:
+ caps_for_encoder = __make_default_encoded_caps(source, &webrtc->ini, &media_type);
+ if (encoder_capsfilter)
+ g_object_set(G_OBJECT(encoder_capsfilter), "caps", caps_for_encoder, NULL);
+
CREATE_ELEMENT_FROM_REGISTRY(elem_info, GST_KLASS_NAME_PAYLOADER_RTP,
- __make_default_encoded_caps(source, &webrtc->ini, &media_type),
+ caps_for_encoder,
NULL,
NULL,
payloader);
goto error;
APPEND_ELEMENT(*element_list, queue);
- if (!(capsfilter2 = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_RTP_CAPSFILTER)))
+ if (!(rtp_capsfilter = _create_element(DEFAULT_ELEMENT_CAPSFILTER, ELEMENT_NAME_RTP_CAPSFILTER)))
goto error;
- APPEND_ELEMENT(*element_list, capsfilter2);
+ APPEND_ELEMENT(*element_list, rtp_capsfilter);
if (_set_payload_type(webrtc, source, idx, media_type) != WEBRTC_ERROR_NONE)
goto error;
if ((sink_caps = _make_rtp_caps(media_type, source->av[idx].pt, source, encoder))) {
- g_object_set(G_OBJECT(capsfilter2), "caps", sink_caps, NULL);
+ g_object_set(G_OBJECT(rtp_capsfilter), "caps", sink_caps, NULL);
gst_caps_unref(sink_caps);
}
return true;
}
+//LCOV_EXCL_START
static void __parse_type_and_set_value(GType type, GstElement *element, GStrv key_value_pair)
{
RET_IF(element == NULL, "element is NULL");
g_strfreev(key_value_pair);
}
-}
\ No newline at end of file
+}
+
+GstCaps *_gst_set_caps_additional_fields(GstCaps *caps, GStrv key_value_pairs)
+{
+ GStrv key_value_pair;
+
+ if (!caps)
+ return NULL;
+
+ if (!key_value_pairs)
+ return NULL;
+
+ while (key_value_pairs && *key_value_pairs) {
+ key_value_pair = g_strsplit(*key_value_pairs++, "=", 2);
+
+ if (!g_strcmp0(key_value_pair[0], "") || !g_strcmp0(key_value_pair[1], "")) {
+ LOG_ERROR("invalid key_value_pair, key[%s], value[%s]", key_value_pair[0], key_value_pair[1]);
+ g_strfreev(key_value_pair);
+ continue;
+ }
+
+ gst_caps_set_simple(caps,
+ key_value_pair[0], G_TYPE_STRING, key_value_pair[1],
+ NULL);
+
+ LOG_DEBUG("field[%s] value[%s]", key_value_pair[0], key_value_pair[1]);
+
+ g_strfreev(key_value_pair);
+ }
+
+ return caps;
+}
+//LCOV_EXCL_STOP
\ No newline at end of file