, _subtitle_codec (0)
, _decode_video (video)
, _decode_audio (audio)
- , _video_pts_offset (0)
- , _audio_pts_offset (0)
+ , _pts_offset (0)
, _just_sought (false)
{
setup_subtitle ();
insertion of black frames to work.
We will do:
- audio_pts_to_use = audio_pts_from_ffmpeg + audio_pts_offset;
- video_pts_to_use = video_pts_from_ffmpeg + video_pts_offset;
+ audio_pts_to_use = audio_pts_from_ffmpeg + pts_offset;
+ video_pts_to_use = video_pts_from_ffmpeg + pts_offset;
*/
bool const have_video = video && c->first_video();
/* First, make one of them start at 0 */
if (have_audio && have_video) {
- _video_pts_offset = _audio_pts_offset = - min (c->first_video().get(), c->audio_stream()->first_audio.get());
+ _pts_offset = - min (c->first_video().get(), c->audio_stream()->first_audio.get());
} else if (have_video) {
- _video_pts_offset = - c->first_video().get();
+ _pts_offset = - c->first_video().get();
} else if (have_audio) {
- _audio_pts_offset = - c->audio_stream()->first_audio.get();
+ _pts_offset = - c->audio_stream()->first_audio.get();
}
/* Now adjust both so that the video pts starts on a frame */
if (have_video && have_audio) {
- double first_video = c->first_video().get() + _video_pts_offset;
+ double first_video = c->first_video().get() + _pts_offset;
double const old_first_video = first_video;
/* Round the first video up to a frame boundary */
first_video = ceil (first_video * c->video_frame_rate()) / c->video_frame_rate ();
}
- _video_pts_offset += first_video - old_first_video;
- _audio_pts_offset += first_video - old_first_video;
+ _pts_offset += first_video - old_first_video;
}
}
}
/* Initial seek time in the stream's timebase */
- int64_t const initial_vt = ((initial / _ffmpeg_content->video_frame_rate()) - _video_pts_offset) / time_base;
+ int64_t const initial_vt = ((initial / _ffmpeg_content->video_frame_rate()) - _pts_offset) / time_base;
av_seek_frame (_format_context, _video_stream, initial_vt, AVSEEK_FLAG_BACKWARD);
r = avcodec_decode_video2 (video_codec_context(), _frame, &finished, &_packet);
if (r >= 0 && finished) {
_video_position = rint (
- (av_frame_get_best_effort_timestamp (_frame) * time_base + _video_pts_offset) * _ffmpeg_content->video_frame_rate()
+ (av_frame_get_best_effort_timestamp (_frame) * time_base + _pts_offset) * _ffmpeg_content->video_frame_rate()
);
if (_video_position >= (frame - 1)) {
if (_audio_position == 0) {
/* Where we are in the source, in seconds */
double const pts = av_q2d (_format_context->streams[copy_packet.stream_index]->time_base)
- * av_frame_get_best_effort_timestamp(_frame) + _audio_pts_offset;
+ * av_frame_get_best_effort_timestamp(_frame) + _pts_offset;
if (pts > 0) {
/* Emit some silence */
if (i->second != AV_NOPTS_VALUE) {
- double const pts = i->second * av_q2d (_format_context->streams[_video_stream]->time_base) + _video_pts_offset;
+ double const pts = i->second * av_q2d (_format_context->streams[_video_stream]->time_base) + _pts_offset;
if (_just_sought) {
/* We just did a seek, so disable any attempts to correct for where we
/* Subtitle PTS in seconds (within the source, not taking into account any of the
source that we may have chopped off for the DCP)
*/
- double const packet_time = (static_cast<double> (sub.pts ) / AV_TIME_BASE) + _video_pts_offset;
+ double const packet_time = (static_cast<double> (sub.pts ) / AV_TIME_BASE) + _pts_offset;
/* hence start time for this sub */
Time const from = (packet_time + (double (sub.start_display_time) / 1e3)) * TIME_HZ;
content->_first_video = 0;
content->_audio_stream->first_audio = 0;
FFmpegDecoder decoder (film, content, true, true);
- BOOST_CHECK_EQUAL (decoder._video_pts_offset, 0);
- BOOST_CHECK_EQUAL (decoder._audio_pts_offset, 0);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, 0);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, 0);
}
{
content->_first_video = 600;
content->_audio_stream->first_audio = 600;
FFmpegDecoder decoder (film, content, true, true);
- BOOST_CHECK_EQUAL (decoder._video_pts_offset, -600);
- BOOST_CHECK_EQUAL (decoder._audio_pts_offset, -600);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, -600);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, -600);
}
{
content->_first_video = 1.0 / 24.0;
content->_audio_stream->first_audio = 0;
FFmpegDecoder decoder (film, content, true, true);
- BOOST_CHECK_EQUAL (decoder._video_pts_offset, 0);
- BOOST_CHECK_EQUAL (decoder._audio_pts_offset, 0);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, 0);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, 0);
}
{
content->_first_video = frame + 0.0215;
content->_audio_stream->first_audio = 0;
FFmpegDecoder decoder (film, content, true, true);
- BOOST_CHECK_CLOSE (decoder._video_pts_offset, (frame - 0.0215), 0.00001);
- BOOST_CHECK_CLOSE (decoder._audio_pts_offset, (frame - 0.0215), 0.00001);
+ BOOST_CHECK_CLOSE (decoder._pts_offset, (frame - 0.0215), 0.00001);
+ BOOST_CHECK_CLOSE (decoder._pts_offset, (frame - 0.0215), 0.00001);
}
{
content->_first_video = frame + 0.0215 + 4.1;
content->_audio_stream->first_audio = 4.1;
FFmpegDecoder decoder (film, content, true, true);
- BOOST_CHECK_EQUAL (decoder._video_pts_offset, (frame - 0.0215) - 4.1);
- BOOST_CHECK_EQUAL (decoder._audio_pts_offset, (frame - 0.0215) - 4.1);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, (frame - 0.0215) - 4.1);
+ BOOST_CHECK_EQUAL (decoder._pts_offset, (frame - 0.0215) - 4.1);
}
}