gapless playback
Adeel Arshad
arshad.adeel.83 at gmail.com
Tue Jan 31 19:03:13 UTC 2017
Hi Everyone
I have created an app using objective c and gstreamer.
The issue I am facing is that when I play a single file it is playing as
desired till the end but when I try to include the gapless functionality
the same file did not play till the last frame
I am using playbin and about to finish to perform gapless playback.
Can you guide me where to look at to resolve the problem. Thnaking you in
anticipation
Following is my code
static void prepare_next_stream (GstElement *obj, GStreamerBackend *self){
NSString* uri = [self playNext];
if(![uri isEqualToString:@"loop"] && ![uri isEqualToString:@"playonce"]
&& ![uri isEqualToString:@""])
{
const char *char_uri = [uri UTF8String];
g_object_set (self->pipeline, "uri", char_uri, NULL);
}
}
//Main Function
GstBus *bus;
GSource *timeout_source;
GSource *bus_source;
GError *error = NULL;
//GstElement *audio_sink;
//GstElement *decklink_video_sink;
//GstElement *deinterlace, *interlace;
//GstElement *tee, *queue, *video_sink, *queue1;
GstElement *video_bin, *audio_bin;
GstElement *video_filter_bin;
GST_DEBUG("Creating pipeline");
context = g_main_context_new();
g_main_context_push_thread_default(context);
video_bin = gst_parse_bin_from_description("tee name=t t. ! queue !
autovideosink t. ! decklinkvideosink mode=3", TRUE, NULL);
video_filter_bin = gst_parse_bin_from_description("capssetter
caps=video/x-raw,interlace-mode=interleaved", TRUE, NULL);
audio_bin = gst_parse_bin_from_description("audioconvert !
decklinkaudiosink", TRUE, NULL);
pipeline = gst_parse_launch("playbin", &error);
const char *char_uri = [uri UTF8String];
g_object_set(pipeline, "uri", char_uri, NULL);
GST_DEBUG("URI set to %s", char_uri);
g_object_set(pipeline, "video-sink", video_bin, NULL);
g_object_set(pipeline, "video-filter", video_filter_bin, NULL);
g_object_set(pipeline, "audio-sink", audio_bin, NULL);
if(error){
gchar *message = g_strdup_printf("Unable to build pipeline:
%s", error->message);
g_clear_error(&error);
NSLog(@"pipeline error %s",message);
[self setUIMessage:message];
g_free(message);
return;
}
GstElement *videosink = gst_bin_get_by_interface(GST_BIN(pipeline),
GST_TYPE_VIDEO_OVERLAY);
if(!videosink){
GST_ERROR("Could not retrieve video sink");
return;
}
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(videosink),
(guintptr)(id)ui_video_view);
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
if (ret == GST_STATE_CHANGE_FAILURE) {
NSLog(@"Unable to set the pipeline to the playing state.\n");
gst_object_unref (pipeline);
return;
}
bus = gst_element_get_bus(pipeline);
bus_source = gst_bus_create_watch(bus);
g_source_set_callback(bus_source,
(GSourceFunc)gst_bus_async_signal_func, NULL, NULL);
g_source_attach(bus_source, context);
g_source_unref(bus_source);
g_signal_connect (G_OBJECT(bus), "message::error",
(GCallback)error_cb, (__bridge void *)self);
g_signal_connect (G_OBJECT(bus), "message::eos", (GCallback)eos_cb,
(__bridge void *)self);
g_signal_connect (G_OBJECT(bus), "message::state-changed",
(GCallback)state_changed_cb, (__bridge void *)self);
g_signal_connect (G_OBJECT(bus), "message::duration",
(GCallback)duration_cb, (__bridge void *)self);
g_signal_connect (G_OBJECT(bus), "message::clock-lost",
(GCallback)clock_lost_cb, (__bridge void *)self);
g_signal_connect (pipeline, "about-to-finish",
(GCallback)prepare_next_stream, (__bridge void *)self);
timeout_source = g_timeout_source_new(1);
g_source_set_callback(timeout_source, (GSourceFunc)refresh_ui,
(__bridge void *)self,NULL);
g_source_attach(timeout_source, context);
g_source_unref(timeout_source);
GST_DEBUG("Entering main loop...");
main_loop = g_main_loop_new(context, FALSE);
[self check_initializing_complete];
g_main_loop_run(main_loop);
GST_DEBUG("Exiting main loop...");
g_main_loop_unref(main_loop);
main_loop = NULL;
g_main_context_pop_thread_default(context);
g_main_context_unref(context);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
pipeline = NULL;
timeout_source = NULL;
bus = NULL;
bus_source = NULL;
return;
Regards
Adeel Arshad
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20170201/2a5d2724/attachment-0001.html>
More information about the gstreamer-devel
mailing list