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

Commit b8ac31e1 authored by Wei Jia's avatar Wei Jia Committed by Gerrit Code Review
Browse files

MPEG4Extractor: ensure kKeyTrackID exists before creating an MPEG4Source as track.

GenericSource: return error when no track exists.

SampleIterator: make sure mSamplesPerChunk is not zero before using it as divisor.

Bug: 21657957
Bug: 23705695
Bug: 22802344
Bug: 28799341

CYNGNOS-3020
Change-Id: I7664992ade90b935d3f255dcd43ecc2898f30b04
(cherry picked from commit 0386c91b)
parent 67f734c1
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -209,6 +209,9 @@ status_t NuPlayer::GenericSource::initFromDataSource() {

    for (size_t i = 0; i < numtracks; ++i) {
        sp<MediaSource> track = extractor->getTrack(i);
        if (track == NULL) {
            continue;
        }

        sp<MetaData> meta = extractor->getTrackMetaData(i);

@@ -251,7 +254,6 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
            }
        }

        if (track != NULL) {
        mSources.push(track);
        int64_t durationUs;
        if (meta->findInt64(kKeyDuration, &durationUs)) {
@@ -267,6 +269,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
            totalBitrate = -1;
        }
    }

    if (mSources.size() == 0) {
        ALOGE("b/23705695");
        return UNKNOWN_ERROR;
    }

    mBitrate = totalBitrate;
@@ -337,7 +343,7 @@ int64_t NuPlayer::GenericSource::getLastReadPosition() {

status_t NuPlayer::GenericSource::setBuffers(
        bool audio, Vector<MediaBuffer *> &buffers) {
    if (mIsSecure && !audio) {
    if (mIsWidevine && !audio && mVideoTrack.mSource != NULL) {
        return mVideoTrack.mSource->setBuffers(buffers);
    }
    return INVALID_OPERATION;
+8 −0
Original line number Diff line number Diff line
@@ -1032,6 +1032,11 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
            }

            if (isTrack) {
                int32_t trackId;
                // There must be exact one track header per track.
                if (!mLastTrack->meta->findInt32(kKeyTrackID, &trackId)) {
                    mLastTrack->skipTrack = true;
                }
                if (mLastTrack->skipTrack) {
                    Track *cur = mFirstTrack;

@@ -2945,6 +2950,9 @@ sp<MediaSource> MPEG4Extractor::getTrack(size_t index) {
                break;
            }
        }
    } else {
        ALOGE("b/21657957");
        return NULL;
    }

    ALOGV("getTrack called, pssh: %zu", mPssh.size());
+5 −0
Original line number Diff line number Diff line
@@ -84,6 +84,11 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) {

    CHECK(sampleIndex < mStopChunkSampleIndex);

    if (mSamplesPerChunk == 0) {
        ALOGE("b/22802344");
        return ERROR_MALFORMED;
    }

    uint32_t chunk =
        (sampleIndex - mFirstChunkSampleIndex) / mSamplesPerChunk
        + mFirstChunk;