Loading media/extractors/mp4/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ cc_defaults { shared_libs: [ "liblog", "libmediaextractor", "libmediandk" ], static_libs: [ Loading media/extractors/mp4/ItemTable.cpp +33 −22 Original line number Diff line number Diff line Loading @@ -1477,7 +1477,7 @@ uint32_t ItemTable::countImages() const { return mImageItemsValid ? mDisplayables.size() : 0; } sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { if (!mImageItemsValid) { return NULL; } Loading @@ -1502,28 +1502,31 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { } } sp<MetaData> meta = new MetaData; meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC); AMediaFormat *meta = AMediaFormat_new(); AMediaFormat_setString(meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC); if (image->itemId == mPrimaryItemId) { meta->setInt32(kKeyTrackIsDefault, 1); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_DEFAULT, 1); } ALOGV("image[%u]: size %dx%d", imageIndex, image->width, image->height); meta->setInt32(kKeyWidth, image->width); meta->setInt32(kKeyHeight, image->height); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_WIDTH, image->width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_HEIGHT, image->height); if (image->rotation != 0) { // Rotation angle in HEIF is CCW, convert to CW here to be // consistent with the other media formats. switch(image->rotation) { case 90: meta->setInt32(kKeyRotation, 270); break; case 180: meta->setInt32(kKeyRotation, 180); break; case 270: meta->setInt32(kKeyRotation, 90); break; case 90: case 180: case 270: AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_ROTATION, 360 - image->rotation); break; default: break; // don't set if invalid } } meta->setInt32(kKeyMaxInputSize, image->width * image->height * 1.5); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); if (!image->thumbnails.empty()) { ssize_t thumbItemIndex = mItemIdToItemMap.indexOfKey(image->thumbnails[0]); Loading @@ -1531,10 +1534,12 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { const ImageItem &thumbnail = mItemIdToItemMap[thumbItemIndex]; if (thumbnail.hvcc != NULL) { meta->setInt32(kKeyThumbnailWidth, thumbnail.width); meta->setInt32(kKeyThumbnailHeight, thumbnail.height); meta->setData(kKeyThumbnailHVCC, kTypeHVCC, thumbnail.hvcc->data(), thumbnail.hvcc->size()); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH, thumbnail.width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT, thumbnail.height); AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CSD_HEVC, thumbnail.hvcc->data(), thumbnail.hvcc->size()); ALOGV("image[%u]: thumbnail: size %dx%d, item index %zd", imageIndex, thumbnail.width, thumbnail.height, thumbItemIndex); } else { Loading @@ -1546,24 +1551,30 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { } if (image->isGrid()) { meta->setInt32(kKeyGridRows, image->rows); meta->setInt32(kKeyGridCols, image->columns); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_GRID_ROWS, image->rows); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_GRID_COLUMNS, image->columns); // point image to the first tile for grid size and HVCC image = &mItemIdToItemMap.editValueAt(tileItemIndex); meta->setInt32(kKeyTileWidth, image->width); meta->setInt32(kKeyTileHeight, image->height); meta->setInt32(kKeyMaxInputSize, image->width * image->height * 1.5); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TILE_WIDTH, image->width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TILE_HEIGHT, image->height); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); } if (image->hvcc == NULL) { ALOGE("%s: hvcc is missing for image[%u]!", __FUNCTION__, imageIndex); return NULL; } meta->setData(kKeyHVCC, kTypeHVCC, image->hvcc->data(), image->hvcc->size()); AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CSD_HEVC, image->hvcc->data(), image->hvcc->size()); if (image->icc != NULL) { meta->setData(kKeyIccProfile, 0, image->icc->data(), image->icc->size()); AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_ICC_PROFILE, image->icc->data(), image->icc->size()); } return meta; } Loading media/extractors/mp4/ItemTable.h +3 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <set> #include <media/NdkMediaFormat.h> #include <media/stagefright/foundation/ADebug.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> Loading Loading @@ -51,7 +53,7 @@ public: bool isValid() { return mImageItemsValid; } uint32_t countImages() const; sp<MetaData> getImageMeta(const uint32_t imageIndex); AMediaFormat *getImageMeta(const uint32_t imageIndex); status_t findImageItem(const uint32_t imageIndex, uint32_t *itemIndex); status_t findThumbnailItem(const uint32_t imageIndex, uint32_t *itemIndex); status_t getImageOffsetAndSize( Loading media/extractors/mp4/MPEG4Extractor.cpp +393 −325 File changed.Preview size limit exceeded, changes collapsed. Show changes media/extractors/mp4/MPEG4Extractor.h +7 −7 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ #include <media/MediaExtractorPluginApi.h> #include <media/MediaExtractorPluginHelper.h> #include <media/stagefright/MetaDataBase.h> #include <media/NdkMediaFormat.h> #include <media/stagefright/foundation/AString.h> #include <utils/KeyedVector.h> #include <utils/List.h> Loading Loading @@ -53,15 +53,15 @@ struct Trex { uint32_t default_sample_flags; }; class MPEG4Extractor : public MediaExtractorPluginHelper { class MPEG4Extractor : public MediaExtractorPluginHelperV2 { public: explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL); 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 media_status_t getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); virtual media_status_t getMetaData(AMediaFormat *meta); virtual uint32_t flags() const; virtual const char * name() { return "MPEG4Extractor"; } Loading @@ -77,7 +77,7 @@ private: }; struct Track { Track *next; MetaDataBase meta; AMediaFormat *meta; uint32_t timescale; sp<SampleTable> sampleTable; bool includes_expensive_metadata; Loading Loading @@ -107,7 +107,7 @@ private: Track *mFirstTrack, *mLastTrack; MetaDataBase mFileMetaData; AMediaFormat *mFileMetaData; Vector<uint32_t> mPath; String8 mLastCommentMean; Loading Loading
media/extractors/mp4/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ cc_defaults { shared_libs: [ "liblog", "libmediaextractor", "libmediandk" ], static_libs: [ Loading
media/extractors/mp4/ItemTable.cpp +33 −22 Original line number Diff line number Diff line Loading @@ -1477,7 +1477,7 @@ uint32_t ItemTable::countImages() const { return mImageItemsValid ? mDisplayables.size() : 0; } sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) { if (!mImageItemsValid) { return NULL; } Loading @@ -1502,28 +1502,31 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { } } sp<MetaData> meta = new MetaData; meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC); AMediaFormat *meta = AMediaFormat_new(); AMediaFormat_setString(meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC); if (image->itemId == mPrimaryItemId) { meta->setInt32(kKeyTrackIsDefault, 1); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_IS_DEFAULT, 1); } ALOGV("image[%u]: size %dx%d", imageIndex, image->width, image->height); meta->setInt32(kKeyWidth, image->width); meta->setInt32(kKeyHeight, image->height); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_WIDTH, image->width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_HEIGHT, image->height); if (image->rotation != 0) { // Rotation angle in HEIF is CCW, convert to CW here to be // consistent with the other media formats. switch(image->rotation) { case 90: meta->setInt32(kKeyRotation, 270); break; case 180: meta->setInt32(kKeyRotation, 180); break; case 270: meta->setInt32(kKeyRotation, 90); break; case 90: case 180: case 270: AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_ROTATION, 360 - image->rotation); break; default: break; // don't set if invalid } } meta->setInt32(kKeyMaxInputSize, image->width * image->height * 1.5); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); if (!image->thumbnails.empty()) { ssize_t thumbItemIndex = mItemIdToItemMap.indexOfKey(image->thumbnails[0]); Loading @@ -1531,10 +1534,12 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { const ImageItem &thumbnail = mItemIdToItemMap[thumbItemIndex]; if (thumbnail.hvcc != NULL) { meta->setInt32(kKeyThumbnailWidth, thumbnail.width); meta->setInt32(kKeyThumbnailHeight, thumbnail.height); meta->setData(kKeyThumbnailHVCC, kTypeHVCC, thumbnail.hvcc->data(), thumbnail.hvcc->size()); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH, thumbnail.width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_THUMBNAIL_HEIGHT, thumbnail.height); AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CSD_HEVC, thumbnail.hvcc->data(), thumbnail.hvcc->size()); ALOGV("image[%u]: thumbnail: size %dx%d, item index %zd", imageIndex, thumbnail.width, thumbnail.height, thumbItemIndex); } else { Loading @@ -1546,24 +1551,30 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) { } if (image->isGrid()) { meta->setInt32(kKeyGridRows, image->rows); meta->setInt32(kKeyGridCols, image->columns); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_GRID_ROWS, image->rows); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_GRID_COLUMNS, image->columns); // point image to the first tile for grid size and HVCC image = &mItemIdToItemMap.editValueAt(tileItemIndex); meta->setInt32(kKeyTileWidth, image->width); meta->setInt32(kKeyTileHeight, image->height); meta->setInt32(kKeyMaxInputSize, image->width * image->height * 1.5); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TILE_WIDTH, image->width); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_TILE_HEIGHT, image->height); AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_MAX_INPUT_SIZE, image->width * image->height * 1.5); } if (image->hvcc == NULL) { ALOGE("%s: hvcc is missing for image[%u]!", __FUNCTION__, imageIndex); return NULL; } meta->setData(kKeyHVCC, kTypeHVCC, image->hvcc->data(), image->hvcc->size()); AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_CSD_HEVC, image->hvcc->data(), image->hvcc->size()); if (image->icc != NULL) { meta->setData(kKeyIccProfile, 0, image->icc->data(), image->icc->size()); AMediaFormat_setBuffer(meta, AMEDIAFORMAT_KEY_ICC_PROFILE, image->icc->data(), image->icc->size()); } return meta; } Loading
media/extractors/mp4/ItemTable.h +3 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <set> #include <media/NdkMediaFormat.h> #include <media/stagefright/foundation/ADebug.h> #include <utils/KeyedVector.h> #include <utils/RefBase.h> Loading Loading @@ -51,7 +53,7 @@ public: bool isValid() { return mImageItemsValid; } uint32_t countImages() const; sp<MetaData> getImageMeta(const uint32_t imageIndex); AMediaFormat *getImageMeta(const uint32_t imageIndex); status_t findImageItem(const uint32_t imageIndex, uint32_t *itemIndex); status_t findThumbnailItem(const uint32_t imageIndex, uint32_t *itemIndex); status_t getImageOffsetAndSize( Loading
media/extractors/mp4/MPEG4Extractor.cpp +393 −325 File changed.Preview size limit exceeded, changes collapsed. Show changes
media/extractors/mp4/MPEG4Extractor.h +7 −7 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ #include <media/MediaExtractorPluginApi.h> #include <media/MediaExtractorPluginHelper.h> #include <media/stagefright/MetaDataBase.h> #include <media/NdkMediaFormat.h> #include <media/stagefright/foundation/AString.h> #include <utils/KeyedVector.h> #include <utils/List.h> Loading Loading @@ -53,15 +53,15 @@ struct Trex { uint32_t default_sample_flags; }; class MPEG4Extractor : public MediaExtractorPluginHelper { class MPEG4Extractor : public MediaExtractorPluginHelperV2 { public: explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL); 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 media_status_t getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t flags); virtual status_t getMetaData(MetaDataBase& meta); virtual media_status_t getMetaData(AMediaFormat *meta); virtual uint32_t flags() const; virtual const char * name() { return "MPEG4Extractor"; } Loading @@ -77,7 +77,7 @@ private: }; struct Track { Track *next; MetaDataBase meta; AMediaFormat *meta; uint32_t timescale; sp<SampleTable> sampleTable; bool includes_expensive_metadata; Loading Loading @@ -107,7 +107,7 @@ private: Track *mFirstTrack, *mLastTrack; MetaDataBase mFileMetaData; AMediaFormat *mFileMetaData; Vector<uint32_t> mPath; String8 mLastCommentMean; Loading