void
FFmpegDecoder::seek_and_flush (ContentTime t)
{
- int64_t const initial_v = ((double (t) / TIME_HZ) - _video_pts_offset) /
+ int64_t s = ((double (t) / TIME_HZ) - _video_pts_offset) /
av_q2d (_format_context->streams[_video_stream]->time_base);
- int64_t const initial_a = ((double (t) / TIME_HZ) - _audio_pts_offset) /
- av_q2d (_ffmpeg_content->audio_stream()->stream(_format_context)->time_base);
+ if (_ffmpeg_content->audio_stream ()) {
+ s = min (
+ s, int64_t (
+ ((double (t) / TIME_HZ) - _audio_pts_offset) /
+ av_q2d (_ffmpeg_content->audio_stream()->stream(_format_context)->time_base)
+ )
+ );
+ }
- av_seek_frame (_format_context, _video_stream, min (initial_v, initial_a), AVSEEK_FLAG_BACKWARD);
+ av_seek_frame (_format_context, _video_stream, s, AVSEEK_FLAG_BACKWARD);
avcodec_flush_buffers (video_codec_context());
if (audio_codec_context ()) {
shared_ptr<DecodedSubtitle> ds = dynamic_pointer_cast<DecodedSubtitle> (earliest_decoded);
if (dv && _video) {
- DCPTime const frame = TIME_HZ / _film->video_frame_rate ();
- if (!_just_did_inaccurate_seek && earliest_time > (_video_position + frame)) {
+ DCPTime const half_frame = TIME_HZ / (2 * _film->video_frame_rate ());
+ if (!_just_did_inaccurate_seek && earliest_time > (_video_position + half_frame)) {
/* See if we're inside some video content */
list<shared_ptr<Piece> >::iterator i = _pieces.begin();
#endif
Video (pi, video->eyes, content->colour_conversion(), video->same, video->dcp_time);
-
+
_last_emit_was_black = false;
_video_position = rint (video->dcp_time + TIME_HZ / _film->video_frame_rate());
}
shared_ptr<AudioBuffers> silence (new AudioBuffers (_film->audio_channels(), t * _film->audio_frame_rate() / TIME_HZ));
silence->make_silent ();
Audio (silence, _audio_position);
+
_audio_position += t;
}
*/
+/** @file test/ffmpeg_audio_test.cc
+ * @brief A simple test of reading audio from an FFmpeg file.
+ */
+
#include <boost/test/unit_test.hpp>
#include <libdcp/cpl.h>
#include <libdcp/dcp.h>
film->make_dcp ();
wait_for_jobs ();
- std::cout << film->dir (film->dcp_name ()) << "\n";
check_dcp ("test/data/skip_frame_test", film->dir (film->dcp_name ()));
}
Config::instance()->set_default_dci_metadata (DCIMetadata ());
Config::instance()->set_default_container (static_cast<Ratio*> (0));
Config::instance()->set_default_dcp_content_type (static_cast<DCPContentType*> (0));
+ Config::instance()->set_default_audio_delay (0);
ServerFinder::instance()->disable ();