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

Commit b893fcd9 authored by Marco Nelissen's avatar Marco Nelissen Committed by Android (Google) Code Review
Browse files

Merge changes Ic983efe6,I6eeb4aa6

* changes:
  Fix test that checks if metadata is already set
  Fix multiple-track mkv files
parents 9c29f6b2 9b8cba23
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
@@ -1336,6 +1336,13 @@ MatroskaExtractor::~MatroskaExtractor() {
    mReader = NULL;

    delete mDataSource;

    for (size_t i = 0; i < mTracks.size(); ++i) {
        TrackInfo *info = &mTracks.editItemAt(i);
        if (info->mMeta) {
            AMediaFormat_delete(info->mMeta);
        }
    }
}

size_t MatroskaExtractor::countTracks() {
@@ -1808,6 +1815,8 @@ status_t MatroskaExtractor::initTrackInfo(
void MatroskaExtractor::addTracks() {
    const mkvparser::Tracks *tracks = mSegment->GetTracks();

    AMediaFormat *meta = nullptr;

    for (size_t index = 0; index < tracks->GetTracksCount(); ++index) {
        const mkvparser::Track *track = tracks->GetTrackByIndex(index);

@@ -1832,7 +1841,11 @@ void MatroskaExtractor::addTracks() {

        enum { VIDEO_TRACK = 1, AUDIO_TRACK = 2 };

        AMediaFormat *meta = AMediaFormat_new();
        if (meta) {
            AMediaFormat_clear(meta);
        } else {
            meta = AMediaFormat_new();
        }

        status_t err = OK;
        int32_t nalSize = -1;
@@ -2067,21 +2080,26 @@ void MatroskaExtractor::addTracks() {
        long long durationNs = mSegment->GetDuration();
        AMediaFormat_setInt64(meta, AMEDIAFORMAT_KEY_DURATION, (durationNs + 500) / 1000);

        const char *mimetype = "";
        if (!AMediaFormat_getString(meta, AMEDIAFORMAT_KEY_MIME, &mimetype)) {
            // do not add this track to the track list
            ALOGW("ignoring track with unknown mime");
            continue;
        }

        mTracks.push();
        size_t n = mTracks.size() - 1;
        TrackInfo *trackInfo = &mTracks.editItemAt(n);
        initTrackInfo(track, meta, trackInfo);
        trackInfo->mNalLengthSize = nalSize;

        const char *mimetype = "";
        AMediaFormat_getString(meta, AMEDIAFORMAT_KEY_MIME, &mimetype);

        if ((!strcmp("V_MPEG4/ISO/AVC", codecID) && codecPrivateSize == 0) ||
            (!strcmp(mimetype, MEDIA_MIMETYPE_VIDEO_AVC) && isSetCsdFrom1stFrame)) {
            // Attempt to recover from AVC track without codec private data
            err = synthesizeAVCC(trackInfo, n);
            if (err != OK) {
                mTracks.pop();
                continue;
            }
        } else if ((!strcmp("V_MPEG2", codecID) && codecPrivateSize == 0) ||
            (!strcmp(mimetype, MEDIA_MIMETYPE_VIDEO_MPEG2) && isSetCsdFrom1stFrame)) {
@@ -2089,6 +2107,7 @@ void MatroskaExtractor::addTracks() {
            err = synthesizeMPEG2(trackInfo, n);
            if (err != OK) {
                mTracks.pop();
                continue;
            }
        } else if ((!strcmp("V_MPEG4/ISO/ASP", codecID) && codecPrivateSize == 0) ||
            (!strcmp(mimetype, MEDIA_MIMETYPE_VIDEO_MPEG4) && isSetCsdFrom1stFrame) ||
@@ -2099,9 +2118,14 @@ void MatroskaExtractor::addTracks() {
            err = synthesizeMPEG4(trackInfo, n);
            if (err != OK) {
                mTracks.pop();
                continue;
            }
        }

        // the TrackInfo owns the metadata now
        meta = nullptr;
    }
    if (meta) {
        AMediaFormat_delete(meta);
    }
}

+1 −3
Original line number Diff line number Diff line
@@ -61,10 +61,8 @@ private:
        TrackInfo() {
            mMeta = NULL;
        }

        ~TrackInfo() {
            if (mMeta) {
                AMediaFormat_delete(mMeta);
            }
        }
        unsigned long mTrackNum;
        bool mEncrypted;
+5 −4
Original line number Diff line number Diff line
@@ -3675,8 +3675,10 @@ status_t MPEG4Extractor::parseITunesMetaData(off64_t offset, size_t size) {

    void *tmpData;
    size_t tmpDataSize;
    const char *s;
    if (size >= 8 && metadataKey &&
            !AMediaFormat_getBuffer(mFileMetaData, metadataKey, &tmpData, &tmpDataSize)) {
            !AMediaFormat_getBuffer(mFileMetaData, metadataKey, &tmpData, &tmpDataSize) &&
            !AMediaFormat_getString(mFileMetaData, metadataKey, &s)) {
        if (!strcmp(metadataKey, "albumart")) {
            AMediaFormat_setBuffer(mFileMetaData, metadataKey,
                    buffer + 8, size - 8);
@@ -3918,10 +3920,9 @@ void MPEG4Extractor::parseID3v2MetaData(off64_t offset) {
        };
        static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);

        void *tmpData;
        size_t tmpDataSize;
        for (size_t i = 0; i < kNumMapEntries; ++i) {
            if (!AMediaFormat_getBuffer(mFileMetaData, kMap[i].key, &tmpData, &tmpDataSize)) {
            const char *ss;
            if (!AMediaFormat_getString(mFileMetaData, kMap[i].key, &ss)) {
                ID3::Iterator *it = new ID3::Iterator(id3, kMap[i].tag1);
                if (it->done()) {
                    delete it;