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