Convert AACExtractor to use AMediaFormat
Bug: 111407253
Test: manual
Change-Id: I99ec13444aa6b6306507397b43be5e6e36c2713e
diff --git a/media/extractors/aac/AACExtractor.cpp b/media/extractors/aac/AACExtractor.cpp
index 1589131..f179e03 100644
--- a/media/extractors/aac/AACExtractor.cpp
+++ b/media/extractors/aac/AACExtractor.cpp
@@ -26,24 +26,23 @@
#include <media/stagefright/MediaBufferGroup.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>
namespace android {
-class AACSource : public MediaTrackHelper {
+class AACSource : public MediaTrackHelperV2 {
public:
AACSource(
DataSourceHelper *source,
- MetaDataBase &meta,
+ AMediaFormat *meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us);
virtual status_t start();
virtual status_t stop();
- virtual status_t getFormat(MetaDataBase&);
+ virtual status_t getFormat(AMediaFormat*);
virtual status_t read(
MediaBufferBase **buffer, const ReadOptions *options = NULL);
@@ -54,7 +53,7 @@
private:
static const size_t kMaxFrameSize;
DataSourceHelper *mDataSource;
- MetaDataBase mMeta;
+ AMediaFormat *mMeta;
off64_t mOffset;
int64_t mCurrentTimeUs;
@@ -150,6 +149,7 @@
}
channel = (header[0] & 0x1) << 2 | (header[1] >> 6);
+ mMeta = AMediaFormat_new();
MakeAACCodecSpecificData(mMeta, profile, sf_index, channel);
off64_t streamSize, numFrames = 0;
@@ -173,19 +173,20 @@
// Round up and get the duration
mFrameDurationUs = (1024 * 1000000ll + (sr - 1)) / sr;
duration = numFrames * mFrameDurationUs;
- mMeta.setInt64(kKeyDuration, duration);
+ AMediaFormat_setInt64(mMeta, AMEDIAFORMAT_KEY_DURATION, duration);
}
mInitCheck = OK;
}
AACExtractor::~AACExtractor() {
+ AMediaFormat_delete(mMeta);
}
-status_t AACExtractor::getMetaData(MetaDataBase &meta) {
- meta.clear();
+status_t AACExtractor::getMetaData(AMediaFormat *meta) {
+ AMediaFormat_clear(meta);
if (mInitCheck == OK) {
- meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC_ADTS);
+ AMediaFormat_setString(meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_AUDIO_AAC_ADTS);
}
return OK;
@@ -195,7 +196,7 @@
return mInitCheck == OK ? 1 : 0;
}
-MediaTrackHelper *AACExtractor::getTrack(size_t index) {
+MediaTrackHelperV2 *AACExtractor::getTrack(size_t index) {
if (mInitCheck != OK || index != 0) {
return NULL;
}
@@ -203,12 +204,12 @@
return new AACSource(mDataSource, mMeta, mOffsetVector, mFrameDurationUs);
}
-status_t AACExtractor::getTrackMetaData(MetaDataBase &meta, size_t index, uint32_t /* flags */) {
+status_t AACExtractor::getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t /* flags */) {
if (mInitCheck != OK || index != 0) {
return UNKNOWN_ERROR;
}
- meta = mMeta;
+ AMediaFormat_copy(meta, mMeta);
return OK;
}
@@ -219,7 +220,7 @@
AACSource::AACSource(
DataSourceHelper *source,
- MetaDataBase &meta,
+ AMediaFormat *meta,
const Vector<uint64_t> &offset_vector,
int64_t frame_duration_us)
: mDataSource(source),
@@ -265,8 +266,8 @@
return OK;
}
-status_t AACSource::getFormat(MetaDataBase &meta) {
- meta = mMeta;
+status_t AACSource::getFormat(AMediaFormat *meta) {
+ AMediaFormat_copy(meta, mMeta);
return OK;
}
@@ -322,14 +323,14 @@
////////////////////////////////////////////////////////////////////////////////
-static CMediaExtractor* CreateExtractor(
+static CMediaExtractorV2* CreateExtractor(
CDataSource *source,
void *meta) {
off64_t offset = *static_cast<off64_t*>(meta);
- return wrap(new AACExtractor(new DataSourceHelper(source), offset));
+ return wrapV2(new AACExtractor(new DataSourceHelper(source), offset));
}
-static CreatorFunc Sniff(
+static CreatorFuncV2 Sniff(
CDataSource *source, float *confidence, void **meta,
FreeMetaFunc *freeMeta) {
off64_t pos = 0;
@@ -389,11 +390,11 @@
__attribute__ ((visibility ("default")))
ExtractorDef GETEXTRACTORDEF() {
return {
- EXTRACTORDEF_VERSION,
+ EXTRACTORDEF_VERSION_CURRENT,
UUID("4fd80eae-03d2-4d72-9eb9-48fa6bb54613"),
1, // version
"AAC Extractor",
- { Sniff }
+ { .v2 = Sniff }
};
}
diff --git a/media/extractors/aac/AACExtractor.h b/media/extractors/aac/AACExtractor.h
index 7afdeb7..add7d22 100644
--- a/media/extractors/aac/AACExtractor.h
+++ b/media/extractors/aac/AACExtractor.h
@@ -20,7 +20,7 @@
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
-#include <media/stagefright/MetaDataBase.h>
+#include <media/NdkMediaFormat.h>
#include <utils/Vector.h>
@@ -29,15 +29,15 @@
struct AMessage;
class String8;
-class AACExtractor : public MediaExtractorPluginHelper {
+class AACExtractor : public MediaExtractorPluginHelperV2 {
public:
AACExtractor(DataSourceHelper *source, off64_t offset);
virtual size_t countTracks();
- virtual MediaTrackHelper *getTrack(size_t index);
- virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags);
+ virtual MediaTrackHelperV2 *getTrack(size_t index);
+ virtual status_t getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t flags);
- virtual status_t getMetaData(MetaDataBase& meta);
+ virtual status_t getMetaData(AMediaFormat *meta);
virtual const char * name() { return "AACExtractor"; }
protected:
@@ -45,7 +45,7 @@
private:
DataSourceHelper *mDataSource;
- MetaDataBase mMeta;
+ AMediaFormat *mMeta;
status_t mInitCheck;
Vector<uint64_t> mOffsetVector;
diff --git a/media/extractors/aac/Android.bp b/media/extractors/aac/Android.bp
index 5f05b42..42b0a64 100644
--- a/media/extractors/aac/Android.bp
+++ b/media/extractors/aac/Android.bp
@@ -9,6 +9,7 @@
shared_libs: [
"liblog",
"libmediaextractor",
+ "libmediandk",
],
static_libs: [
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index 90a7eb5..5eae2b3 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -45,7 +45,7 @@
},
},
- shared_libs: ["libmedia"],
+ shared_libs: ["libmedia", "libmediandk"],
}
cc_library_shared {
diff --git a/media/libstagefright/MetaDataUtils.cpp b/media/libstagefright/MetaDataUtils.cpp
index 2475e7b..5672145 100644
--- a/media/libstagefright/MetaDataUtils.cpp
+++ b/media/libstagefright/MetaDataUtils.cpp
@@ -23,6 +23,8 @@
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MetaDataUtils.h>
+#include <media/stagefright/Utils.h>
+#include <media/NdkMediaFormat.h>
namespace android {
@@ -91,20 +93,21 @@
}
bool MakeAACCodecSpecificData(
- MetaDataBase &meta,
- unsigned profile, unsigned sampling_freq_index,
- unsigned channel_configuration) {
+ uint8_t *csd, /* out */
+ size_t *esds_size, /* in/out */
+ unsigned profile, /* in */
+ unsigned sampling_freq_index, /* in */
+ unsigned channel_configuration, /* in */
+ int32_t *sampling_rate /* out */
+) {
if(sampling_freq_index > 11u) {
return false;
}
- int32_t sampleRate;
- int32_t channelCount;
static const int32_t kSamplingFreq[] = {
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
16000, 12000, 11025, 8000
};
- sampleRate = kSamplingFreq[sampling_freq_index];
- channelCount = channel_configuration;
+ *sampling_rate = kSamplingFreq[sampling_freq_index];
static const uint8_t kStaticESDS[] = {
0x03, 22,
@@ -127,7 +130,9 @@
};
size_t csdSize = sizeof(kStaticESDS) + 2;
- uint8_t *csd = new uint8_t[csdSize];
+ if (csdSize > *esds_size) {
+ return false;
+ }
memcpy(csd, kStaticESDS, sizeof(kStaticESDS));
csd[sizeof(kStaticESDS)] =
@@ -136,13 +141,54 @@
csd[sizeof(kStaticESDS) + 1] =
((sampling_freq_index << 7) & 0x80) | (channel_configuration << 3);
+ *esds_size = csdSize;
+ return true;
+}
+
+bool MakeAACCodecSpecificData(AMediaFormat *meta, unsigned profile, unsigned sampling_freq_index,
+ unsigned channel_configuration) {
+
+ if(sampling_freq_index > 11u) {
+ return false;
+ }
+
+ uint8_t csd[2];
+ csd[0] = ((profile + 1) << 3) | (sampling_freq_index >> 1);
+ csd[1] = ((sampling_freq_index << 7) & 0x80) | (channel_configuration << 3);
+
+ static const int32_t kSamplingFreq[] = {
+ 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
+ 16000, 12000, 11025, 8000
+ };
+ int32_t sampleRate = kSamplingFreq[sampling_freq_index];
+
+ AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CSD_0, csd, sizeof(csd));
+ AMediaFormat_setString(meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_AUDIO_AAC);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_SAMPLE_RATE, sampleRate);
+ AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_CHANNEL_COUNT, channel_configuration);
+
+ return true;
+}
+
+bool MakeAACCodecSpecificData(
+ MetaDataBase &meta,
+ unsigned profile, unsigned sampling_freq_index,
+ unsigned channel_configuration) {
+
+ uint8_t csd[24];
+ size_t csdSize = sizeof(csd);
+ int32_t sampleRate;
+
+ if (!MakeAACCodecSpecificData(csd, &csdSize, profile, sampling_freq_index,
+ channel_configuration, &sampleRate)) {
+ return false;
+ }
+
meta.setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
meta.setInt32(kKeySampleRate, sampleRate);
- meta.setInt32(kKeyChannelCount, channelCount);
-
+ meta.setInt32(kKeyChannelCount, channel_configuration);
meta.setData(kKeyESDS, 0, csd, csdSize);
- delete [] csd;
return true;
}
diff --git a/media/libstagefright/httplive/Android.bp b/media/libstagefright/httplive/Android.bp
index 2f933a0..2907751 100644
--- a/media/libstagefright/httplive/Android.bp
+++ b/media/libstagefright/httplive/Android.bp
@@ -37,6 +37,7 @@
"libcutils",
"libmedia",
"libmediaextractor",
+ "libmediandk",
"libstagefright",
"libstagefright_foundation",
"libutils",
diff --git a/media/libstagefright/include/media/stagefright/MetaDataUtils.h b/media/libstagefright/include/media/stagefright/MetaDataUtils.h
index 4a7107d..fd79a9e 100644
--- a/media/libstagefright/include/media/stagefright/MetaDataUtils.h
+++ b/media/libstagefright/include/media/stagefright/MetaDataUtils.h
@@ -20,14 +20,20 @@
#include <media/stagefright/MetaData.h>
+struct AMediaFormat;
+
namespace android {
struct ABuffer;
bool MakeAVCCodecSpecificData(MetaDataBase &meta, const uint8_t *data, size_t size);
+
bool MakeAACCodecSpecificData(MetaDataBase &meta, const uint8_t *data, size_t size);
bool MakeAACCodecSpecificData(MetaDataBase &meta, unsigned profile, unsigned sampling_freq_index,
unsigned channel_configuration);
+bool MakeAACCodecSpecificData(AMediaFormat *meta, unsigned profile, unsigned sampling_freq_index,
+ unsigned channel_configuration);
+
} // namespace android
#endif // META_DATA_UTILS_H_