2
mkvmerge -- utility for splicing together matroska files
3
from component media subtypes
5
Distributed under the GPL v2
6
see the file COPYING for details
7
or visit http://www.gnu.org/copyleft/gpl.html
9
the timecode calculator implementation
11
Written by Moritz Bunkus <moritz@bunkus.org>.
14
#include "common/common_pch.h"
16
#include "merge/timecode_calculator.h"
17
#include "merge/packet.h"
19
timecode_calculator_c::timecode_calculator_c(int64_t samples_per_second)
20
: m_reference_timecode{timecode_c::ns(0)}
21
, m_samples_per_second{samples_per_second}
22
, m_samples_since_reference_timecode{}
23
, m_samples_to_timecode{1000000000, static_cast<int64_t>(samples_per_second)}
28
timecode_calculator_c::add_timecode(timecode_c const &timecode) {
30
m_available_timecodes.push_back(timecode);
34
timecode_calculator_c::add_timecode(int64_t timecode) {
36
m_available_timecodes.push_back(timecode_c::ns(timecode));
40
timecode_calculator_c::add_timecode(packet_cptr const &packet) {
41
if (packet->has_timecode())
42
m_available_timecodes.push_back(timecode_c::ns(packet->timecode));
46
timecode_calculator_c::get_next_timecode(int64_t samples_in_frame) {
47
if (!m_available_timecodes.empty()) {
48
auto next_timecode = m_available_timecodes.front();
49
m_reference_timecode = next_timecode;
50
m_samples_since_reference_timecode = samples_in_frame;
52
m_available_timecodes.pop_front();
57
if (!m_samples_per_second)
58
throw std::invalid_argument{"samples per second must not be 0"};
60
auto next_timecode = m_reference_timecode + timecode_c::ns(m_samples_to_timecode * m_samples_since_reference_timecode);
61
m_samples_since_reference_timecode += samples_in_frame;
67
timecode_calculator_c::get_duration(int64_t samples) {
68
if (!m_samples_per_second)
69
throw std::invalid_argument{"samples per second must not be 0"};
71
return timecode_c::ns(m_samples_to_timecode * samples);
75
timecode_calculator_c::set_samples_per_second(int64_t samples_per_second) {
76
if (!samples_per_second || (samples_per_second == m_samples_per_second))
79
m_reference_timecode += get_duration(m_samples_since_reference_timecode);
80
m_samples_since_reference_timecode = 0;
81
m_samples_to_timecode.set(1000000000, samples_per_second);