X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg.cc;h=af6c8e1674e66c12b01dcafbbc2f428ddc96d561;hb=58b5c57c9a4767c786a1428f243c60ff52c82c26;hp=490189c128fbf512c54c1ba1312aa528c3c0f0bd;hpb=3828baf56467224f5d44049bf1e7a7ed11f43a05;p=dcpomatic.git diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index 490189c12..af6c8e167 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -23,12 +23,12 @@ #include "film.h" #include "exceptions.h" #include "util.h" -#include "raw_convert.h" #include "log.h" #include "ffmpeg_subtitle_stream.h" #include "ffmpeg_audio_stream.h" -#include "md5_digester.h" +#include "digester.h" #include "compose.hpp" +#include extern "C" { #include #include @@ -46,6 +46,7 @@ using std::cerr; using std::vector; using boost::shared_ptr; using boost::optional; +using dcp::raw_convert; boost::mutex FFmpeg::_mutex; boost::weak_ptr FFmpeg::_ffmpeg_log; @@ -130,8 +131,9 @@ FFmpeg::setup_general () av_dict_set (&options, "analyzeduration", raw_convert (5 * 60 * 1000000).c_str(), 0); av_dict_set (&options, "probesize", raw_convert (5 * 60 * 1000000).c_str(), 0); - if (avformat_open_input (&_format_context, 0, 0, &options) < 0) { - throw OpenFileError (_ffmpeg_content->path(0).string ()); + int e = avformat_open_input (&_format_context, 0, 0, &options); + if (e < 0) { + throw OpenFileError (_ffmpeg_content->path(0).string(), e, true); } if (avformat_find_stream_info (_format_context, 0) < 0) { @@ -201,12 +203,16 @@ FFmpeg::setup_decoders () AVCodec* codec = avcodec_find_decoder (context->codec_id); if (codec) { + AVDictionary* options = 0; /* This option disables decoding of DCA frame footers in our patched version of FFmpeg. I believe these footers are of no use to us, and they can cause problems when FFmpeg fails to decode them (mantis #352). */ - AVDictionary* options = 0; av_dict_set (&options, "disable_footer", "1", 0); + /* This allows decoding of some DNxHR 444 and HQX files; see + https://trac.ffmpeg.org/ticket/5681 + */ + av_dict_set_int (&options, "strict", FF_COMPLIANCE_EXPERIMENTAL, 0); if (avcodec_open2 (context, codec, &options) < 0) { throw DecodeError (N_("could not open decoder")); @@ -220,7 +226,10 @@ FFmpeg::setup_decoders () AVCodecContext * FFmpeg::video_codec_context () const { - DCPOMATIC_ASSERT (_video_stream); + if (!_video_stream) { + return 0; + } + return _format_context->streams[_video_stream.get()]->codec; } @@ -269,25 +278,31 @@ FFmpeg::subtitle_period (AVSubtitle const & sub) string FFmpeg::subtitle_id (AVSubtitle const & sub) { - MD5Digester digester; + Digester digester; digester.add (sub.pts); for (unsigned int i = 0; i < sub.num_rects; ++i) { AVSubtitleRect* rect = sub.rects[i]; - digester.add (rect->x); - digester.add (rect->y); - digester.add (rect->w); - digester.add (rect->h); + if (rect->type == SUBTITLE_BITMAP) { + digester.add (rect->x); + digester.add (rect->y); + digester.add (rect->w); + digester.add (rect->h); #ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT - int const line = rect->pict.linesize[0]; - for (int j = 0; j < rect->h; ++j) { - digester.add (rect->pict.data[0] + j * line, line); - } + int const line = rect->pict.linesize[0]; + for (int j = 0; j < rect->h; ++j) { + digester.add (rect->pict.data[0] + j * line, line); + } #else - int const line = rect->linesize[0]; - for (int j = 0; j < rect->h; ++j) { - digester.add (rect->data[0] + j * line, line); - } + int const line = rect->linesize[0]; + for (int j = 0; j < rect->h; ++j) { + digester.add (rect->data[0] + j * line, line); + } #endif + } else if (rect->type == SUBTITLE_TEXT) { + digester.add (string (rect->text)); + } else if (rect->type == SUBTITLE_ASS) { + digester.add (string (rect->ass)); + } } return digester.get (); }