Various test / seek fixes.
authorCarl Hetherington <cth@carlh.net>
Sun, 22 Dec 2013 01:20:39 +0000 (01:20 +0000)
committerCarl Hetherington <cth@carlh.net>
Sun, 22 Dec 2013 01:20:39 +0000 (01:20 +0000)
src/lib/ffmpeg_decoder.cc
src/lib/player.cc
test/ffmpeg_audio_test.cc
test/skip_frame_test.cc
test/test.cc

index 80c3d9906b48188d2057f34007f632ac4671c9dc..c6e4217b6740959dc2ac23cf3dd2cfb91d2fc2e6 100644 (file)
@@ -367,13 +367,19 @@ FFmpegDecoder::seek_final_finished (int n, int done) const
 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 ()) {
index 17b44cdb8ca6f22fc0b2918d2f5627df58707b12..9757040d4e6100feb953bdf518f922b6a7ca6e02 100644 (file)
@@ -142,8 +142,8 @@ Player::pass ()
        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();
@@ -243,7 +243,7 @@ Player::emit_video (weak_ptr<Piece> weak_piece, shared_ptr<DecodedVideo> video)
 #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());
 }
@@ -520,6 +520,7 @@ Player::emit_silence (DCPTime most)
        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;
 }
 
index 65c29325c348178b2fd4febc13fa8ac7f01044ff..bba05ae9bef5a4db7ffbdb52f0d7860f153fd225 100644 (file)
 
 */
 
+/** @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>
index 4420475942bfe4819220100130477a31cc0b8416..4ac5192f23284d375353adb6c6487cbd4fa02504 100644 (file)
@@ -46,7 +46,6 @@ BOOST_AUTO_TEST_CASE (skip_frame_test)
        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 ()));
 }
 
index df2cb1c4b03b256da63861c589dc267d024f203f..c0f732c46d22c9f558e6c897772d3833cf51e39f 100644 (file)
@@ -62,6 +62,7 @@ struct TestConfig
                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 ();