Merge "MPEG4Extractor: parse Sample Auxiliary Information in mdat" into rvc-dev am: bf74c089dc am: da14a891e0
Change-Id: I40cd9a63520e272cb40d4c0d0cea6f79623ac244
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 73d1267..7c85952 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -20,6 +20,7 @@
#include <ctype.h>
#include <inttypes.h>
#include <algorithm>
+#include <map>
#include <memory>
#include <stdint.h>
#include <stdlib.h>
@@ -204,6 +205,7 @@
Vector<size_t> encryptedsizes;
};
Vector<Sample> mCurrentSamples;
+ std::map<off64_t, uint32_t> mDrmOffsets;
MPEG4Source(const MPEG4Source &);
MPEG4Source &operator=(const MPEG4Source &);
@@ -5172,6 +5174,9 @@
if (chunk_type == FOURCC("moof")) {
mNextMoofOffset = *offset;
break;
+ } else if (chunk_type == FOURCC("mdat")) {
+ parseChunk(offset);
+ continue;
} else if (chunk_size == 0) {
break;
}
@@ -5233,6 +5238,22 @@
// parse DRM info if present
ALOGV("MPEG4Source::parseChunk mdat");
// if saiz/saoi was previously observed, do something with the sampleinfos
+ status_t err = OK;
+ auto kv = mDrmOffsets.lower_bound(*offset);
+ if (kv != mDrmOffsets.end()) {
+ auto drmoffset = kv->first;
+ auto flags = kv->second;
+ mDrmOffsets.erase(kv);
+ ALOGV("mdat chunk_size %" PRIu64 " drmoffset %" PRId64 " offset %" PRId64,
+ chunk_size, drmoffset, *offset);
+ if (chunk_size >= drmoffset - *offset) {
+ err = parseClearEncryptedSizes(drmoffset, false, flags,
+ chunk_size - (drmoffset - *offset));
+ }
+ }
+ if (err != OK) {
+ return err;
+ }
*offset += chunk_size;
break;
}
@@ -5414,8 +5435,10 @@
off64_t drmoffset = mCurrentSampleInfoOffsets[0]; // from moof
drmoffset += mCurrentMoofOffset;
+ mDrmOffsets[drmoffset] = flags;
+ ALOGV("saio drmoffset %" PRId64 " flags %u", drmoffset, flags);
- return parseClearEncryptedSizes(drmoffset, false, 0, mCurrentMoofSize);
+ return OK;
}
status_t MPEG4Source::parseClearEncryptedSizes(