Add Ndk MediaExtractor wrapper
Bug: 69805888
Change-Id: Id41ba3a6984171643d53e2a5de615829071b16d4
diff --git a/media/libmedia/nuplayer2/NdkWrapper.cpp b/media/libmedia/nuplayer2/NdkWrapper.cpp
index 3c55c56..6698826 100644
--- a/media/libmedia/nuplayer2/NdkWrapper.cpp
+++ b/media/libmedia/nuplayer2/NdkWrapper.cpp
@@ -25,6 +25,7 @@
#include <media/NdkMediaCrypto.h>
#include <media/NdkMediaDrm.h>
#include <media/NdkMediaFormat.h>
+#include <media/NdkMediaExtractor.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
@@ -177,7 +178,6 @@
return ret;
}
-
//////////// AMediaFormatWrapper
// static
sp<AMediaFormatWrapper> AMediaFormatWrapper::Create(const sp<AMessage> &message) {
@@ -993,4 +993,126 @@
AMediaCodec_setParameters(mAMediaCodec, params->getAMediaFormat()));
}
+//////////// AMediaExtractorWrapper
+
+AMediaExtractorWrapper::AMediaExtractorWrapper(AMediaExtractor *aMediaExtractor)
+ : mAMediaExtractor(aMediaExtractor) {
+}
+
+AMediaExtractorWrapper::~AMediaExtractorWrapper() {
+ release();
+}
+
+status_t AMediaExtractorWrapper::release() {
+ if (mAMediaExtractor != NULL) {
+ media_status_t err = AMediaExtractor_delete(mAMediaExtractor);
+ mAMediaExtractor = NULL;
+ return translateErrorCode(err);
+ }
+ return OK;
+}
+
+AMediaExtractor *AMediaExtractorWrapper::getAMediaExtractor() const {
+ return mAMediaExtractor;
+}
+
+status_t AMediaExtractorWrapper::setDataSource(int fd, off64_t offset, off64_t length) {
+ if (mAMediaExtractor == NULL) {
+ return DEAD_OBJECT;
+ }
+ return translateErrorCode(AMediaExtractor_setDataSourceFd(
+ mAMediaExtractor, fd, offset, length));
+}
+
+status_t AMediaExtractorWrapper::setDataSource(const char *location) {
+ if (mAMediaExtractor == NULL) {
+ return DEAD_OBJECT;
+ }
+ return translateErrorCode(AMediaExtractor_setDataSource(mAMediaExtractor, location));
+}
+
+size_t AMediaExtractorWrapper::getTrackCount() {
+ if (mAMediaExtractor == NULL) {
+ return 0;
+ }
+ return AMediaExtractor_getTrackCount(mAMediaExtractor);
+}
+
+sp<AMediaFormatWrapper> AMediaExtractorWrapper::getTrackFormat(size_t idx) {
+ if (mAMediaExtractor == NULL) {
+ return NULL;
+ }
+ return new AMediaFormatWrapper(AMediaExtractor_getTrackFormat(mAMediaExtractor, idx));
+}
+
+status_t AMediaExtractorWrapper::selectTrack(size_t idx) {
+ if (mAMediaExtractor == NULL) {
+ return DEAD_OBJECT;
+ }
+ return translateErrorCode(AMediaExtractor_selectTrack(mAMediaExtractor, idx));
+}
+
+status_t AMediaExtractorWrapper::unselectTrack(size_t idx) {
+ if (mAMediaExtractor == NULL) {
+ return DEAD_OBJECT;
+ }
+ return translateErrorCode(AMediaExtractor_unselectTrack(mAMediaExtractor, idx));
+}
+
+ssize_t AMediaExtractorWrapper::readSampleData(const sp<ABuffer> &buffer) {
+ if (mAMediaExtractor == NULL) {
+ return -1;
+ }
+ return AMediaExtractor_readSampleData(mAMediaExtractor, buffer->data(), buffer->capacity());
+}
+
+uint32_t AMediaExtractorWrapper::getSampleFlags() {
+ if (mAMediaExtractor == NULL) {
+ return 0;
+ }
+ return AMediaExtractor_getSampleFlags(mAMediaExtractor);
+}
+
+int AMediaExtractorWrapper::getSampleTrackIndex() {
+ if (mAMediaExtractor == NULL) {
+ return -1;
+ }
+ return AMediaExtractor_getSampleTrackIndex(mAMediaExtractor);
+}
+
+int64_t AMediaExtractorWrapper::getSampleTime() {
+ if (mAMediaExtractor == NULL) {
+ return -1;
+ }
+ return AMediaExtractor_getSampleTime(mAMediaExtractor);
+}
+
+bool AMediaExtractorWrapper::advance() {
+ if (mAMediaExtractor == NULL) {
+ return false;
+ }
+ return AMediaExtractor_advance(mAMediaExtractor);
+}
+
+status_t AMediaExtractorWrapper::seekTo(int64_t seekPosUs, SeekMode mode) {
+ if (mAMediaExtractor == NULL) {
+ return DEAD_OBJECT;
+ }
+ return AMediaExtractor_seekTo(mAMediaExtractor, seekPosUs, mode);
+}
+
+PsshInfo* AMediaExtractorWrapper::getPsshInfo() {
+ if (mAMediaExtractor == NULL) {
+ return NULL;
+ }
+ return AMediaExtractor_getPsshInfo(mAMediaExtractor);
+}
+
+sp<AMediaCodecCryptoInfoWrapper> AMediaExtractorWrapper::getSampleCryptoInfo() {
+ if (mAMediaExtractor == NULL) {
+ return NULL;
+ }
+ return new AMediaCodecCryptoInfoWrapper(AMediaExtractor_getSampleCryptoInfo(mAMediaExtractor));
+}
+
} // namespace android
diff --git a/media/libmedia/nuplayer2/NdkWrapper.h b/media/libmedia/nuplayer2/NdkWrapper.h
index cf06f5e..a097d5a 100644
--- a/media/libmedia/nuplayer2/NdkWrapper.h
+++ b/media/libmedia/nuplayer2/NdkWrapper.h
@@ -19,8 +19,10 @@
#define NDK_WRAPPER_H_
#include <media/NdkMediaError.h>
+#include <media/NdkMediaExtractor.h>
#include <media/hardware/CryptoAPI.h>
#include <media/stagefright/foundation/ABase.h>
+#include <media/stagefright/foundation/ABuffer.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
@@ -30,6 +32,8 @@
struct AMediaCrypto;
struct AMediaDrm;
struct AMediaFormat;
+struct AMediaExtractor;
+struct PsshInfo;
namespace android {
@@ -252,6 +256,53 @@
DISALLOW_EVIL_CONSTRUCTORS(AMediaCodecWrapper);
};
+struct AMediaExtractorWrapper : public RefBase {
+
+ AMediaExtractorWrapper(AMediaExtractor *aMediaExtractor);
+
+ // the returned AMediaExtractor is still owned by this wrapper.
+ AMediaExtractor *getAMediaExtractor() const;
+
+ status_t release();
+
+ status_t setDataSource(int fd, off64_t offset, off64_t length);
+
+ status_t setDataSource(const char *location);
+
+ size_t getTrackCount();
+
+ sp<AMediaFormatWrapper> getTrackFormat(size_t idx);
+
+ status_t selectTrack(size_t idx);
+
+ status_t unselectTrack(size_t idx);
+
+ ssize_t readSampleData(const sp<ABuffer> &buffer);
+
+ uint32_t getSampleFlags();
+
+ int getSampleTrackIndex();
+
+ int64_t getSampleTime();
+
+ bool advance();
+
+ status_t seekTo(int64_t seekPosUs, SeekMode mode);
+
+ // the returned PsshInfo is still owned by this wrapper.
+ PsshInfo* getPsshInfo();
+
+ sp<AMediaCodecCryptoInfoWrapper> getSampleCryptoInfo();
+
+protected:
+ virtual ~AMediaExtractorWrapper();
+
+private:
+ AMediaExtractor *mAMediaExtractor;
+
+ DISALLOW_EVIL_CONSTRUCTORS(AMediaExtractorWrapper);
+};
+
} // namespace android
#endif // NDK_WRAPPER_H_