Gstreamer noticeable seek gap on windows

vihaan vickey at tunebasket.com
Wed Jul 18 05:13:33 PDT 2012


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

--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Gstreamer-noticeable-seek-gap-on-windows-tp4655634.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list