Shaka Packager SDK
Loading...
Searching...
No Matches
decoding_time_iterator.cc
1// Copyright 2014 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#include <packager/media/formats/mp4/decoding_time_iterator.h>
8
9#include <algorithm>
10#include <cstdint>
11#include <vector>
12
13#include <absl/log/check.h>
14
15#include <packager/media/formats/mp4/box_definitions.h>
16
17namespace shaka {
18namespace media {
19namespace mp4 {
20
22 const DecodingTimeToSample& decoding_time_to_sample)
23 : sample_index_(0),
24 decoding_time_table_(decoding_time_to_sample.decoding_time),
25 iterator_(decoding_time_table_.begin()) {}
26DecodingTimeIterator::~DecodingTimeIterator() {}
27
29 ++sample_index_;
30 if (sample_index_ >= iterator_->sample_count) {
31 ++iterator_;
32 if (iterator_ == decoding_time_table_.end())
33 return false;
34 sample_index_ = 0;
35 }
36 return true;
37}
38
40 return iterator_ != decoding_time_table_.end() &&
41 sample_index_ < iterator_->sample_count;
42}
43
44int64_t DecodingTimeIterator::Duration(uint32_t start_sample,
45 uint32_t end_sample) const {
46 DCHECK_LE(start_sample, end_sample);
47 uint32_t current_sample = 0;
48 uint32_t prev_sample = 0;
49 int64_t duration = 0;
50 std::vector<DecodingTime>::const_iterator it = decoding_time_table_.begin();
51 for (; it != decoding_time_table_.end(); ++it) {
52 current_sample += it->sample_count;
53 if (current_sample >= start_sample) {
54 duration += (std::min(end_sample, current_sample) -
55 std::max(start_sample, prev_sample + 1) + 1) *
56 it->sample_delta;
57 if (current_sample >= end_sample)
58 break;
59 }
60 prev_sample = current_sample;
61 }
62 return duration;
63}
64
66 uint32_t num_samples = 0;
67 std::vector<DecodingTime>::const_iterator it = decoding_time_table_.begin();
68 for (; it != decoding_time_table_.end(); ++it) {
69 num_samples += it->sample_count;
70 }
71 return num_samples;
72}
73
74} // namespace mp4
75} // namespace media
76} // namespace shaka
DecodingTimeIterator(const DecodingTimeToSample &decoding_time_to_sample)
Create DecodingTimeIterator from decoding time to sample box.
int64_t Duration(uint32_t start_sample, uint32_t end_sample) const
All the methods that are virtual are virtual for mocking.