I've written C++ wrapper for each Gstreamer types. They're simple and intuitive, so I don't think their implementation needs to be posted here (though I could post them (maybe at github) if need arises).
The problem I'm facing is that I start playing a video (and simulteneously saving it to a file using gst tee element)....and while it is playing, I pause (from different thread) which is working great. However, when I want to resume it, it doesn't work:
void pause()
{
_pipeline.state(GST_STATE_PAUSED)
}
void resume()
{
_pipeline.state(GST_STATE_PLAYING);
}
And here is the play()
function where I create the pipeline and set it state to GST_STATE_PLAYING.
int play(std::string const & source_path, std::string const & save_as_file)
{
gst::element source(source_path.substr(0,4) == "http" ? "souphttpsrc" : "filesrc", "media-source");
gst::element demuxer("decodebin", "decoder");
gst::element vconv("videoconvert", "vconverter");
gst::element vsink("autovideosink", "video-output");
gst::element aconv("audioconvert", "aconverter");
gst::element asink("autoaudiosink", "audio-output");
gst::element filesink("filesink", "file-sink");
gst::element fq("queue", "file-queqe");
gst::element tee("tee", "media-tee");
gst::element aq("queue", "audio-queue");
gst::element vq("queue", "video-queue");
source.set("location", source_path.c_str());
gst::bus bus = _pipeline.bus();
guint bus_watch_id = _session.add_watch(bus);
_pipeline.add(source, demuxer, vconv, vsink, aconv, asink, filesink, tee,fq, aq, vq);
gst::element::link(source, tee);
gst::element::link(vq, vconv, vsink);
gst::element::link(aq, aconv, asink);
gst::pad tee_src_pad = tee.request_pad("src_%u");
gst::pad demuxer_sink_pad = demuxer.static_pad("sink");
gst::pad::link(tee_src_pad, demuxer_sink_pad);
filesink.set("location", save_as_file.c_str());
gst::element::link(fq, filesink);
gst::pad tee_src_pad2 = tee.request_pad("src_%u");
gst::pad fq_pad = fq.static_pad ("sink");
gst::pad::link(tee_src_pad2, fq_pad);
gst::element::dynamic_link(demuxer, aq);
gst::element::dynamic_link(demuxer, vq);
g_print ("Now playing: %s\n", source_path.c_str());
_pipeline.state(GST_STATE_PLAYING);
//code
_session.run()
//cleanup
}
I'd appreciate if anybody could help me figuring out the solution to this problem.
I'm playing the video on Qt widget using its handle and passing it to gstreamer video overlay.