Loading media/libstagefright/MPEG4Extractor.cpp +75 −59 Original line number Diff line number Diff line Loading @@ -441,6 +441,7 @@ sp<MetaData> MPEG4Extractor::getTrackMetaData( return NULL; } [=] { int64_t duration; int32_t samplerate; if (track->has_elst && mHeaderTimescale != 0 && Loading @@ -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; Loading @@ -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 Loading @@ -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, ×cale_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) { Loading Loading
media/libstagefright/MPEG4Extractor.cpp +75 −59 Original line number Diff line number Diff line Loading @@ -441,6 +441,7 @@ sp<MetaData> MPEG4Extractor::getTrackMetaData( return NULL; } [=] { int64_t duration; int32_t samplerate; if (track->has_elst && mHeaderTimescale != 0 && Loading @@ -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; Loading @@ -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 Loading @@ -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, ×cale_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) { Loading