Merge changes Ic983efe6,I6eeb4aa6
* changes:
Fix test that checks if metadata is already set
Fix multiple-track mkv files
diff --git a/media/extractors/mkv/MatroskaExtractor.cpp b/media/extractors/mkv/MatroskaExtractor.cpp
index 20cc643..d6d24c1 100644
--- a/media/extractors/mkv/MatroskaExtractor.cpp
+++ b/media/extractors/mkv/MatroskaExtractor.cpp
@@ -1336,6 +1336,13 @@
mReader = NULL;
delete mDataSource;
+
+ for (size_t i = 0; i < mTracks.size(); ++i) {
+ TrackInfo *info = &mTracks.editItemAt(i);
+ if (info->mMeta) {
+ AMediaFormat_delete(info->mMeta);
+ }
+ }
}
size_t MatroskaExtractor::countTracks() {
@@ -1808,6 +1815,8 @@
void MatroskaExtractor::addTracks() {
const mkvparser::Tracks *tracks = mSegment->GetTracks();
+ AMediaFormat *meta = nullptr;
+
for (size_t index = 0; index < tracks->GetTracksCount(); ++index) {
const mkvparser::Track *track = tracks->GetTrackByIndex(index);
@@ -1832,7 +1841,11 @@
enum { VIDEO_TRACK = 1, AUDIO_TRACK = 2 };
- AMediaFormat *meta = AMediaFormat_new();
+ if (meta) {
+ AMediaFormat_clear(meta);
+ } else {
+ meta = AMediaFormat_new();
+ }
status_t err = OK;
int32_t nalSize = -1;
@@ -2067,21 +2080,26 @@
long long durationNs = mSegment->GetDuration();
AMediaFormat_setInt64(meta, AMEDIAFORMAT_KEY_DURATION, (durationNs + 500) / 1000);
+ const char *mimetype = "";
+ if (!AMediaFormat_getString(meta, AMEDIAFORMAT_KEY_MIME, &mimetype)) {
+ // do not add this track to the track list
+ ALOGW("ignoring track with unknown mime");
+ continue;
+ }
+
mTracks.push();
size_t n = mTracks.size() - 1;
TrackInfo *trackInfo = &mTracks.editItemAt(n);
initTrackInfo(track, meta, trackInfo);
trackInfo->mNalLengthSize = nalSize;
- const char *mimetype = "";
- AMediaFormat_getString(meta, AMEDIAFORMAT_KEY_MIME, &mimetype);
-
if ((!strcmp("V_MPEG4/ISO/AVC", codecID) && codecPrivateSize == 0) ||
(!strcmp(mimetype, MEDIA_MIMETYPE_VIDEO_AVC) && isSetCsdFrom1stFrame)) {
// Attempt to recover from AVC track without codec private data
err = synthesizeAVCC(trackInfo, n);
if (err != OK) {
mTracks.pop();
+ continue;
}
} else if ((!strcmp("V_MPEG2", codecID) && codecPrivateSize == 0) ||
(!strcmp(mimetype, MEDIA_MIMETYPE_VIDEO_MPEG2) && isSetCsdFrom1stFrame)) {
@@ -2089,6 +2107,7 @@
err = synthesizeMPEG2(trackInfo, n);
if (err != OK) {
mTracks.pop();
+ continue;
}
} else if ((!strcmp("V_MPEG4/ISO/ASP", codecID) && codecPrivateSize == 0) ||
(!strcmp(mimetype, MEDIA_MIMETYPE_VIDEO_MPEG4) && isSetCsdFrom1stFrame) ||
@@ -2099,9 +2118,14 @@
err = synthesizeMPEG4(trackInfo, n);
if (err != OK) {
mTracks.pop();
+ continue;
}
}
-
+ // the TrackInfo owns the metadata now
+ meta = nullptr;
+ }
+ if (meta) {
+ AMediaFormat_delete(meta);
}
}
diff --git a/media/extractors/mkv/MatroskaExtractor.h b/media/extractors/mkv/MatroskaExtractor.h
index d53d9e3..99fad17 100644
--- a/media/extractors/mkv/MatroskaExtractor.h
+++ b/media/extractors/mkv/MatroskaExtractor.h
@@ -61,10 +61,8 @@
TrackInfo() {
mMeta = NULL;
}
+
~TrackInfo() {
- if (mMeta) {
- AMediaFormat_delete(mMeta);
- }
}
unsigned long mTrackNum;
bool mEncrypted;
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index a3bf7f4..5ff1c59 100755
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -3675,8 +3675,10 @@
void *tmpData;
size_t tmpDataSize;
+ const char *s;
if (size >= 8 && metadataKey &&
- !AMediaFormat_getBuffer(mFileMetaData, metadataKey, &tmpData, &tmpDataSize)) {
+ !AMediaFormat_getBuffer(mFileMetaData, metadataKey, &tmpData, &tmpDataSize) &&
+ !AMediaFormat_getString(mFileMetaData, metadataKey, &s)) {
if (!strcmp(metadataKey, "albumart")) {
AMediaFormat_setBuffer(mFileMetaData, metadataKey,
buffer + 8, size - 8);
@@ -3918,10 +3920,9 @@
};
static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);
- void *tmpData;
- size_t tmpDataSize;
for (size_t i = 0; i < kNumMapEntries; ++i) {
- if (!AMediaFormat_getBuffer(mFileMetaData, kMap[i].key, &tmpData, &tmpDataSize)) {
+ const char *ss;
+ if (!AMediaFormat_getString(mFileMetaData, kMap[i].key, &ss)) {
ID3::Iterator *it = new ID3::Iterator(id3, kMap[i].tag1);
if (it->done()) {
delete it;