Fix potential incorrect target duration in iFrame Playlist

This may happen if media segments do not start with iframes.

Change-Id: Ie7b2d33a14405a5dcd071644f2fa3d5f9656dd07
This commit is contained in:
KongQun Yang 2018-05-23 10:24:57 -07:00
parent cf40accaa8
commit 1a52a9b7c0
2 changed files with 10 additions and 6 deletions

View File

@ -521,8 +521,8 @@ void MediaPlaylist::AddSegmentInfoEntry(const std::string& segment_file_name,
static_cast<double>(start_time) / time_scale_; static_cast<double>(start_time) / time_scale_;
const double segment_duration_seconds = const double segment_duration_seconds =
static_cast<double>(duration) / time_scale_; static_cast<double>(duration) / time_scale_;
if (segment_duration_seconds > longest_segment_duration_) longest_segment_duration_ =
longest_segment_duration_ = segment_duration_seconds; std::max(longest_segment_duration_, segment_duration_seconds);
const int kBitsInByte = 8; const int kBitsInByte = 8;
const uint64_t bitrate = kBitsInByte * size / segment_duration_seconds; const uint64_t bitrate = kBitsInByte * size / segment_duration_seconds;
@ -539,15 +539,19 @@ void MediaPlaylist::AdjustLastSegmentInfoEntryDuration(
if (time_scale_ == 0) if (time_scale_ == 0)
return; return;
const double scaled_next_timestamp = const double next_timestamp_seconds =
static_cast<double>(next_timestamp) / time_scale_; static_cast<double>(next_timestamp) / time_scale_;
for (auto iter = entries_.rbegin(); iter != entries_.rend(); ++iter) { for (auto iter = entries_.rbegin(); iter != entries_.rend(); ++iter) {
if (iter->get()->type() == HlsEntry::EntryType::kExtInf) { if (iter->get()->type() == HlsEntry::EntryType::kExtInf) {
SegmentInfoEntry* segment_info = SegmentInfoEntry* segment_info =
reinterpret_cast<SegmentInfoEntry*>(iter->get()); reinterpret_cast<SegmentInfoEntry*>(iter->get());
segment_info->set_duration(scaled_next_timestamp -
segment_info->start_time()); const double segment_duration_seconds =
next_timestamp_seconds - segment_info->start_time();
segment_info->set_duration(segment_duration_seconds);
longest_segment_duration_ =
std::max(longest_segment_duration_, segment_duration_seconds);
break; break;
} }
} }

View File

@ -811,7 +811,7 @@ TEST_F(IFrameMediaPlaylistTest, SingleSegment) {
"#EXT-X-VERSION:6\n" "#EXT-X-VERSION:6\n"
"## Generated with https://github.com/google/shaka-packager version " "## Generated with https://github.com/google/shaka-packager version "
"test\n" "test\n"
"#EXT-X-TARGETDURATION:8\n" "#EXT-X-TARGETDURATION:9\n"
"#EXT-X-PLAYLIST-TYPE:VOD\n" "#EXT-X-PLAYLIST-TYPE:VOD\n"
"#EXT-X-I-FRAMES-ONLY\n" "#EXT-X-I-FRAMES-ONLY\n"
"#EXT-X-MAP:URI=\"file.mp4\",BYTERANGE=\"501@0\"\n" "#EXT-X-MAP:URI=\"file.mp4\",BYTERANGE=\"501@0\"\n"