Merge "Nuplayer logging empty records to media.metrics" into oc-dev
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index 4d8dd3c..80aad2f 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -908,9 +908,7 @@
if (listComponents) {
sp<IOMX> omx;
- int32_t trebleOmx = property_get_int32("persist.media.treble_omx", -1);
- if ((trebleOmx == 1) || ((trebleOmx == -1) &&
- property_get_bool("persist.hal.binderization", 0))) {
+ if (property_get_bool("persist.media.treble_omx", true)) {
using namespace ::android::hardware::media::omx::V1_0;
sp<IOmx> tOmx = IOmx::getService();
diff --git a/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp b/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp
index 8cc5ee9..5fdac5c 100644
--- a/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp
+++ b/drm/mediadrm/plugins/clearkey/DrmPlugin.cpp
@@ -37,6 +37,9 @@
status_t DrmPlugin::closeSession(const Vector<uint8_t>& sessionId) {
sp<Session> session = mSessionLibrary->findSession(sessionId);
+ if (sessionId.size() == 0) {
+ return android::BAD_VALUE;
+ }
if (session.get()) {
mSessionLibrary->destroySession(session);
return android::OK;
@@ -54,6 +57,9 @@
String8& defaultUrl,
DrmPlugin::KeyRequestType *keyRequestType) {
UNUSED(optionalParameters);
+ if (scope.size() == 0) {
+ return android::BAD_VALUE;
+ }
if (keyType != kKeyType_Streaming) {
return android::ERROR_DRM_CANNOT_HANDLE;
}
@@ -70,6 +76,9 @@
const Vector<uint8_t>& scope,
const Vector<uint8_t>& response,
Vector<uint8_t>& keySetId) {
+ if (scope.size() == 0 || response.size() == 0) {
+ return android::BAD_VALUE;
+ }
sp<Session> session = mSessionLibrary->findSession(scope);
if (!session.get()) {
return android::ERROR_DRM_SESSION_NOT_OPENED;
diff --git a/drm/mediadrm/plugins/clearkey/DrmPlugin.h b/drm/mediadrm/plugins/clearkey/DrmPlugin.h
index c4d934e..d5a47ca 100644
--- a/drm/mediadrm/plugins/clearkey/DrmPlugin.h
+++ b/drm/mediadrm/plugins/clearkey/DrmPlugin.h
@@ -99,9 +99,12 @@
const Vector<uint8_t>& response,
Vector<uint8_t>& certificate,
Vector<uint8_t>& wrappedKey) {
- UNUSED(response);
UNUSED(certificate);
UNUSED(wrappedKey);
+ if (response.size() == 0) {
+ // empty response
+ return android::BAD_VALUE;
+ }
return android::ERROR_DRM_CANNOT_HANDLE;
}
@@ -111,13 +114,18 @@
}
virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
- UNUSED(ssid);
+ if (ssid.size() == 0) {
+ return android::BAD_VALUE;
+ }
+
UNUSED(secureStop);
return android::ERROR_DRM_CANNOT_HANDLE;
}
virtual status_t releaseSecureStops(const Vector<uint8_t>& ssRelease) {
- UNUSED(ssRelease);
+ if (ssRelease.size() == 0) {
+ return android::BAD_VALUE;
+ }
return android::ERROR_DRM_CANNOT_HANDLE;
}
@@ -151,15 +159,17 @@
virtual status_t setCipherAlgorithm(
const Vector<uint8_t>& sessionId, const String8& algorithm) {
- UNUSED(sessionId);
- UNUSED(algorithm);
+ if (sessionId.size() == 0 || algorithm.size() == 0) {
+ return android::BAD_VALUE;
+ }
return android::ERROR_DRM_CANNOT_HANDLE;
}
virtual status_t setMacAlgorithm(
const Vector<uint8_t>& sessionId, const String8& algorithm) {
- UNUSED(sessionId);
- UNUSED(algorithm);
+ if (sessionId.size() == 0 || algorithm.size() == 0) {
+ return android::BAD_VALUE;
+ }
return android::ERROR_DRM_CANNOT_HANDLE;
}
diff --git a/media/libaaudio/include/aaudio/AAudioDefinitions.h b/media/libaaudio/include/aaudio/AAudioDefinitions.h
index e5b7d7a..846318c 100644
--- a/media/libaaudio/include/aaudio/AAudioDefinitions.h
+++ b/media/libaaudio/include/aaudio/AAudioDefinitions.h
@@ -46,6 +46,12 @@
AAUDIO_FORMAT_PCM_I8_24,
AAUDIO_FORMAT_PCM_I32
};
+typedef int32_t aaudio_format_t;
+
+/**
+ * @deprecated use aaudio_format_t instead
+ * TODO remove when tests and examples are updated
+ */
typedef int32_t aaudio_audio_format_t;
enum {
diff --git a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.h b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.h
index 9459b87..ee604eb 100644
--- a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.h
+++ b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.h
@@ -140,7 +140,7 @@
{120001, 460000},
{460001, 1800000},
{1800001, 7000000},
- {7000001, 1}};
+ {7000001, 20000000}};
//Note: If these frequencies change, please update LimitLevel values accordingly.
static const LVM_UINT16 EQNB_5BandPresetsFrequencies[] = {
diff --git a/media/libmedia/IMediaExtractorService.cpp b/media/libmedia/IMediaExtractorService.cpp
index 8b00d85..7c0d08d 100644
--- a/media/libmedia/IMediaExtractorService.cpp
+++ b/media/libmedia/IMediaExtractorService.cpp
@@ -23,11 +23,13 @@
#include <sys/types.h>
#include <binder/Parcel.h>
#include <media/IMediaExtractorService.h>
+#include <media/stagefright/MediaExtractor.h>
namespace android {
enum {
- MAKE_EXTRACTOR = IBinder::FIRST_CALL_TRANSACTION
+ MAKE_EXTRACTOR = IBinder::FIRST_CALL_TRANSACTION,
+ MAKE_IDATA_SOURCE_FD,
};
class BpMediaExtractorService : public BpInterface<IMediaExtractorService>
@@ -52,6 +54,21 @@
return NULL;
}
+ virtual sp<IDataSource> makeIDataSource(int fd, int64_t offset, int64_t length)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IMediaExtractorService::getInterfaceDescriptor());
+ data.writeFileDescriptor(fd);
+ data.writeInt64(offset);
+ data.writeInt64(length);
+ status_t ret = remote()->transact(MAKE_IDATA_SOURCE_FD, data, &reply);
+ ALOGV("fd:%d offset:%lld length:%lld ret:%d",
+ fd, (long long)offset, (long long)length, ret);
+ if (ret == NO_ERROR) {
+ return interface_cast<IDataSource>(reply.readStrongBinder());
+ }
+ return nullptr;
+ }
};
IMPLEMENT_META_INTERFACE(MediaExtractorService, "android.media.IMediaExtractorService");
@@ -80,6 +97,23 @@
reply->writeStrongBinder(IInterface::asBinder(ex));
return NO_ERROR;
}
+
+ case MAKE_IDATA_SOURCE_FD: {
+ CHECK_INTERFACE(IMediaExtractorService, data, reply);
+ const int fd = dup(data.readFileDescriptor()); // -1 fd checked in makeIDataSource
+ const int64_t offset = data.readInt64();
+ const int64_t length = data.readInt64();
+ ALOGV("fd %d offset%lld length:%lld", fd, (long long)offset, (long long)length);
+ sp<IDataSource> source = makeIDataSource(fd, offset, length);
+ reply->writeStrongBinder(IInterface::asBinder(source));
+ // The FileSource closes the descriptor, so if it is not created
+ // we need to close the descriptor explicitly.
+ if (source.get() == nullptr && fd != -1) {
+ close(fd);
+ }
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libmedia/include/IMediaExtractorService.h b/media/libmedia/include/IMediaExtractorService.h
index 4d7b317..45e9620 100644
--- a/media/libmedia/include/IMediaExtractorService.h
+++ b/media/libmedia/include/IMediaExtractorService.h
@@ -32,6 +32,7 @@
virtual sp<IMediaExtractor> makeExtractor(const sp<IDataSource> &source, const char *mime) = 0;
+ virtual sp<IDataSource> makeIDataSource(int fd, int64_t offset, int64_t length) = 0;
};
class BnMediaExtractorService: public BnInterface<IMediaExtractorService>
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index f3fc924..b082654 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -736,9 +736,7 @@
mExtractorDeathListener = new ServiceDeathNotifier(binder, p, MEDIAEXTRACTOR_PROCESS_DEATH);
binder->linkToDeath(mExtractorDeathListener);
- int32_t trebleOmx = property_get_int32("persist.media.treble_omx", -1);
- if ((trebleOmx == 1) || ((trebleOmx == -1) &&
- property_get_bool("persist.hal.binderization", 0))) {
+ if (property_get_bool("persist.media.treble_omx", true)) {
// Treble IOmx
sp<IOmx> omx = IOmx::getService();
if (omx == nullptr) {
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index 638eec3..6400481 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -450,9 +450,7 @@
}
sCameraChecked = true;
- int32_t trebleOmx = property_get_int32("persist.media.treble_omx", -1);
- if ((trebleOmx == 1) || ((trebleOmx == -1) &&
- property_get_bool("persist.hal.binderization", 0))) {
+ if (property_get_bool("persist.media.treble_omx", true)) {
// Treble IOmx
sp<IOmx> omx = IOmx::getService();
if (omx == nullptr) {
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 8378d24..aedca3f 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -21,7 +21,9 @@
#include "NuPlayerDrm.h"
#include "AnotherPacketSource.h"
-
+#include <binder/IServiceManager.h>
+#include <cutils/properties.h>
+#include <media/IMediaExtractorService.h>
#include <media/IMediaHTTPService.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -361,7 +363,32 @@
mHTTPService, uri, &mUriHeaders, &contentType,
static_cast<HTTPBase *>(mHttpSource.get()));
} else {
- mDataSource = new FileSource(mFd, mOffset, mLength);
+ if (property_get_bool("media.stagefright.extractremote", true) &&
+ !FileSource::requiresDrm(mFd, mOffset, mLength, nullptr /* mime */)) {
+ sp<IBinder> binder =
+ defaultServiceManager()->getService(String16("media.extractor"));
+ if (binder != nullptr) {
+ ALOGD("FileSource remote");
+ sp<IMediaExtractorService> mediaExService(
+ interface_cast<IMediaExtractorService>(binder));
+ sp<IDataSource> source =
+ mediaExService->makeIDataSource(mFd, mOffset, mLength);
+ ALOGV("IDataSource(FileSource): %p %d %lld %lld",
+ source.get(), mFd, (long long)mOffset, (long long)mLength);
+ if (source.get() != nullptr) {
+ mDataSource = DataSource::CreateFromIDataSource(source);
+ } else {
+ ALOGW("extractor service cannot make data source");
+ }
+ } else {
+ ALOGW("extractor service not running");
+ }
+ }
+ if (mDataSource == nullptr) {
+ ALOGD("FileSource local");
+ mDataSource = new FileSource(mFd, mOffset, mLength);
+ }
+
mFd = -1;
}
diff --git a/media/libstagefright/CallbackDataSource.cpp b/media/libstagefright/CallbackDataSource.cpp
index 0434bab..4309372 100644
--- a/media/libstagefright/CallbackDataSource.cpp
+++ b/media/libstagefright/CallbackDataSource.cpp
@@ -113,6 +113,10 @@
return mIDataSource->DrmInitialization(mime);
}
+sp<IDataSource> CallbackDataSource::getIDataSource() const {
+ return mIDataSource;
+}
+
TinyCacheSource::TinyCacheSource(const sp<DataSource>& source)
: mSource(source), mCachedOffset(0), mCachedSize(0) {
mName = String8::format("TinyCacheSource(%s)", mSource->toString().string());
@@ -190,4 +194,9 @@
mCachedSize = 0;
return mSource->DrmInitialization(mime);
}
+
+sp<IDataSource> TinyCacheSource::getIDataSource() const {
+ return mSource->getIDataSource();
+}
+
} // namespace android
diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp
index ded79f3..a5760d1 100644
--- a/media/libstagefright/DataSource.cpp
+++ b/media/libstagefright/DataSource.cpp
@@ -20,6 +20,7 @@
#include "include/HTTPBase.h"
#include "include/NuCachedSource2.h"
+#include <media/IDataSource.h>
#include <media/IMediaHTTPConnection.h>
#include <media/IMediaHTTPService.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -29,6 +30,7 @@
#include <media/stagefright/FileSource.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaHTTP.h>
+#include <media/stagefright/RemoteDataSource.h>
#include <media/stagefright/Utils.h>
#include <utils/String8.h>
@@ -36,8 +38,6 @@
#include <private/android_filesystem_config.h>
-#include <arpa/inet.h>
-
namespace android {
bool DataSource::getUInt16(off64_t offset, uint16_t *x) {
@@ -98,6 +98,10 @@
return ERROR_UNSUPPORTED;
}
+sp<IDataSource> DataSource::getIDataSource() const {
+ return nullptr;
+}
+
////////////////////////////////////////////////////////////////////////////////
// static
@@ -167,6 +171,11 @@
return source;
}
+sp<DataSource> DataSource::CreateFromFd(int fd, int64_t offset, int64_t length) {
+ sp<FileSource> source = new FileSource(fd, offset, length);
+ return source->initCheck() != OK ? nullptr : source;
+}
+
sp<DataSource> DataSource::CreateMediaHTTP(const sp<IMediaHTTPService> &httpService) {
if (httpService == NULL) {
return NULL;
@@ -188,4 +197,8 @@
return String8("application/octet-stream");
}
+sp<IDataSource> DataSource::asIDataSource() {
+ return RemoteDataSource::wrap(sp<DataSource>(this));
+}
+
} // namespace android
diff --git a/media/libstagefright/FileSource.cpp b/media/libstagefright/FileSource.cpp
index 5b92f91..97d8988 100644
--- a/media/libstagefright/FileSource.cpp
+++ b/media/libstagefright/FileSource.cpp
@@ -21,6 +21,7 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/FileSource.h>
#include <media/stagefright/Utils.h>
+#include <private/android_filesystem_config.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
@@ -171,6 +172,7 @@
}
sp<DecryptHandle> FileSource::DrmInitialization(const char *mime) {
+ if (getuid() == AID_MEDIA_EX) return nullptr; // no DRM in media extractor
if (mDrmManagerClient == NULL) {
mDrmManagerClient = new DrmManagerClient();
}
@@ -227,4 +229,18 @@
return mDrmManagerClient->pread(mDecryptHandle, data, size, offset + mOffset);
}
}
+
+/* static */
+bool FileSource::requiresDrm(int fd, int64_t offset, int64_t length, const char *mime) {
+ std::unique_ptr<DrmManagerClient> drmClient(new DrmManagerClient());
+ sp<DecryptHandle> decryptHandle =
+ drmClient->openDecryptSession(fd, offset, length, mime);
+ bool requiresDrm = false;
+ if (decryptHandle != nullptr) {
+ requiresDrm = decryptHandle->decryptApiType == DecryptApiType::CONTAINER_BASED;
+ drmClient->closeDecryptSession(decryptHandle);
+ }
+ return requiresDrm;
+}
+
} // namespace android
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index 059a730..bb20850 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -940,6 +940,10 @@
CHECK(msg->findInt32("err", &err));
ALOGE("Encoder (%s) reported error : 0x%x",
mIsVideo ? "video" : "audio", err);
+ if (!(mFlags & FLAG_USE_SURFACE_INPUT)) {
+ mStopping = true;
+ mPuller->stop();
+ }
signalEOS();
}
break;
diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp
index 76775c2..9965462 100644
--- a/media/libstagefright/MediaExtractor.cpp
+++ b/media/libstagefright/MediaExtractor.cpp
@@ -117,74 +117,6 @@
return CAN_SEEK_BACKWARD | CAN_SEEK_FORWARD | CAN_PAUSE | CAN_SEEK;
}
-
-
-class RemoteDataSource : public BnDataSource {
-public:
- enum {
- kBufferSize = 64 * 1024,
- };
-
- static sp<IDataSource> wrap(const sp<DataSource> &source);
- virtual ~RemoteDataSource();
-
- virtual sp<IMemory> getIMemory();
- virtual ssize_t readAt(off64_t offset, size_t size);
- virtual status_t getSize(off64_t* size);
- virtual void close();
- virtual uint32_t getFlags();
- virtual String8 toString();
- virtual sp<DecryptHandle> DrmInitialization(const char *mime);
-
-private:
- sp<IMemory> mMemory;
- sp<DataSource> mSource;
- String8 mName;
- explicit RemoteDataSource(const sp<DataSource> &source);
- DISALLOW_EVIL_CONSTRUCTORS(RemoteDataSource);
-};
-
-
-sp<IDataSource> RemoteDataSource::wrap(const sp<DataSource> &source) {
- return new RemoteDataSource(source);
-}
-RemoteDataSource::RemoteDataSource(const sp<DataSource> &source) {
- mSource = source;
- sp<MemoryDealer> memoryDealer = new MemoryDealer(kBufferSize, "RemoteDataSource");
- mMemory = memoryDealer->allocate(kBufferSize);
- if (mMemory == NULL) {
- ALOGE("Failed to allocate memory!");
- }
- mName = String8::format("RemoteDataSource(%s)", mSource->toString().string());
-}
-RemoteDataSource::~RemoteDataSource() {
- close();
-}
-sp<IMemory> RemoteDataSource::getIMemory() {
- return mMemory;
-}
-ssize_t RemoteDataSource::readAt(off64_t offset, size_t size) {
- ALOGV("readAt(%" PRId64 ", %zu)", offset, size);
- return mSource->readAt(offset, mMemory->pointer(), size);
-}
-status_t RemoteDataSource::getSize(off64_t* size) {
- return mSource->getSize(size);
-}
-void RemoteDataSource::close() {
- mSource = NULL;
-}
-uint32_t RemoteDataSource::getFlags() {
- return mSource->flags();
-}
-
-String8 RemoteDataSource::toString() {
- return mName;
-}
-
-sp<DecryptHandle> RemoteDataSource::DrmInitialization(const char *mime) {
- return mSource->DrmInitialization(mime);
-}
-
// static
sp<IMediaExtractor> MediaExtractor::Create(
const sp<DataSource> &source, const char *mime) {
@@ -201,7 +133,7 @@
if (binder != 0) {
sp<IMediaExtractorService> mediaExService(interface_cast<IMediaExtractorService>(binder));
- sp<IMediaExtractor> ex = mediaExService->makeExtractor(RemoteDataSource::wrap(source), mime);
+ sp<IMediaExtractor> ex = mediaExService->makeExtractor(source->asIDataSource(), mime);
return ex;
} else {
ALOGE("extractor service not running");
@@ -218,7 +150,7 @@
RegisterDefaultSniffers();
// initialize source decryption if needed
- source->DrmInitialization();
+ source->DrmInitialization(nullptr /* mime */);
sp<AMessage> meta;
diff --git a/media/libstagefright/OMXClient.cpp b/media/libstagefright/OMXClient.cpp
index 1706221..02d275b 100644
--- a/media/libstagefright/OMXClient.cpp
+++ b/media/libstagefright/OMXClient.cpp
@@ -38,9 +38,7 @@
}
status_t OMXClient::connect(bool* trebleFlag) {
- int32_t trebleOmx = property_get_int32("persist.media.treble_omx", -1);
- if ((trebleOmx == 1) || ((trebleOmx == -1) &&
- property_get_bool("persist.hal.binderization", 0))) {
+ if (property_get_bool("persist.media.treble_omx", true)) {
if (trebleFlag != nullptr) {
*trebleFlag = true;
}
diff --git a/media/libstagefright/include/CallbackDataSource.h b/media/libstagefright/include/CallbackDataSource.h
index 80cd1f7..0d775e6 100644
--- a/media/libstagefright/include/CallbackDataSource.h
+++ b/media/libstagefright/include/CallbackDataSource.h
@@ -42,6 +42,7 @@
return mName;
}
virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL);
+ virtual sp<IDataSource> getIDataSource() const;
private:
sp<IDataSource> mIDataSource;
@@ -70,6 +71,7 @@
return mName;
}
virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL);
+ virtual sp<IDataSource> getIDataSource() const;
private:
// 2kb comes from experimenting with the time-to-first-frame from a MediaPlayer
diff --git a/media/libstagefright/include/DataSource.h b/media/libstagefright/include/DataSource.h
index e7135a2..8f2c7eb 100644
--- a/media/libstagefright/include/DataSource.h
+++ b/media/libstagefright/include/DataSource.h
@@ -56,6 +56,7 @@
static sp<DataSource> CreateMediaHTTP(const sp<IMediaHTTPService> &httpService);
static sp<DataSource> CreateFromIDataSource(const sp<IDataSource> &source);
+ static sp<DataSource> CreateFromFd(int fd, int64_t offset, int64_t length);
DataSource() {}
@@ -117,6 +118,12 @@
virtual void close() {};
+ // creates an IDataSource wrapper to the DataSource.
+ virtual sp<IDataSource> asIDataSource();
+
+ // returns a pointer to IDataSource if it is wrapped.
+ virtual sp<IDataSource> getIDataSource() const;
+
protected:
virtual ~DataSource() {}
diff --git a/media/libstagefright/include/FileSource.h b/media/libstagefright/include/FileSource.h
index 9f3bb5e..7267e9a 100644
--- a/media/libstagefright/include/FileSource.h
+++ b/media/libstagefright/include/FileSource.h
@@ -51,6 +51,8 @@
return mName;
}
+ static bool requiresDrm(int fd, int64_t offset, int64_t length, const char *mime);
+
protected:
virtual ~FileSource();
diff --git a/media/libstagefright/include/RemoteDataSource.h b/media/libstagefright/include/RemoteDataSource.h
new file mode 100644
index 0000000..255b7ae
--- /dev/null
+++ b/media/libstagefright/include/RemoteDataSource.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2016, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef REMOTE_DATA_SOURCE_H_
+#define REMOTE_DATA_SOURCE_H_
+
+#include <binder/IMemory.h>
+#include <binder/MemoryDealer.h>
+#include <media/IDataSource.h>
+#include <media/stagefright/DataSource.h>
+
+namespace android {
+
+// Originally in MediaExtractor.cpp
+class RemoteDataSource : public BnDataSource {
+public:
+ static sp<IDataSource> wrap(const sp<DataSource> &source) {
+ if (source.get() == nullptr) {
+ return nullptr;
+ }
+ if (source->getIDataSource().get() != nullptr) {
+ return source->getIDataSource();
+ }
+ return new RemoteDataSource(source);
+ }
+
+ virtual ~RemoteDataSource() {
+ close();
+ }
+ virtual sp<IMemory> getIMemory() {
+ return mMemory;
+ }
+ virtual ssize_t readAt(off64_t offset, size_t size) {
+ ALOGV("readAt(%lld, %zu)", (long long)offset, size);
+ if (size > kBufferSize) {
+ size = kBufferSize;
+ }
+ return mSource->readAt(offset, mMemory->pointer(), size);
+ }
+ virtual status_t getSize(off64_t *size) {
+ return mSource->getSize(size);
+ }
+ virtual void close() {
+ mSource = nullptr;
+ mMemory = nullptr;
+ }
+ virtual uint32_t getFlags() {
+ return mSource->flags();
+ }
+ virtual String8 toString() {
+ return mName;
+ }
+ virtual sp<DecryptHandle> DrmInitialization(const char *mime) {
+ return mSource->DrmInitialization(mime);
+ }
+
+private:
+ enum {
+ kBufferSize = 64 * 1024,
+ };
+
+ sp<IMemory> mMemory;
+ sp<DataSource> mSource;
+ String8 mName;
+
+ explicit RemoteDataSource(const sp<DataSource> &source) {
+ mSource = source;
+ sp<MemoryDealer> memoryDealer = new MemoryDealer(kBufferSize, "RemoteDataSource");
+ mMemory = memoryDealer->allocate(kBufferSize);
+ if (mMemory.get() == nullptr) {
+ ALOGE("Failed to allocate memory!");
+ }
+ mName = String8::format("RemoteDataSource(%s)", mSource->toString().string());
+ }
+
+ DISALLOW_EVIL_CONSTRUCTORS(RemoteDataSource);
+};
+
+} // namespace android
+
+#endif // REMOTE_DATA_SOURCE_H_
diff --git a/media/libstagefright/omx/GraphicBufferSource.cpp b/media/libstagefright/omx/GraphicBufferSource.cpp
index dae1ee9..afbde6a 100644
--- a/media/libstagefright/omx/GraphicBufferSource.cpp
+++ b/media/libstagefright/omx/GraphicBufferSource.cpp
@@ -384,6 +384,7 @@
// to be handled and [pause, 1us], [resume 2us] will be discarded.
bool dropped = false;
bool done = false;
+ bool seeStopAction = false;
if (!mActionQueue.empty()) {
// First scan to check if bufferTimestamp is smaller than first action's timestamp.
ActionItem nextAction = *(mActionQueue.begin());
@@ -431,7 +432,7 @@
dropped = true;
// Clear the whole ActionQueue as recording is done
mActionQueue.clear();
- submitEndOfInputStream_l();
+ seeStopAction = true;
break;
}
default:
@@ -443,6 +444,14 @@
if (dropped) {
releaseBuffer(item.mSlot, item.mFrameNumber, item.mFence);
+ if (seeStopAction) {
+ // Clear all the buffers before setting mEndOfStream and signal EndOfInputStream.
+ if (!releaseAllBuffers()) {
+ ALOGW("Failed to release all the buffers when handling STOP action");
+ }
+ mEndOfStream = true;
+ submitEndOfInputStream_l();
+ }
return true;
}
@@ -922,18 +931,8 @@
if (suspend) {
mSuspended = true;
- while (mNumFramesAvailable > 0) {
- BufferItem item;
- status_t err = acquireBuffer(&item);
-
- if (err != OK) {
- ALOGE("setSuspend: acquireBuffer returned err=%d", err);
- break;
- }
-
- --mNumFramesAvailable;
-
- releaseBuffer(item.mSlot, item.mFrameNumber, item.mFence);
+ if (!releaseAllBuffers()) {
+ ALOGW("Failed to release all the buffers during suspend");
}
return OK;
} else {
@@ -954,6 +953,23 @@
return OK;
}
+bool GraphicBufferSource::releaseAllBuffers() {
+ while (mNumFramesAvailable > 0) {
+ BufferItem item;
+ status_t err = acquireBuffer(&item);
+
+ if (err != OK) {
+ ALOGE("releaseAllBuffers: acquireBuffer fail returned err=%d", err);
+ return false;;
+ }
+
+ --mNumFramesAvailable;
+
+ releaseBuffer(item.mSlot, item.mFrameNumber, item.mFence);
+ }
+ return true;
+}
+
status_t GraphicBufferSource::setRepeatPreviousFrameDelayUs(int64_t repeatAfterUs) {
ALOGV("setRepeatPreviousFrameDelayUs: delayUs=%lld", (long long)repeatAfterUs);
diff --git a/media/libstagefright/omx/GraphicBufferSource.h b/media/libstagefright/omx/GraphicBufferSource.h
index 371c5ed..ab52ce2 100644
--- a/media/libstagefright/omx/GraphicBufferSource.h
+++ b/media/libstagefright/omx/GraphicBufferSource.h
@@ -220,6 +220,8 @@
// Acquire buffer from the consumer
status_t acquireBuffer(BufferItem *bi);
+ bool releaseAllBuffers();
+
// Release buffer to the consumer
void releaseBuffer(int id, uint64_t frameNum, const sp<Fence> &fence);
diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp
index cbca461..fcc44d8 100644
--- a/media/libstagefright/omx/tests/OMXHarness.cpp
+++ b/media/libstagefright/omx/tests/OMXHarness.cpp
@@ -78,9 +78,7 @@
}
status_t Harness::initOMX() {
- int32_t trebleOmx = property_get_int32("persist.media.treble_omx", -1);
- if ((trebleOmx == 1) || ((trebleOmx == -1) &&
- property_get_bool("persist.hal.binderization", 0))) {
+ if (property_get_bool("persist.media.treble_omx", true)) {
using namespace ::android::hardware::media::omx::V1_0;
sp<IOmx> tOmx = IOmx::getService();
if (tOmx == nullptr) {
diff --git a/services/mediacodec/main_codecservice.cpp b/services/mediacodec/main_codecservice.cpp
index 38717b5..3a4546b 100644
--- a/services/mediacodec/main_codecservice.cpp
+++ b/services/mediacodec/main_codecservice.cpp
@@ -54,9 +54,7 @@
::android::hardware::configureRpcThreadpool(64, false);
sp<ProcessState> proc(ProcessState::self());
- int32_t trebleOmx = property_get_int32("persist.media.treble_omx", -1);
- if ((trebleOmx == 1) || ((trebleOmx == -1) &&
- property_get_bool("persist.hal.binderization", 0))) {
+ if (property_get_bool("persist.media.treble_omx", true)) {
using namespace ::android::hardware::media::omx::V1_0;
sp<IOmx> omx = new implementation::Omx();
if (omx == nullptr) {
diff --git a/services/mediaextractor/MediaExtractorService.cpp b/services/mediaextractor/MediaExtractorService.cpp
index 4a80166..08cbef6 100644
--- a/services/mediaextractor/MediaExtractorService.cpp
+++ b/services/mediaextractor/MediaExtractorService.cpp
@@ -22,6 +22,7 @@
#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaExtractor.h>
+#include <media/stagefright/RemoteDataSource.h>
#include "MediaExtractorService.h"
namespace android {
@@ -45,6 +46,12 @@
return ret;
}
+sp<IDataSource> MediaExtractorService::makeIDataSource(int fd, int64_t offset, int64_t length)
+{
+ sp<DataSource> source = DataSource::CreateFromFd(fd, offset, length);
+ return source.get() != nullptr ? source->asIDataSource() : nullptr;
+}
+
status_t MediaExtractorService::dump(int fd, const Vector<String16>& args) {
return dumpExtractors(fd, args);
}
diff --git a/services/mediaextractor/MediaExtractorService.h b/services/mediaextractor/MediaExtractorService.h
index 078af0c..9df3ecd 100644
--- a/services/mediaextractor/MediaExtractorService.h
+++ b/services/mediaextractor/MediaExtractorService.h
@@ -34,6 +34,9 @@
static const char* getServiceName() { return "media.extractor"; }
virtual sp<IMediaExtractor> makeExtractor(const sp<IDataSource> &source, const char *mime);
+
+ virtual sp<IDataSource> makeIDataSource(int fd, int64_t offset, int64_t length);
+
virtual status_t dump(int fd, const Vector<String16>& args);
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply,
diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy b/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy
index 96840a0..4e4ce30 100644
--- a/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy
+++ b/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy
@@ -37,6 +37,11 @@
getgid32: 1
getegid32: 1
getgroups32: 1
+nanosleep: 1
+
+# for FileSource
+readlinkat: 1
+_llseek: 1
# for attaching to debuggerd on process crash
sigaction: 1
diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy b/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy
index c95ddb7..1683adb 100644
--- a/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy
+++ b/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy
@@ -26,6 +26,11 @@
exit_group: 1
rt_sigreturn: 1
getrlimit: 1
+nanosleep: 1
+
+# for FileSource
+readlinkat: 1
+_llseek: 1
# for attaching to debuggerd on process crash
tgkill: 1
diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy b/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy
index 2ce6cf8..83725cd 100644
--- a/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy
+++ b/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy
@@ -37,6 +37,10 @@
getgroups32: 1
nanosleep: 1
+# for FileSource
+readlinkat: 1
+_llseek: 1
+
# for attaching to debuggerd on process crash
socketcall: 1
sigaction: 1