GStreamer camerabin: don't recreate camera source on device change.
Change-Id: If62573b11c8e3112d386d93de9a504f49965d597 Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
This commit is contained in:
@@ -461,7 +461,7 @@ GstElement *CameraBinSession::buildCameraSource()
|
|||||||
GstElement *camSrc = 0;
|
GstElement *camSrc = 0;
|
||||||
g_object_get(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, &camSrc, NULL);
|
g_object_get(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, &camSrc, NULL);
|
||||||
|
|
||||||
if (m_sourceFactory)
|
if (!m_cameraSrc && m_sourceFactory)
|
||||||
m_cameraSrc = gst_element_factory_create(m_sourceFactory, "camera_source");
|
m_cameraSrc = gst_element_factory_create(m_sourceFactory, "camera_source");
|
||||||
|
|
||||||
// If gstreamer has set a default source use it.
|
// If gstreamer has set a default source use it.
|
||||||
@@ -477,8 +477,7 @@ GstElement *CameraBinSession::buildCameraSource()
|
|||||||
m_usingWrapperCameraBinSrc = qstrcmp(cameraSrcName, "wrappercamerabinsrc") == 0;
|
m_usingWrapperCameraBinSrc = qstrcmp(cameraSrcName, "wrappercamerabinsrc") == 0;
|
||||||
|
|
||||||
if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "video-source")) {
|
if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "video-source")) {
|
||||||
GstElement *src = 0;
|
if (!m_videoSrc) {
|
||||||
|
|
||||||
/* QT_GSTREAMER_CAMERABIN_VIDEOSRC can be used to set the video source element.
|
/* QT_GSTREAMER_CAMERABIN_VIDEOSRC can be used to set the video source element.
|
||||||
|
|
||||||
--- Usage
|
--- Usage
|
||||||
@@ -497,30 +496,32 @@ GstElement *CameraBinSession::buildCameraSource()
|
|||||||
QT_GSTREAMER_CAMERABIN_VIDEOSRC="somedriver=somevideosrc,somevideosrc2"
|
QT_GSTREAMER_CAMERABIN_VIDEOSRC="somedriver=somevideosrc,somevideosrc2"
|
||||||
*/
|
*/
|
||||||
const QByteArray envVideoSource = qgetenv("QT_GSTREAMER_CAMERABIN_VIDEOSRC");
|
const QByteArray envVideoSource = qgetenv("QT_GSTREAMER_CAMERABIN_VIDEOSRC");
|
||||||
|
|
||||||
if (!envVideoSource.isEmpty()) {
|
if (!envVideoSource.isEmpty()) {
|
||||||
QList<QByteArray> sources = envVideoSource.split(',');
|
QList<QByteArray> sources = envVideoSource.split(',');
|
||||||
foreach (const QByteArray &source, sources) {
|
foreach (const QByteArray &source, sources) {
|
||||||
QList<QByteArray> keyValue = source.split('=');
|
QList<QByteArray> keyValue = source.split('=');
|
||||||
if (keyValue.count() == 1) {
|
if (keyValue.count() == 1) {
|
||||||
src = gst_element_factory_make(keyValue.at(0), "camera_source");
|
m_videoSrc = gst_element_factory_make(keyValue.at(0), "camera_source");
|
||||||
break;
|
break;
|
||||||
} else if (keyValue.at(0) == QGstUtils::cameraDriver(m_inputDevice, m_sourceFactory)) {
|
} else if (keyValue.at(0) == QGstUtils::cameraDriver(m_inputDevice, m_sourceFactory)) {
|
||||||
src = gst_element_factory_make(keyValue.at(1), "camera_source");
|
m_videoSrc = gst_element_factory_make(keyValue.at(1), "camera_source");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (m_videoInputFactory) {
|
} else if (m_videoInputFactory) {
|
||||||
src = m_videoInputFactory->buildElement();
|
m_videoSrc = m_videoInputFactory->buildElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!src)
|
if (!m_videoSrc)
|
||||||
src = gst_element_factory_make("v4l2src", "camera_source");
|
m_videoSrc = gst_element_factory_make("v4l2src", "camera_source");
|
||||||
|
|
||||||
if (src) {
|
g_object_set(G_OBJECT(m_cameraSrc), "video-source", m_videoSrc, NULL);
|
||||||
g_object_set(G_OBJECT(src), "device", m_inputDevice.toUtf8().constData(), NULL);
|
|
||||||
g_object_set(G_OBJECT(m_cameraSrc), "video-source", src, NULL);
|
|
||||||
m_videoSrc = src;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_videoSrc)
|
||||||
|
g_object_set(G_OBJECT(m_videoSrc), "device", m_inputDevice.toUtf8().constData(), NULL);
|
||||||
|
|
||||||
} else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) {
|
} else if (g_object_class_find_property(G_OBJECT_GET_CLASS(m_cameraSrc), "camera-device")) {
|
||||||
if (m_inputDevice == QLatin1String("secondary")) {
|
if (m_inputDevice == QLatin1String("secondary")) {
|
||||||
g_object_set(G_OBJECT(m_cameraSrc), "camera-device", 1, NULL);
|
g_object_set(G_OBJECT(m_cameraSrc), "camera-device", 1, NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user