gst_element_seek_simple returns false using GST_FORMAT_BYTES format

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

gst_element_seek_simple returns false using GST_FORMAT_BYTES format

greg gallardo
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.     

Thanks,

Greg

 


_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel