All pastes #1087364 Raw Edit

someone

public text v1 · immutable
#1087364 ·published 2008-07-30 17:34 UTC
rendered paste body
Index: libhb/sync.c===================================================================--- libhb/sync.c	(revision 1594)+++ libhb/sync.c	(working copy)@@ -39,7 +39,7 @@ struct hb_work_private_s {     hb_job_t * job;-    int        done;+    int        busy;      /* Video */     hb_subtitle_t * subtitle;@@ -69,7 +69,7 @@  * Local prototypes  **********************************************************************/ static void InitAudio( hb_work_object_t * w, int i );-static int  SyncVideo( hb_work_object_t * w );+static void SyncVideo( hb_work_object_t * w ); static void SyncAudio( hb_work_object_t * w, int i ); static void InsertSilence( hb_work_object_t * w, int i, int64_t d ); static void UpdateState( hb_work_object_t * w );@@ -92,7 +92,6 @@      pv->job            = job;     pv->pts_offset     = INT64_MIN;-    pv->count_frames   = 0;      /* Calculate how many video frames we are expecting */     duration = 0;@@ -106,18 +105,18 @@     pv->count_frames_max = duration * job->vrate / job->vrate_base / 90000;      hb_log( "sync: expecting %d video frames", pv->count_frames_max );+    pv->busy |= 1;      /* Initialize libsamplerate for every audio track we have */     for( i = 0; i < hb_list_count( title->list_audio ); i++ )     {+        pv->busy |= ( 1 << (i + 1) );         InitAudio( w, i );     }      /* Get subtitle info, if any */     pv->subtitle = hb_list_item( title->list_subtitle, 0 ); -    pv->video_sequence = 0;-     return 0; } @@ -180,17 +179,20 @@     hb_work_private_t * pv = w->private_data;     int i; +    if ( pv->busy & 1 )+        SyncVideo( w );+     /* If we ever got a video frame, handle audio now */     if( pv->pts_offset != INT64_MIN )     {         for( i = 0; i < hb_list_count( pv->job->title->list_audio ); i++ )         {-            SyncAudio( w, i );+            if ( pv->busy & ( 1 << (i + 1) ) )+                SyncAudio( w, i );         }     } -    /* Handle video */-    return SyncVideo( w );+    return ( pv->busy? HB_WORK_OK : HB_WORK_DONE ); }  hb_work_object_t hb_sync =@@ -263,29 +265,24 @@  ***********************************************************************  *  **********************************************************************/-static int SyncVideo( hb_work_object_t * w )+static void SyncVideo( hb_work_object_t * w ) {     hb_work_private_t * pv = w->private_data;     hb_buffer_t * cur, * next, * sub = NULL;     hb_job_t * job = pv->job; -    if( pv->done )-    {-        return HB_WORK_DONE;-    }-     if( !pv->cur && !( pv->cur = hb_fifo_get( job->fifo_raw ) ) )     {         /* We haven't even got a frame yet */-        return HB_WORK_OK;+        return;     }     cur = pv->cur;     if( cur->size == 0 )     {         /* we got an end-of-stream. Feed it downstream & signal that we're done. */         hb_fifo_push( job->fifo_sync, hb_buffer_init( 0 ) );-        pv->done = 1;-        return HB_WORK_DONE;+        pv->busy &=~ 1;+        return;     }      /* At this point we have a frame to process. Let's check@@ -304,8 +301,8 @@              * video (we don't know its duration). On DVDs the final frame              * is often strange and dropping it seems to be a good idea. */             hb_fifo_push( job->fifo_sync, hb_buffer_init( 0 ) );-            pv->done = 1;-            return HB_WORK_DONE;+            pv->busy &=~ 1;+            return;         }         if( pv->pts_offset == INT64_MIN )         {@@ -618,15 +615,14 @@         {             hb_log( "sync: got too many frames (%d), exiting early",                     pv->count_frames );-            pv->done = 1;              // Drop an empty buffer into our output to ensure that things             // get flushed all the way out.             hb_fifo_push( job->fifo_sync, hb_buffer_init( 0 ) );-            return HB_WORK_DONE;+            pv->busy &=~ 1;+            return;         }     }-    return HB_WORK_OK; }  static void OutputAudioFrame( hb_job_t *job, hb_audio_t *audio, hb_buffer_t *buf,@@ -723,6 +719,7 @@         {             buf = hb_fifo_get( audio->priv.fifo_raw );             hb_fifo_push( fifo, buf );+            pv->busy &=~ (1 << (i + 1) );             return;         }         if ( (int64_t)( buf->start - sync->next_pts ) < 0 )