Gstreamer noticeable seek gap on windows

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Gstreamer noticeable seek gap on windows

vihaan
I have written a demo program to perform seek . Here is the code


    #define BOOST_ALL_NO_LIB
    #include <iostream>
   
    #include <gst/gst.h>
    #include <glib/gmain.h>
    #include <boost/thread.hpp>
    using namespace std;
    int bus_state_changed(GstBus *bus, GstMessage *msg, gpointer loop)
    {
        std::cerr << "bus message: " << GST_MESSAGE_TYPE_NAME(msg) << std::endl;
            GMainLoop *ptrLoop = (GMainLoop *) loop;
        switch (GST_MESSAGE_TYPE(msg))
        {
        case GST_MESSAGE_EOS:
            std::cout<<"End of stream\n";
            g_main_loop_quit(ptrLoop);
            break;
        case GST_MESSAGE_ERROR:
            {
            GError *err=0;
   
            gst_message_parse_error(msg, &err, 0);
            std::cerr<< "GST_MESSAGE_ERROR: " << err->message << ": "
            << GST_MESSAGE_SRC_NAME(msg);
            g_error_free(err);
            g_main_loop_quit(ptrLoop);
            break;
            }
   
        case GST_MESSAGE_STATE_CHANGED: {
            GstState old_state, new_state;
   
            gst_message_parse_state_changed (msg, &old_state, &new_state, NULL);
            g_print ("Element %s changed state from %s to %s.\n",
                GST_OBJECT_NAME (msg->src),
                gst_element_state_get_name (old_state),
                gst_element_state_get_name (new_state));
            break;
                                        }
   
        default:
            break;
        }
        return true;
    }
   
    int main()
    {
        GMainLoop *loop;
        GstElement *pipeline=0;
        GstBus *bus=0;
        guint busWatchId;
   
        GError *err = 0;
        if(!gst_init_check(0, 0,&err))
        {
            std::string errmsg(err->message);
            g_error_free(err);
        }
   
        loop = g_main_loop_new(NULL, FALSE);
   
        //create a pipeline for audio/video playback
        pipeline = gst_element_factory_make("playbin2", "player");
   
        if(!pipeline)
        {
            std::cout<<"Can not get pipeline";
        }
   
        //get a bus to receive GSTMessages from pipeline.
        bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
   
        if(!bus)
        {
            std::cout<<"Can not get bus";
        }
   
        //when the state of bus changes call bus_state_changed function.
        busWatchId = gst_bus_add_watch(bus, bus_state_changed, loop);
        //make the pipeline ready to use.
        gst_element_set_state(pipeline, GST_STATE_READY);
   
        boost::thread gloopThread([&](){g_main_loop_run(loop);});
   
    g_object_set(G_OBJECT(pipeline), "uri","file:///C:/song.mp3" , 0);
    gst_element_set_state(pipeline, GST_STATE_PLAYING);
   
   
    std::cout<<"Seek will be perfomed now "<<std::endl;
    gint64 pos =-1;
    GstFormat fmt = GST_FORMAT_TIME;
        while(true)
        {
   
        if (!gst_element_query_position(pipeline, &fmt, &pos))
    {
        std::cerr << "gst_element_query_position failed" << std::endl;
    }
        //std::cout<<"\nCurrent Position"<<pos<<std::endl;
        if(pos > 2807641720)  // 3 seconds
        {
        if (!gst_element_seek_simple(pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,44531201814 ))
    {
        std::cerr << "gst_element_seek failed" << std::endl;
    }
   
        GstStateChangeReturn r = gst_element_get_state(pipeline, 0, 0, -1);
        std::cout << "state change return = " << r << std::endl;
   
            if (!gst_element_query_position(pipeline, &fmt, &pos))
    {
        std::cerr << "gst_element_query_position failed 2" << std::endl;
    }
        //std::cout<<"\nCurrent Position :"<<pos<<std::endl;
    break;
        }
       }
        while(true)
        {
   
            gst_element_query_position(pipeline, &fmt, &pos);
        //std::cout<<"\nCurrent Position"<<pos<<std::endl;
        if(pos > 47531201814)  // 3 seconds
        {
        gst_element_seek_simple(pipeline, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,50531201814 );
            gst_element_query_position(pipeline, &fmt, &pos);
        //std::cout<<"\nCurrent Position :"<<pos<<std::endl;
        break;
        }
       }
        while(true);
   
   
        return 0;
    }

here is my .pro file

    TEMPLATE = app
    CONFIG += console
    CONFIG -= qt
   
    SOURCES += main.cpp
    QMAKE_CXXFLAGS += -std=c++0x
   
    CONFIG += link_pkgconfig
    PKGCONFIG += gstreamer-0.10
   
   
    win32: INCLUDEPATH += c:\boost_1_48_0 \
   
    win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../boost_1_48_0/stage/lib/ -lboost_thread-vc100-mt-1_48
    else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../boost_1_48_0/stage/lib/ -lboost_thread-vc100-mt-gd-1_48
   
    INCLUDEPATH += $$PWD/../../../boost_1_48_0/stage
    DEPENDPATH += $$PWD/../../../boost_1_48_0/stage

On running the code , the song plays fine but there is a seek gap when seeking is triggered. The same code runs flawlessly on linux . I m not able to understand where the problem lies . Thanks