]> granicus.if.org Git - handbrake/commitdiff
Filter timestamps to prevent missing/incorrect Transport Stream PCRs messing up A...
authorvan <vanj.hb@gmail.com>
Wed, 17 Sep 2008 17:06:38 +0000 (17:06 +0000)
committervan <vanj.hb@gmail.com>
Wed, 17 Sep 2008 17:06:38 +0000 (17:06 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@1712 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/demuxmpeg.c

index 51292eb43681de5e1134759de590079b9824906c..d92798a403548c0522f04c13b11970f5c5d34509 100644 (file)
@@ -137,6 +137,25 @@ int hb_demux_ps( hb_buffer_t * buf_ps, hb_list_t * list_es, hb_psdemux_t* state
             {
                 dts = pts;
             }
+            if ( state )
+            {
+                // Program streams have an SCR in every PACK header so they
+                // can't lose their clock reference. But the PCR in Transport
+                // streams is typically on <.1% of the packets. If a PCR
+                // packet gets lost and it marks a clock discontinuity then
+                // the data following it will be referenced to the wrong
+                // clock & introduce huge gaps or throw our A/V sync off.
+                // We try to protect against that here by sanity checking
+                // timestamps against the current reference clock and discarding
+                // packets where the DTS is "too far" from its clock.
+                int64_t fdelta = dts - state->last_scr;
+                if ( fdelta < -5000 * 90 || fdelta > 5000 * 90 )
+                {
+                    // packet too far behind or ahead of its clock reference
+                    pos = pes_packet_end;
+                    continue;
+                }
+            }
         }
 
         pos = pes_header_end;