From 9423e02c37daba7f9e406929a1cfc1bb10fb4b62 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 10 May 2016 13:50:47 +0100 Subject: [PATCH] Partial work on using a no-video FFmpeg file. --- src/lib/ffmpeg.cc | 4 ---- src/lib/ffmpeg_content.cc | 43 +++++++++++++++++++--------------- src/lib/ffmpeg_decoder.cc | 6 ++++- src/lib/ffmpeg_examiner.cc | 18 ++++++++++---- src/lib/ffmpeg_examiner.h | 2 ++ test/ffmpeg_audio_only_test.cc | 37 +++++++++++++++++++++++++++++ test/wscript | 1 + 7 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 test/ffmpeg_audio_only_test.cc diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index 7b1eae2b1..bfa3d4e7f 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -161,10 +161,6 @@ FFmpeg::setup_general () _video_stream = video_stream_undefined_frame_rate.get(); } - if (!_video_stream) { - throw DecodeError (N_("could not find video stream")); - } - /* Hack: if the AVStreams have duplicate IDs, replace them with our own. We use the IDs so that we can cope with VOBs, in which streams move about in index but remain with the same ID in different diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index a0bf88c25..bb9795f25 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -64,11 +64,7 @@ int const FFmpegContentProperty::FILTERS = 102; FFmpegContent::FFmpegContent (shared_ptr film, boost::filesystem::path p) : Content (film, p) { - video.reset (new VideoContent (this, film)); - audio.reset (new AudioContent (this, film)); - subtitle.reset (new SubtitleContent (this, film)); - set_default_colour_conversion (); } FFmpegContent::FFmpegContent (shared_ptr film, cxml::ConstNodePtr node, int version, list& notes) @@ -210,35 +206,44 @@ FFmpegContent::examine (shared_ptr job) Content::examine (job); shared_ptr examiner (new FFmpegExaminer (shared_from_this (), job)); - video->take_from_examiner (examiner); - set_default_colour_conversion (); + + if (examiner->has_video ()) { + video.reset (new VideoContent (this, film ())); + video->take_from_examiner (examiner); + set_default_colour_conversion (); + } { boost::mutex::scoped_lock lm (_mutex); - _subtitle_streams = examiner->subtitle_streams (); - if (!_subtitle_streams.empty ()) { - _subtitle_stream = _subtitle_streams.front (); + if (examiner->has_video ()) { + _first_video = examiner->first_video (); + _color_range = examiner->color_range (); + _color_primaries = examiner->color_primaries (); + _color_trc = examiner->color_trc (); + _colorspace = examiner->colorspace (); + _bits_per_pixel = examiner->bits_per_pixel (); } - BOOST_FOREACH (shared_ptr i, examiner->audio_streams ()) { - audio->add_stream (i); - } + if (!examiner->audio_streams().empty ()) { + audio.reset (new AudioContent (this, film ())); + + BOOST_FOREACH (shared_ptr i, examiner->audio_streams ()) { + audio->add_stream (i); + } - if (!audio->streams().empty ()) { AudioStreamPtr as = audio->streams().front(); AudioMapping m = as->mapping (); film()->make_audio_mapping_default (m); as->set_mapping (m); } - _first_video = examiner->first_video (); + _subtitle_streams = examiner->subtitle_streams (); + if (!_subtitle_streams.empty ()) { + subtitle.reset (new SubtitleContent (this, film ())); + _subtitle_stream = _subtitle_streams.front (); + } - _color_range = examiner->color_range (); - _color_primaries = examiner->color_primaries (); - _color_trc = examiner->color_trc (); - _colorspace = examiner->colorspace (); - _bits_per_pixel = examiner->bits_per_pixel (); } signal_changed (FFmpegContentProperty::SUBTITLE_STREAMS); diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 72df69126..d84bb2a52 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -77,8 +77,12 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr c, shared_ptr , SubtitleDecoder (c->subtitle) , FFmpeg (c) , _log (log) - , _pts_offset (pts_offset (c->ffmpeg_audio_streams(), c->first_video(), c->active_video_frame_rate())) { + if (c->video) { + _pts_offset = pts_offset (c->ffmpeg_audio_streams(), c->first_video(), c->active_video_frame_rate()); + } else { + _pts_offset = ContentTime (); + } } void diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index eeb0cfc38..44d6a87df 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -72,10 +72,12 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c, shared_ptrduration == AV_NOPTS_VALUE; - if (!_need_video_length) { - _video_length = (double (_format_context->duration) / AV_TIME_BASE) * video_frame_rate().get (); + if (has_video ()) { + /* See if the header has duration information in it */ + _need_video_length = _format_context->duration == AV_NOPTS_VALUE; + if (!_need_video_length) { + _video_length = (double (_format_context->duration) / AV_TIME_BASE) * video_frame_rate().get (); + } } if (job) { @@ -169,7 +171,7 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr c, shared_ptr i, _subtitle_streams) { i->add_offset (pts_offset (_audio_streams, _first_video, video_frame_rate().get())); } @@ -477,3 +479,9 @@ FFmpegExaminer::yuv () const return false; } } + +bool +FFmpegExaminer::has_video () const +{ + return static_cast (_video_stream); +} diff --git a/src/lib/ffmpeg_examiner.h b/src/lib/ffmpeg_examiner.h index b9ca04e4c..258c2ea53 100644 --- a/src/lib/ffmpeg_examiner.h +++ b/src/lib/ffmpeg_examiner.h @@ -32,6 +32,8 @@ class FFmpegExaminer : public FFmpeg, public VideoExaminer public: FFmpegExaminer (boost::shared_ptr, boost::shared_ptr job = boost::shared_ptr ()); + bool has_video () const; + boost::optional video_frame_rate () const; dcp::Size video_size () const; Frame video_length () const; diff --git a/test/ffmpeg_audio_only_test.cc b/test/ffmpeg_audio_only_test.cc new file mode 100644 index 000000000..a0c39b9c1 --- /dev/null +++ b/test/ffmpeg_audio_only_test.cc @@ -0,0 +1,37 @@ +/* + Copyright (C) 2016 Carl Hetherington + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "lib/film.h" +#include "lib/ffmpeg_content.h" +#include "test.h" +#include + +using boost::shared_ptr; + +/** Test the FFmpeg code with audio-only content */ +BOOST_AUTO_TEST_CASE (ffmpeg_audio_only_test) +{ + shared_ptr film = new_test_film ("ffmpeg_audio_only_test"); + film->set_name ("test_film"); + shared_ptr c (new FFmpegContent (film, "test/data/sine_440.mp3")); + film->examine_and_add_content (c); + wait_for_jobs (); + film->write_metadata (); +} + diff --git a/test/wscript b/test/wscript index 7efe6e61c..a93eac661 100644 --- a/test/wscript +++ b/test/wscript @@ -51,6 +51,7 @@ def build(bld): dcp_subtitle_test.cc dcpomatic_time_test.cc ffmpeg_audio_test.cc + ffmpeg_audio_only_test.cc ffmpeg_dcp_test.cc ffmpeg_decoder_seek_test.cc ffmpeg_decoder_sequential_test.cc -- 2.30.2