Skip to content

Commit 2a9fb8b

Browse files
Zaggy1024awesomekling
authored andcommitted
LibVideo: Give Matroska duration an absolute value getter
Previously, the duration had to be multiplied by timestamp_scale and converted to a Time object, now SegmentInformation::duration() does it itself.
1 parent a58bf7c commit 2a9fb8b

File tree

3 files changed

+13
-9
lines changed

3 files changed

+13
-9
lines changed

Userland/Libraries/LibVideo/Containers/Matroska/Document.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,20 @@ class SegmentInformation {
3131
void set_muxing_app(String muxing_app) { m_muxing_app = move(muxing_app); }
3232
Utf8View writing_app() const { return Utf8View(m_writing_app); }
3333
void set_writing_app(String writing_app) { m_writing_app = move(writing_app); }
34-
Optional<double> duration() const { return m_duration; }
35-
void set_duration(double duration) { m_duration.emplace(duration); }
34+
Optional<double> duration_unscaled() const { return m_duration_unscaled; }
35+
void set_duration_unscaled(double duration) { m_duration_unscaled.emplace(duration); }
36+
Optional<Time> duration() const
37+
{
38+
if (!duration_unscaled().has_value())
39+
return {};
40+
return Time::from_nanoseconds(static_cast<i64>(static_cast<double>(timestamp_scale()) * duration_unscaled().value()));
41+
}
3642

3743
private:
3844
u64 m_timestamp_scale { 1'000'000 };
3945
String m_muxing_app;
4046
String m_writing_app;
41-
Optional<double> m_duration;
47+
Optional<double> m_duration_unscaled;
4248
};
4349

4450
class TrackEntry {

Userland/Libraries/LibVideo/Containers/Matroska/MatroskaDemuxer.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,8 @@ DecoderErrorOr<NonnullOwnPtr<Sample>> MatroskaDemuxer::get_next_sample_for_track
8282

8383
DecoderErrorOr<Time> MatroskaDemuxer::duration()
8484
{
85-
auto segment_information = TRY(m_reader.segment_information());
86-
if (!segment_information.duration().has_value())
87-
return Time::zero();
88-
return Time::from_nanoseconds(static_cast<i64>(segment_information.duration().value() * segment_information.timestamp_scale()));
85+
auto duration = TRY(m_reader.segment_information()).duration();
86+
return duration.value_or(Time::zero());
8987
}
9088

9189
}

Userland/Libraries/LibVideo/Containers/Matroska/Reader.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,8 +270,8 @@ static DecoderErrorOr<SegmentInformation> parse_information(Streamer& streamer)
270270
dbgln_if(MATROSKA_DEBUG, "Read WritingApp attribute: {}", segment_information.writing_app().as_string());
271271
break;
272272
case DURATION_ID:
273-
segment_information.set_duration(TRY_READ(streamer.read_float()));
274-
dbgln_if(MATROSKA_DEBUG, "Read Duration attribute: {}", segment_information.duration().value());
273+
segment_information.set_duration_unscaled(TRY_READ(streamer.read_float()));
274+
dbgln_if(MATROSKA_DEBUG, "Read Duration attribute: {}", segment_information.duration_unscaled().value());
275275
break;
276276
default:
277277
TRY_READ(streamer.read_unknown_element());

0 commit comments

Comments
 (0)