Moved QMediaStorageLocation out of the Android plugin.

It's now a private API in the QtMultimedia library in order to be
accessible in other plugins.

Change-Id: I63541de1e8c540cebc210f9037646ce74d866c6f
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
This commit is contained in:
Yoann Lopes
2014-04-09 19:13:45 +02:00
committed by The Qt Project
parent 703ee3879b
commit 5339aed040
8 changed files with 82 additions and 49 deletions

View File

@@ -21,7 +21,8 @@ PRIVATE_HEADERS += \
qmediaserviceprovider_p.h \ qmediaserviceprovider_p.h \
qmediaresourcepolicyplugin_p.h \ qmediaresourcepolicyplugin_p.h \
qmediaresourcepolicy_p.h \ qmediaresourcepolicy_p.h \
qmediaresourceset_p.h qmediaresourceset_p.h \
qmediastoragelocation_p.h
PUBLIC_HEADERS += \ PUBLIC_HEADERS += \
qmediabindableinterface.h \ qmediabindableinterface.h \
@@ -47,6 +48,7 @@ SOURCES += \
qmediaresourcepolicyplugin_p.cpp \ qmediaresourcepolicyplugin_p.cpp \
qmediaresourcepolicy_p.cpp \ qmediaresourcepolicy_p.cpp \
qmediaresourceset_p.cpp \ qmediaresourceset_p.cpp \
qmediastoragelocation.cpp \
qmultimedia.cpp qmultimedia.cpp
include(audio/audio.pri) include(audio/audio.pri)

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -39,24 +39,40 @@
** **
****************************************************************************/ ****************************************************************************/
#include "qandroidmediastoragelocation.h" #include "qmediastoragelocation_p.h"
#include "jmultimediautils.h" #include <QStandardPaths>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
QAndroidMediaStorageLocation::QAndroidMediaStorageLocation() QMediaStorageLocation::QMediaStorageLocation()
{ {
} }
QDir QAndroidMediaStorageLocation::defaultDir(CaptureSource source) const void QMediaStorageLocation::addStorageLocation(MediaType type, const QString &location)
{
m_customLocations[type].append(location);
}
QDir QMediaStorageLocation::defaultLocation(MediaType type) const
{ {
QStringList dirCandidates; QStringList dirCandidates;
if (source == Camera) dirCandidates << m_customLocations.value(type);
dirCandidates << JMultimediaUtils::getDefaultMediaDirectory(JMultimediaUtils::DCIM);
else switch (type) {
dirCandidates << JMultimediaUtils::getDefaultMediaDirectory(JMultimediaUtils::Sounds); case Movies:
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MoviesLocation);
break;
case Music:
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::MusicLocation);
break;
case Pictures:
dirCandidates << QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
default:
break;
}
dirCandidates << QDir::homePath(); dirCandidates << QDir::homePath();
dirCandidates << QDir::currentPath(); dirCandidates << QDir::currentPath();
dirCandidates << QDir::tempPath(); dirCandidates << QDir::tempPath();
@@ -69,31 +85,31 @@ QDir QAndroidMediaStorageLocation::defaultDir(CaptureSource source) const
return QDir(); return QDir();
} }
QString QAndroidMediaStorageLocation::generateFileName(const QString &requestedName, QString QMediaStorageLocation::generateFileName(const QString &requestedName,
CaptureSource source, MediaType type,
const QString &prefix, const QString &prefix,
const QString &extension) const const QString &extension) const
{ {
if (requestedName.isEmpty()) if (requestedName.isEmpty())
return generateFileName(prefix, defaultDir(source), extension); return generateFileName(prefix, defaultLocation(type), extension);
QString path = requestedName; QString path = requestedName;
if (QFileInfo(path).isRelative()) if (QFileInfo(path).isRelative())
path = defaultDir(source).absoluteFilePath(path); path = defaultLocation(type).absoluteFilePath(path);
if (QFileInfo(path).isDir()) if (QFileInfo(path).isDir())
return generateFileName(prefix, QDir(path), extension); return generateFileName(prefix, QDir(path), extension);
if (!path.endsWith(extension)) if (!path.endsWith(extension))
path.append(QString(".%1").arg(extension)); path.append(QString(QLatin1String(".%1")).arg(extension));
return path; return path;
} }
QString QAndroidMediaStorageLocation::generateFileName(const QString &prefix, QString QMediaStorageLocation::generateFileName(const QString &prefix,
const QDir &dir, const QDir &dir,
const QString &extension) const const QString &extension) const
{ {
QMutexLocker lock(&m_mutex); QMutexLocker lock(&m_mutex);
@@ -102,7 +118,7 @@ QString QAndroidMediaStorageLocation::generateFileName(const QString &prefix,
if (lastMediaIndex == 0) { if (lastMediaIndex == 0) {
// first run, find the maximum media number during the fist capture // first run, find the maximum media number during the fist capture
Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString("%1*.%2").arg(prefix).arg(extension))) { Q_FOREACH (const QString &fileName, dir.entryList(QStringList() << QString(QLatin1String("%1*.%2")).arg(prefix).arg(extension))) {
const qint64 mediaIndex = fileName.midRef(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt(); const qint64 mediaIndex = fileName.midRef(prefix.length(), fileName.size() - prefix.length() - extension.length() - 1).toInt();
lastMediaIndex = qMax(lastMediaIndex, mediaIndex); lastMediaIndex = qMax(lastMediaIndex, mediaIndex);
} }
@@ -111,7 +127,7 @@ QString QAndroidMediaStorageLocation::generateFileName(const QString &prefix,
// don't just rely on cached lastMediaIndex value, // don't just rely on cached lastMediaIndex value,
// someone else may create a file after camera started // someone else may create a file after camera started
while (true) { while (true) {
const QString name = QString("%1%2.%3").arg(prefix) const QString name = QString(QLatin1String("%1%2.%3")).arg(prefix)
.arg(lastMediaIndex + 1, 8, 10, QLatin1Char('0')) .arg(lastMediaIndex + 1, 8, 10, QLatin1Char('0'))
.arg(extension); .arg(extension);

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -39,37 +39,42 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef QANDROIDMEDIASTORAGELOCATION_H #ifndef QMEDIASTORAGELOCATION_H
#define QANDROIDMEDIASTORAGELOCATION_H #define QMEDIASTORAGELOCATION_H
#include <QCamera> #include <qtmultimediadefs.h>
#include <QDir> #include <QDir>
#include <QMap>
#include <QHash> #include <QHash>
#include <QMutex> #include <QMutex>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QAndroidMediaStorageLocation class Q_MULTIMEDIA_EXPORT QMediaStorageLocation
{ {
public: public:
enum CaptureSource { enum MediaType {
Camera, Movies,
Audio Music,
Pictures,
Sounds
}; };
QAndroidMediaStorageLocation(); QMediaStorageLocation();
QDir defaultDir(CaptureSource source) const; void addStorageLocation(MediaType type, const QString &location);
QString generateFileName(const QString &requestedName, CaptureSource source, const QString &prefix, const QString &extension) const; QDir defaultLocation(MediaType type) const;
QString generateFileName(const QString &requestedName, MediaType type, const QString &prefix, const QString &extension) const;
QString generateFileName(const QString &prefix, const QDir &dir, const QString &extension) const; QString generateFileName(const QString &prefix, const QDir &dir, const QString &extension) const;
private: private:
mutable QHash<QString, qint64> m_lastUsedIndex;
mutable QMutex m_mutex; mutable QMutex m_mutex;
mutable QHash<QString, qint64> m_lastUsedIndex;
QMap<MediaType, QStringList> m_customLocations;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QANDROIDMEDIASTORAGELOCATION_H #endif // QMEDIASTORAGELOCATION_H

View File

@@ -12,7 +12,6 @@ SOURCES += \
$$PWD/qandroidcameraimagecapturecontrol.cpp \ $$PWD/qandroidcameraimagecapturecontrol.cpp \
$$PWD/qandroidcameracapturedestinationcontrol.cpp \ $$PWD/qandroidcameracapturedestinationcontrol.cpp \
$$PWD/qandroidcameracapturebufferformatcontrol.cpp \ $$PWD/qandroidcameracapturebufferformatcontrol.cpp \
$$PWD/qandroidmediastoragelocation.cpp \
$$PWD/qandroidcameraflashcontrol.cpp \ $$PWD/qandroidcameraflashcontrol.cpp \
$$PWD/qandroidcamerafocuscontrol.cpp \ $$PWD/qandroidcamerafocuscontrol.cpp \
$$PWD/qandroidcameralockscontrol.cpp \ $$PWD/qandroidcameralockscontrol.cpp \
@@ -37,7 +36,6 @@ HEADERS += \
$$PWD/qandroidcameraimagecapturecontrol.h \ $$PWD/qandroidcameraimagecapturecontrol.h \
$$PWD/qandroidcameracapturedestinationcontrol.h \ $$PWD/qandroidcameracapturedestinationcontrol.h \
$$PWD/qandroidcameracapturebufferformatcontrol.h \ $$PWD/qandroidcameracapturebufferformatcontrol.h \
$$PWD/qandroidmediastoragelocation.h \
$$PWD/qandroidcameraflashcontrol.h \ $$PWD/qandroidcameraflashcontrol.h \
$$PWD/qandroidcamerafocuscontrol.h \ $$PWD/qandroidcamerafocuscontrol.h \
$$PWD/qandroidcameralockscontrol.h \ $$PWD/qandroidcameralockscontrol.h \

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -111,6 +111,10 @@ QAndroidCameraSession::QAndroidCameraSession(QObject *parent)
, m_captureCanceled(false) , m_captureCanceled(false)
, m_currentImageCaptureId(-1) , m_currentImageCaptureId(-1)
{ {
m_mediaStorageLocation.addStorageLocation(
QMediaStorageLocation::Pictures,
JMultimediaUtils::getDefaultMediaDirectory(JMultimediaUtils::DCIM));
if (qApp) { if (qApp) {
connect(qApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)), connect(qApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)),
this, SLOT(onApplicationStateChanged(Qt::ApplicationState))); this, SLOT(onApplicationStateChanged(Qt::ApplicationState)));
@@ -644,7 +648,7 @@ void QAndroidCameraSession::processCapturedImage(int id,
if (dest & QCameraImageCapture::CaptureToFile) { if (dest & QCameraImageCapture::CaptureToFile) {
const QString actualFileName = m_mediaStorageLocation.generateFileName(fileName, const QString actualFileName = m_mediaStorageLocation.generateFileName(fileName,
QAndroidMediaStorageLocation::Camera, QMediaStorageLocation::Pictures,
QLatin1String("IMG_"), QLatin1String("IMG_"),
QLatin1String("jpg")); QLatin1String("jpg"));

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -47,7 +47,7 @@
#include <QCameraImageCapture> #include <QCameraImageCapture>
#include <QSet> #include <QSet>
#include <QMutex> #include <QMutex>
#include "qandroidmediastoragelocation.h" #include <private/qmediastoragelocation_p.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -174,7 +174,7 @@ private:
int m_currentImageCaptureId; int m_currentImageCaptureId;
QString m_currentImageCaptureFileName; QString m_currentImageCaptureFileName;
QAndroidMediaStorageLocation m_mediaStorageLocation; QMediaStorageLocation m_mediaStorageLocation;
QSet<QAndroidMediaVideoProbeControl *> m_videoProbes; QSet<QAndroidMediaVideoProbeControl *> m_videoProbes;
QMutex m_videoProbesMutex; QMutex m_videoProbesMutex;

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -65,6 +65,14 @@ QAndroidCaptureSession::QAndroidCaptureSession(QAndroidCameraSession *cameraSess
, m_audioEncoder(JMediaRecorder::DefaultAudioEncoder) , m_audioEncoder(JMediaRecorder::DefaultAudioEncoder)
, m_videoEncoder(JMediaRecorder::DefaultVideoEncoder) , m_videoEncoder(JMediaRecorder::DefaultVideoEncoder)
{ {
m_mediaStorageLocation.addStorageLocation(
QMediaStorageLocation::Movies,
JMultimediaUtils::getDefaultMediaDirectory(JMultimediaUtils::DCIM));
m_mediaStorageLocation.addStorageLocation(
QMediaStorageLocation::Sounds,
JMultimediaUtils::getDefaultMediaDirectory(JMultimediaUtils::Sounds));
connect(this, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateStatus())); connect(this, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateStatus()));
if (cameraSession) { if (cameraSession) {
@@ -214,8 +222,8 @@ bool QAndroidCaptureSession::start()
QString filePath = m_mediaStorageLocation.generateFileName( QString filePath = m_mediaStorageLocation.generateFileName(
m_requestedOutputLocation.isLocalFile() ? m_requestedOutputLocation.toLocalFile() m_requestedOutputLocation.isLocalFile() ? m_requestedOutputLocation.toLocalFile()
: m_requestedOutputLocation.toString(), : m_requestedOutputLocation.toString(),
m_cameraSession ? QAndroidMediaStorageLocation::Camera m_cameraSession ? QMediaStorageLocation::Movies
: QAndroidMediaStorageLocation::Audio, : QMediaStorageLocation::Sounds,
m_cameraSession ? QLatin1String("VID_") m_cameraSession ? QLatin1String("VID_")
: QLatin1String("REC_"), : QLatin1String("REC_"),
m_containerFormat); m_containerFormat);

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -47,7 +47,7 @@
#include <qurl.h> #include <qurl.h>
#include <qelapsedtimer.h> #include <qelapsedtimer.h>
#include <qtimer.h> #include <qtimer.h>
#include "qandroidmediastoragelocation.h" #include <private/qmediastoragelocation_p.h>
#include "jmediarecorder.h" #include "jmediarecorder.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -152,7 +152,7 @@ private:
QString m_audioInput; QString m_audioInput;
JMediaRecorder::AudioSource m_audioSource; JMediaRecorder::AudioSource m_audioSource;
QAndroidMediaStorageLocation m_mediaStorageLocation; QMediaStorageLocation m_mediaStorageLocation;
QElapsedTimer m_elapsedTime; QElapsedTimer m_elapsedTime;
QTimer m_notifyTimer; QTimer m_notifyTimer;