OSDN Git Service

disable asserts in libdvdnav except when configured with --debug=max
[handbrake-jp/handbrake-jp-git.git] / libhb / stream.c
index 09334a4..998aac4 100644 (file)
@@ -354,9 +354,16 @@ static int hb_stream_check_for_ts(const uint8_t *buf)
 
 static int hb_stream_check_for_ps(const uint8_t *buf)
 {
-    // program streams should start with a PACK then some other mpeg start
-    // code (usually a SYS but that might be missing if we only have a clip).
-    return check_ps_sync(buf) && check_ps_sc(buf);
+    // program streams should start with a PACK then some other mpeg start 
+    // code (usually a SYS but that might be missing if we only have a clip). 
+    int offset = 0;
+
+    for ( offset = 0; offset < 8*1024-24; ++offset )
+    {
+        if ( check_ps_sync( &buf[offset] ) && check_ps_sc( &buf[offset] ) )
+            return 1;
+    }
+    return 0;
 }
 
 static int hb_stream_check_for_dvd_ps(const uint8_t *buf)
@@ -370,6 +377,7 @@ static int hb_stream_check_for_dvd_ps(const uint8_t *buf)
 static int hb_stream_get_type(hb_stream_t *stream)
 {
     uint8_t buf[2048*4];
+    int i = 64;
 
     if ( fread(buf, 1, sizeof(buf), stream->file_handle) == sizeof(buf) )
     {
@@ -395,12 +403,17 @@ static int hb_stream_get_type(hb_stream_t *stream)
             stream->hb_stream_type = dvd_program;
             return 1;
         }
-        if ( hb_stream_check_for_ps(buf) != 0 )
+        do
         {
-            hb_log("file is MPEG Program Stream");
-            stream->hb_stream_type = program;
-            return 1;
-        }
+            if ( hb_stream_check_for_ps(buf) != 0 )
+            {
+                hb_log("file is MPEG Program Stream");
+                stream->hb_stream_type = program;
+                return 1;
+            }
+            // Seek back to handle start codes that run over end of last buffer
+            fseek( stream->file_handle, -28, SEEK_CUR );
+        } while ( --i && fread(buf, 1, sizeof(buf), stream->file_handle) == sizeof(buf) );
     }
     return 0;
 }
@@ -1220,7 +1233,7 @@ int hb_stream_read( hb_stream_t * src_stream, hb_buffer_t * b )
                 }
                 *cp++ = len >> 8;
                 *cp++ = len & 0xff;
-                fread_unlocked( cp, 1, len, src_stream->file_handle );
+                fread( cp, 1, len, src_stream->file_handle );
                 cp += len;
             }
         }
@@ -1274,6 +1287,17 @@ int hb_stream_seek_chapter( hb_stream_t * stream, int chapter_num )
     {
         av_seek_frame( stream->ffmpeg_ic, -1, pos, 0);
     }
+    else
+    {
+        // ffmpeg has a bug that causes the first PTS after
+        // av_find_stream_info() is called to be incorrect.
+        // av_find_stream_info is called whenever opening a file
+        // with ffmpeg.  av_seek_frame clears the condition
+        // that causes the problem. since hb_stream_seek_chapter
+        // is called before we start reading, make sure
+        // we do a seek here.
+        av_seek_frame( stream->ffmpeg_ic, -1, 0LL, AVSEEK_FLAG_BACKWARD );
+    }
     return 1;
 }