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

Commit c10a3e93 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "fix elst calculations"

parents 240201e2 3caa9db4
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) {