summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-04-25 15:57:07 +0000
committerjstebbins <[email protected]>2011-04-25 15:57:07 +0000
commite06c1946ddf693572d8f3044daa423462b6bdadc (patch)
treefda10c68e279e9d1193f8339bf657c825a3a6bba
parentc9fd57320b601bafaec8178680d689d3e5b75f77 (diff)
Make order of audio tracks found in PS streams more predictable
Since PS streams don't have a directory of streams, we find them by scanning the PES headers for stream types. We were adding them in the order found which is pretty random. This sorts audios by substream id. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3958 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/common.c34
-rw-r--r--libhb/common.h1
-rw-r--r--libhb/stream.c11
3 files changed, 45 insertions, 1 deletions
diff --git a/libhb/common.c b/libhb/common.c
index 90bd23cb6..9c06d783b 100644
--- a/libhb/common.c
+++ b/libhb/common.c
@@ -748,6 +748,40 @@ void hb_list_add( hb_list_t * l, void * p )
}
/**********************************************************************
+ * hb_list_insert
+ **********************************************************************
+ * Adds an item at the specifiec position in the list, making it bigger
+ * if necessary.
+ * Can safely be called with a NULL pointer to add, it will be ignored.
+ *********************************************************************/
+void hb_list_insert( hb_list_t * l, int pos, void * p )
+{
+ if( !p )
+ {
+ return;
+ }
+
+ if( l->items_count == l->items_alloc )
+ {
+ /* We need a bigger boat */
+ l->items_alloc += HB_LIST_DEFAULT_SIZE;
+ l->items = realloc( l->items,
+ l->items_alloc * sizeof( void * ) );
+ }
+
+ if ( l->items_count != pos )
+ {
+ /* Shift all items after it sizeof( void * ) bytes earlier */
+ memmove( &l->items[pos+1], &l->items[pos],
+ ( l->items_count - pos ) * sizeof( void * ) );
+ }
+
+
+ l->items[pos] = p;
+ (l->items_count)++;
+}
+
+/**********************************************************************
* hb_list_rem
**********************************************************************
* Remove an item from the list. Bad things will happen if called
diff --git a/libhb/common.h b/libhb/common.h
index 4844bd689..295ef9241 100644
--- a/libhb/common.h
+++ b/libhb/common.h
@@ -86,6 +86,7 @@ typedef struct hb_lock_s hb_lock_t;
hb_list_t * hb_list_init();
int hb_list_count( hb_list_t * );
void hb_list_add( hb_list_t *, void * );
+void hb_list_insert( hb_list_t * l, int pos, void * p );
void hb_list_rem( hb_list_t *, void * );
void * hb_list_item( hb_list_t *, int );
void hb_list_close( hb_list_t ** );
diff --git a/libhb/stream.c b/libhb/stream.c
index fd213ecc3..77bdc3c8b 100644
--- a/libhb/stream.c
+++ b/libhb/stream.c
@@ -2033,7 +2033,16 @@ static void add_audio_to_title(hb_title_t *title, int id)
}
set_audio_description( audio, lang_for_code( 0 ) );
- hb_list_add( title->list_audio, audio );
+
+ // Sort by id when adding to the list
+ int i;
+ for ( i = 0; i < hb_list_count( title->list_audio ); i++ )
+ {
+ hb_audio_t *tmp = hb_list_item( title->list_audio, i );
+ if ( audio->id < tmp->id )
+ break;
+ }
+ hb_list_insert( title->list_audio, i, audio );
}
static void hb_ps_stream_find_audio_ids(hb_stream_t *stream, hb_title_t *title)