GStreamer: use QMediaStorageLocation to generate capture file names.
Change-Id: I2111eb8e28f60ca6305a48a8ee9299bc14ab0df9 Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
This commit is contained in:
@@ -542,9 +542,10 @@ GstElement *CameraBinSession::buildCameraSource()
|
||||
|
||||
void CameraBinSession::captureImage(int requestId, const QString &fileName)
|
||||
{
|
||||
QString actualFileName = fileName;
|
||||
if (actualFileName.isEmpty())
|
||||
actualFileName = generateFileName("img_", defaultDir(QCamera::CaptureStillImage), "jpg");
|
||||
const QString actualFileName = m_mediaStorageLocation.generateFileName(fileName,
|
||||
QMediaStorageLocation::Pictures,
|
||||
QLatin1String("IMG_"),
|
||||
QLatin1String("jpg"));
|
||||
|
||||
m_requestId = requestId;
|
||||
|
||||
@@ -592,60 +593,6 @@ bool CameraBinSession::setOutputLocation(const QUrl& sink)
|
||||
return true;
|
||||
}
|
||||
|
||||
QDir CameraBinSession::defaultDir(QCamera::CaptureModes mode) const
|
||||
{
|
||||
QStringList dirCandidates;
|
||||
|
||||
#if defined(Q_WS_MAEMO_6)
|
||||
dirCandidates << QLatin1String("/home/user/MyDocs/DCIM");
|
||||
dirCandidates << QLatin1String("/home/user/MyDocs/");
|
||||
#endif
|
||||
|
||||
if (mode == QCamera::CaptureVideo) {
|
||||
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
|
||||
dirCandidates << QDir::home().filePath("Documents/Video");
|
||||
dirCandidates << QDir::home().filePath("Documents/Videos");
|
||||
} else {
|
||||
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
|
||||
dirCandidates << QDir::home().filePath("Documents/Photo");
|
||||
dirCandidates << QDir::home().filePath("Documents/Photos");
|
||||
dirCandidates << QDir::home().filePath("Documents/photo");
|
||||
dirCandidates << QDir::home().filePath("Documents/photos");
|
||||
dirCandidates << QDir::home().filePath("Documents/Images");
|
||||
}
|
||||
|
||||
dirCandidates << QDir::home().filePath("Documents");
|
||||
dirCandidates << QDir::home().filePath("My Documents");
|
||||
dirCandidates << QDir::homePath();
|
||||
dirCandidates << QDir::currentPath();
|
||||
dirCandidates << QDir::tempPath();
|
||||
|
||||
foreach (const QString &path, dirCandidates) {
|
||||
if (QFileInfo(path).isWritable())
|
||||
return QDir(path);
|
||||
}
|
||||
|
||||
return QDir();
|
||||
}
|
||||
|
||||
QString CameraBinSession::generateFileName(const QString &prefix, const QDir &dir, const QString &ext) const
|
||||
{
|
||||
int lastClip = 0;
|
||||
foreach(QString fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(ext))) {
|
||||
int imgNumber = fileName.midRef(prefix.length(), fileName.size()-prefix.length()-ext.length()-1).toInt();
|
||||
lastClip = qMax(lastClip, imgNumber);
|
||||
}
|
||||
|
||||
QString name = QString("%1%2.%3").arg(prefix)
|
||||
.arg(lastClip+1,
|
||||
4, //fieldWidth
|
||||
10,
|
||||
QLatin1Char('0'))
|
||||
.arg(ext);
|
||||
|
||||
return dir.absoluteFilePath(name);
|
||||
}
|
||||
|
||||
void CameraBinSession::setDevice(const QString &device)
|
||||
{
|
||||
if (m_inputDevice != device) {
|
||||
@@ -1122,18 +1069,16 @@ bool CameraBinSession::processBusMessage(const QGstreamerMessage &message)
|
||||
|
||||
void CameraBinSession::recordVideo()
|
||||
{
|
||||
m_recordingActive = true;
|
||||
m_actualSink = m_sink;
|
||||
if (m_actualSink.isEmpty()) {
|
||||
QString ext = m_mediaContainerControl->suggestedFileExtension(m_mediaContainerControl->actualContainerFormat());
|
||||
m_actualSink = QUrl::fromLocalFile(generateFileName("clip_", defaultDir(QCamera::CaptureVideo), ext));
|
||||
} else {
|
||||
// Output location was rejected in setOutputlocation() if not a local file
|
||||
m_actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(m_actualSink);
|
||||
}
|
||||
const QString actualFileName = m_mediaStorageLocation.generateFileName(m_sink.isLocalFile() ? m_sink.toLocalFile()
|
||||
: m_sink.toString(),
|
||||
QMediaStorageLocation::Movies,
|
||||
QLatin1String("clip_"),
|
||||
m_mediaContainerControl->suggestedFileExtension(m_mediaContainerControl->actualContainerFormat()));
|
||||
|
||||
QString fileName = m_actualSink.toLocalFile();
|
||||
g_object_set(G_OBJECT(m_camerabin), FILENAME_PROPERTY, QFile::encodeName(fileName).constData(), NULL);
|
||||
m_recordingActive = true;
|
||||
m_actualSink = QUrl::fromLocalFile(actualFileName);
|
||||
|
||||
g_object_set(G_OBJECT(m_camerabin), FILENAME_PROPERTY, QFile::encodeName(actualFileName).constData(), NULL);
|
||||
|
||||
g_signal_emit_by_name(G_OBJECT(m_camerabin), CAPTURE_START, NULL);
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
|
||||
#include <private/qgstreamerbushelper_p.h>
|
||||
#include <private/qgstreamerbufferprobe_p.h>
|
||||
#include <private/qmediastoragelocation_p.h>
|
||||
#include "qcamera.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
@@ -102,9 +103,6 @@ public:
|
||||
QUrl outputLocation() const;
|
||||
bool setOutputLocation(const QUrl& sink);
|
||||
|
||||
QDir defaultDir(QCamera::CaptureModes mode) const;
|
||||
QString generateFileName(const QString &prefix, const QDir &dir, const QString &ext) const;
|
||||
|
||||
GstElement *buildCameraSource();
|
||||
GstElementFactory *sourceFactory() const { return m_sourceFactory; }
|
||||
|
||||
@@ -209,6 +207,7 @@ private:
|
||||
QString m_inputDevice;
|
||||
bool m_muted;
|
||||
bool m_busy;
|
||||
QMediaStorageLocation m_mediaStorageLocation;
|
||||
|
||||
QCamera::CaptureModes m_captureMode;
|
||||
QMap<QByteArray, QVariant> m_metaData;
|
||||
|
||||
Reference in New Issue
Block a user