gapless playback

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

gapless playback

adeel
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

_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gapless playback

Antonio Ospite-2
On Wed, 1 Feb 2017 00:03:13 +0500
Adeel Arshad <[hidden email]> wrote:

> 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.
>

Using about-to-finish is the right thing to do, however sometimes I
noticed that the gapless behavior is dependent on the particular codec
used for the video, some codecs allow a finer granularity in seeking
than others, what you are seeing might be related to that.

Ciao,
   Antonio

--
Antonio Ospite
https://ao2.it
https://twitter.com/ao2it

A: Because it messes up the order in which people normally read text.
   See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gapless playback

adeel
Hi

Hope you people are doing good. 

How can I use gstreamer debugging in my code. As my video sometimes play perfectly some time freezes in the same pipeline and I am not using decklink element in pipeline in my code. I want to check which element is creating issue.

File Type: Mpeg2

Regards
Adeel Arshad

On Sat, Feb 4, 2017 at 5:35 PM, Antonio Ospite <[hidden email]> wrote:
On Wed, 1 Feb 2017 00:03:13 +0500
Adeel Arshad <[hidden email]> wrote:

> 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.
>

Using about-to-finish is the right thing to do, however sometimes I
noticed that the gapless behavior is dependent on the particular codec
used for the video, some codecs allow a finer granularity in seeking
than others, what you are seeing might be related to that.

Ciao,
   Antonio

--
Antonio Ospite
https://ao2.it
https://twitter.com/ao2it

A: Because it messes up the order in which people normally read text.
   See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?


_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gapless playback

Digits
In reply to this post by adeel
Adeel Arshad wrote:
Hope you people are doing good.

How can I use gstreamer debugging in my code. As my video sometimes play
perfectly some time freezes in the same pipeline and I am not using
decklink element in pipeline in my code. I want to check which element is
creating issue.

File Type: Mpeg2

Regards
Adeel Arshad
I tested playbin looping playback using the about-to-finish signal and found MPEG2 and Matroska files do not restart correctly.  The Matroska file restarts at the beginning, freezes at 12 frames then continues from 10 seconds.  The MPEG2 file restarts at 21 frames.  Both Prores422 and MJPEG files play correctly.  Could this be due to the latter (working) file types being I-Frame only codecs?

Regards,

Dave.


_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel