|
|
|
@@ -1,5 +1,5 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2014-2023, NVIDIA CORPORATION. All rights reserved.
|
|
|
|
|
* Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
@@ -1481,10 +1481,6 @@ set_encoder_bitrate (guint bitrate)
|
|
|
|
|
else if (app->capres.vid_res_index >= VR_3840x2160)
|
|
|
|
|
bitrate = NVGST_DEFAULT_2160P_ENCODER_BITRATE;
|
|
|
|
|
}
|
|
|
|
|
if (app->encset.video_enc == FORMAT_H264_SW)
|
|
|
|
|
{
|
|
|
|
|
bitrate /= 1000; // x264enc requires kbits/sec
|
|
|
|
|
}
|
|
|
|
|
app->encset.bitrate = bitrate;
|
|
|
|
|
g_print ("bitrate = %u\n", app->encset.bitrate);
|
|
|
|
|
g_object_set (G_OBJECT (app->ele.vid_enc), "bitrate", app->encset.bitrate,
|
|
|
|
@@ -1625,25 +1621,16 @@ get_video_encoder (GstElement ** vencoder)
|
|
|
|
|
*vencoder = gst_element_factory_make (NVGST_PRIMARY_V4L2_VP9_VENC, NULL);
|
|
|
|
|
set_encoder_bitrate (app->encset.bitrate);
|
|
|
|
|
break;
|
|
|
|
|
case FORMAT_H264_SW:
|
|
|
|
|
*vencoder = gst_element_factory_make(NVGST_SW_H264_ENC, NULL);
|
|
|
|
|
set_encoder_bitrate(app->encset.bitrate);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
*vencoder = gst_element_factory_make (NVGST_PRIMARY_V4L2_H264_VENC, NULL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (app->encset.video_enc != FORMAT_H264_SW)
|
|
|
|
|
{
|
|
|
|
|
g_object_set(*vencoder, "control-rate", app->encset.controlrate, NULL);
|
|
|
|
|
g_print("Encoder control-rate = %u\n", app->encset.controlrate);
|
|
|
|
|
}
|
|
|
|
|
g_object_set (*vencoder, "control-rate", app->encset.controlrate, NULL);
|
|
|
|
|
if (app->encset.enabletwopassCBR)
|
|
|
|
|
{
|
|
|
|
|
g_object_set (*vencoder, "EnableTwopassCBR", app->encset.enabletwopassCBR, NULL);
|
|
|
|
|
g_print("Encoder EnableTwopassCBR = %d\n", app->encset.enabletwopassCBR);
|
|
|
|
|
}
|
|
|
|
|
g_print ("Encoder control-rate = %u\n", app->encset.controlrate);
|
|
|
|
|
g_print ("Encoder EnableTwopassCBR = %d\n", app->encset.enabletwopassCBR);
|
|
|
|
|
|
|
|
|
|
if (!(*vencoder)) {
|
|
|
|
|
app->return_value = -1;
|
|
|
|
@@ -1659,10 +1646,7 @@ get_parser (GstElement ** parser)
|
|
|
|
|
{
|
|
|
|
|
switch (app->encset.video_enc) {
|
|
|
|
|
case FORMAT_H264_HW:
|
|
|
|
|
*parser = gst_element_factory_make(NVGST_PRIMARY_H264_PARSER, NULL);
|
|
|
|
|
break;
|
|
|
|
|
case FORMAT_H264_SW:
|
|
|
|
|
*parser = gst_element_factory_make(NVGST_PRIMARY_H264_PARSER, NULL);
|
|
|
|
|
*parser = gst_element_factory_make (NVGST_PRIMARY_H264_PARSER, NULL);
|
|
|
|
|
break;
|
|
|
|
|
case FORMAT_H265_HW:
|
|
|
|
|
*parser = gst_element_factory_make (NVGST_PRIMARY_H265_PARSER, NULL);
|
|
|
|
@@ -2759,11 +2743,8 @@ create_video_scaling_bin (void)
|
|
|
|
|
"width", G_TYPE_INT, app->capres.video_cap_width,
|
|
|
|
|
"height", G_TYPE_INT, app->capres.video_cap_height, NULL);
|
|
|
|
|
|
|
|
|
|
if (app->encset.video_enc != FORMAT_H264_SW)
|
|
|
|
|
{
|
|
|
|
|
feature = gst_caps_features_new("memory:NVMM", NULL);
|
|
|
|
|
gst_caps_set_features (caps, 0, feature);
|
|
|
|
|
}
|
|
|
|
|
feature = gst_caps_features_new ("memory:NVMM", NULL);
|
|
|
|
|
gst_caps_set_features (caps, 0, feature);
|
|
|
|
|
|
|
|
|
|
/* Set capture caps on capture filter */
|
|
|
|
|
g_object_set (app->ele.svc_vidvconv_out_filter, "caps", caps, NULL);
|
|
|
|
@@ -2894,10 +2875,6 @@ rtsp_video_stream_new (GObject * media)
|
|
|
|
|
case FORMAT_VP9_HW:
|
|
|
|
|
appsrc_caps = gst_caps_from_string ("video/x-vp9");
|
|
|
|
|
break;
|
|
|
|
|
case FORMAT_H264_SW:
|
|
|
|
|
appsrc_caps =
|
|
|
|
|
gst_caps_from_string("video/x-h264, stream-format=byte-stream, alignment=au");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
appsrc_caps = gst_caps_from_string ("video/x-h264");
|
|
|
|
|
break;
|
|
|
|
@@ -3037,12 +3014,8 @@ create_streaming_file_src_bin (void)
|
|
|
|
|
gst_caps_new_simple ("video/x-raw", "format", G_TYPE_STRING, "I420",
|
|
|
|
|
"width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
|
|
|
|
|
|
|
|
|
|
if (app->encset.video_enc != FORMAT_H264_SW)
|
|
|
|
|
{
|
|
|
|
|
feature = gst_caps_features_new("memory:NVMM", NULL);
|
|
|
|
|
gst_caps_set_features (caps, 0, feature);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
feature = gst_caps_features_new ("memory:NVMM", NULL);
|
|
|
|
|
gst_caps_set_features (caps, 0, feature);
|
|
|
|
|
g_object_set (app->ele.cap_filter, "caps", caps, NULL);
|
|
|
|
|
gst_caps_unref (caps);
|
|
|
|
|
|
|
|
|
@@ -3110,11 +3083,6 @@ create_streaming_enc_bin (void)
|
|
|
|
|
case FORMAT_VP9_HW:
|
|
|
|
|
appsink_caps = gst_caps_from_string ("video/x-vp9");
|
|
|
|
|
break;
|
|
|
|
|
case FORMAT_H264_SW:
|
|
|
|
|
appsink_caps =
|
|
|
|
|
gst_caps_from_string
|
|
|
|
|
("video/x-h264, stream-format=byte-stream, alignment=au");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
appsink_caps = gst_caps_from_string ("video/x-h264");
|
|
|
|
|
break;
|
|
|
|
@@ -3177,32 +3145,13 @@ create_vid_enc_bin (void)
|
|
|
|
|
caps =
|
|
|
|
|
gst_caps_new_simple ("video/x-raw","format", G_TYPE_STRING, "NV12", NULL);
|
|
|
|
|
|
|
|
|
|
if (app->encset.video_enc != FORMAT_H264_SW) {
|
|
|
|
|
feature = gst_caps_features_new("memory:NVMM", NULL);
|
|
|
|
|
gst_caps_set_features(caps, 0, feature);
|
|
|
|
|
}
|
|
|
|
|
feature = gst_caps_features_new ("memory:NVMM", NULL);
|
|
|
|
|
gst_caps_set_features (caps, 0, feature);
|
|
|
|
|
|
|
|
|
|
g_object_set (G_OBJECT (app->ele.vid_enc_cap_filter), "caps", caps, NULL);
|
|
|
|
|
gst_caps_unref (caps);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((app->cam_src == NV_CAM_SRC_CSI) && (app->encset.video_enc == FORMAT_H264_SW))
|
|
|
|
|
{
|
|
|
|
|
app->ele.vid_enc_conv = gst_element_factory_make("nvvidconv", "nvvidconv");
|
|
|
|
|
if (!app->ele.vid_enc_conv)
|
|
|
|
|
{
|
|
|
|
|
NVGST_ERROR_MESSAGE("nvvidconv element could not be created.\n");
|
|
|
|
|
goto fail;
|
|
|
|
|
}
|
|
|
|
|
app->ele.vid_enc_cap_filter =
|
|
|
|
|
gst_element_factory_make(NVGST_DEFAULT_CAPTURE_FILTER, NULL);
|
|
|
|
|
caps =
|
|
|
|
|
gst_caps_new_simple("video/x-raw", "format", G_TYPE_STRING, "NV12", NULL);
|
|
|
|
|
|
|
|
|
|
g_object_set(G_OBJECT(app->ele.vid_enc_cap_filter), "caps", caps, NULL);
|
|
|
|
|
gst_caps_unref(caps);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app->ele.video_sink =
|
|
|
|
|
gst_element_factory_make (NVGST_DEFAULT_VENC_SINK, NULL);
|
|
|
|
|
if (!app->ele.video_sink) {
|
|
|
|
@@ -3244,25 +3193,8 @@ create_vid_enc_bin (void)
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (app->encset.video_enc != FORMAT_H264_SW) {
|
|
|
|
|
gst_bin_add_many(GST_BIN(app->ele.vid_bin), app->ele.vid_enc,
|
|
|
|
|
app->ele.parser, app->ele.muxer, app->ele.video_sink, NULL);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
gst_bin_add_many(GST_BIN(app->ele.vid_bin), app->ele.vid_enc_conv,
|
|
|
|
|
app->ele.vid_enc_cap_filter, app->ele.vid_enc,
|
|
|
|
|
app->ele.parser, app->ele.muxer, app->ele.video_sink, NULL);
|
|
|
|
|
|
|
|
|
|
if ((gst_element_link(app->ele.vid_enc_conv, app->ele.vid_enc_cap_filter)) != TRUE) {
|
|
|
|
|
NVGST_ERROR_MESSAGE("Elements could not link nvvidconv & caps filter\n");
|
|
|
|
|
goto fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((gst_element_link(app->ele.vid_enc_cap_filter, app->ele.vid_enc)) != TRUE) {
|
|
|
|
|
NVGST_ERROR_MESSAGE("Elements could not link caps filter & encoder \n");
|
|
|
|
|
goto fail;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
gst_bin_add_many (GST_BIN (app->ele.vid_bin), app->ele.vid_enc,
|
|
|
|
|
app->ele.parser, app->ele.muxer, app->ele.video_sink, NULL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((gst_element_link (app->ele.vid_enc, app->ele.parser)) != TRUE) {
|
|
|
|
@@ -3272,6 +3204,7 @@ create_vid_enc_bin (void)
|
|
|
|
|
|
|
|
|
|
srcpad = gst_element_get_static_pad (app->ele.parser, "src");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (app->muxer_is_identity)
|
|
|
|
|
{
|
|
|
|
|
sinkpad = gst_element_get_static_pad (app->ele.muxer, "sink");
|
|
|
|
@@ -3297,7 +3230,7 @@ create_vid_enc_bin (void)
|
|
|
|
|
goto fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if((app->cam_src != NV_CAM_SRC_CSI) || (app->encset.video_enc == FORMAT_H264_SW))
|
|
|
|
|
if(app->cam_src != NV_CAM_SRC_CSI)
|
|
|
|
|
{
|
|
|
|
|
pad = gst_element_get_static_pad (app->ele.vid_enc_conv, "sink");
|
|
|
|
|
if (!pad) {
|
|
|
|
@@ -4166,14 +4099,14 @@ nvgst_handle_xevents ()
|
|
|
|
|
static gpointer
|
|
|
|
|
nvgst_x_event_thread (gpointer data)
|
|
|
|
|
{
|
|
|
|
|
gint64 end_time;
|
|
|
|
|
g_mutex_lock (app->lock);
|
|
|
|
|
while (app->disp.window) {
|
|
|
|
|
nvgst_handle_xevents ();
|
|
|
|
|
g_mutex_unlock(app->lock);
|
|
|
|
|
g_usleep(G_USEC_PER_SEC / 20);
|
|
|
|
|
g_mutex_lock(app->lock);
|
|
|
|
|
end_time = g_get_monotonic_time () + 1;
|
|
|
|
|
g_cond_wait_until (app->x_cond, app->lock, end_time);
|
|
|
|
|
}
|
|
|
|
|
g_mutex_unlock(app->lock);
|
|
|
|
|
g_mutex_unlock (app->lock);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
@@ -4362,7 +4295,6 @@ main (int argc, char *argv[])
|
|
|
|
|
|
|
|
|
|
/* Initialize capture params */
|
|
|
|
|
capture_init_params ();
|
|
|
|
|
|
|
|
|
|
GOptionEntry options_argus[] = {
|
|
|
|
|
{"prev-res", 0, 0, G_OPTION_ARG_CALLBACK, parse_spec,
|
|
|
|
|
"Preview width & height."
|
|
|
|
@@ -4388,7 +4320,7 @@ main (int argc, char *argv[])
|
|
|
|
|
"Capture mode value (1=still 2=video)", NULL}
|
|
|
|
|
,
|
|
|
|
|
{"video-enc", 'v', 0, G_OPTION_ARG_INT, &app->encset.video_enc,
|
|
|
|
|
"Video encoder type (0=h264[HW] 1=vp8[HW] 2=h265[HW] 3=vp9[HW] 4=h264[SW])",
|
|
|
|
|
"Video encoder type (0=h264[HW] 1=vp8[HW] 2=h265[HW] 3=vp9[HW])",
|
|
|
|
|
NULL}
|
|
|
|
|
,
|
|
|
|
|
{"hw-enc-path", 'p', 0, G_OPTION_ARG_INT, &app->encset.hw_enc_type,
|
|
|
|
@@ -4589,17 +4521,6 @@ main (int argc, char *argv[])
|
|
|
|
|
if(app->encset.bitrate != 0)
|
|
|
|
|
is_user_bitrate = 1;
|
|
|
|
|
|
|
|
|
|
FILE *fp;
|
|
|
|
|
fp = fopen(NVGST_DEFAULT_V4L2_NVENC_DEVICE_PATH, "r");
|
|
|
|
|
if (fp == NULL)
|
|
|
|
|
{
|
|
|
|
|
if (app->encset.video_enc != FORMAT_H264_SW)
|
|
|
|
|
g_print("Codec not supported. Falling back to opensrc H264 encoder\n");
|
|
|
|
|
app->encset.video_enc = FORMAT_H264_SW;
|
|
|
|
|
}
|
|
|
|
|
if (fp)
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
|
|
g_option_context_free (ctx);
|
|
|
|
|
|
|
|
|
|
if (!app->aut.automate)
|
|
|
|
@@ -4655,10 +4576,6 @@ main (int argc, char *argv[])
|
|
|
|
|
payloader = "rtpvp9pay";
|
|
|
|
|
parser = "identity";
|
|
|
|
|
break;
|
|
|
|
|
case FORMAT_H264_SW:
|
|
|
|
|
payloader = "rtph264pay";
|
|
|
|
|
parser = "h264parse";
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
NVGST_ERROR_MESSAGE ("Unsupported codec for streaming");
|
|
|
|
|
goto done;
|
|
|
|
|