projects
/
dcpomatic.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Missing FFmpeg include; fixes #989.
[dcpomatic.git]
/
src
/
lib
/
ffmpeg_decoder.cc
diff --git
a/src/lib/ffmpeg_decoder.cc
b/src/lib/ffmpeg_decoder.cc
index 28c638998de6a850b2478b9346434de7efe537f7..f0500a6296965bec6a43816de589a49f999e0ed4 100644
(file)
--- a/
src/lib/ffmpeg_decoder.cc
+++ b/
src/lib/ffmpeg_decoder.cc
@@
-37,10
+37,10
@@
#include "raw_image_proxy.h"
#include "video_decoder.h"
#include "film.h"
#include "raw_image_proxy.h"
#include "video_decoder.h"
#include "film.h"
-#include "md5_digester.h"
#include "audio_decoder.h"
#include "compose.hpp"
#include "subtitle_content.h"
#include "audio_decoder.h"
#include "compose.hpp"
#include "subtitle_content.h"
+#include "audio_content.h"
#include <dcp/subtitle_string.h>
#include <sub/ssa_reader.h>
#include <sub/subtitle.h>
#include <dcp/subtitle_string.h>
#include <sub/ssa_reader.h>
#include <sub/subtitle.h>
@@
-74,9
+74,11
@@
using std::map;
using boost::shared_ptr;
using boost::is_any_of;
using boost::split;
using boost::shared_ptr;
using boost::is_any_of;
using boost::split;
+using boost::optional;
+using boost::dynamic_pointer_cast;
using dcp::Size;
using dcp::Size;
-FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log
, bool fast
)
+FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log> log)
: FFmpeg (c)
, _log (log)
{
: FFmpeg (c)
, _log (log)
{
@@
-88,7
+90,7
@@
FFmpegDecoder::FFmpegDecoder (shared_ptr<const FFmpegContent> c, shared_ptr<Log>
}
if (c->audio) {
}
if (c->audio) {
- audio.reset (new AudioDecoder (this, c->audio,
fast,
log));
+ audio.reset (new AudioDecoder (this, c->audio, log));
}
if (c->subtitle) {
}
if (c->subtitle) {
@@
-135,7
+137,7
@@
FFmpegDecoder::pass (PassReason reason, bool accurate)
/* Maybe we should fail here, but for now we'll just finish off instead */
char buf[256];
av_strerror (r, buf, sizeof(buf));
/* Maybe we should fail here, but for now we'll just finish off instead */
char buf[256];
av_strerror (r, buf, sizeof(buf));
- LOG_ERROR (N_("error on av_read_frame (%1) (%2)"),
buf
, r);
+ LOG_ERROR (N_("error on av_read_frame (%1) (%2)"),
&buf[0]
, r);
}
flush ();
}
flush ();
@@
-327,7
+329,18
@@
FFmpegDecoder::seek (ContentTime time, bool accurate)
http://www.mjbshaw.com/2012/04/seeking-in-ffmpeg-know-your-timestamp.html
*/
http://www.mjbshaw.com/2012/04/seeking-in-ffmpeg-know-your-timestamp.html
*/
- DCPOMATIC_ASSERT (_video_stream);
+ optional<int> stream;
+
+ if (_video_stream) {
+ stream = _video_stream;
+ } else {
+ shared_ptr<FFmpegAudioStream> s = dynamic_pointer_cast<FFmpegAudioStream> (_ffmpeg_content->audio->stream ());
+ if (s) {
+ stream = s->index (_format_context);
+ }
+ }
+
+ DCPOMATIC_ASSERT (stream);
ContentTime u = time - _pts_offset;
if (u < ContentTime ()) {
ContentTime u = time - _pts_offset;
if (u < ContentTime ()) {
@@
-335,12
+348,14
@@
FFmpegDecoder::seek (ContentTime time, bool accurate)
}
av_seek_frame (
_format_context,
}
av_seek_frame (
_format_context,
-
_video_
stream.get(),
- u.seconds() / av_q2d (_format_context->streams[
_video_
stream.get()]->time_base),
+ stream.get(),
+ u.seconds() / av_q2d (_format_context->streams[stream.get()]->time_base),
AVSEEK_FLAG_BACKWARD
);
AVSEEK_FLAG_BACKWARD
);
- avcodec_flush_buffers (video_codec_context());
+ if (video_codec_context ()) {
+ avcodec_flush_buffers (video_codec_context());
+ }
/* XXX: should be flushing audio buffers? */
/* XXX: should be flushing audio buffers? */
@@
-377,7
+392,7
@@
FFmpegDecoder::decode_audio_packet ()
if (decode_result < 0) {
/* avcodec_decode_audio4 can sometimes return an error even though it has decoded
some valid data; for example dca_subframe_footer can return AVERROR_INVALIDDATA
if (decode_result < 0) {
/* avcodec_decode_audio4 can sometimes return an error even though it has decoded
some valid data; for example dca_subframe_footer can return AVERROR_INVALIDDATA
- if it overreads the auxiliary data. ffplay carries on if frame_finished is true,
+ if it overreads the auxiliary data. ffplay carries on if frame_finished is true,
even in the face of such an error, so I think we should too.
Returning from the method here caused mantis #352.
even in the face of such an error, so I think we should too.
Returning from the method here caused mantis #352.
@@
-406,7
+421,12
@@
FFmpegDecoder::decode_audio_packet ()
ct += ContentTime::from_frames (remove, (*stream)->frame_rate ());
}
ct += ContentTime::from_frames (remove, (*stream)->frame_rate ());
}
- if (data->frames() > 0) {
+ if (ct < ContentTime()) {
+ LOG_WARNING ("Crazy timestamp %s", to_string (ct));
+ }
+
+ /* Give this data provided there is some, and its time is sane */
+ if (ct >= ContentTime() && data->frames() > 0) {
audio->give (*stream, data, ct);
}
}
audio->give (*stream, data, ct);
}
}