mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 16:08:51 +00:00
nvenc: Query supported minimum resolution
Hard-coded 16x16 resolution is likely to differ from the device's support in most cases. If we can use NV_ENC_CAPS_WIDTH_MIN and NV_ENC_CAPS_HEIGHT_MIN, update pad template with returned value.
This commit is contained in:
parent
58a663c1e5
commit
e8d527df93
1 changed files with 52 additions and 17 deletions
|
@ -40,6 +40,15 @@
|
||||||
#define NVENC_LIBRARY_NAME "libnvidia-encode.so.1"
|
#define NVENC_LIBRARY_NAME "libnvidia-encode.so.1"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* For backward compatibility */
|
||||||
|
#define GST_NVENC_MIN_API_MAJOR_VERSION 8
|
||||||
|
#define GST_NVENC_MIN_API_MINOR_VERSION 1
|
||||||
|
|
||||||
|
#define GST_NVENCAPI_VERSION(major,minor) ((major) | ((minor) << 24))
|
||||||
|
#define GST_NVENCAPI_STRUCT_VERSION(ver,api_ver) ((uint32_t)(api_ver) | ((ver)<<16) | (0x7 << 28))
|
||||||
|
|
||||||
|
static guint32 gst_nvenc_api_version = NVENCAPI_VERSION;
|
||||||
|
|
||||||
typedef NVENCSTATUS NVENCAPI
|
typedef NVENCSTATUS NVENCAPI
|
||||||
tNvEncodeAPICreateInstance (NV_ENCODE_API_FUNCTION_LIST * functionList);
|
tNvEncodeAPICreateInstance (NV_ENCODE_API_FUNCTION_LIST * functionList);
|
||||||
tNvEncodeAPICreateInstance *nvEncodeAPICreateInstance;
|
tNvEncodeAPICreateInstance *nvEncodeAPICreateInstance;
|
||||||
|
@ -595,6 +604,8 @@ gst_nv_enc_register (GstPlugin * plugin, GUID codec_id, const gchar * codec,
|
||||||
guint32 count;
|
guint32 count;
|
||||||
gint max_width = 0;
|
gint max_width = 0;
|
||||||
gint max_height = 0;
|
gint max_height = 0;
|
||||||
|
gint min_width = 16;
|
||||||
|
gint min_height = 16;
|
||||||
GstCaps *sink_templ = NULL;
|
GstCaps *sink_templ = NULL;
|
||||||
GstCaps *src_templ = NULL;
|
GstCaps *src_templ = NULL;
|
||||||
gchar *name;
|
gchar *name;
|
||||||
|
@ -655,6 +666,20 @@ gst_nv_enc_register (GstPlugin * plugin, GUID codec_id, const gchar * codec,
|
||||||
max_height = 4096;
|
max_height = 4096;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
caps_param.capsToQuery = NV_ENC_CAPS_WIDTH_MIN;
|
||||||
|
if (NvEncGetEncodeCaps (enc,
|
||||||
|
codec_id, &caps_param, &min_width) != NV_ENC_SUCCESS) {
|
||||||
|
GST_WARNING ("could not query min width");
|
||||||
|
min_width = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
caps_param.capsToQuery = NV_ENC_CAPS_HEIGHT_MIN;
|
||||||
|
if (NvEncGetEncodeCaps (enc,
|
||||||
|
codec_id, &caps_param, &min_height) != NV_ENC_SUCCESS) {
|
||||||
|
GST_WARNING ("could not query min height");
|
||||||
|
min_height = 16;
|
||||||
|
}
|
||||||
|
|
||||||
caps_param.capsToQuery = NV_ENC_CAPS_SUPPORTED_RATECONTROL_MODES;
|
caps_param.capsToQuery = NV_ENC_CAPS_SUPPORTED_RATECONTROL_MODES;
|
||||||
if (NvEncGetEncodeCaps (enc, codec_id, &caps_param,
|
if (NvEncGetEncodeCaps (enc, codec_id, &caps_param,
|
||||||
&device_caps.rc_modes) != NV_ENC_SUCCESS) {
|
&device_caps.rc_modes) != NV_ENC_SUCCESS) {
|
||||||
|
@ -734,8 +759,8 @@ gst_nv_enc_register (GstPlugin * plugin, GUID codec_id, const gchar * codec,
|
||||||
gst_caps_set_value (sink_templ, "format", formats);
|
gst_caps_set_value (sink_templ, "format", formats);
|
||||||
|
|
||||||
gst_caps_set_simple (sink_templ,
|
gst_caps_set_simple (sink_templ,
|
||||||
"width", GST_TYPE_INT_RANGE, 16, max_width,
|
"width", GST_TYPE_INT_RANGE, min_width, max_width,
|
||||||
"height", GST_TYPE_INT_RANGE, 16, max_height,
|
"height", GST_TYPE_INT_RANGE, min_height, max_height,
|
||||||
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
|
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, NULL);
|
||||||
|
|
||||||
if (interlace_modes) {
|
if (interlace_modes) {
|
||||||
|
@ -754,8 +779,8 @@ gst_nv_enc_register (GstPlugin * plugin, GUID codec_id, const gchar * codec,
|
||||||
|
|
||||||
name = g_strdup_printf ("video/x-%s", codec);
|
name = g_strdup_printf ("video/x-%s", codec);
|
||||||
src_templ = gst_caps_new_simple (name,
|
src_templ = gst_caps_new_simple (name,
|
||||||
"width", GST_TYPE_INT_RANGE, 16, max_width,
|
"width", GST_TYPE_INT_RANGE, min_width, max_width,
|
||||||
"height", GST_TYPE_INT_RANGE, 16, max_height,
|
"height", GST_TYPE_INT_RANGE, min_height, max_height,
|
||||||
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1,
|
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1,
|
||||||
"stream-format", G_TYPE_STRING, "byte-stream",
|
"stream-format", G_TYPE_STRING, "byte-stream",
|
||||||
"alignment", G_TYPE_STRING, "au", NULL);
|
"alignment", G_TYPE_STRING, "au", NULL);
|
||||||
|
@ -798,20 +823,23 @@ gst_nv_enc_register (GstPlugin * plugin, GUID codec_id, const gchar * codec,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For backward compatibility */
|
typedef struct
|
||||||
#define GST_NVENC_API_MAJOR_VERSION 8
|
{
|
||||||
#define GST_NVENC_API_MINOR_VERSION 1
|
gint major;
|
||||||
|
gint minor;
|
||||||
#define GST_NVENCAPI_VERSION (GST_NVENC_API_MAJOR_VERSION | (GST_NVENC_API_MINOR_VERSION << 24))
|
} GstNvEncVersion;
|
||||||
#define GST_NVENCAPI_STRUCT_VERSION(ver,api_ver) ((uint32_t)(api_ver) | ((ver)<<16) | (0x7 << 28))
|
|
||||||
|
|
||||||
static guint32 gst_nvenc_api_version = NVENCAPI_VERSION;
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gst_nvenc_load_library (void)
|
gst_nvenc_load_library (void)
|
||||||
{
|
{
|
||||||
GModule *module;
|
GModule *module;
|
||||||
NVENCSTATUS ret;
|
NVENCSTATUS ret = NV_ENC_SUCCESS;
|
||||||
|
gint i;
|
||||||
|
static const GstNvEncVersion version_list[] = {
|
||||||
|
{NVENCAPI_MAJOR_VERSION, NVENCAPI_MINOR_VERSION},
|
||||||
|
{9, 0},
|
||||||
|
{GST_NVENC_MIN_API_MAJOR_VERSION, GST_NVENC_MIN_API_MINOR_VERSION}
|
||||||
|
};
|
||||||
|
|
||||||
module = g_module_open (NVENC_LIBRARY_NAME, G_MODULE_BIND_LAZY);
|
module = g_module_open (NVENC_LIBRARY_NAME, G_MODULE_BIND_LAZY);
|
||||||
if (module == NULL) {
|
if (module == NULL) {
|
||||||
|
@ -860,13 +888,20 @@ gst_nvenc_load_library (void)
|
||||||
* NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER NVENCAPI_STRUCT_VERSION(1)
|
* NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER NVENCAPI_STRUCT_VERSION(1)
|
||||||
* NV_ENCODE_API_FUNCTION_LIST_VER NVENCAPI_STRUCT_VERSION(2)
|
* NV_ENCODE_API_FUNCTION_LIST_VER NVENCAPI_STRUCT_VERSION(2)
|
||||||
*/
|
*/
|
||||||
if (ret != NV_ENC_SUCCESS) {
|
|
||||||
GST_WARNING ("Failed to get the latest NVEncodeAPI function table!");
|
for (i = 0; i < G_N_ELEMENTS (version_list); i++) {
|
||||||
gst_nvenc_api_version = GST_NVENCAPI_VERSION;
|
gst_nvenc_api_version =
|
||||||
/* NV_ENCODE_API_FUNCTION_LIST_VER == NVENCAPI_STRUCT_VERSION(2) */
|
GST_NVENCAPI_VERSION (version_list[i].major, version_list[i].minor);
|
||||||
|
|
||||||
nvenc_api.version = GST_NVENCAPI_STRUCT_VERSION (2, gst_nvenc_api_version);
|
nvenc_api.version = GST_NVENCAPI_STRUCT_VERSION (2, gst_nvenc_api_version);
|
||||||
|
|
||||||
ret = nvEncodeAPICreateInstance (&nvenc_api);
|
ret = nvEncodeAPICreateInstance (&nvenc_api);
|
||||||
|
|
||||||
|
if (ret == NV_ENC_SUCCESS) {
|
||||||
|
GST_INFO ("Supported SDK version %d.%d",
|
||||||
|
version_list[i].major, version_list[i].minor);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret == NV_ENC_SUCCESS;
|
return ret == NV_ENC_SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue