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 <andrew.den.exter@qinetic.com.au>
This commit is contained in:
Yoann Lopes
2014-10-02 14:21:20 +02:00
committed by Yoann Lopes
parent f02d9e9343
commit ca94dc79b6

View File

@@ -98,6 +98,8 @@
#define CAPTURE_START "start-capture" #define CAPTURE_START "start-capture"
#define CAPTURE_STOP "stop-capture" #define CAPTURE_STOP "stop-capture"
#define FILESINK_BIN_NAME "videobin-filesink"
#define CAMERABIN_IMAGE_MODE 1 #define CAMERABIN_IMAGE_MODE 1
#define CAMERABIN_VIDEO_MODE 2 #define CAMERABIN_VIDEO_MODE 2
@@ -721,13 +723,19 @@ void CameraBinSession::updateBusyStatus(GObject *o, GParamSpec *p, gpointer d)
qint64 CameraBinSession::duration() const qint64 CameraBinSession::duration() const
{ {
GstFormat format = GST_FORMAT_TIME; if (m_camerabin) {
gint64 duration = 0; 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 0;
return duration / 1000000;
else
return 0;
} }
bool CameraBinSession::isMuted() const bool CameraBinSession::isMuted() const