heif: add muxer support for adding still images
This change adds basic support for adding still images to a
heif container.
bug: 63633199
test:
Locally built test app that adds more than one still images
and video sequences to a heif container. Verified the muxed
file can be played by locally built heif viewer app that
uses MediaExtractor/MediaMetadataRetriever/MediaPlayer apis.
Tested media post-submit CTS on Pixel2XL.
Change-Id: I185bbbbed3dbb4e76d64bcf7323ee44a42cc8623
diff --git a/media/extractors/mp4/ItemTable.cpp b/media/extractors/mp4/ItemTable.cpp
index 9a6cb64..85c66b2 100644
--- a/media/extractors/mp4/ItemTable.cpp
+++ b/media/extractors/mp4/ItemTable.cpp
@@ -1425,7 +1425,7 @@
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC);
if (image->itemId == mPrimaryItemId) {
- meta->setInt32(kKeyIsPrimaryImage, 1);
+ meta->setInt32(kKeyTrackIsDefault, 1);
}
ALOGV("image[%u]: size %dx%d", imageIndex, image->width, image->height);
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index 6671956..b411125 100644
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -347,7 +347,7 @@
mHeaderTimescale(0),
mIsQT(false),
mIsHeif(false),
- mIsHeifSequence(false),
+ mHasMoovBox(false),
mPreferHeif(mime != NULL && !strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_HEIF)),
mFirstTrack(NULL),
mLastTrack(NULL),
@@ -563,9 +563,9 @@
status_t err;
bool sawMoovOrSidx = false;
- while (!((!mIsHeif && sawMoovOrSidx && (mMdatFound || mMoofFound)) ||
- (mIsHeif && (mPreferHeif || !mIsHeifSequence)
- && (mItemTable != NULL) && mItemTable->isValid()))) {
+ while (!((mHasMoovBox && sawMoovOrSidx && (mMdatFound || mMoofFound)) ||
+ (mIsHeif && (mPreferHeif || !mHasMoovBox) &&
+ (mItemTable != NULL) && mItemTable->isValid()))) {
off64_t orig_offset = offset;
err = parseChunk(&offset, 0);
@@ -582,34 +582,30 @@
}
}
- if (mIsHeif) {
- uint32_t imageCount = mItemTable->countImages();
- if (imageCount == 0) {
- ALOGE("found no image in heif!");
- } else {
- for (uint32_t imageIndex = 0; imageIndex < imageCount; imageIndex++) {
- sp<MetaData> meta = mItemTable->getImageMeta(imageIndex);
- if (meta == NULL) {
- ALOGE("heif image %u has no meta!", imageIndex);
- continue;
- }
-
- ALOGV("adding HEIF image track %u", imageIndex);
- Track *track = new Track;
- track->next = NULL;
- if (mLastTrack != NULL) {
- mLastTrack->next = track;
- } else {
- mFirstTrack = track;
- }
- mLastTrack = track;
-
- track->meta = meta;
- track->meta->setInt32(kKeyTrackID, imageIndex);
- track->includes_expensive_metadata = false;
- track->skipTrack = false;
- track->timescale = 0;
+ if (mIsHeif && (mItemTable != NULL) && (mItemTable->countImages() > 0)) {
+ for (uint32_t imageIndex = 0;
+ imageIndex < mItemTable->countImages(); imageIndex++) {
+ sp<MetaData> meta = mItemTable->getImageMeta(imageIndex);
+ if (meta == NULL) {
+ ALOGE("heif image %u has no meta!", imageIndex);
+ continue;
}
+
+ ALOGV("adding HEIF image track %u", imageIndex);
+ Track *track = new Track;
+ track->next = NULL;
+ if (mLastTrack != NULL) {
+ mLastTrack->next = track;
+ } else {
+ mFirstTrack = track;
+ }
+ mLastTrack = track;
+
+ track->meta = meta;
+ track->meta->setInt32(kKeyTrackID, imageIndex);
+ track->includes_expensive_metadata = false;
+ track->skipTrack = false;
+ track->timescale = 0;
}
}
@@ -2512,13 +2508,18 @@
} else {
if (brandSet.count(FOURCC('m', 'i', 'f', '1')) > 0
&& brandSet.count(FOURCC('h', 'e', 'i', 'c')) > 0) {
- mIsHeif = true;
ALOGV("identified HEIF image");
+
+ mIsHeif = true;
+ brandSet.erase(FOURCC('m', 'i', 'f', '1'));
+ brandSet.erase(FOURCC('h', 'e', 'i', 'c'));
}
- if (brandSet.count(FOURCC('m', 's', 'f', '1')) > 0
- && brandSet.count(FOURCC('h', 'e', 'v', 'c')) > 0) {
- mIsHeifSequence = true;
- ALOGV("identified HEIF image sequence");
+
+ if (!brandSet.empty()) {
+ // This means that the file should have moov box.
+ // It could be any iso files (mp4, heifs, etc.)
+ mHasMoovBox = true;
+ ALOGV("identified HEIF image with other tracks");
}
}
diff --git a/media/extractors/mp4/MPEG4Extractor.h b/media/extractors/mp4/MPEG4Extractor.h
index d4f17e3..76b549d 100644
--- a/media/extractors/mp4/MPEG4Extractor.h
+++ b/media/extractors/mp4/MPEG4Extractor.h
@@ -104,7 +104,7 @@
uint32_t mHeaderTimescale;
bool mIsQT;
bool mIsHeif;
- bool mIsHeifSequence;
+ bool mHasMoovBox;
bool mPreferHeif;
Track *mFirstTrack, *mLastTrack;