From ca94dc79b6f0e57ba7446a87c70398a178fbcac8 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Thu, 2 Oct 2014 14:21:20 +0200 Subject: GStreamer: fix QMediaRecorder::duration() when recording with a camera To get the recording duration, we were using the camerabin's position, which represents the time since it was started, not the time it's been recording to a file. We now retrieve the camerabin's filesink position. Change-Id: I68eeb25d1718666288655d22deea23e25de73b90 Reviewed-by: Andrew den Exter --- src/plugins/gstreamer/camerabin/camerabinsession.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 850f8c16c..019783971 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -98,6 +98,8 @@ #define CAPTURE_START "start-capture" #define CAPTURE_STOP "stop-capture" +#define FILESINK_BIN_NAME "videobin-filesink" + #define CAMERABIN_IMAGE_MODE 1 #define CAMERABIN_VIDEO_MODE 2 @@ -721,13 +723,19 @@ void CameraBinSession::updateBusyStatus(GObject *o, GParamSpec *p, gpointer d) qint64 CameraBinSession::duration() const { - GstFormat format = GST_FORMAT_TIME; - gint64 duration = 0; + if (m_camerabin) { + GstElement *fileSink = gst_bin_get_by_name(GST_BIN(m_camerabin), FILESINK_BIN_NAME); + if (fileSink) { + GstFormat format = GST_FORMAT_TIME; + gint64 duration = 0; + bool ret = gst_element_query_position(fileSink, &format, &duration); + gst_object_unref(GST_OBJECT(fileSink)); + if (ret) + return duration / 1000000; + } + } - if ( m_camerabin && gst_element_query_position(m_camerabin, &format, &duration)) - return duration / 1000000; - else - return 0; + return 0; } bool CameraBinSession::isMuted() const -- cgit v1.2.3