X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg.cc;h=f5d114e8f946c59cecbcc8e4efb72c31d1eccc5e;hb=e60bb3e51bd1508b149e6b8f6608f09b5196ae26;hp=741716b0400acc818c23d965b02eb97071d8278e;hpb=0a93237cb5e4642d3b698ff9b7d0cfae5401478c;p=dcpomatic.git diff --git a/src/lib/ffmpeg.cc b/src/lib/ffmpeg.cc index 741716b04..f5d114e8f 100644 --- a/src/lib/ffmpeg.cc +++ b/src/lib/ffmpeg.cc @@ -85,14 +85,14 @@ FFmpeg::setup_general () _avio_context = avio_alloc_context (_avio_buffer, _avio_buffer_size, 0, this, avio_read_wrapper, 0, avio_seek_wrapper); _format_context = avformat_alloc_context (); _format_context->pb = _avio_context; - + AVDictionary* options = 0; /* These durations are in microseconds, and represent how far into the content file we will look for streams. */ 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 ()); } @@ -126,24 +126,28 @@ FFmpeg::setup_general () */ if (_video_stream == -1 && video_stream_undefined_frame_rate != -1) { _video_stream = video_stream_undefined_frame_rate; - } - + } + if (_video_stream < 0) { throw DecodeError (N_("could not find video stream")); } - /* Hack: if the AVStreams have zero IDs, put some in. We - use the IDs so that we can cope with VOBs, in which streams + /* 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 - VOBs. However, some files have all-zero IDs, hence this hack. + VOBs. However, some files have duplicate IDs, hence this hack. */ - - uint32_t i = 0; - while (i < _format_context->nb_streams && _format_context->streams[i]->id == 0) { - ++i; + + bool duplicates = false; + for (uint32_t i = 0; i < _format_context->nb_streams; ++i) { + for (uint32_t j = i + 1; j < _format_context->nb_streams; ++j) { + if (_format_context->streams[i]->id == _format_context->streams[j]->id) { + duplicates = true; + } + } } - if (i == _format_context->nb_streams) { + if (duplicates) { /* Put in our own IDs */ for (uint32_t i = 0; i < _format_context->nb_streams; ++i) { _format_context->streams[i]->id = i; @@ -163,7 +167,7 @@ FFmpeg::setup_decoders () for (uint32_t i = 0; i < _format_context->nb_streams; ++i) { AVCodecContext* context = _format_context->streams[i]->codec; - + AVCodec* codec = avcodec_find_decoder (context->codec_id); if (codec) { @@ -173,7 +177,7 @@ FFmpeg::setup_decoders () */ AVDictionary* options = 0; av_dict_set (&options, "disable_footer", "1", 0); - + if (avcodec_open2 (context, codec, &options) < 0) { throw DecodeError (N_("could not open decoder")); } @@ -195,7 +199,7 @@ FFmpeg::subtitle_codec_context () const if (!_ffmpeg_content->subtitle_stream ()) { return 0; } - + return _ffmpeg_content->subtitle_stream()->stream(_format_context)->codec; } @@ -211,6 +215,6 @@ FFmpeg::avio_seek (int64_t const pos, int whence) if (whence == AVSEEK_SIZE) { return _file_group.length (); } - + return _file_group.seek (pos, whence); }