Fix some DCP generation bugs and update some tests.
authorCarl Hetherington <cth@carlh.net>
Mon, 27 May 2013 22:17:34 +0000 (23:17 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 27 May 2013 22:17:34 +0000 (23:17 +0100)
src/lib/ffmpeg_decoder.cc
src/lib/filter_graph.cc
src/lib/player.cc
src/lib/playlist.cc
test/dcp_test.cc
test/film_metadata_test.cc
test/metadata.ref [deleted file]
test/metadata.xml.ref [new file with mode: 0644]
test/pixel_formats_test.cc
test/test.cc

index 119e82851ec5de9433d119e2409b1b951067104f..a1a6636fb6ed005a12577cffede608c369f94149 100644 (file)
@@ -539,7 +539,7 @@ FFmpegDecoder::decode_audio_packet ()
                                        );
                                
                                assert (_audio_codec_context->channels == _ffmpeg_content->audio_channels());
-                               Audio (deinterleave_audio (_frame->data, data_size), source_pts_seconds);
+                               audio (deinterleave_audio (_frame->data, data_size), source_pts_seconds);
                        }
                        
                        copy_packet.data += decode_result;
@@ -608,11 +608,11 @@ FFmpegDecoder::decode_video_packet ()
 Time
 FFmpegDecoder::next () const
 {
-       if (_decode_video && _decode_audio) {
+       if (_decode_video && _decode_audio && _audio_codec_context) {
                return min (_next_video, _next_audio);
        }
 
-       if (_decode_audio) {
+       if (_decode_audio && _audio_codec_context) {
                return _next_audio;
        }
 
index 4564033d5379dd5d6770addfdac826cff447237f..7ec2466c588a4dc29e6e02b6274a7ca6ee81fbdf 100644 (file)
@@ -40,6 +40,7 @@ extern "C" {
 using std::stringstream;
 using std::string;
 using std::list;
+using std::cout;
 using boost::shared_ptr;
 using boost::weak_ptr;
 using libdcp::Size;
@@ -86,8 +87,8 @@ FilterGraph::FilterGraph (shared_ptr<const FFmpegContent> content, libdcp::Size
        stringstream a;
        a << "video_size=" << _size.width << "x" << _size.height << ":"
          << "pix_fmt=" << _pixel_format << ":"
-         << "time_base=0/1:"
-         << "pixel_aspect=0/1";
+         << "time_base=1/1:"
+         << "pixel_aspect=1/1";
 
        int r;
 
index 34894ff0e1f2a8bb0977a974b11c4968682380df..2926796ef1d35f440fdf2344899cfc536e884d8a 100644 (file)
@@ -172,8 +172,8 @@ Player::process_audio (weak_ptr<Content> weak_content, shared_ptr<const AudioBuf
 
         if (time > _next_audio) {
                 /* We can emit some audio from our buffers */
-               assert (_film->time_to_audio_frames (time - _next_audio) <= _audio_buffers.frames());
                 OutputAudioFrame const N = _film->time_to_audio_frames (time - _next_audio);
+               assert (N <= _audio_buffers.frames());
                 shared_ptr<AudioBuffers> emit (new AudioBuffers (_audio_buffers.channels(), N));
                 emit->copy_from (&_audio_buffers, N, 0, 0);
                 Audio (emit, _next_audio);
@@ -189,6 +189,7 @@ Player::process_audio (weak_ptr<Content> weak_content, shared_ptr<const AudioBuf
         /* Now accumulate the new audio into our buffers */
         _audio_buffers.ensure_size (_audio_buffers.frames() + audio->frames());
         _audio_buffers.accumulate_frames (audio.get(), 0, 0, audio->frames ());
+       _audio_buffers.set_frames (_audio_buffers.frames() + audio->frames());
 }
 
 /** @return true on error */
@@ -324,9 +325,11 @@ Player::setup_pieces ()
                        if (diff > 0) {
                                add_black_piece (video_pos, diff);
                        }
-                                               
                        video_pos = (*i)->content->end();
-               } else {
+               }
+
+               shared_ptr<AudioContent> ac = dynamic_pointer_cast<AudioContent> ((*i)->content);
+               if (ac && ac->audio_channels()) {
                        Time const diff = (*i)->content->start() - audio_pos;
                        if (diff > 0) {
                                add_silent_piece (video_pos, diff);
index d32ec6ba8ac911e70295d70840a1ce67347be4b7..5ee764a8e73d4e14491e3bac9d6333b19fb87392 100644 (file)
@@ -73,7 +73,6 @@ void
 Playlist::content_changed (weak_ptr<Content> c, int p)
 {
        if (p == ContentProperty::LENGTH && _sequence_video && !_sequencing_video) {
-               cout << "sequencing.\n";
                _sequencing_video = true;
 
                ContentList cl = _content;
@@ -85,7 +84,6 @@ Playlist::content_changed (weak_ptr<Content> c, int p)
                        }
 
                        (*i)->set_start (last);
-                       cout << (*i)->file() << " -> " << last << "\n";
                        last = (*i)->end ();
                }
 
index 5a698684beb2f6824deaf6dcb6eaca65741029d1..795b4dfe3d0078cac76d2f9870764f50457815ff 100644 (file)
@@ -21,7 +21,14 @@ BOOST_AUTO_TEST_CASE (make_dcp_test)
 {
        shared_ptr<Film> film = new_test_film ("make_dcp_test");
        film->set_name ("test_film2");
-       film->add_content (shared_ptr<FFmpegContent> (new FFmpegContent (film, "../../../test/test.mp4")));
+       system ("pwd");
+       film->examine_and_add_content (shared_ptr<FFmpegContent> (new FFmpegContent (film, "test/test.mp4")));
+
+       /* Wait for the examine to finish */
+       while (JobManager::instance()->work_to_do ()) {
+               dcpomatic_sleep (1);
+       }
+       
        film->set_container (Container::from_id ("185"));
        film->set_dcp_content_type (DCPContentType::from_pretty_name ("Test"));
        film->make_dcp ();
@@ -46,21 +53,3 @@ BOOST_AUTO_TEST_CASE (have_dcp_test)
        boost::filesystem::remove (p);
        BOOST_CHECK (!f.have_dcp ());
 }
-
-BOOST_AUTO_TEST_CASE (make_dcp_with_range_test)
-{
-       shared_ptr<Film> film = new_test_film ("make_dcp_with_range_test");
-       film->set_name ("test_film3");
-       film->add_content (shared_ptr<Content> (new FFmpegContent (film, "../../../test/test.mp4")));
-//     film->examine_content ();
-       film->set_container (Container::from_id ("185"));
-       film->set_dcp_content_type (DCPContentType::from_pretty_name ("Test"));
-       film->make_dcp ();
-
-       while (JobManager::instance()->work_to_do() && !JobManager::instance()->errors()) {
-               dcpomatic_sleep (1);
-       }
-
-       BOOST_CHECK_EQUAL (JobManager::instance()->errors(), false);
-}
-
index 8309de7f1d350037f650539bdd16a87b848624d9..315461b2285c5f36a3a427ae87ce860ba009709f 100644 (file)
@@ -31,14 +31,13 @@ BOOST_AUTO_TEST_CASE (film_metadata_test)
        BOOST_CHECK (f->dcp_content_type() == 0);
 
        f->set_name ("fred");
-//     BOOST_CHECK_THROW (f->add_content ("jim"), OpenFileError);
        f->set_dcp_content_type (DCPContentType::from_pretty_name ("Short"));
        f->set_container (Container::from_id ("185"));
        f->set_ab (true);
        f->write_metadata ();
 
        stringstream s;
-       s << "diff -u test/metadata.ref " << test_film << "/metadata";
+       s << "diff -u test/metadata.xml.ref " << test_film << "/metadata.xml";
        BOOST_CHECK_EQUAL (::system (s.str().c_str ()), 0);
 
        shared_ptr<Film> g (new Film (test_film));
diff --git a/test/metadata.ref b/test/metadata.ref
deleted file mode 100644 (file)
index b7a0318..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-version 4
-name fred
-use_dci_name 1
-content 
-trust_content_header 1
-dcp_content_type SHR
-format 185
-left_crop 1
-right_crop 2
-top_crop 3
-bottom_crop 4
-filter pphb
-filter unsharp
-scaler bicubic
-trim_start 42
-trim_end 99
-trim_type cpl
-dcp_ab 1
-use_content_audio 1
-audio_gain 0
-audio_delay 0
-still_duration 10
-with_subtitles 0
-subtitle_offset 0
-subtitle_scale 1
-colour_lut 0
-j2k_bandwidth 200000000
-audio_language 
-subtitle_language 
-territory 
-rating 
-studio 
-facility 
-package_type 
-dci_date 20130211
-dcp_frame_rate 0
-width 0
-height 0
-length 0
-content_digest 
-external_audio_stream external 0 0
-source_frame_rate 0
diff --git a/test/metadata.xml.ref b/test/metadata.xml.ref
new file mode 100644 (file)
index 0000000..be791c7
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Metadata>
+  <Version>4</Version>
+  <Name>fred</Name>
+  <UseDCIName>1</UseDCIName>
+  <DCPContentType>SHR</DCPContentType>
+  <Container>185</Container>
+  <Scaler>bicubic</Scaler>
+  <AB>1</AB>
+  <WithSubtitles>0</WithSubtitles>
+  <SubtitleOffset>0</SubtitleOffset>
+  <SubtitleScale>1</SubtitleScale>
+  <ColourLUT>0</ColourLUT>
+  <J2KBandwidth>200000000</J2KBandwidth>
+  <DCIMetadata>
+    <AudioLanguage></AudioLanguage>
+    <SubtitleLanguage></SubtitleLanguage>
+    <Territory></Territory>
+    <Rating></Rating>
+    <Studio></Studio>
+    <Facility></Facility>
+    <PackageType></PackageType>
+  </DCIMetadata>
+  <DCPVideoFrameRate>0</DCPVideoFrameRate>
+  <DCIDate>20130211</DCIDate>
+  <DCPAudioChannels>6</DCPAudioChannels>
+  <Playlist>
+    <Loop>1</Loop>
+    <SequenceVideo>1</SequenceVideo>
+  </Playlist>
+</Metadata>
index 08c9f2d2def524e250692d67be7bcdc498ba5d35..fb2278fdbba39e8125bd43955a928fa3763a015e 100644 (file)
@@ -62,6 +62,7 @@ BOOST_AUTO_TEST_CASE (pixel_formats_test)
                f->width = 640;
                f->height = 480;
                f->format = static_cast<int> (i->format);
+               av_frame_get_buffer (f, true);
                SimpleImage t (f);
                BOOST_CHECK_EQUAL(t.components(), i->components);
                BOOST_CHECK_EQUAL(t.lines(0), i->lines[0]);
index cbbd0443dc8eae7df4a64b4194bf843a1f7fdc5e..7e2715a02169112f899feaf493de4888119db374 100644 (file)
@@ -63,6 +63,8 @@ struct TestConfig
                Config::instance()->set_servers (vector<ServerDescription*> ());
                Config::instance()->set_server_port (61920);
                Config::instance()->set_default_dci_metadata (DCIMetadata ());
+               Config::instance()->set_default_container (0);
+               Config::instance()->set_default_dcp_content_type (0);
        }
 };