Merge.
[dcpomatic.git] / src / lib / ffmpeg.cc
index e85a2c44e4912200bf5ebf2013a454b44ddc1e22..b7ae04b069017d8404325939fdbbad8ba4108f26 100644 (file)
@@ -62,7 +62,7 @@ FFmpeg::~FFmpeg ()
                }
        }
 
-       avcodec_free_frame (&_frame);
+       av_frame_free (&_frame);
        
        avformat_close_input (&_format_context);
 }
@@ -118,7 +118,25 @@ FFmpeg::setup_general ()
                throw DecodeError (N_("could not find video stream"));
        }
 
-       _frame = avcodec_alloc_frame ();
+       /* Hack: if the AVStreams have zero IDs, put some in.  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.
+       */
+          
+       uint32_t i = 0;
+       while (i < _format_context->nb_streams && _format_context->streams[i]->id == 0) {
+               ++i;
+       }
+
+       if (i == _format_context->nb_streams) {
+               /* Put in our own IDs */
+               for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
+                       _format_context->streams[i]->id = i;
+               }
+       }
+
+       _frame = av_frame_alloc ();
        if (_frame == 0) {
                throw DecodeError (N_("could not allocate frame"));
        }
@@ -128,7 +146,8 @@ void
 FFmpeg::setup_video ()
 {
        boost::mutex::scoped_lock lm (_mutex);
-       
+
+       assert (_video_stream >= 0);
        AVCodecContext* context = _format_context->streams[_video_stream]->codec;
        AVCodec* codec = avcodec_find_decoder (context->codec_id);