Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dba610b7 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Make MP4 extractor use AMediaFormat

Bug: 111407253
Test: manual, CTS
Change-Id: I43fcd270134d653a58715e1da38658d307a59774
parent 3d560e51
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ cc_defaults {
    shared_libs: [
        "liblog",
        "libmediaextractor",
        "libmediandk"
    ],

    static_libs: [
+33 −22
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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]);
@@ -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 {
@@ -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;
}
+3 −1
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@

#include <set>

#include <media/NdkMediaFormat.h>

#include <media/stagefright/foundation/ADebug.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
@@ -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(
+393 −325

File changed.

Preview size limit exceeded, changes collapsed.

+7 −7
Original line number Diff line number Diff line
@@ -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>
@@ -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"; }

@@ -77,7 +77,7 @@ private:
    };
    struct Track {
        Track *next;
        MetaDataBase meta;
        AMediaFormat *meta;
        uint32_t timescale;
        sp<SampleTable> sampleTable;
        bool includes_expensive_metadata;
@@ -107,7 +107,7 @@ private:

    Track *mFirstTrack, *mLastTrack;

    MetaDataBase mFileMetaData;
    AMediaFormat *mFileMetaData;

    Vector<uint32_t> mPath;
    String8 mLastCommentMean;
Loading