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

Commit ee4079a3 authored by Wonsik Kim's avatar Wonsik Kim Committed by android-build-merger
Browse files

Merge "fix elst calculations"

am: c10a3e93

Change-Id: Iaaa989706fbd52bff1440048cac866ae28060e7b
parents 63c04ff2 c10a3e93
Loading
Loading
Loading
Loading
+75 −59
Original line number Diff line number Diff line
@@ -441,6 +441,7 @@ sp<MetaData> MPEG4Extractor::getTrackMetaData(
        return NULL;
    }

    [=] {
        int64_t duration;
        int32_t samplerate;
        if (track->has_elst && mHeaderTimescale != 0 &&
@@ -450,11 +451,17 @@ sp<MetaData> MPEG4Extractor::getTrackMetaData(
            track->has_elst = false;

            if (track->elst_segment_duration > INT64_MAX) {
            goto editlistoverflow;
                return;
            }
            int64_t segment_duration = track->elst_segment_duration;
            int64_t media_time = track->elst_media_time;
            int64_t halfscale = mHeaderTimescale / 2;
            ALOGV("segment_duration = %" PRId64 ", media_time = %" PRId64
                  ", halfscale = %" PRId64 ", timescale = %d",
                  segment_duration,
                  media_time,
                  halfscale,
                  mHeaderTimescale);

            int64_t delay;
            // delay = ((media_time * samplerate) + halfscale) / mHeaderTimescale;
@@ -463,24 +470,27 @@ sp<MetaData> MPEG4Extractor::getTrackMetaData(
                    (delay /= mHeaderTimescale, false) ||
                    delay > INT32_MAX ||
                    delay < INT32_MIN) {
            goto editlistoverflow;
                return;
            }
            ALOGV("delay = %" PRId64, delay);
            track->meta->setInt32(kKeyEncoderDelay, delay);

            int64_t scaled_duration;
        // scaled_duration = ((duration * mHeaderTimescale) + 500000) / 1000000;
        if (__builtin_mul_overflow(duration, mHeaderTimescale, &scaled_duration) ||
                __builtin_add_overflow(scaled_duration, 500000, &scaled_duration)) {
            goto editlistoverflow;
            // scaled_duration = duration * mHeaderTimescale;
            if (__builtin_mul_overflow(duration, mHeaderTimescale, &scaled_duration)) {
                return;
            }
        scaled_duration /= 1000000;
            ALOGV("scaled_duration = %" PRId64, scaled_duration);

            int64_t segment_end;
            int64_t padding;
            // padding = scaled_duration - ((segment_duration + media_time) * 1000000);
            if (__builtin_add_overflow(segment_duration, media_time, &segment_end) ||
                    __builtin_mul_overflow(segment_end, 1000000, &segment_end) ||
                    __builtin_sub_overflow(scaled_duration, segment_end, &padding)) {
            goto editlistoverflow;
                return;
            }
            ALOGV("segment_end = %" PRId64 ", padding = %" PRId64, segment_end, padding);

            if (padding < 0) {
                // track duration from media header (which is what kKeyDuration is) might
@@ -490,16 +500,22 @@ sp<MetaData> MPEG4Extractor::getTrackMetaData(
            }

            int64_t paddingsamples;
        // paddingsamples = ((padding * samplerate) + halfscale) / mHeaderTimescale;
            int64_t halfscale_e6;
            int64_t timescale_e6;
            // paddingsamples = ((padding * samplerate) + (halfscale * 1000000))
            //                / (mHeaderTimescale * 1000000);
            if (__builtin_mul_overflow(padding, samplerate, &paddingsamples) ||
                __builtin_add_overflow(paddingsamples, halfscale, &paddingsamples) ||
                (paddingsamples /= mHeaderTimescale, false) ||
                    __builtin_mul_overflow(halfscale, 1000000, &halfscale_e6) ||
                    __builtin_mul_overflow(mHeaderTimescale, 1000000, &timescale_e6) ||
                    __builtin_add_overflow(paddingsamples, halfscale_e6, &paddingsamples) ||
                    (paddingsamples /= timescale_e6, false) ||
                    paddingsamples > INT32_MAX) {
            goto editlistoverflow;
                return;
            }
            ALOGV("paddingsamples = %" PRId64, paddingsamples);
            track->meta->setInt32(kKeyEncoderPadding, paddingsamples);
        }
    editlistoverflow:
    }();

    if ((flags & kIncludeExtensiveMetaData)
            && !track->includes_expensive_metadata) {