OSDN Git Service

CLI: Add support for naming audio tracks to the HandBrakeCLI, thanks to LePetomane...
[handbrake-jp/handbrake-jp-git.git] / libhb / reader.c
index 75fd1b4..c93c2a0 100644 (file)
@@ -8,8 +8,8 @@
 
 typedef struct
 {
-    int64_t last;   // last timestamp seen on this stream
     double average; // average time between packets
+    int64_t last;   // last timestamp seen on this stream
     int id;         // stream id
 } stream_timing_t;
 
@@ -138,7 +138,7 @@ static void update_ipt( hb_reader_t *r, const hb_buffer_t *buf )
 {
     stream_timing_t *st = id_to_st( r, buf );
     double dt = buf->renderOffset - st->last;
-    st->average += ( dt - st->average ) * (1./16.);
+    st->average += ( dt - st->average ) * (1./32.);
     st->last = buf->renderOffset;
 }
 
@@ -209,6 +209,7 @@ static void ReaderFunc( void * _r )
 
     list  = hb_list_init();
     hb_buffer_t *ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE );
+    r->demux.flaky_clock = r->title->flaky_clock;
 
     while( !*r->die && !r->job->done )
     {
@@ -287,6 +288,8 @@ static void ReaderFunc( void * _r )
                 if ( buf->id == r->title->video_id && buf->start != -1 &&
                      buf->renderOffset != -1 )
                 {
+                    // force a new scr offset computation
+                    r->scr_changes = r->demux.scr_changes - 1;
                     r->saw_video = 1;
                     hb_log( "reader: first SCR %lld", r->demux.last_scr );
                 }
@@ -314,9 +317,27 @@ static void ReaderFunc( void * _r )
                         // change. Compute a new scr offset that would make this
                         // packet follow the last of this stream with the correct
                         // average spacing.
-                        if ( find_st( r, buf ) )
+                        stream_timing_t *st = find_st( r, buf );
+
+                        if ( st )
                         {
-                            new_scr_offset( r, buf );
+                            // if this isn't the video stream or we don't
+                            // have audio yet then generate a new scr
+                            if ( st != r->stream_timing ||
+                                 r->stream_timing[1].id == -1 )
+                            {
+                                new_scr_offset( r, buf );
+                            }
+                            else
+                            {
+                                // defer the scr change until we get some
+                                // audio since audio has a timestamp per
+                                // frame but video doesn't. Clear the timestamps
+                                // so the decoder will regenerate them from
+                                // the frame durations.
+                                buf->start = -1;
+                                buf->renderOffset = -1;
+                            }
                         }
                         else
                         {
@@ -381,6 +402,10 @@ static void ReaderFunc( void * _r )
     }
 
     hb_log( "reader: done. %d scr changes", r->demux.scr_changes );
+    if ( r->demux.dts_drops )
+    {
+        hb_log( "reader: %d drops because DTS out of range", r->demux.dts_drops );
+    }
 
     free( r );
     _r = NULL;