feat: add the video sink to the tutorial-3

master
邱棚 2023-02-11 13:59:50 +00:00
parent de7f25c417
commit 905ac7fb1e
2 changed files with 46 additions and 25 deletions

18
.vscode/tasks.json vendored
View File

@ -4,15 +4,17 @@
{ {
"label": "CMake", "label": "CMake",
"detail": "Produce MakeFile", "detail": "Produce MakeFile",
"command":[ "command": [
"cmake" "cmake"
], ],
"type": "shell", "type": "shell",
"args": [".."], "args": [
".."
],
"options": { "options": {
"cwd": "${workspaceFolder}/build", "cwd": "${workspaceFolder}/build"
}, },
"group": "build", "group": "build"
}, },
{ {
"label": "Build", "label": "Build",
@ -27,7 +29,7 @@
"reveal": "always" "reveal": "always"
}, },
"options": { "options": {
"cwd": "${workspaceFolder}/build", "cwd": "${workspaceFolder}/build"
}, },
"group": "build" "group": "build"
}, },
@ -38,15 +40,15 @@
"type": "shell", "type": "shell",
"group": "build", "group": "build",
"options": { "options": {
"cwd": "${workspaceFolder}/build", "cwd": "${workspaceFolder}/build"
} }
}, },
{ {
"label": "Build & Run", "label": "Build & Run",
"detail": "Build program and run it", "detail": "Build program and run it",
"dependsOn":[ "dependsOn": [
"Build", "Build",
"Run", "Run"
], ],
"dependsOrder": "sequence", "dependsOrder": "sequence",
"group": "build" "group": "build"

View File

@ -7,7 +7,8 @@ typedef struct _CustomData
GstElement *source; GstElement *source;
GstElement *convert; GstElement *convert;
GstElement *resample; GstElement *resample;
GstElement *sink; GstElement *audio_sink;
GstElement *video_sink;
} CustomData; } CustomData;
static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data); static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data);
@ -25,25 +26,27 @@ int main(int argc, char *argv[])
data.source = gst_element_factory_make("uridecodebin","source"); data.source = gst_element_factory_make("uridecodebin","source");
data.convert = gst_element_factory_make("audioconvert","convert"); data.convert = gst_element_factory_make("audioconvert","convert");
data.resample = gst_element_factory_make("audioresample","resample"); data.resample = gst_element_factory_make("audioresample","resample");
data.sink = gst_element_factory_make("autoaudiosink","sink"); data.audio_sink = gst_element_factory_make("autoaudiosink","audio_sink");
data.video_sink = gst_element_factory_make("autovideosink","video_sink");
data.pipeline = gst_pipeline_new("test-pipeline"); data.pipeline = gst_pipeline_new("test-pipeline");
if(!data.pipeline|| !data.source || !data.convert || !data.resample || ! data.sink) if(!data.pipeline|| !data.source || !data.convert || !data.resample || ! data.audio_sink || !data.video_sink)
{ {
g_printerr("Not all elements could be created.\n"); g_printerr("Not all elements could be created.\n");
return -1; return -1;
} }
gst_bin_add_many(GST_BIN(data.pipeline),data.source,data.convert,data.resample,data.sink,NULL); gst_bin_add_many(GST_BIN(data.pipeline),data.source,data.convert,data.resample,data.audio_sink,data.video_sink,NULL);
if(!gst_element_link_many(data.convert,data.resample,data.sink,NULL)) if(!gst_element_link_many(data.convert,data.resample,data.audio_sink,NULL))
{ {
g_printerr("Elements could not be linked.\n"); g_printerr("Elements could not be linked.\n");
gst_object_unref(data.pipeline); gst_object_unref(data.pipeline);
return -1; return -1;
} }
g_object_set(data.source,"uri","https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",NULL); // g_object_set(data.source,"uri","https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",NULL);
g_object_set(data.source,"uri","https://media.w3.org/2010/05/sintel/trailer.mp4",NULL);
g_signal_connect(data.source,"pad-added",G_CALLBACK(pad_added_handler),&data); g_signal_connect(data.source,"pad-added",G_CALLBACK(pad_added_handler),&data);
@ -103,7 +106,8 @@ int main(int argc, char *argv[])
static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data) static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data)
{ {
GstPad *sink_pad = gst_element_get_static_pad(data->convert,"sink"); GstPad *audio_sink_pad = gst_element_get_static_pad(data->convert,"sink");
GstPad *video_sink_pad = gst_element_get_static_pad(data->video_sink,"sink");
GstPadLinkReturn ret; GstPadLinkReturn ret;
GstCaps *new_pad_caps = NULL; GstCaps *new_pad_caps = NULL;
GstStructure *new_pad_struct = NULL; GstStructure *new_pad_struct = NULL;
@ -111,7 +115,7 @@ static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data)
g_print("Received new pad '%s' from '%s':\n",GST_PAD_NAME(new_pad),GST_ELEMENT_NAME(src)); g_print("Received new pad '%s' from '%s':\n",GST_PAD_NAME(new_pad),GST_ELEMENT_NAME(src));
if(gst_pad_is_linked(sink_pad)) if(gst_pad_is_linked(audio_sink_pad))// && gst_pad_is_linked(video_sink_pad))
{ {
g_print("We are already linked. Ignoring.\n"); g_print("We are already linked. Ignoring.\n");
goto exit; goto exit;
@ -120,20 +124,35 @@ static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data)
new_pad_caps = gst_pad_get_current_caps(new_pad); new_pad_caps = gst_pad_get_current_caps(new_pad);
new_pad_struct = gst_caps_get_structure(new_pad_caps,0); new_pad_struct = gst_caps_get_structure(new_pad_caps,0);
new_pad_type = gst_structure_get_name(new_pad_struct); new_pad_type = gst_structure_get_name(new_pad_struct);
if(!g_str_has_prefix(new_pad_type,"audio/x-raw")) if(g_str_has_prefix(new_pad_type,"audio/x-raw"))
{ {
g_print("It has type '%s' which is not raw audio. Ignoring.\n",new_pad_type); ret = gst_pad_link(new_pad,audio_sink_pad);
goto exit; if(GST_PAD_LINK_FAILED(ret))
{
g_print("Type is %s but link failed.\n",new_pad_type);
}
else
{
g_print("Link succeeded (type %s).\n",new_pad_type);
}
} }
else if(g_str_has_prefix(new_pad_type,"video/x-raw"))
ret = gst_pad_link(new_pad,sink_pad);
if(GST_PAD_LINK_FAILED(ret))
{ {
g_print("Type is %s but link failed.\n",new_pad_type); ret = gst_pad_link(new_pad,video_sink_pad);
if(GST_PAD_LINK_FAILED(ret))
{
g_print("Type is %s but link failed.\n",new_pad_type);
}
else
{
g_print("Link succeeded (type %s).\n",new_pad_type);
}
} }
else else
{ {
g_print("Link succeeded (type %s).\n",new_pad_type); g_print("It has type '%s' which is not raw audio. Ignoring.\n",new_pad_type);
goto exit;
} }
exit: exit:
@ -141,6 +160,6 @@ static void pad_added_handler(GstElement *src, GstPad *new_pad,CustomData *data)
{ {
gst_caps_unref(new_pad_caps); gst_caps_unref(new_pad_caps);
} }
gst_object_unref(sink_pad); gst_object_unref(audio_sink_pad);
} }