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 Original line Diff line number Diff line
@@ -16,6 +16,7 @@ cc_defaults {
    shared_libs: [
    shared_libs: [
        "liblog",
        "liblog",
        "libmediaextractor",
        "libmediaextractor",
        "libmediandk"
    ],
    ],


    static_libs: [
    static_libs: [
+33 −22
Original line number Original line Diff line number Diff line
@@ -1477,7 +1477,7 @@ uint32_t ItemTable::countImages() const {
    return mImageItemsValid ? mDisplayables.size() : 0;
    return mImageItemsValid ? mDisplayables.size() : 0;
}
}


sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) {
AMediaFormat *ItemTable::getImageMeta(const uint32_t imageIndex) {
    if (!mImageItemsValid) {
    if (!mImageItemsValid) {
        return NULL;
        return NULL;
    }
    }
@@ -1502,28 +1502,31 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) {
        }
        }
    }
    }


    sp<MetaData> meta = new MetaData;
    AMediaFormat *meta = AMediaFormat_new();
    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC);
    AMediaFormat_setString(meta, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC);


    if (image->itemId == mPrimaryItemId) {
    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);
    ALOGV("image[%u]: size %dx%d", imageIndex, image->width, image->height);


    meta->setInt32(kKeyWidth, image->width);
    AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_WIDTH, image->width);
    meta->setInt32(kKeyHeight, image->height);
    AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_HEIGHT, image->height);
    if (image->rotation != 0) {
    if (image->rotation != 0) {
        // Rotation angle in HEIF is CCW, convert to CW here to be
        // Rotation angle in HEIF is CCW, convert to CW here to be
        // consistent with the other media formats.
        // consistent with the other media formats.
        switch(image->rotation) {
        switch(image->rotation) {
            case 90: meta->setInt32(kKeyRotation, 270); break;
            case 90:
            case 180: meta->setInt32(kKeyRotation, 180); break;
            case 180:
            case 270: meta->setInt32(kKeyRotation, 90); break;
            case 270:
                AMediaFormat_setInt32(meta, AMEDIAFORMAT_KEY_ROTATION, 360 - image->rotation);
                break;
            default: break; // don't set if invalid
            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()) {
    if (!image->thumbnails.empty()) {
        ssize_t thumbItemIndex = mItemIdToItemMap.indexOfKey(image->thumbnails[0]);
        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];
            const ImageItem &thumbnail = mItemIdToItemMap[thumbItemIndex];


            if (thumbnail.hvcc != NULL) {
            if (thumbnail.hvcc != NULL) {
                meta->setInt32(kKeyThumbnailWidth, thumbnail.width);
                AMediaFormat_setInt32(meta,
                meta->setInt32(kKeyThumbnailHeight, thumbnail.height);
                        AMEDIAFORMAT_KEY_THUMBNAIL_WIDTH, thumbnail.width);
                meta->setData(kKeyThumbnailHVCC, kTypeHVCC,
                AMediaFormat_setInt32(meta,
                        thumbnail.hvcc->data(), thumbnail.hvcc->size());
                        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",
                ALOGV("image[%u]: thumbnail: size %dx%d, item index %zd",
                        imageIndex, thumbnail.width, thumbnail.height, thumbItemIndex);
                        imageIndex, thumbnail.width, thumbnail.height, thumbItemIndex);
            } else {
            } else {
@@ -1546,24 +1551,30 @@ sp<MetaData> ItemTable::getImageMeta(const uint32_t imageIndex) {
    }
    }


    if (image->isGrid()) {
    if (image->isGrid()) {
        meta->setInt32(kKeyGridRows, image->rows);
        AMediaFormat_setInt32(meta,
        meta->setInt32(kKeyGridCols, image->columns);
                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
        // point image to the first tile for grid size and HVCC
        image = &mItemIdToItemMap.editValueAt(tileItemIndex);
        image = &mItemIdToItemMap.editValueAt(tileItemIndex);
        meta->setInt32(kKeyTileWidth, image->width);
        AMediaFormat_setInt32(meta,
        meta->setInt32(kKeyTileHeight, image->height);
                AMEDIAFORMAT_KEY_TILE_WIDTH, image->width);
        meta->setInt32(kKeyMaxInputSize, image->width * image->height * 1.5);
        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) {
    if (image->hvcc == NULL) {
        ALOGE("%s: hvcc is missing for image[%u]!", __FUNCTION__, imageIndex);
        ALOGE("%s: hvcc is missing for image[%u]!", __FUNCTION__, imageIndex);
        return NULL;
        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) {
    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;
    return meta;
}
}
+3 −1
Original line number Original line Diff line number Diff line
@@ -19,6 +19,8 @@


#include <set>
#include <set>


#include <media/NdkMediaFormat.h>

#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ADebug.h>
#include <utils/KeyedVector.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>
#include <utils/RefBase.h>
@@ -51,7 +53,7 @@ public:


    bool isValid() { return mImageItemsValid; }
    bool isValid() { return mImageItemsValid; }
    uint32_t countImages() const;
    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 findImageItem(const uint32_t imageIndex, uint32_t *itemIndex);
    status_t findThumbnailItem(const uint32_t imageIndex, uint32_t *itemIndex);
    status_t findThumbnailItem(const uint32_t imageIndex, uint32_t *itemIndex);
    status_t getImageOffsetAndSize(
    status_t getImageOffsetAndSize(
+393 −325

File changed.

Preview size limit exceeded, changes collapsed.

+7 −7
Original line number Original line Diff line number Diff line
@@ -22,7 +22,7 @@


#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <media/NdkMediaFormat.h>
#include <media/stagefright/foundation/AString.h>
#include <media/stagefright/foundation/AString.h>
#include <utils/KeyedVector.h>
#include <utils/KeyedVector.h>
#include <utils/List.h>
#include <utils/List.h>
@@ -53,15 +53,15 @@ struct Trex {
    uint32_t default_sample_flags;
    uint32_t default_sample_flags;
};
};


class MPEG4Extractor : public MediaExtractorPluginHelper {
class MPEG4Extractor : public MediaExtractorPluginHelperV2 {
public:
public:
    explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL);
    explicit MPEG4Extractor(DataSourceHelper *source, const char *mime = NULL);


    virtual size_t countTracks();
    virtual size_t countTracks();
    virtual MediaTrackHelper *getTrack(size_t index);
    virtual MediaTrackHelperV2 *getTrack(size_t index);
    virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags);
    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 uint32_t flags() const;
    virtual const char * name() { return "MPEG4Extractor"; }
    virtual const char * name() { return "MPEG4Extractor"; }


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


    Track *mFirstTrack, *mLastTrack;
    Track *mFirstTrack, *mLastTrack;


    MetaDataBase mFileMetaData;
    AMediaFormat *mFileMetaData;


    Vector<uint32_t> mPath;
    Vector<uint32_t> mPath;
    String8 mLastCommentMean;
    String8 mLastCommentMean;
Loading