mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-21 13:36:39 +00:00
nvcodec: Add suppport for environment based primary h264 decoder implementation
Introduce GST_USE_NV_STATELESS_CODEC environment to allow user to select primary nvidia decoder implementation. In case the environment GST_USE_NV_STATELESS_CODEC=h264 was set, old nvidia h264 decoder element will not be registered. Instead, both nvh264dec and nvh264sldec factory name will create gstcodecs based new nvidia h264 decoder element. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1198>
This commit is contained in:
parent
9c21923f04
commit
4d585c64d1
3 changed files with 54 additions and 10 deletions
|
@ -1011,7 +1011,7 @@ gst_nv_h264_dec_subclass_init (gpointer klass, GstNvH264DecClassData * cdata)
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_nv_h264_dec_register (GstPlugin * plugin, guint device_id, guint rank,
|
gst_nv_h264_dec_register (GstPlugin * plugin, guint device_id, guint rank,
|
||||||
GstCaps * sink_caps, GstCaps * src_caps)
|
GstCaps * sink_caps, GstCaps * src_caps, gboolean is_primary)
|
||||||
{
|
{
|
||||||
GTypeQuery type_query;
|
GTypeQuery type_query;
|
||||||
GTypeInfo type_info = { 0, };
|
GTypeInfo type_info = { 0, };
|
||||||
|
@ -1048,14 +1048,25 @@ gst_nv_h264_dec_register (GstPlugin * plugin, guint device_id, guint rank,
|
||||||
type_info.class_init = (GClassInitFunc) gst_nv_h264_dec_subclass_init;
|
type_info.class_init = (GClassInitFunc) gst_nv_h264_dec_subclass_init;
|
||||||
type_info.class_data = cdata;
|
type_info.class_data = cdata;
|
||||||
|
|
||||||
|
if (is_primary) {
|
||||||
|
type_name = g_strdup ("GstNvH264StatelessPrimaryDec");
|
||||||
|
feature_name = g_strdup ("nvh264dec");
|
||||||
|
} else {
|
||||||
type_name = g_strdup ("GstNvH264StatelessDec");
|
type_name = g_strdup ("GstNvH264StatelessDec");
|
||||||
feature_name = g_strdup ("nvh264sldec");
|
feature_name = g_strdup ("nvh264sldec");
|
||||||
|
}
|
||||||
|
|
||||||
if (g_type_from_name (type_name) != 0) {
|
if (g_type_from_name (type_name) != 0) {
|
||||||
g_free (type_name);
|
g_free (type_name);
|
||||||
g_free (feature_name);
|
g_free (feature_name);
|
||||||
|
if (is_primary) {
|
||||||
|
type_name =
|
||||||
|
g_strdup_printf ("GstNvH264StatelessPrimaryDevice%dDec", device_id);
|
||||||
|
feature_name = g_strdup_printf ("nvh264device%ddec", device_id);
|
||||||
|
} else {
|
||||||
type_name = g_strdup_printf ("GstNvH264StatelessDevice%dDec", device_id);
|
type_name = g_strdup_printf ("GstNvH264StatelessDevice%dDec", device_id);
|
||||||
feature_name = g_strdup_printf ("nvh264sldevice%ddec", device_id);
|
feature_name = g_strdup_printf ("nvh264sldevice%ddec", device_id);
|
||||||
|
}
|
||||||
|
|
||||||
is_default = FALSE;
|
is_default = FALSE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,8 @@ void gst_nv_h264_dec_register (GstPlugin * plugin,
|
||||||
guint device_id,
|
guint device_id,
|
||||||
guint rank,
|
guint rank,
|
||||||
GstCaps * sink_caps,
|
GstCaps * sink_caps,
|
||||||
GstCaps * src_caps);
|
GstCaps * src_caps,
|
||||||
|
gboolean is_primary);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,8 @@ plugin_init (GstPlugin * plugin)
|
||||||
/* hardcoded minimum supported version */
|
/* hardcoded minimum supported version */
|
||||||
guint api_major_ver = 8;
|
guint api_major_ver = 8;
|
||||||
guint api_minor_ver = 1;
|
guint api_minor_ver = 1;
|
||||||
|
const gchar *env;
|
||||||
|
gboolean use_h264_sl_dec = FALSE;
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_INIT (gst_nvcodec_debug, "nvcodec", 0, "nvcodec");
|
GST_DEBUG_CATEGORY_INIT (gst_nvcodec_debug, "nvcodec", 0, "nvcodec");
|
||||||
GST_DEBUG_CATEGORY_INIT (gst_nvdec_debug, "nvdec", 0, "nvdec");
|
GST_DEBUG_CATEGORY_INIT (gst_nvdec_debug, "nvdec", 0, "nvdec");
|
||||||
|
@ -89,6 +91,26 @@ plugin_init (GstPlugin * plugin)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check environment to determine primary h264decoder */
|
||||||
|
env = g_getenv ("GST_USE_NV_STATELESS_CODEC");
|
||||||
|
if (env) {
|
||||||
|
gchar **split;
|
||||||
|
gchar **iter;
|
||||||
|
|
||||||
|
split = g_strsplit (env, ",", 0);
|
||||||
|
|
||||||
|
for (iter = split; *iter; iter++) {
|
||||||
|
if (g_ascii_strcasecmp (*iter, "h264") == 0) {
|
||||||
|
GST_INFO ("Found %s in GST_USE_NV_STATELESS_CODEC environment", *iter);
|
||||||
|
use_h264_sl_dec = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev (split);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < dev_count; i++) {
|
for (i = 0; i < dev_count; i++) {
|
||||||
CUdevice cuda_device;
|
CUdevice cuda_device;
|
||||||
CUcontext cuda_ctx;
|
CUcontext cuda_ctx;
|
||||||
|
@ -115,6 +137,7 @@ plugin_init (GstPlugin * plugin)
|
||||||
GstCaps *sink_template = NULL;
|
GstCaps *sink_template = NULL;
|
||||||
GstCaps *src_template = NULL;
|
GstCaps *src_template = NULL;
|
||||||
cudaVideoCodec codec = (cudaVideoCodec) j;
|
cudaVideoCodec codec = (cudaVideoCodec) j;
|
||||||
|
gboolean register_cuviddec = TRUE;
|
||||||
|
|
||||||
if (gst_nv_decoder_check_device_caps (cuda_ctx,
|
if (gst_nv_decoder_check_device_caps (cuda_ctx,
|
||||||
codec, &sink_template, &src_template)) {
|
codec, &sink_template, &src_template)) {
|
||||||
|
@ -124,12 +147,21 @@ plugin_init (GstPlugin * plugin)
|
||||||
"src template %" GST_PTR_FORMAT, codec_name,
|
"src template %" GST_PTR_FORMAT, codec_name,
|
||||||
sink_template, src_template);
|
sink_template, src_template);
|
||||||
|
|
||||||
gst_nvdec_plugin_init (plugin,
|
|
||||||
i, codec, codec_name, sink_template, src_template);
|
|
||||||
|
|
||||||
if (codec == cudaVideoCodec_H264) {
|
if (codec == cudaVideoCodec_H264) {
|
||||||
gst_nv_h264_dec_register (plugin,
|
gst_nv_h264_dec_register (plugin,
|
||||||
i, GST_RANK_SECONDARY, sink_template, src_template);
|
i, GST_RANK_SECONDARY, sink_template, src_template, FALSE);
|
||||||
|
if (use_h264_sl_dec) {
|
||||||
|
GST_INFO ("Skip register cuvid parser based nvh264dec");
|
||||||
|
register_cuviddec = FALSE;
|
||||||
|
|
||||||
|
gst_nv_h264_dec_register (plugin,
|
||||||
|
i, GST_RANK_PRIMARY, sink_template, src_template, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (register_cuviddec) {
|
||||||
|
gst_nvdec_plugin_init (plugin,
|
||||||
|
i, codec, codec_name, sink_template, src_template);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_caps_unref (sink_template);
|
gst_caps_unref (sink_template);
|
||||||
|
|
Loading…
Reference in a new issue