mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 11:29:55 +00:00
Added tutorial 12
This commit is contained in:
parent
0eec3a7146
commit
987109fd3f
4 changed files with 122 additions and 2 deletions
110
gst-sdk/tutorials/basic-tutorial-12.c
Normal file
110
gst-sdk/tutorials/basic-tutorial-12.c
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
#include <gst/gst.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
typedef struct _CustomData {
|
||||||
|
gboolean is_live;
|
||||||
|
GstElement *pipeline;
|
||||||
|
GMainLoop *loop;
|
||||||
|
} CustomData;
|
||||||
|
|
||||||
|
/* playbin2 flags */
|
||||||
|
typedef enum {
|
||||||
|
GST_PLAY_FLAG_BUFFERING = (1 << 8) /* We want to allow buffering */
|
||||||
|
} GstPlayFlags;
|
||||||
|
|
||||||
|
static void cb_message (GstBus *bus, GstMessage *msg, CustomData *data) {
|
||||||
|
|
||||||
|
switch (GST_MESSAGE_TYPE (msg)) {
|
||||||
|
case GST_MESSAGE_ERROR: {
|
||||||
|
GError *err;
|
||||||
|
gchar *debug;
|
||||||
|
|
||||||
|
gst_message_parse_error (msg, &err, &debug);
|
||||||
|
g_print ("Error: %s\n", err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
g_free (debug);
|
||||||
|
|
||||||
|
gst_element_set_state (data->pipeline, GST_STATE_READY);
|
||||||
|
g_main_loop_quit (data->loop);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_MESSAGE_EOS:
|
||||||
|
/* end-of-stream */
|
||||||
|
gst_element_set_state (data->pipeline, GST_STATE_READY);
|
||||||
|
g_main_loop_quit (data->loop);
|
||||||
|
break;
|
||||||
|
case GST_MESSAGE_CLOCK_LOST:
|
||||||
|
/* Get a new clock */
|
||||||
|
gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
|
||||||
|
gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
|
||||||
|
break;
|
||||||
|
case GST_MESSAGE_BUFFERING: {
|
||||||
|
gint percent = 0;
|
||||||
|
|
||||||
|
/* If the stream is live, we do not care about buffering. */
|
||||||
|
if (data->is_live) break;
|
||||||
|
|
||||||
|
gst_message_parse_buffering (msg, &percent);
|
||||||
|
g_print ("Buffering (%3d%%)\r", percent);
|
||||||
|
/* Wait until buffering is complete before start/resume playing */
|
||||||
|
if (percent < 100)
|
||||||
|
gst_element_set_state (data->pipeline, GST_STATE_PAUSED);
|
||||||
|
else
|
||||||
|
gst_element_set_state (data->pipeline, GST_STATE_PLAYING);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
/* Unhandled message */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
GstElement *pipeline;
|
||||||
|
GstBus *bus;
|
||||||
|
GstStateChangeReturn ret;
|
||||||
|
GMainLoop *main_loop;
|
||||||
|
CustomData data;
|
||||||
|
guint flags;
|
||||||
|
|
||||||
|
/* Initialize GStreamer */
|
||||||
|
gst_init (&argc, &argv);
|
||||||
|
|
||||||
|
/* Initialize our data structure */
|
||||||
|
memset (&data, 0, sizeof (data));
|
||||||
|
|
||||||
|
/* Build the pipeline */
|
||||||
|
pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL);
|
||||||
|
bus = gst_element_get_bus (pipeline);
|
||||||
|
|
||||||
|
/* Set the buffering flag */
|
||||||
|
g_object_get (pipeline, "flags", &flags, NULL);
|
||||||
|
flags |= GST_PLAY_FLAG_BUFFERING;
|
||||||
|
g_object_set (pipeline, "flags", flags, NULL);
|
||||||
|
|
||||||
|
/* Start playing */
|
||||||
|
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||||
|
if (ret == GST_STATE_CHANGE_FAILURE) {
|
||||||
|
g_printerr ("Unable to set the pipeline to the playing state.\n");
|
||||||
|
gst_object_unref (pipeline);
|
||||||
|
return -1;
|
||||||
|
} else if (ret == GST_STATE_CHANGE_NO_PREROLL) {
|
||||||
|
data.is_live = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
main_loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
data.loop = main_loop;
|
||||||
|
data.pipeline = pipeline;
|
||||||
|
|
||||||
|
gst_bus_add_signal_watch (bus);
|
||||||
|
g_signal_connect (bus, "message", G_CALLBACK (cb_message), &data);
|
||||||
|
|
||||||
|
g_main_loop_run (main_loop);
|
||||||
|
|
||||||
|
/* Free resources */
|
||||||
|
g_main_loop_unref (main_loop);
|
||||||
|
gst_object_unref (bus);
|
||||||
|
gst_element_set_state (pipeline, GST_STATE_NULL);
|
||||||
|
gst_object_unref (pipeline);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -19,7 +19,7 @@
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\basic-tutorial-10.c" />
|
<ClCompile Include="..\..\basic-tutorial-12.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\basic-tutorial-10.c" />
|
<ClCompile Include="..\..\basic-tutorial-12.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -23,6 +23,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "playback-tutorial-2", "play
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-9", "basic-tutorial-9\basic-tutorial-9.vcxproj", "{7B61F2C6-5202-48B7-8589-164F81BC636C}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-9", "basic-tutorial-9\basic-tutorial-9.vcxproj", "{7B61F2C6-5202-48B7-8589-164F81BC636C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "basic-tutorial-12", "basic-tutorial-12\basic-tutorial-12.vcxproj", "{A2E63C29-3375-4930-B7D3-2F23EC824EAF}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
|
@ -119,6 +121,14 @@ Global
|
||||||
{7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|Win32.Build.0 = Release|Win32
|
{7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|Win32.Build.0 = Release|Win32
|
||||||
{7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|x64.ActiveCfg = Release|x64
|
{7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|x64.ActiveCfg = Release|x64
|
||||||
{7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|x64.Build.0 = Release|x64
|
{7B61F2C6-5202-48B7-8589-164F81BC636C}.Release|x64.Build.0 = Release|x64
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{A2E63C29-3375-4930-B7D3-2F23EC824EAF}.Release|x64.Build.0 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
Loading…
Reference in a new issue