[vlc-devel] [PATCH] mp4 mux: fix #4691
Rafaël Carré
funman at videolan.org
Sun Nov 13 03:41:13 CET 2011
always write esds descriptor length using 4 bytes,
ipod shuffle doesn't support anything else.
Fix from FFmpeg
Also simplify bo_* functions (bo_add_descr is from FFmpeg too)
---
modules/mux/mp4.c | 78 +++++-----------------------------------------------
1 files changed, 8 insertions(+), 70 deletions(-)
diff --git a/modules/mux/mp4.c b/modules/mux/mp4.c
index 0df3455..728a4e2 100644
--- a/modules/mux/mp4.c
+++ b/modules/mux/mp4.c
@@ -676,18 +676,6 @@ static block_t *ConvertAVC1( block_t *p_block )
return p_block;
}
-static int GetDescrLength( int i_size )
-{
- if( i_size < 0x00000080 )
- return 2 + i_size;
- else if( i_size < 0x00004000 )
- return 3 + i_size;
- else if( i_size < 0x00200000 )
- return 4 + i_size;
- else
- return 5 + i_size;
-}
-
static bo_t *GetESDS( mp4_stream_t *p_stream )
{
bo_t *esds;
@@ -718,22 +706,12 @@ static bo_t *GetESDS( mp4_stream_t *p_stream )
i_bitrate_max = 0x7fffffff;
/* */
- if( p_stream->fmt.i_extra > 0 )
- {
- i_decoder_specific_info_size =
- GetDescrLength( p_stream->fmt.i_extra );
- }
- else
- {
- i_decoder_specific_info_size = 0;
- }
+ i_decoder_specific_info_size = ( p_stream->fmt.i_extra > 0 ) ? 5 + p_stream->fmt.i_extra : 0;
esds = box_full_new( "esds", 0, 0 );
/* ES_Descr */
- bo_add_descr( esds, 0x03, 3 +
- GetDescrLength( 13 + i_decoder_specific_info_size ) +
- GetDescrLength( 1 ) );
+ bo_add_descr( esds, 0x03, 3 + 5 + 13 + i_decoder_specific_info_size + 5 + 1 );
bo_add_16be( esds, p_stream->i_track_id );
bo_add_8 ( esds, 0x1f ); // flags=0|streamPriority=0x1f
@@ -1989,62 +1967,22 @@ static void bo_add_fourcc( bo_t *p_bo, const char *fcc )
static void bo_add_mem( bo_t *p_bo, int i_size, uint8_t *p_mem )
{
- int i;
-
- for( i = 0; i < i_size; i++ )
- {
+ for( int i = 0; i < i_size; i++ )
bo_add_8( p_bo, p_mem[i] );
- }
}
-static void bo_add_descr( bo_t *p_bo, uint8_t tag, uint32_t i_size )
+static void bo_add_descr( bo_t *p_bo, uint8_t tag, uint32_t size )
{
- uint32_t i_length;
- uint8_t vals[4];
-
- i_length = i_size;
- vals[3] = (unsigned char)(i_length & 0x7f);
- i_length >>= 7;
- vals[2] = (unsigned char)((i_length & 0x7f) | 0x80);
- i_length >>= 7;
- vals[1] = (unsigned char)((i_length & 0x7f) | 0x80);
- i_length >>= 7;
- vals[0] = (unsigned char)((i_length & 0x7f) | 0x80);
-
bo_add_8( p_bo, tag );
-
- if( i_size < 0x00000080 )
- {
- bo_add_8( p_bo, vals[3] );
- }
- else if( i_size < 0x00004000 )
- {
- bo_add_8( p_bo, vals[2] );
- bo_add_8( p_bo, vals[3] );
- }
- else if( i_size < 0x00200000 )
- {
- bo_add_8( p_bo, vals[1] );
- bo_add_8( p_bo, vals[2] );
- bo_add_8( p_bo, vals[3] );
- }
- else if( i_size < 0x10000000 )
- {
- bo_add_8( p_bo, vals[0] );
- bo_add_8( p_bo, vals[1] );
- bo_add_8( p_bo, vals[2] );
- bo_add_8( p_bo, vals[3] );
- }
+ for(int i = 3; i>0; i--)
+ bo_add_8( p_bo, (size>>(7*i)) | 0x80 );
+ bo_add_8(p_bo, size & 0x7F);
}
static void bo_add_bo( bo_t *p_bo, bo_t *p_bo2 )
{
- int i;
-
- for( i = 0; i < p_bo2->i_buffer; i++ )
- {
+ for( int i = 0; i < p_bo2->i_buffer; i++ )
bo_add_8( p_bo, p_bo2->p_buffer[i] );
- }
}
static bo_t * box_new( const char *fcc )
--
1.7.5.4
More information about the vlc-devel
mailing list