Merge changes I16e1fa82,Ic59ebc1b
* changes:
Convert MatroskaExtractor to V3 format
Convert MPEG4Extractor to V3 format
diff --git a/media/extractors/mkv/Android.bp b/media/extractors/mkv/Android.bp
index 8d028e1..1744d3d 100644
--- a/media/extractors/mkv/Android.bp
+++ b/media/extractors/mkv/Android.bp
@@ -11,7 +11,6 @@
shared_libs: [
"liblog",
- "libmediaextractor",
"libmediandk",
],
diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp
index 1fdac05..4a30740 100644
--- a/media/extractors/mkv/MatroskaExtractor.cpp
+++ b/media/extractors/mkv/MatroskaExtractor.cpp
@@ -29,10 +29,8 @@
#include <media/stagefright/foundation/ByteUtils.h>
#include <media/stagefright/foundation/ColorUtils.h>
#include <media/stagefright/foundation/hexdump.h>
-#include <media/stagefright/MediaBufferBase.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
-#include <media/stagefright/MetaData.h>
#include <media/stagefright/MetaDataUtils.h>
#include <utils/String8.h>
@@ -127,7 +125,7 @@
BlockIterator &operator=(const BlockIterator &);
};
-struct MatroskaSource : public MediaTrackHelperV2 {
+struct MatroskaSource : public MediaTrackHelperV3 {
MatroskaSource(MatroskaExtractor *extractor, size_t index);
virtual media_status_t start();
@@ -136,7 +134,7 @@
virtual media_status_t getFormat(AMediaFormat *);
virtual media_status_t read(
- MediaBufferBase **buffer, const ReadOptions *options);
+ MediaBufferHelperV3 **buffer, const ReadOptions *options);
protected:
virtual ~MatroskaSource();
@@ -156,11 +154,11 @@
BlockIterator mBlockIter;
ssize_t mNALSizeLen; // for type AVC or HEVC
- List<MediaBufferBase *> mPendingFrames;
+ List<MediaBufferHelperV3 *> mPendingFrames;
status_t advance();
- status_t setWebmBlockCryptoInfo(MediaBufferBase *mbuf);
+ status_t setWebmBlockCryptoInfo(MediaBufferHelperV3 *mbuf);
media_status_t readBlock();
void clearPendingFrames();
@@ -265,6 +263,8 @@
return AMEDIA_ERROR_MALFORMED;
}
+ // allocate one small initial buffer, but leave plenty of room to grow
+ mBufferGroup->init(1 /* number of buffers */, 1024 /* buffer size */, 64 /* growth limit */);
mBlockIter.reset();
return AMEDIA_OK;
@@ -569,7 +569,7 @@
void MatroskaSource::clearPendingFrames() {
while (!mPendingFrames.empty()) {
- MediaBufferBase *frame = *mPendingFrames.begin();
+ MediaBufferHelperV3 *frame = *mPendingFrames.begin();
mPendingFrames.erase(mPendingFrames.begin());
frame->release();
@@ -577,7 +577,7 @@
}
}
-status_t MatroskaSource::setWebmBlockCryptoInfo(MediaBufferBase *mbuf) {
+status_t MatroskaSource::setWebmBlockCryptoInfo(MediaBufferHelperV3 *mbuf) {
if (mbuf->range_length() < 1 || mbuf->range_length() - 1 > INT32_MAX) {
// 1-byte signal
return ERROR_MALFORMED;
@@ -591,7 +591,7 @@
return ERROR_MALFORMED;
}
- MetaDataBase &meta = mbuf->meta_data();
+ AMediaFormat *meta = mbuf->meta_data();
if (encrypted) {
uint8_t ctrCounter[16] = { 0 };
const uint8_t *keyId;
@@ -599,9 +599,9 @@
AMediaFormat *trackMeta = mExtractor->mTracks.itemAt(mTrackIndex).mMeta;
AMediaFormat_getBuffer(trackMeta, AMEDIAFORMAT_KEY_CRYPTO_KEY,
(void**)&keyId, &keyIdSize);
- meta.setData(kKeyCryptoKey, 0, keyId, keyIdSize);
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_KEY, keyId, keyIdSize);
memcpy(ctrCounter, data + 1, 8);
- meta.setData(kKeyCryptoIV, 0, ctrCounter, 16);
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_IV, ctrCounter, 16);
if (partitioned) {
/* 0 1 2 3
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -654,8 +654,10 @@
}
uint32_t sizeofPlainSizes = sizeof(uint32_t) * plainSizes.size();
uint32_t sizeofEncryptedSizes = sizeof(uint32_t) * encryptedSizes.size();
- meta.setData(kKeyPlainSizes, 0, plainSizes.data(), sizeofPlainSizes);
- meta.setData(kKeyEncryptedSizes, 0, encryptedSizes.data(), sizeofEncryptedSizes);
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES,
+ plainSizes.data(), sizeofPlainSizes);
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES,
+ encryptedSizes.data(), sizeofEncryptedSizes);
mbuf->set_range(frameOffset, mbuf->range_length() - frameOffset);
} else {
/*
@@ -675,8 +677,10 @@
*/
int32_t plainSizes[] = { 0 };
int32_t encryptedSizes[] = { static_cast<int32_t>(mbuf->range_length() - 9) };
- meta.setData(kKeyPlainSizes, 0, plainSizes, sizeof(plainSizes));
- meta.setData(kKeyEncryptedSizes, 0, encryptedSizes, sizeof(encryptedSizes));
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES,
+ plainSizes, sizeof(plainSizes));
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES,
+ encryptedSizes, sizeof(encryptedSizes));
mbuf->set_range(9, mbuf->range_length() - 9);
}
} else {
@@ -693,8 +697,10 @@
*/
int32_t plainSizes[] = { static_cast<int32_t>(mbuf->range_length() - 1) };
int32_t encryptedSizes[] = { 0 };
- meta.setData(kKeyPlainSizes, 0, plainSizes, sizeof(plainSizes));
- meta.setData(kKeyEncryptedSizes, 0, encryptedSizes, sizeof(encryptedSizes));
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES,
+ plainSizes, sizeof(plainSizes));
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES,
+ encryptedSizes, sizeof(encryptedSizes));
mbuf->set_range(1, mbuf->range_length() - 1);
}
@@ -721,14 +727,17 @@
}
len += trackInfo->mHeaderLen;
- MediaBufferBase *mbuf = MediaBufferBase::Create(len);
+ MediaBufferHelperV3 *mbuf;
+ mBufferGroup->acquire_buffer(&mbuf, false /* nonblocking */, len /* requested size */);
+ mbuf->set_range(0, len);
uint8_t *data = static_cast<uint8_t *>(mbuf->data());
if (trackInfo->mHeader) {
memcpy(data, trackInfo->mHeader, trackInfo->mHeaderLen);
}
- mbuf->meta_data().setInt64(kKeyTime, timeUs);
- mbuf->meta_data().setInt32(kKeyIsSyncFrame, block->IsKey());
+ AMediaFormat *meta = mbuf->meta_data();
+ AMediaFormat_setInt64(meta, AMEDIAFORMAT_KEY_TIME_US, timeUs);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, block->IsKey());
status_t err = frame.Read(mExtractor->mReader, data + trackInfo->mHeaderLen);
if (err == OK
@@ -754,7 +763,7 @@
}
media_status_t MatroskaSource::read(
- MediaBufferBase **out, const ReadOptions *options) {
+ MediaBufferHelperV3 **out, const ReadOptions *options) {
*out = NULL;
int64_t targetSampleTimeUs = -1ll;
@@ -790,13 +799,13 @@
}
}
- MediaBufferBase *frame = *mPendingFrames.begin();
+ MediaBufferHelperV3 *frame = *mPendingFrames.begin();
mPendingFrames.erase(mPendingFrames.begin());
if ((mType != AVC && mType != HEVC) || mNALSizeLen == 0) {
if (targetSampleTimeUs >= 0ll) {
- frame->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(frame->meta_data(),
+ AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
*out = frame;
@@ -819,7 +828,7 @@
size_t srcSize = frame->range_length();
size_t dstSize = 0;
- MediaBufferBase *buffer = NULL;
+ MediaBufferHelperV3 *buffer = NULL;
uint8_t *dstPtr = NULL;
for (int32_t pass = 0; pass < 2; ++pass) {
@@ -879,16 +888,20 @@
// each 4-byte nal size with a 4-byte start code
buffer = frame;
} else {
- buffer = MediaBufferBase::Create(dstSize);
+ mBufferGroup->acquire_buffer(
+ &buffer, false /* nonblocking */, dstSize /* requested size */);
+ buffer->set_range(0, dstSize);
}
+ AMediaFormat *frameMeta = frame->meta_data();
int64_t timeUs;
- CHECK(frame->meta_data().findInt64(kKeyTime, &timeUs));
+ CHECK(AMediaFormat_getInt64(frameMeta, AMEDIAFORMAT_KEY_TIME_US, &timeUs));
int32_t isSync;
- CHECK(frame->meta_data().findInt32(kKeyIsSyncFrame, &isSync));
+ CHECK(AMediaFormat_getInt32(frameMeta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, &isSync));
- buffer->meta_data().setInt64(kKeyTime, timeUs);
- buffer->meta_data().setInt32(kKeyIsSyncFrame, isSync);
+ AMediaFormat *bufMeta = buffer->meta_data();
+ AMediaFormat_setInt64(bufMeta, AMEDIAFORMAT_KEY_TIME_US, timeUs);
+ AMediaFormat_setInt32(bufMeta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, isSync);
dstPtr = (uint8_t *)buffer->data();
}
@@ -900,8 +913,8 @@
}
if (targetSampleTimeUs >= 0ll) {
- buffer->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(buffer->meta_data(),
+ AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
*out = buffer;
@@ -992,7 +1005,7 @@
return mTracks.size();
}
-MediaTrackHelperV2 *MatroskaExtractor::getTrack(size_t index) {
+MediaTrackHelperV3 *MatroskaExtractor::getTrack(size_t index) {
if (index >= mTracks.size()) {
return NULL;
}
@@ -1660,22 +1673,22 @@
__attribute__ ((visibility ("default")))
ExtractorDef GETEXTRACTORDEF() {
return {
- EXTRACTORDEF_VERSION_CURRENT,
+ EXTRACTORDEF_VERSION_CURRENT + 1,
UUID("abbedd92-38c4-4904-a4c1-b3f45f899980"),
1,
"Matroska Extractor",
{
- .v2 = [](
+ .v3 = [](
CDataSource *source,
float *confidence,
void **,
- FreeMetaFunc *) -> CreatorFuncV2 {
+ FreeMetaFunc *) -> CreatorFuncV3 {
DataSourceHelper helper(source);
if (SniffMatroska(&helper, confidence)) {
return [](
CDataSource *source,
- void *) -> CMediaExtractorV2* {
- return wrapV2(new MatroskaExtractor(new DataSourceHelper(source)));};
+ void *) -> CMediaExtractorV3* {
+ return wrapV3(new MatroskaExtractor(new DataSourceHelper(source)));};
}
return NULL;
}
diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h
index 2fa8881..a09256a 100644
--- a/media/extractors/mkv/MatroskaExtractor.h
+++ b/media/extractors/mkv/MatroskaExtractor.h
@@ -35,12 +35,12 @@
struct DataSourceBaseReader;
struct MatroskaSource;
-struct MatroskaExtractor : public MediaExtractorPluginHelperV2 {
+struct MatroskaExtractor : public MediaExtractorPluginHelperV3 {
explicit MatroskaExtractor(DataSourceHelper *source);
virtual size_t countTracks();
- virtual MediaTrackHelperV2 *getTrack(size_t index);
+ virtual MediaTrackHelperV3 *getTrack(size_t index);
virtual media_status_t getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t flags);
diff --git a/media/extractors/mp4/Android.bp b/media/extractors/mp4/Android.bp
index 91de353..1b308aa 100644
--- a/media/extractors/mp4/Android.bp
+++ b/media/extractors/mp4/Android.bp
@@ -15,7 +15,6 @@
shared_libs: [
"liblog",
- "libmediaextractor",
"libmediandk"
],
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 52213bd..c4b539d 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -44,10 +44,9 @@
#include <media/stagefright/foundation/ColorUtils.h>
#include <media/stagefright/foundation/avc_utils.h>
#include <media/stagefright/foundation/hexdump.h>
-#include <media/stagefright/MediaBufferBase.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaDefs.h>
-#include <media/stagefright/MetaData.h>
+#include <media/stagefright/MetaDataBase.h>
#include <utils/String8.h>
#include <byteswap.h>
@@ -70,7 +69,7 @@
kMaxAtomSize = 64 * 1024 * 1024,
};
-class MPEG4Source : public MediaTrackHelperV2 {
+class MPEG4Source : public MediaTrackHelperV3 {
static const size_t kMaxPcmFrameSize = 8192;
public:
// Caller retains ownership of both "dataSource" and "sampleTable".
@@ -89,10 +88,10 @@
virtual media_status_t getFormat(AMediaFormat *);
- virtual media_status_t read(MediaBufferBase **buffer, const ReadOptions *options = NULL);
+ virtual media_status_t read(MediaBufferHelperV3 **buffer, const ReadOptions *options = NULL);
virtual bool supportNonblockingRead() { return true; }
virtual media_status_t fragmentedRead(
- MediaBufferBase **buffer, const ReadOptions *options = NULL);
+ MediaBufferHelperV3 **buffer, const ReadOptions *options = NULL);
virtual ~MPEG4Source();
@@ -137,9 +136,7 @@
bool mStarted;
- MediaBufferGroup *mGroup;
-
- MediaBufferBase *mBuffer;
+ MediaBufferHelperV3 *mBuffer;
uint8_t *mSrcBuffer;
@@ -3827,7 +3824,7 @@
}
}
-MediaTrackHelperV2 *MPEG4Extractor::getTrack(size_t index) {
+MediaTrackHelperV3 *MPEG4Extractor::getTrack(size_t index) {
status_t err;
if ((err = readMetaData()) != OK) {
return NULL;
@@ -4329,7 +4326,6 @@
mIsPcm(false),
mNALLengthSize(0),
mStarted(false),
- mGroup(NULL),
mBuffer(NULL),
mSrcBuffer(NULL),
mIsHeif(itemTable != NULL),
@@ -4458,12 +4454,10 @@
const size_t kInitialBuffers = 2;
const size_t kMaxBuffers = 8;
const size_t realMaxBuffers = min(kMaxBufferSize / max_size, kMaxBuffers);
- mGroup = new MediaBufferGroup(kInitialBuffers, max_size, realMaxBuffers);
+ mBufferGroup->init(kInitialBuffers, max_size, realMaxBuffers);
mSrcBuffer = new (std::nothrow) uint8_t[max_size];
if (mSrcBuffer == NULL) {
// file probably specified a bad max size
- delete mGroup;
- mGroup = NULL;
return AMEDIA_ERROR_MALFORMED;
}
@@ -4485,9 +4479,6 @@
delete[] mSrcBuffer;
mSrcBuffer = NULL;
- delete mGroup;
- mGroup = NULL;
-
mStarted = false;
mCurrentSampleIndex = 0;
@@ -5184,12 +5175,12 @@
}
media_status_t MPEG4Source::read(
- MediaBufferBase **out, const ReadOptions *options) {
+ MediaBufferHelperV3 **out, const ReadOptions *options) {
Mutex::Autolock autoLock(mLock);
CHECK(mStarted);
- if (options != nullptr && options->getNonBlocking() && !mGroup->has_buffers()) {
+ if (options != nullptr && options->getNonBlocking() && !mBufferGroup->has_buffers()) {
*out = nullptr;
return AMEDIA_ERROR_WOULD_BLOCK;
}
@@ -5338,7 +5329,7 @@
return AMEDIA_ERROR_UNKNOWN;
}
- err = mGroup->acquire_buffer(&mBuffer);
+ err = mBufferGroup->acquire_buffer(&mBuffer);
if (err != OK) {
CHECK(mBuffer == NULL);
@@ -5377,9 +5368,11 @@
return AMEDIA_ERROR_IO;
}
- mBuffer->meta_data().clear();
- mBuffer->meta_data().setInt64(kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
- mBuffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
+ AMediaFormat *meta = mBuffer->meta_data();
+ AMediaFormat_clear(meta);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TIME_US, ((int64_t)cts * 1000000) / mTimescale);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, 1);
int32_t byteOrder;
AMediaFormat_getInt32(mFormat,
@@ -5410,19 +5403,20 @@
CHECK(mBuffer != NULL);
mBuffer->set_range(0, size);
- mBuffer->meta_data().clear();
- mBuffer->meta_data().setInt64(
- kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
- mBuffer->meta_data().setInt64(
- kKeyDuration, ((int64_t)stts * 1000000) / mTimescale);
+ AMediaFormat *meta = mBuffer->meta_data();
+ AMediaFormat_clear(meta);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TIME_US, ((int64_t)cts * 1000000) / mTimescale);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_DURATION, ((int64_t)stts * 1000000) / mTimescale);
if (targetSampleTimeUs >= 0) {
- mBuffer->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
if (isSyncSample) {
- mBuffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, 1);
}
++mCurrentSampleIndex;
@@ -5465,19 +5459,20 @@
}
mBuffer->set_range(0, dstOffset + size);
- mBuffer->meta_data().clear();
- mBuffer->meta_data().setInt64(
- kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
- mBuffer->meta_data().setInt64(
- kKeyDuration, ((int64_t)stts * 1000000) / mTimescale);
+ AMediaFormat *meta = mBuffer->meta_data();
+ AMediaFormat_clear(meta);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TIME_US, ((int64_t)cts * 1000000) / mTimescale);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_DURATION, ((int64_t)stts * 1000000) / mTimescale);
if (targetSampleTimeUs >= 0) {
- mBuffer->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
if (isSyncSample) {
- mBuffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, 1);
}
++mCurrentSampleIndex;
@@ -5545,31 +5540,32 @@
CHECK(mBuffer != NULL);
mBuffer->set_range(0, dstOffset);
- mBuffer->meta_data().clear();
- mBuffer->meta_data().setInt64(
- kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
- mBuffer->meta_data().setInt64(
- kKeyDuration, ((int64_t)stts * 1000000) / mTimescale);
+ AMediaFormat *meta = mBuffer->meta_data();
+ AMediaFormat_clear(meta);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TIME_US, ((int64_t)cts * 1000000) / mTimescale);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_DURATION, ((int64_t)stts * 1000000) / mTimescale);
if (targetSampleTimeUs >= 0) {
- mBuffer->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(
+ meta, AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
if (mIsAVC) {
uint32_t layerId = FindAVCLayerId(
(const uint8_t *)mBuffer->data(), mBuffer->range_length());
- mBuffer->meta_data().setInt32(kKeyTemporalLayerId, layerId);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID, layerId);
} else if (mIsHEVC) {
int32_t layerId = parseHEVCLayerId(
(const uint8_t *)mBuffer->data(), mBuffer->range_length());
if (layerId >= 0) {
- mBuffer->meta_data().setInt32(kKeyTemporalLayerId, layerId);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID, layerId);
}
}
if (isSyncSample) {
- mBuffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, 1);
}
++mCurrentSampleIndex;
@@ -5582,7 +5578,7 @@
}
media_status_t MPEG4Source::fragmentedRead(
- MediaBufferBase **out, const ReadOptions *options) {
+ MediaBufferHelperV3 **out, const ReadOptions *options) {
ALOGV("MPEG4Source::fragmentedRead");
@@ -5685,7 +5681,7 @@
mCurrentTime += smpl->duration;
isSyncSample = (mCurrentSampleIndex == 0);
- status_t err = mGroup->acquire_buffer(&mBuffer);
+ status_t err = mBufferGroup->acquire_buffer(&mBuffer);
if (err != OK) {
CHECK(mBuffer == NULL);
@@ -5701,19 +5697,21 @@
}
const Sample *smpl = &mCurrentSamples[mCurrentSampleIndex];
- MetaDataBase &bufmeta = mBuffer->meta_data();
- bufmeta.clear();
+ AMediaFormat *bufmeta = mBuffer->meta_data();
+ AMediaFormat_clear(bufmeta);
if (smpl->encryptedsizes.size()) {
// store clear/encrypted lengths in metadata
- bufmeta.setData(kKeyPlainSizes, 0,
+ AMediaFormat_setBuffer(bufmeta, AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES,
smpl->clearsizes.array(), smpl->clearsizes.size() * 4);
- bufmeta.setData(kKeyEncryptedSizes, 0,
+ AMediaFormat_setBuffer(bufmeta, AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES,
smpl->encryptedsizes.array(), smpl->encryptedsizes.size() * 4);
- bufmeta.setInt32(kKeyCryptoDefaultIVSize, mDefaultIVSize);
- bufmeta.setInt32(kKeyCryptoMode, mCryptoMode);
- bufmeta.setData(kKeyCryptoKey, 0, mCryptoKey, 16);
- bufmeta.setInt32(kKeyEncryptedByteBlock, mDefaultEncryptedByteBlock);
- bufmeta.setInt32(kKeySkipByteBlock, mDefaultSkipByteBlock);
+ AMediaFormat_setInt32(bufmeta, AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE, mDefaultIVSize);
+ AMediaFormat_setInt32(bufmeta, AMEDIAFORMAT_KEY_CRYPTO_MODE, mCryptoMode);
+ AMediaFormat_setBuffer(bufmeta, AMEDIAFORMAT_KEY_CRYPTO_KEY, mCryptoKey, 16);
+ AMediaFormat_setInt32(bufmeta,
+ AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK, mDefaultEncryptedByteBlock);
+ AMediaFormat_setInt32(bufmeta,
+ AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK, mDefaultSkipByteBlock);
void *iv = NULL;
size_t ivlength = 0;
@@ -5722,8 +5720,7 @@
iv = (void *) smpl->iv;
ivlength = 16; // use 16 or the actual size?
}
- bufmeta.setData(kKeyCryptoIV, 0, iv, ivlength);
-
+ AMediaFormat_setBuffer(bufmeta, AMEDIAFORMAT_KEY_CRYPTO_IV, iv, ivlength);
}
if (!mIsAVC && !mIsHEVC) {
@@ -5749,30 +5746,29 @@
CHECK(mBuffer != NULL);
mBuffer->set_range(0, size);
- mBuffer->meta_data().setInt64(
- kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
- mBuffer->meta_data().setInt64(
- kKeyDuration, ((int64_t)smpl->duration * 1000000) / mTimescale);
+ AMediaFormat_setInt64(bufmeta,
+ AMEDIAFORMAT_KEY_TIME_US, ((int64_t)cts * 1000000) / mTimescale);
+ AMediaFormat_setInt64(bufmeta,
+ AMEDIAFORMAT_KEY_DURATION, ((int64_t)smpl->duration * 1000000) / mTimescale);
if (targetSampleTimeUs >= 0) {
- mBuffer->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(bufmeta, AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
if (mIsAVC) {
uint32_t layerId = FindAVCLayerId(
(const uint8_t *)mBuffer->data(), mBuffer->range_length());
- mBuffer->meta_data().setInt32(kKeyTemporalLayerId, layerId);
+ AMediaFormat_setInt32(bufmeta, AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID, layerId);
} else if (mIsHEVC) {
int32_t layerId = parseHEVCLayerId(
(const uint8_t *)mBuffer->data(), mBuffer->range_length());
if (layerId >= 0) {
- mBuffer->meta_data().setInt32(kKeyTemporalLayerId, layerId);
+ AMediaFormat_setInt32(bufmeta, AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID, layerId);
}
}
if (isSyncSample) {
- mBuffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
+ AMediaFormat_setInt32(bufmeta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, 1);
}
++mCurrentSampleIndex;
@@ -5864,18 +5860,18 @@
CHECK(mBuffer != NULL);
mBuffer->set_range(0, dstOffset);
- mBuffer->meta_data().setInt64(
- kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
- mBuffer->meta_data().setInt64(
- kKeyDuration, ((int64_t)smpl->duration * 1000000) / mTimescale);
+ AMediaFormat *bufmeta = mBuffer->meta_data();
+ AMediaFormat_setInt64(bufmeta,
+ AMEDIAFORMAT_KEY_TIME_US, ((int64_t)cts * 1000000) / mTimescale);
+ AMediaFormat_setInt64(bufmeta,
+ AMEDIAFORMAT_KEY_DURATION, ((int64_t)smpl->duration * 1000000) / mTimescale);
if (targetSampleTimeUs >= 0) {
- mBuffer->meta_data().setInt64(
- kKeyTargetTime, targetSampleTimeUs);
+ AMediaFormat_setInt64(bufmeta, AMEDIAFORMAT_KEY_TARGET_TIME, targetSampleTimeUs);
}
if (isSyncSample) {
- mBuffer->meta_data().setInt32(kKeyIsSyncFrame, 1);
+ AMediaFormat_setInt32(bufmeta, AMEDIAFORMAT_KEY_IS_SYNC_FRAME, 1);
}
++mCurrentSampleIndex;
@@ -6075,11 +6071,11 @@
return true;
}
-static CMediaExtractorV2* CreateExtractor(CDataSource *source, void *) {
- return wrapV2(new MPEG4Extractor(new DataSourceHelper(source)));
+static CMediaExtractorV3* CreateExtractor(CDataSource *source, void *) {
+ return wrapV3(new MPEG4Extractor(new DataSourceHelper(source)));
}
-static CreatorFuncV2 Sniff(
+static CreatorFuncV3 Sniff(
CDataSource *source, float *confidence, void **,
FreeMetaFunc *) {
DataSourceHelper helper(source);
@@ -6100,11 +6096,11 @@
__attribute__ ((visibility ("default")))
ExtractorDef GETEXTRACTORDEF() {
return {
- EXTRACTORDEF_VERSION_CURRENT,
+ EXTRACTORDEF_VERSION_CURRENT + 1,
UUID("27575c67-4417-4c54-8d3d-8e626985a164"),
2, // version
"MP4 Extractor",
- { .v2 = Sniff }
+ { .v3 = Sniff }
};
}
diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h
index 56b641d..a9a4635 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -53,12 +53,12 @@
uint32_t default_sample_flags;
};
-class MPEG4Extractor : public MediaExtractorPluginHelperV2 {
+class MPEG4Extractor : public MediaExtractorPluginHelperV3 {
public:
explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL);
virtual size_t countTracks();
- virtual MediaTrackHelperV2 *getTrack(size_t index);
+ virtual MediaTrackHelperV3 *getTrack(size_t index);
virtual media_status_t getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t flags);
virtual media_status_t getMetaData(AMediaFormat *meta);
diff --git a/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h b/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
index eb49f4c..3682368 100644
--- a/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
+++ b/media/libmediaextractor/include/media/stagefright/MediaBufferBase.h
@@ -96,6 +96,14 @@
return ((MediaBufferBase*)handle)->size();
};
+ mWrapper->range_offset = [](void *handle) -> size_t {
+ return ((MediaBufferBase*)handle)->range_offset();
+ };
+
+ mWrapper->range_length = [](void *handle) -> size_t {
+ return ((MediaBufferBase*)handle)->range_length();
+ };
+
mWrapper->set_range = [](void *handle, size_t offset, size_t length) -> void {
return ((MediaBufferBase*)handle)->set_range(offset, length);
};
diff --git a/media/libstagefright/MediaTrack.cpp b/media/libstagefright/MediaTrack.cpp
index 6c0f989..5f2e601 100644
--- a/media/libstagefright/MediaTrack.cpp
+++ b/media/libstagefright/MediaTrack.cpp
@@ -16,6 +16,7 @@
#include <mutex>
+#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/Utils.h>
@@ -216,10 +217,51 @@
if (format->mFormat->findInt64("timeUs", &val64)) {
meta.setInt64(kKeyTime, val64);
}
+ if (format->mFormat->findInt64("duration", &val64)) {
+ meta.setInt64(kKeyDuration, val64);
+ }
+ if (format->mFormat->findInt64("target-time", &val64)) {
+ meta.setInt64(kKeyTargetTime, val64);
+ }
int32_t val32;
if (format->mFormat->findInt32("is-sync-frame", &val32)) {
meta.setInt32(kKeyIsSyncFrame, val32);
}
+ if (format->mFormat->findInt32("temporal-layer-id", &val32)) {
+ meta.setInt32(kKeyTemporalLayerId, val32);
+ }
+ if (format->mFormat->findInt32("temporal-layer-count", &val32)) {
+ meta.setInt32(kKeyTemporalLayerCount, val32);
+ }
+ if (format->mFormat->findInt32("crypto-default-iv-size", &val32)) {
+ meta.setInt32(kKeyCryptoDefaultIVSize, val32);
+ }
+ if (format->mFormat->findInt32("crypto-mode", &val32)) {
+ meta.setInt32(kKeyCryptoMode, val32);
+ }
+ if (format->mFormat->findInt32("crypto-encrypted-byte-block", &val32)) {
+ meta.setInt32(kKeyEncryptedByteBlock, val32);
+ }
+ if (format->mFormat->findInt32("crypto-skip-byte-block", &val32)) {
+ meta.setInt32(kKeySkipByteBlock, val32);
+ }
+ sp<ABuffer> valbuf;
+ if (format->mFormat->findBuffer("crypto-plain-sizes", &valbuf)) {
+ meta.setData(kKeyPlainSizes,
+ MetaDataBase::Type::TYPE_NONE, valbuf->data(), valbuf->size());
+ }
+ if (format->mFormat->findBuffer("crypto-encrypted-sizes", &valbuf)) {
+ meta.setData(kKeyEncryptedSizes,
+ MetaDataBase::Type::TYPE_NONE, valbuf->data(), valbuf->size());
+ }
+ if (format->mFormat->findBuffer("crypto-key", &valbuf)) {
+ meta.setData(kKeyCryptoKey,
+ MetaDataBase::Type::TYPE_NONE, valbuf->data(), valbuf->size());
+ }
+ if (format->mFormat->findBuffer("crypto-iv", &valbuf)) {
+ meta.setData(kKeyCryptoIV,
+ MetaDataBase::Type::TYPE_NONE, valbuf->data(), valbuf->size());
+ }
} else {
*buffer = nullptr;
}
diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp
index 670b607..cfa9fd9 100644
--- a/media/libstagefright/Utils.cpp
+++ b/media/libstagefright/Utils.cpp
@@ -598,7 +598,10 @@
{
{ "exif-offset", kKeyExifOffset },
{ "exif-size", kKeyExifSize },
+ { "target-time", kKeyTargetTime },
{ "thumbnail-time", kKeyThumbnailTime },
+ { "timeUs", kKeyTime },
+ { "durationUs", kKeyDuration },
}
};
@@ -613,6 +616,7 @@
{ "max-bitrate", kKeyMaxBitRate },
{ "pcm-big-endian", kKeyPcmBigEndian },
{ "temporal-layer-count", kKeyTemporalLayerCount },
+ { "temporal-layer-id", kKeyTemporalLayerId },
{ "thumbnail-width", kKeyThumbnailWidth },
{ "thumbnail-height", kKeyThumbnailHeight },
{ "frame-count", kKeyFrameCount },
@@ -626,6 +630,8 @@
{ "pssh", kKeyPssh },
{ "crypto-iv", kKeyCryptoIV },
{ "crypto-key", kKeyCryptoKey },
+ { "crypto-encrypted-sizes", kKeyEncryptedSizes },
+ { "crypto-plain-sizes", kKeyPlainSizes },
{ "icc-profile", kKeyIccProfile },
{ "text-format-data", kKeyTextFormatData },
}
diff --git a/media/ndk/NdkMediaFormat.cpp b/media/ndk/NdkMediaFormat.cpp
index e0af80d..8f3a9f3 100644
--- a/media/ndk/NdkMediaFormat.cpp
+++ b/media/ndk/NdkMediaFormat.cpp
@@ -294,9 +294,11 @@
EXPORT const char* AMEDIAFORMAT_KEY_COMPOSER = "composer";
EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE = "crypto-default-iv-size";
EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK = "crypto-encrypted-byte-block";
+EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES = "crypto-encrypted-sizes";
EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_IV = "crypto-iv";
EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_KEY = "crypto-key";
EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_MODE = "crypto-mode";
+EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES = "crypto-encrypted-sizes";
EXPORT const char* AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK = "crypto-skip-byte-block";
EXPORT const char* AMEDIAFORMAT_KEY_CSD = "csd";
EXPORT const char* AMEDIAFORMAT_KEY_CSD_0 = "csd-0";
@@ -361,6 +363,7 @@
EXPORT const char* AMEDIAFORMAT_KEY_SEI = "sei";
EXPORT const char* AMEDIAFORMAT_KEY_SLICE_HEIGHT = "slice-height";
EXPORT const char* AMEDIAFORMAT_KEY_STRIDE = "stride";
+EXPORT const char* AMEDIAFORMAT_KEY_TARGET_TIME = "target-time";
EXPORT const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT = "temporal-layer-count";
EXPORT const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID = "temporal-layer-id";
EXPORT const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYERING = "ts-schema";
diff --git a/media/ndk/include/media/NdkMediaFormat.h b/media/ndk/include/media/NdkMediaFormat.h
index 2cd1d04..6e7e0f9 100644
--- a/media/ndk/include/media/NdkMediaFormat.h
+++ b/media/ndk/include/media/NdkMediaFormat.h
@@ -190,9 +190,11 @@
extern const char* AMEDIAFORMAT_KEY_COMPOSER __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK __INTRODUCED_IN(29);
+extern const char* AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CRYPTO_IV __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CRYPTO_KEY __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CRYPTO_MODE __INTRODUCED_IN(29);
+extern const char* AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CSD_AVC __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_CSD_HEVC __INTRODUCED_IN(29);
@@ -217,6 +219,7 @@
extern const char* AMEDIAFORMAT_KEY_PSSH __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_SAR_HEIGHT __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_SAR_WIDTH __INTRODUCED_IN(29);
+extern const char* AMEDIAFORMAT_KEY_TARGET_TIME __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_TEXT_FORMAT_DATA __INTRODUCED_IN(29);
extern const char* AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT __INTRODUCED_IN(29);
diff --git a/media/ndk/libmediandk.map.txt b/media/ndk/libmediandk.map.txt
index 3567899..d24cc9b 100644
--- a/media/ndk/libmediandk.map.txt
+++ b/media/ndk/libmediandk.map.txt
@@ -58,9 +58,11 @@
AMEDIAFORMAT_KEY_COMPOSER; # var introduced=29
AMEDIAFORMAT_KEY_CRYPTO_DEFAULT_IV_SIZE; # var introduced=29
AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_BYTE_BLOCK; # var introduced=29
+ AMEDIAFORMAT_KEY_CRYPTO_ENCRYPTED_SIZES; # var introduced=29
AMEDIAFORMAT_KEY_CRYPTO_IV; # var introduced=29
AMEDIAFORMAT_KEY_CRYPTO_KEY; # var introduced=29
AMEDIAFORMAT_KEY_CRYPTO_MODE; # var introduced=29
+ AMEDIAFORMAT_KEY_CRYPTO_PLAIN_SIZES; # var introduced=29
AMEDIAFORMAT_KEY_CRYPTO_SKIP_BYTE_BLOCK; # var introduced=29
AMEDIAFORMAT_KEY_CSD; # var introduced=28
AMEDIAFORMAT_KEY_CSD_0; # var introduced=28
@@ -124,6 +126,7 @@
AMEDIAFORMAT_KEY_SEI; # var introduced=28
AMEDIAFORMAT_KEY_SLICE_HEIGHT; # var introduced=28
AMEDIAFORMAT_KEY_STRIDE; # var introduced=21
+ AMEDIAFORMAT_KEY_TARGET_TIME; # var introduced=29
AMEDIAFORMAT_KEY_TEMPORAL_LAYER_COUNT; # var introduced=29
AMEDIAFORMAT_KEY_TEMPORAL_LAYER_ID; # var introduced=28
AMEDIAFORMAT_KEY_TEMPORAL_LAYERING; # var introduced=28