Clarify "frames" (video, timecode) vs "samples" (audio)
This commit is contained in:
parent
f05f19bdd4
commit
61c7af141d
|
@ -2731,18 +2731,18 @@ Editor::snap_to (framepos_t& start, RoundMode direction, bool for_mark, bool ens
|
||||||
void
|
void
|
||||||
Editor::timecode_snap_to_internal (framepos_t& start, RoundMode direction, bool /*for_mark*/)
|
Editor::timecode_snap_to_internal (framepos_t& start, RoundMode direction, bool /*for_mark*/)
|
||||||
{
|
{
|
||||||
const framepos_t one_timecode_second = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->frames_per_timecode_frame());
|
const framepos_t one_timecode_second = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->samples_per_timecode_frame());
|
||||||
framepos_t one_timecode_minute = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->frames_per_timecode_frame() * 60);
|
framepos_t one_timecode_minute = (framepos_t)(rint(_session->timecode_frames_per_second()) * _session->samples_per_timecode_frame() * 60);
|
||||||
|
|
||||||
switch (_snap_type) {
|
switch (_snap_type) {
|
||||||
case SnapToTimecodeFrame:
|
case SnapToTimecodeFrame:
|
||||||
if ((direction == RoundUpMaybe || direction == RoundDownMaybe) &&
|
if ((direction == RoundUpMaybe || direction == RoundDownMaybe) &&
|
||||||
fmod((double)start, (double)_session->frames_per_timecode_frame()) == 0) {
|
fmod((double)start, (double)_session->samples_per_timecode_frame()) == 0) {
|
||||||
/* start is already on a whole timecode frame, do nothing */
|
/* start is already on a whole timecode frame, do nothing */
|
||||||
} else if (((direction == 0) && (fmod((double)start, (double)_session->frames_per_timecode_frame()) > (_session->frames_per_timecode_frame() / 2))) || (direction > 0)) {
|
} else if (((direction == 0) && (fmod((double)start, (double)_session->samples_per_timecode_frame()) > (_session->samples_per_timecode_frame() / 2))) || (direction > 0)) {
|
||||||
start = (framepos_t) (ceil ((double) start / _session->frames_per_timecode_frame()) * _session->frames_per_timecode_frame());
|
start = (framepos_t) (ceil ((double) start / _session->samples_per_timecode_frame()) * _session->samples_per_timecode_frame());
|
||||||
} else {
|
} else {
|
||||||
start = (framepos_t) (floor ((double) start / _session->frames_per_timecode_frame()) * _session->frames_per_timecode_frame());
|
start = (framepos_t) (floor ((double) start / _session->samples_per_timecode_frame()) * _session->samples_per_timecode_frame());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -747,26 +747,26 @@ Editor::set_timecode_ruler_scale (framepos_t lower, framepos_t upper)
|
||||||
upper = upper + spacer;
|
upper = upper + spacer;
|
||||||
framecnt_t const range = upper - lower;
|
framecnt_t const range = upper - lower;
|
||||||
|
|
||||||
if (range < (2 * _session->frames_per_timecode_frame())) { /* 0 - 2 frames */
|
if (range < (2 * _session->samples_per_timecode_frame())) { /* 0 - 2 frames */
|
||||||
timecode_ruler_scale = timecode_show_bits;
|
timecode_ruler_scale = timecode_show_bits;
|
||||||
timecode_mark_modulo = 20;
|
timecode_mark_modulo = 20;
|
||||||
timecode_nmarks = 2 + (2 * _session->config.get_subframes_per_frame());
|
timecode_nmarks = 2 + (2 * _session->config.get_subframes_per_frame());
|
||||||
} else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */
|
} else if (range <= (fr / 4)) { /* 2 frames - 0.250 second */
|
||||||
timecode_ruler_scale = timecode_show_frames;
|
timecode_ruler_scale = timecode_show_frames;
|
||||||
timecode_mark_modulo = 1;
|
timecode_mark_modulo = 1;
|
||||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||||
} else if (range <= (fr / 2)) { /* 0.25-0.5 second */
|
} else if (range <= (fr / 2)) { /* 0.25-0.5 second */
|
||||||
timecode_ruler_scale = timecode_show_frames;
|
timecode_ruler_scale = timecode_show_frames;
|
||||||
timecode_mark_modulo = 2;
|
timecode_mark_modulo = 2;
|
||||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||||
} else if (range <= fr) { /* 0.5-1 second */
|
} else if (range <= fr) { /* 0.5-1 second */
|
||||||
timecode_ruler_scale = timecode_show_frames;
|
timecode_ruler_scale = timecode_show_frames;
|
||||||
timecode_mark_modulo = 5;
|
timecode_mark_modulo = 5;
|
||||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||||
} else if (range <= 2 * fr) { /* 1-2 seconds */
|
} else if (range <= 2 * fr) { /* 1-2 seconds */
|
||||||
timecode_ruler_scale = timecode_show_frames;
|
timecode_ruler_scale = timecode_show_frames;
|
||||||
timecode_mark_modulo = 10;
|
timecode_mark_modulo = 10;
|
||||||
timecode_nmarks = 2 + (range / (framepos_t)_session->frames_per_timecode_frame());
|
timecode_nmarks = 2 + (range / (framepos_t)_session->samples_per_timecode_frame());
|
||||||
} else if (range <= 8 * fr) { /* 2-8 seconds */
|
} else if (range <= 8 * fr) { /* 2-8 seconds */
|
||||||
timecode_ruler_scale = timecode_show_seconds;
|
timecode_ruler_scale = timecode_show_seconds;
|
||||||
timecode_mark_modulo = 1;
|
timecode_mark_modulo = 1;
|
||||||
|
|
|
@ -428,7 +428,7 @@ ClockOption::set_state_from_config ()
|
||||||
if (!Timecode::parse_timecode_format(_get(), TC)) {
|
if (!Timecode::parse_timecode_format(_get(), TC)) {
|
||||||
_clock.set (0, true);
|
_clock.set (0, true);
|
||||||
}
|
}
|
||||||
TC.rate = _session->frames_per_timecode_frame();
|
TC.rate = _session->samples_per_timecode_frame();
|
||||||
TC.drop = _session->timecode_drop_frames();
|
TC.drop = _session->timecode_drop_frames();
|
||||||
_session->timecode_to_sample(TC, when, false, false);
|
_session->timecode_to_sample(TC, when, false, false);
|
||||||
if (TC.negative) { when=-when; }
|
if (TC.negative) { when=-when; }
|
||||||
|
|
|
@ -450,7 +450,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
|
||||||
framecnt_t nominal_frame_rate () const { return _nominal_frame_rate; }
|
framecnt_t nominal_frame_rate () const { return _nominal_frame_rate; }
|
||||||
framecnt_t frames_per_hour () const { return _frames_per_hour; }
|
framecnt_t frames_per_hour () const { return _frames_per_hour; }
|
||||||
|
|
||||||
double frames_per_timecode_frame() const { return _frames_per_timecode_frame; }
|
double samples_per_timecode_frame() const { return _samples_per_timecode_frame; }
|
||||||
framecnt_t timecode_frames_per_hour() const { return _timecode_frames_per_hour; }
|
framecnt_t timecode_frames_per_hour() const { return _timecode_frames_per_hour; }
|
||||||
|
|
||||||
MIDI::byte get_mtc_timecode_bits() const {
|
MIDI::byte get_mtc_timecode_bits() const {
|
||||||
|
@ -1604,7 +1604,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
|
||||||
Timecode::Time transmitting_timecode_time;
|
Timecode::Time transmitting_timecode_time;
|
||||||
int next_quarter_frame_to_send;
|
int next_quarter_frame_to_send;
|
||||||
|
|
||||||
double _frames_per_timecode_frame; /* has to be floating point because of drop frame */
|
double _samples_per_timecode_frame; /* has to be floating point because of drop frame */
|
||||||
framecnt_t _frames_per_hour;
|
framecnt_t _frames_per_hour;
|
||||||
framecnt_t _timecode_frames_per_hour;
|
framecnt_t _timecode_frames_per_hour;
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ using namespace Timecode;
|
||||||
LTC_Slave::LTC_Slave (Session& s)
|
LTC_Slave::LTC_Slave (Session& s)
|
||||||
: session (s)
|
: session (s)
|
||||||
{
|
{
|
||||||
frames_per_ltc_frame = session.frames_per_timecode_frame();
|
frames_per_ltc_frame = session.samples_per_timecode_frame();
|
||||||
timecode.rate = session.timecode_frames_per_second();
|
timecode.rate = session.timecode_frames_per_second();
|
||||||
timecode.drop = session.timecode_drop_frames();
|
timecode.drop = session.timecode_drop_frames();
|
||||||
|
|
||||||
|
@ -365,13 +365,13 @@ LTC_Slave::process_ltc(framepos_t const /*now*/)
|
||||||
ltc_frame_increment(&frame.ltc, fps_i, tv_standard, 0);
|
ltc_frame_increment(&frame.ltc, fps_i, tv_standard, 0);
|
||||||
ltc_frame_to_time(&stime, &frame.ltc, 0);
|
ltc_frame_to_time(&stime, &frame.ltc, 0);
|
||||||
transport_direction = 1;
|
transport_direction = 1;
|
||||||
frame.off_start -= ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
frame.off_start -= ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||||
frame.off_end -= ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
frame.off_end -= ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||||
} else {
|
} else {
|
||||||
ltc_frame_decrement(&frame.ltc, fps_i, tv_standard, 0);
|
ltc_frame_decrement(&frame.ltc, fps_i, tv_standard, 0);
|
||||||
int off = frame.off_end - frame.off_start;
|
int off = frame.off_end - frame.off_start;
|
||||||
frame.off_start += off - ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
frame.off_start += off - ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||||
frame.off_end += off - ltc_frame_alignment(session.frames_per_timecode_frame(), tv_standard);
|
frame.off_end += off - ltc_frame_alignment(session.samples_per_timecode_frame(), tv_standard);
|
||||||
transport_direction = -1;
|
transport_direction = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1769,7 +1769,7 @@ LuaBindings::common (lua_State* L)
|
||||||
.addFunction ("transport_speed", &Session::transport_speed)
|
.addFunction ("transport_speed", &Session::transport_speed)
|
||||||
.addFunction ("frame_rate", &Session::frame_rate)
|
.addFunction ("frame_rate", &Session::frame_rate)
|
||||||
.addFunction ("nominal_frame_rate", &Session::nominal_frame_rate)
|
.addFunction ("nominal_frame_rate", &Session::nominal_frame_rate)
|
||||||
.addFunction ("frames_per_timecode_frame", &Session::frames_per_timecode_frame)
|
.addFunction ("samples_per_timecode_frame", &Session::samples_per_timecode_frame)
|
||||||
.addFunction ("timecode_frames_per_hour", &Session::timecode_frames_per_hour)
|
.addFunction ("timecode_frames_per_hour", &Session::timecode_frames_per_hour)
|
||||||
.addFunction ("timecode_frames_per_second", &Session::timecode_frames_per_second)
|
.addFunction ("timecode_frames_per_second", &Session::timecode_frames_per_second)
|
||||||
.addFunction ("timecode_drop_frames", &Session::timecode_drop_frames)
|
.addFunction ("timecode_drop_frames", &Session::timecode_drop_frames)
|
||||||
|
|
|
@ -65,7 +65,7 @@ MTC_Slave::MTC_Slave (Session& s, MidiPort& p)
|
||||||
busy_guard1 = busy_guard2 = 0;
|
busy_guard1 = busy_guard2 = 0;
|
||||||
|
|
||||||
last_mtc_fps_byte = session.get_mtc_timecode_bits ();
|
last_mtc_fps_byte = session.get_mtc_timecode_bits ();
|
||||||
quarter_frame_duration = (double(session.frames_per_timecode_frame()) / 4.0);
|
quarter_frame_duration = (double(session.samples_per_timecode_frame()) / 4.0);
|
||||||
|
|
||||||
mtc_timecode = session.config.get_timecode_format();
|
mtc_timecode = session.config.get_timecode_format();
|
||||||
a3e_timecode = session.config.get_timecode_format();
|
a3e_timecode = session.config.get_timecode_format();
|
||||||
|
@ -448,7 +448,7 @@ MTC_Slave::update_mtc_time (const MIDI::byte *msg, bool was_full, framepos_t now
|
||||||
long int mtc_off = (long) rint(7.0 * qtr);
|
long int mtc_off = (long) rint(7.0 * qtr);
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::MTC, string_compose ("new mtc_frame: %1 | MTC-FpT: %2 A3-FpT:%3\n",
|
DEBUG_TRACE (DEBUG::MTC, string_compose ("new mtc_frame: %1 | MTC-FpT: %2 A3-FpT:%3\n",
|
||||||
mtc_frame, (4.0*qtr), session.frames_per_timecode_frame()));
|
mtc_frame, (4.0*qtr), session.samples_per_timecode_frame()));
|
||||||
|
|
||||||
switch (port->self_parser().mtc_running()) {
|
switch (port->self_parser().mtc_running()) {
|
||||||
case MTC_Backward:
|
case MTC_Backward:
|
||||||
|
|
|
@ -257,7 +257,7 @@ Session::Session (AudioEngine &eng,
|
||||||
, step_speed (0)
|
, step_speed (0)
|
||||||
, outbound_mtc_timecode_frame (0)
|
, outbound_mtc_timecode_frame (0)
|
||||||
, next_quarter_frame_to_send (-1)
|
, next_quarter_frame_to_send (-1)
|
||||||
, _frames_per_timecode_frame (0)
|
, _samples_per_timecode_frame (0)
|
||||||
, _frames_per_hour (0)
|
, _frames_per_hour (0)
|
||||||
, _timecode_frames_per_hour (0)
|
, _timecode_frames_per_hour (0)
|
||||||
, last_timecode_valid (false)
|
, last_timecode_valid (false)
|
||||||
|
|
|
@ -275,7 +275,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
|
||||||
/* LTC TV standard offset */
|
/* LTC TV standard offset */
|
||||||
if (current_speed != 0) {
|
if (current_speed != 0) {
|
||||||
/* ditto - send "NOW" if not rolling */
|
/* ditto - send "NOW" if not rolling */
|
||||||
cycle_start_frame -= ltc_frame_alignment(frames_per_timecode_frame(), TV_STANDARD(cur_timecode));
|
cycle_start_frame -= ltc_frame_alignment(samples_per_timecode_frame(), TV_STANDARD(cur_timecode));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* cycle-start may become negative due to latency compensation */
|
/* cycle-start may become negative due to latency compensation */
|
||||||
|
@ -448,7 +448,7 @@ Session::ltc_tx_send_time_code_for_cycle (framepos_t start_frame, framepos_t end
|
||||||
|
|
||||||
|
|
||||||
// (4) check if alignment matches
|
// (4) check if alignment matches
|
||||||
const double fptcf = frames_per_timecode_frame();
|
const double fptcf = samples_per_timecode_frame();
|
||||||
|
|
||||||
/* maximum difference of bit alignment in audio-samples.
|
/* maximum difference of bit alignment in audio-samples.
|
||||||
*
|
*
|
||||||
|
|
|
@ -426,13 +426,13 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
|
||||||
// or a new full timecode will be queued next cycle.
|
// or a new full timecode will be queued next cycle.
|
||||||
while (outbound_mtc_timecode_frame < t) {
|
while (outbound_mtc_timecode_frame < t) {
|
||||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||||
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
|
outbound_mtc_timecode_frame += _samples_per_timecode_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
double const quarter_frame_duration = ((framecnt_t) _frames_per_timecode_frame) / 4.0;
|
double const quarter_frame_duration = ((framecnt_t) _samples_per_timecode_frame) / 4.0;
|
||||||
if (ceil((t - mtc_tc) / quarter_frame_duration) > 0) {
|
if (ceil((t - mtc_tc) / quarter_frame_duration) > 0) {
|
||||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||||
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
|
outbound_mtc_timecode_frame += _samples_per_timecode_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1 (off %2)\n", outbound_mtc_timecode_frame, mtc_offset));
|
DEBUG_TRACE (DEBUG::MTC, string_compose ("Full MTC TC %1 (off %2)\n", outbound_mtc_timecode_frame, mtc_offset));
|
||||||
|
@ -443,7 +443,7 @@ Session::send_full_time_code (framepos_t const t, MIDI::pframes_t nframes)
|
||||||
if (((mtc_timecode_bits >> 5) != MIDI::MTC_25_FPS) && (transmitting_timecode_time.frames % 2)) {
|
if (((mtc_timecode_bits >> 5) != MIDI::MTC_25_FPS) && (transmitting_timecode_time.frames % 2)) {
|
||||||
// start MTC quarter frame transmission on an even frame
|
// start MTC quarter frame transmission on an even frame
|
||||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||||
outbound_mtc_timecode_frame += _frames_per_timecode_frame;
|
outbound_mtc_timecode_frame += _samples_per_timecode_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
next_quarter_frame_to_send = 0;
|
next_quarter_frame_to_send = 0;
|
||||||
|
@ -507,7 +507,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
|
||||||
assert (next_quarter_frame_to_send <= 7);
|
assert (next_quarter_frame_to_send <= 7);
|
||||||
|
|
||||||
/* Duration of one quarter frame */
|
/* Duration of one quarter frame */
|
||||||
double const quarter_frame_duration = _frames_per_timecode_frame / 4.0;
|
double const quarter_frame_duration = _samples_per_timecode_frame / 4.0;
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::MTC, string_compose ("TF %1 SF %2 MT %3 QF %4 QD %5\n",
|
DEBUG_TRACE (DEBUG::MTC, string_compose ("TF %1 SF %2 MT %3 QF %4 QD %5\n",
|
||||||
_transport_frame, start_frame, outbound_mtc_timecode_frame,
|
_transport_frame, start_frame, outbound_mtc_timecode_frame,
|
||||||
|
@ -592,7 +592,7 @@ Session::send_midi_time_code_for_cycle (framepos_t start_frame, framepos_t end_f
|
||||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||||
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
Timecode::increment (transmitting_timecode_time, config.get_subframes_per_frame());
|
||||||
// Increment timing of first quarter frame
|
// Increment timing of first quarter frame
|
||||||
outbound_mtc_timecode_frame += 2.0 * _frames_per_timecode_frame;
|
outbound_mtc_timecode_frame += 2.0 * _samples_per_timecode_frame;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,11 +67,11 @@ void
|
||||||
Session::sync_time_vars ()
|
Session::sync_time_vars ()
|
||||||
{
|
{
|
||||||
_current_frame_rate = (framecnt_t) round (_nominal_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
|
_current_frame_rate = (framecnt_t) round (_nominal_frame_rate * (1.0 + (config.get_video_pullup()/100.0)));
|
||||||
_frames_per_timecode_frame = (double) _current_frame_rate / (double) timecode_frames_per_second();
|
_samples_per_timecode_frame = (double) _current_frame_rate / (double) timecode_frames_per_second();
|
||||||
if (timecode_drop_frames()) {
|
if (timecode_drop_frames()) {
|
||||||
_frames_per_hour = (int32_t)(107892 * _frames_per_timecode_frame);
|
_frames_per_hour = (int32_t)(107892 * _samples_per_timecode_frame);
|
||||||
} else {
|
} else {
|
||||||
_frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second()) * _frames_per_timecode_frame);
|
_frames_per_hour = (int32_t)(3600 * rint(timecode_frames_per_second()) * _samples_per_timecode_frame);
|
||||||
}
|
}
|
||||||
_timecode_frames_per_hour = rint(timecode_frames_per_second() * 3600.0);
|
_timecode_frames_per_hour = rint(timecode_frames_per_second() * 3600.0);
|
||||||
|
|
||||||
|
|
|
@ -653,7 +653,7 @@ timecode_to_sample(
|
||||||
bool offset_is_negative, int64_t offset_samples
|
bool offset_is_negative, int64_t offset_samples
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const double frames_per_timecode_frame = (double) sample_frame_rate / (double) timecode.rate;
|
const double samples_per_timecode_frame = (double) sample_frame_rate / (double) timecode.rate;
|
||||||
|
|
||||||
if (timecode.drop) {
|
if (timecode.drop) {
|
||||||
// The drop frame format was created to better approximate the 30000/1001 = 29.97002997002997....
|
// The drop frame format was created to better approximate the 30000/1001 = 29.97002997002997....
|
||||||
|
@ -711,7 +711,7 @@ timecode_to_sample(
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
Non drop is easy.. just note the use of
|
Non drop is easy.. just note the use of
|
||||||
rint(timecode.rate) * frames_per_timecode_frame
|
rint(timecode.rate) * samples_per_timecode_frame
|
||||||
(frames per Timecode second), which is larger than
|
(frames per Timecode second), which is larger than
|
||||||
frame_rate() in the non-integer Timecode rate case.
|
frame_rate() in the non-integer Timecode rate case.
|
||||||
*/
|
*/
|
||||||
|
@ -720,14 +720,14 @@ timecode_to_sample(
|
||||||
(
|
(
|
||||||
((timecode.hours * 60 * 60) + (timecode.minutes * 60) + timecode.seconds)
|
((timecode.hours * 60 * 60) + (timecode.minutes * 60) + timecode.seconds)
|
||||||
*
|
*
|
||||||
(rint(timecode.rate) * frames_per_timecode_frame)
|
(rint(timecode.rate) * samples_per_timecode_frame)
|
||||||
)
|
)
|
||||||
+ (timecode.frames * frames_per_timecode_frame)
|
+ (timecode.frames * samples_per_timecode_frame)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_subframes) {
|
if (use_subframes) {
|
||||||
sample += (int64_t) rint(((double)timecode.subframes * frames_per_timecode_frame) / (double)subframes_per_frame);
|
sample += (int64_t) rint(((double)timecode.subframes * samples_per_timecode_frame) / (double)subframes_per_frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_offset) {
|
if (use_offset) {
|
||||||
|
@ -812,14 +812,14 @@ sample_to_timecode (
|
||||||
double timecode_frames_left_exact;
|
double timecode_frames_left_exact;
|
||||||
double timecode_frames_fraction;
|
double timecode_frames_fraction;
|
||||||
int64_t timecode_frames_left;
|
int64_t timecode_frames_left;
|
||||||
const double frames_per_timecode_frame = sample_frame_rate / timecode_frames_per_second;
|
const double samples_per_timecode_frame = sample_frame_rate / timecode_frames_per_second;
|
||||||
const int64_t frames_per_hour = (int64_t)(3600. * rint(timecode_frames_per_second) * frames_per_timecode_frame);
|
const int64_t frames_per_hour = (int64_t)(3600. * rint(timecode_frames_per_second) * samples_per_timecode_frame);
|
||||||
|
|
||||||
timecode.hours = offset_sample / frames_per_hour;
|
timecode.hours = offset_sample / frames_per_hour;
|
||||||
|
|
||||||
// Extract whole hours. Do this to prevent rounding errors with
|
// Extract whole hours. Do this to prevent rounding errors with
|
||||||
// high sample numbers in the calculations that follow.
|
// high sample numbers in the calculations that follow.
|
||||||
timecode_frames_left_exact = (double)(offset_sample % frames_per_hour) / frames_per_timecode_frame;
|
timecode_frames_left_exact = (double)(offset_sample % frames_per_hour) / samples_per_timecode_frame;
|
||||||
timecode_frames_fraction = timecode_frames_left_exact - floor( timecode_frames_left_exact );
|
timecode_frames_fraction = timecode_frames_left_exact - floor( timecode_frames_left_exact );
|
||||||
|
|
||||||
timecode.subframes = (int32_t) rint(timecode_frames_fraction * subframes_per_frame);
|
timecode.subframes = (int32_t) rint(timecode_frames_fraction * subframes_per_frame);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user