From 075f395197c3f68ecd9fd36be6a0112ecb6c945c Mon Sep 17 00:00:00 2001
From: jstebbins <jstebbins.hb@gmail.com>
Date: Wed, 14 May 2014 09:32:09 +0000
Subject: mux: fix problems created by >32 track limit patch

First problem was pre-existing, but hidden.  Interleaving was severely
broken because we relied on buf->s.stop to determin interleave points.
stop is not guaranteed to be set.

Other problems with the new bit vector code caused failure to complete
muxing.


git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6187 b64f7644-9d1e-0410-96f1-a4d463321fa5
---
 libhb/muxcommon.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

(limited to 'libhb')

diff --git a/libhb/muxcommon.c b/libhb/muxcommon.c
index 3cc799182..f06651734 100644
--- a/libhb/muxcommon.c
+++ b/libhb/muxcommon.c
@@ -242,8 +242,6 @@ static void add_mux_track( hb_mux_t *mux, hb_mux_data_t *mux_data,
 
     int t = mux->ntracks++;
     mux->track[t] = track;
-    hb_bitvec_add_bits(mux->allEof, 1);
-    hb_bitvec_add_bits(mux->allRdy, 1);
     hb_bitvec_set(mux->allEof, t);
     if (is_continuous)
         hb_bitvec_set(mux->allRdy, t);
@@ -329,7 +327,7 @@ static void MoveToInternalFifos( int tk, hb_mux_t *mux, hb_buffer_t * buf )
     // (b) we can control how data from multiple tracks is
     // interleaved in the output file.
     mf_push( mux, tk, buf );
-    if ( buf->s.stop >= mux->pts )
+    if ( buf->s.start >= mux->pts )
     {
         // buffer is past our next interleave point so
         // note that this track is ready to be output.
@@ -386,7 +384,8 @@ static int muxWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     }
     *buf_in = NULL;
 
-    if (!hb_bitvec_and_cmp(mux->rdy, mux->allRdy, mux->allRdy))
+    if (!hb_bitvec_and_cmp(mux->rdy, mux->allRdy, mux->allRdy) &&
+        !hb_bitvec_and_cmp(mux->eof, mux->allEof, mux->allEof))
     {
         hb_unlock( mux->mutex );
         return HB_WORK_OK;
@@ -419,7 +418,7 @@ static int muxWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
             // Otherwise clear rdy.
             if (hb_bitvec_bit(mux->eof, i) &&
                 (track->mf.out == track->mf.in ||
-                 track->mf.fifo[(track->mf.in-1) & (track->mf.flen-1)]->s.stop
+                 track->mf.fifo[(track->mf.in-1) & (track->mf.flen-1)]->s.start
                      < mux->pts + mux->interleave))
             {
                 hb_bitvec_clr(mux->rdy, i);
@@ -593,8 +592,14 @@ hb_work_object_t * hb_muxer_init( hb_job_t * job )
     hb_work_object_t  * w;
     hb_work_object_t  * muxer;
 
-    mux->allRdy = hb_bitvec_new(0);
-    mux->allEof = hb_bitvec_new(0);
+    // The bit vectors must be allocated before hb_thread_init for the
+    // audio and subtitle muxer jobs below.
+    int bit_vec_size = 1 + hb_list_count(job->list_audio) +
+                           hb_list_count(job->list_subtitle);
+    mux->rdy = hb_bitvec_new(bit_vec_size);
+    mux->eof = hb_bitvec_new(bit_vec_size);
+    mux->allRdy = hb_bitvec_new(bit_vec_size);
+    mux->allEof = hb_bitvec_new(bit_vec_size);
 
     mux->mutex = hb_lock_init();
 
@@ -650,13 +655,6 @@ hb_work_object_t * hb_muxer_init( hb_job_t * job )
     add_mux_track( mux, job->mux_data, 1 );
     muxer->done = &muxer->private_data->mux->done;
 
-    // The bit vectors must be allocated before hb_thread_init for the
-    // audio and subtitle muxer jobs below.
-    int bit_vec_size = mux->ntracks + hb_list_count(job->list_audio) +
-                                      hb_list_count(job->list_subtitle);
-    mux->rdy = hb_bitvec_new(bit_vec_size);
-    mux->eof = hb_bitvec_new(bit_vec_size);
-
     for( i = 0; i < hb_list_count( job->list_audio ); i++ )
     {
         hb_audio_t  *audio = hb_list_item( job->list_audio, i );
-- 
cgit v1.2.3