diff options
| author | Carl Hetherington <cth@carlh.net> | 2015-01-23 23:00:48 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2015-01-23 23:00:48 +0000 |
| commit | 1a36fb7d4d84a1a993dc36d03454d9097790535e (patch) | |
| tree | a0de0a1559abe6d8c3abc3a658af75903c5891d1 /src/lib/ffmpeg_examiner.cc | |
| parent | 0483a39b8e66ba8436bc6a27eb23e1b7c62be710 (diff) | |
Hand-apply cb998bee2e70f3426fd95655736deae803efa58e from master; examine a whole FFmpeg file if there is no length information in the header.
Diffstat (limited to 'src/lib/ffmpeg_examiner.cc')
| -rw-r--r-- | src/lib/ffmpeg_examiner.cc | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/lib/ffmpeg_examiner.cc b/src/lib/ffmpeg_examiner.cc index 1d01981f6..f28060a56 100644 --- a/src/lib/ffmpeg_examiner.cc +++ b/src/lib/ffmpeg_examiner.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net> + Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net> 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 @@ -38,6 +38,7 @@ using boost::optional; FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c) : FFmpeg (c) + , _need_video_length (false) { /* Find audio and subtitle streams */ @@ -64,6 +65,12 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c) } } + /* See if the header has duration information in it */ + _need_video_length = _format_context->duration == AV_NOPTS_VALUE; + if (!_need_video_length) { + _video_length = ContentTime::from_seconds (double (_format_context->duration) / AV_TIME_BASE); + } + /* Run through until we find: * - the first video. * - the first audio for each stream. @@ -104,13 +111,18 @@ FFmpegExaminer::FFmpegExaminer (shared_ptr<const FFmpegContent> c) void FFmpegExaminer::video_packet (AVCodecContext* context) { - if (_first_video) { + if (_first_video && !_need_video_length) { return; } int frame_finished; if (avcodec_decode_video2 (context, _frame, &frame_finished, &_packet) >= 0 && frame_finished) { - _first_video = frame_time (_format_context->streams[_video_stream]); + if (!_first_video) { + _first_video = frame_time (_format_context->streams[_video_stream]); + } + if (_need_video_length) { + _video_length = frame_time (_format_context->streams[_video_stream]).get_value_or (ContentTime ()); + } } } @@ -177,7 +189,7 @@ ContentTime FFmpegExaminer::video_length () const { ContentTime const length = ContentTime::from_seconds (double (_format_context->duration) / AV_TIME_BASE); - return ContentTime (max (ContentTime::Type (1), length.get ())); + return ContentTime (max (ContentTime (1), _video_length)); } optional<float> |
