Hi, I've been trying to use gst_element_seek_simple() to move around in a video file. I'm using gstreamer 1.8.2 on Windows 7 and 10 with Visual Studio 2010.I'm building the pipeline using gst_parse_launch (). gchar location[] = "C:\\temp\\test.h264"; CustomData customdata; memset(&customdata, 0, sizeof(customdata)); gst_init(NULL, NULL); gst_debug_set_threshold_from_string("video*:6", TRUE); GError *error = NULL; GstElement *pipeline = gst_parse_launch("filesrc name=src ! decodebin name=dec ! videoconvert name=conv ! autovideosink name=sink", &error); customdata.pipeline = pipeline; // set file GstElement *src = gst_bin_get_by_name(GST_BIN(pipeline), "src"); g_object_set(src, "location", location, NULL); // GstElement *dec = gst_bin_get_by_name(GST_BIN(pipeline), "dec"); if (dec) { g_signal_connect(dec, "pad-added", G_CALLBACK(cb_newpad), (gpointer)&customdata); } GstElement *conv = gst_bin_get_by_name(GST_BIN(pipeline), "conv"); customdata.conv = conv; GstElement *sink = gst_bin_get_by_name(GST_BIN(pipeline), "sink"); GstCaps *appsink_caps = gst_caps_from_string(APPSINK_CAPS); g_object_set(G_OBJECT(sink), "caps", appsink_caps, NULL); gst_caps_unref(appsink_caps); GstAppSink *appsink = (GstAppSink *)sink; gst_app_sink_set_max_buffers(appsink, 300); // limit number of buffers queued gst_app_sink_set_drop(appsink, true); GstStateChangeReturn ret = gst_element_set_state(pipeline, GST_STATE_PAUSED); GThread *main_loop_thread = g_thread_new("main_loop_thread", &thread_func_main_loop_run, (gpointer)&customdata); I'm able to see video frames with this. I have some code that lets me step through the video using gst_event_new_step(). I'm able to seek using GST_FORMAT_TIME and gst_element_seek_simple() The following code returns true and I can see the video change to a new frame. success = gst_element_seek_simple(GST_FORMAT_TIME, format, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SNAP_NEAREST), position); Switching to GST_FORMAT_BYTES, gst_element_seek_simple returns false success = gst_element_seek_simple(GST_FORMAT_BYTES, format, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SNAP_NEAREST), position); debug output says there's a problem with converting 0:03:40.267769863 4668 00000000035CD1E0 DEBUG videodecoder gstvideodecoder.c:1671:gst_video_decoder_src_event:<avdec_h264-0> received event 51201, seek 0:03:40.269860528 4668 00000000035CD1E0 DEBUG videodecoder gstvideodecoder.c:1572:gst_video_decoder_src_event_default:<avdec_h264-0> received event 51201, seek 0:03:40.272414995 4668 00000000035CD1E0 DEBUG videodecoder gstvideodecoder.c:1812:gst_video_decoder_src_query:<avdec_h264-0> received query 20483, convert 0:03:40.307895856 4668 00000000035CD1E0 LOG videodecoder gstvideodecoder.c:1685:gst_video_decoder_src_query_default:<avdec_h264-0> handling query: convert query: 00000000035B3DD0, GstQueryConvert, src_format=(GstFormat)GST_FORMAT_BYTES, src_value=(gint64)713509, dest_format=(GstFormat)GST_FORMAT_TIME, dest_value=(gint64)-1; 0:03:40.318774662 4668 00000000035CD1E0 DEBUG videodecoder gstvideodecoder.c:1751:gst_video_decoder_src_query_default:<avdec_h264-0> convert query 0:03:40.321472536 4668 00000000035CD1E0 ERROR videodecoder gstvideodecoder.c:1797:gst_video_decoder_src_query_default:<avdec_h264-0> query failed 0:03:40.353767622 4668 00000000035CD1E0 DEBUG videodecoder gstvideodecoder.c:1656:gst_video_decoder_src_event_default:<avdec_h264-0> could not convert format I'm new to gstreamer and I'm not sure what this means. Presumably the byte format has to be changed into a time in the video. Is there something I should be doing to make this conversion happen? Trying to convert using gst_element_query_convert() gets me the same error message. _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |