All pastes #716708 Raw Edit

HB Subtitles

public diff v1 · immutable
#716708 ·published 2007-09-27 02:21 UTC
rendered paste body
Index: libhb/reader.c===================================================================--- libhb/reader.c	(revision 991)+++ libhb/reader.c	(working copy)@@ -15,6 +15,8 @@     hb_dvd_t     * dvd;     hb_buffer_t  * ps;     hb_stream_t  * stream;+    +    uint           sequence;  } hb_reader_t; @@ -38,6 +40,7 @@     r->job   = job;     r->title = job->title;     r->die   = job->die;+    r->sequence = 0;          return hb_thread_init( "reader", ReaderFunc, r,                            HB_NORMAL_PRIORITY );@@ -153,6 +156,7 @@                 {                     hb_snooze( 50 );                 }+                buf->sequence = r->sequence++;                 hb_fifo_push( fifo, buf );             }             elseIndex: libhb/decsub.c===================================================================--- libhb/decsub.c	(revision 991)+++ libhb/decsub.c	(working copy)@@ -95,6 +95,11 @@         /* We got a complete subtitle, decode it */         *buf_out = Decode( w ); +        if( *buf_out )+        {+            (*buf_out)->sequence = in->sequence;+        }+         /* Wait for the next one */         pv->size_sub = 0;         pv->size_got = 0;Index: libhb/decmpeg2.c===================================================================--- libhb/decmpeg2.c	(revision 991)+++ libhb/decmpeg2.c	(working copy)@@ -151,6 +151,8 @@                 buf  = hb_buffer_init( m->width * m->height * 3 / 2 );                 data = buf->data; +                buf->sequence = buf_es->sequence;+                 // Was a good break point found?                 if( chap_break )                 {Index: libhb/sync.c===================================================================--- libhb/sync.c	(revision 991)+++ libhb/sync.c	(working copy)@@ -301,12 +301,29 @@ 	    hb_log( "Sync: Video PTS discontinuity (current buffer start=%lld, next buffer start=%lld), trash Video",                     cur->start, next->start );             -            /* Trash all subtitles */+            /*+             * Do we need to trash the subtitle, is it from the next->start period+             * or is it from our old position. If the latter then trash it.+             */             if( pv->subtitle )             {-                while( ( sub = hb_fifo_get( pv->subtitle->fifo_raw ) ) )+                while( ( sub = hb_fifo_see( pv->subtitle->fifo_raw ) ) )                 {-                    hb_buffer_close( &sub );+                    if( ( sub->start > ( cur->start - PTS_DISCONTINUITY_TOLERANCE ) ) &&+                        ( sub->start < ( cur->start + PTS_DISCONTINUITY_TOLERANCE ) ) )+                    {+                        /*+                         * The subtitle is from our current time region which we are+                         * jumping from. So trash it as we are about to jump backwards+                         * or forwards and don't want it blocking the subtitle fifo.+                         */+                        hb_log("Trashing subtitle 0x%x due to PTS discontinuity", sub);+                        sub = hb_fifo_get( pv->subtitle->fifo_raw );+                        hb_buffer_close( &sub );+                    } else {+                        hb_log("NOT trashing subtitle 0x%x", sub);+                        break;+                    }                 }             } @@ -336,20 +353,115 @@                 if( sub2 && sub->stop > sub2->start )                     sub->stop = sub2->start; -                if( sub->stop > cur->start )+                hb_log("0x%x: video seq: %lld  subtitle sequence: %lld", +                       sub, cur->sequence, sub->sequence);++                if( sub->sequence > cur->sequence )+                {+                    /*+                     * The video is behind where we are, so wait until it catches+                     * up to the same reader point on the DVD. Then our PTS should+                     * be in the same region as the video.+                     */+                    hb_log("0x%x: Subtitle not at read point yet, defer", sub);+                    sub = NULL;                     break;+                } +                if( sub->stop > cur->start ) {+                    /*+                     * The stop time is in the future+                     */+                    hb_log("0x%x: Video is at %lld substart=%lld substop=%lld, applying subtitle",+                           sub, cur->start, sub->start, sub->stop);+                    break;+                } +                else +                {+                    /*+                     * The stop time is in the past. But is it due to it having been+                     * played already, or has the PTS been reset to 0?+                     */+                    if( ( cur->start - sub->stop ) > PTS_DISCONTINUITY_TOLERANCE ) {+                        /*+                         * There is a lot of time between our current video and where+                         * this subtitle is ending, assume that we are about to reset+                         * the PTS and do not throw away this subtitle.+                         */+                        hb_log("0x%x: Video is at %lld substart=%lld substop=%lld, Sub in the past, PTS reset?",+                               sub, cur->start, sub->start, sub->stop);+                        break;+                    }+                }++                hb_log("0x%x: *** Video is at %lld substart=%lld substop=%lld, trashing subtitle",+                       sub, cur->start, sub->start, sub->stop);+                 /* The subtitle is older than this picture, trash it */                 sub = hb_fifo_get( pv->subtitle->fifo_raw );                 hb_buffer_close( &sub );             } -            /* If we have subtitles left in the fifo, check if we should-               apply the first one to the current frame or if we should-               keep it for later */-            if( sub && sub->start > cur->start )+            if( sub )             {-                sub = NULL;+                if( sub->stop > sub->start)+                {+                    /*+                     * Normal subtitle which ends after it starts, check to +                     * see that the current video is between the start and end.+                     */+                    if( cur->start > sub->start &&+                        cur->start < sub->stop )+                    {+                        /*+                         * We should be playing this, so leave the subtitle in place.+                         */+                    } +                    else+                    {+                        /*+                         * Defer until the play point is within the subtitle+                         */+                        hb_log("0x%x: Normal subtitle too early, wait", sub);+                        sub = NULL;+                    }+                }+                else+                {+                    /*+                     * The end of the subtitle is less than the start, this is a+                     * sign of a PTS discontinuity.+                     */+                    if( sub->start > cur->start )+                    {+                        /*+                         * we haven't reached the start time yet, or we have jumped+                         * backwards after having already started this subtitle.+                         */+                        if( cur->start < sub->stop )+                        {+                            /*+                             * We have jumped backwards and so should continue displaying +                             * this subtitle.+                             */+                            hb_log("0x%x: Discontinuity end play this subtitle", sub);+                        } +                        else +                        {+                            /*+                             * Defer until the play point is within the subtitle+                             */+                            hb_log("0x%x: Discontinuity subtitle too early, wait", sub);+                            sub = NULL;+                        }+                    } else {+                        /*+                         * Play this subtitle as the start is greater than our+                         * video point.+                         */+                        hb_log("0x%x: Discontinuity start play this subtitle", sub);+                    }+                }             }         } @@ -510,10 +622,13 @@ 		hb_log("Sync: Audio is way out of sync, attempt to reconverge from current video PTS"); 		 		/*-		  * It wasn't from the old place, so we must be from the new, but just too far out. So attempt to-		  * reconverge by resetting the point we want to be to where we are currently wanting to be.+		  * It wasn't from the old place, so we must be from+		  * the new, but just too far out. So attempt to+		  * reconverge by resetting the point we want to be to+		  * where we are currently wanting to be. 		  */ 		pts_expected = pv->pts_offset + sync->count_frames * 90000 / rate;+                start = pts_expected - pv->pts_offset; 	    } else {                  /* Use the older offset */                 start = pts_expected - pv->pts_offset_old;Index: libhb/internal.h===================================================================--- libhb/internal.h	(revision 991)+++ libhb/internal.h	(working copy)@@ -35,6 +35,8 @@     uint8_t *     data;     int           cur; +    int64_t       sequence;+     int           id;     int64_t       start;     int64_t       stop;Index: libhb/common.c===================================================================--- libhb/common.c	(revision 991)+++ libhb/common.c	(working copy)@@ -522,7 +522,7 @@     strcat( string, "\n" );      /* Print it */-    fprintf( stderr, "%s", string );+    fprintf( stdout, "%s", string ); }  /**********************************************************************