GstElement* _pipeline = nullptr; GstElement* _reader = nullptr; GstElement* _demuxer = nullptr; GstElement* _videoDecoder = nullptr; GstElement* _videoStream = nullptr; GstElement* MakePlaybackPipeline(const char* path) { GstElement* result = gst_pipeline_new("VideoPlayback"); //init file reding _reader = gst_element_factory_make("filesrc", "Reader"); g_object_set(_reader, "location", path, NULL); //init video demuxing _demuxer = gst_element_factory_make("matroskademux", "Demuxer"); g_signal_connect(_demuxer, "pad-added", G_CALLBACK(NewPadAdded), this); //init video videoDecoder _videoDecoder = gst_element_factory_make("jpegdec", "VideoDecoder"); //init video processor _videoStream = gst_element_factory_make("autovideosink", "VideoFrame"); //build the pipeline gst_bin_add_many(GST_BIN(result), _reader, _demuxer, _videoDecoder, _videoStream, NULL ); //link common elemets if ((bool)gst_element_link(_reader, _demuxer) != true) { throw 5; } //link video elemets if ((bool)gst_element_link(_videoDecoder, _videoStream) != true) { throw 5; } return result; } //link video pad void NewPadAdded(GstElement* element,GstPad* pad, void* data) { GStreamerPlayer* player = (GStreamerPlayer*)data; gchar *name = gst_pad_get_name(pad); GstPad* decoderPad = gst_element_get_static_pad(player->_videoDecoder, "sink"); if (name[0] == 'v') //video_0 gst_pad_link(pad, decoderPad ); } main() { _pipeline = MakePlaybackPipeline("C:\\VideoID\\Video\\1474531038942.mkv"); //start recording GstStateChangeReturn status; status = gst_element_set_state(_pipeline, GST_STATE_PLAYING); if (status == GST_STATE_CHANGE_FAILURE) { throw 1; } //some other code }