Fix audio analyis hang with duplicate stream IDs (#598).
authorCarl Hetherington <cth@carlh.net>
Thu, 11 Jun 2015 08:39:15 +0000 (09:39 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 11 Jun 2015 08:39:15 +0000 (09:39 +0100)
There was existing code to work around the case when FFmpeg files
have all-zero stream IDs.  Extend this to cope with duplicate
stream IDs, as these have been seen in the wild.

src/lib/ffmpeg.cc

index 741716b0400acc818c23d965b02eb97071d8278e..8764933e3e070522b247029e26aee80a148a4ab7 100644 (file)
@@ -132,18 +132,22 @@ FFmpeg::setup_general ()
                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;
-       }
 
-       if (i == _format_context->nb_streams) {
+       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 (duplicates) {
                /* Put in our own IDs */
                for (uint32_t i = 0; i < _format_context->nb_streams; ++i) {
                        _format_context->streams[i]->id = i;