[vlc-commits] flac packetizer: use the largest possible frame size

Rafaël Carré git at videolan.org
Mon Oct 14 16:49:56 CEST 2013


vlc | branch: master | Rafaël Carré <funman at videolan.org> | Mon Oct 14 16:47:21 2013 +0200| [03e0644c82bf1dea96f8ade8829c2e1f360bd1ee] | committer: Rafaël Carré

flac packetizer: use the largest possible frame size

Fixes #6476
Fixes #9442

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=03e0644c82bf1dea96f8ade8829c2e1f360bd1ee
---

 modules/packetizer/flac.c |   25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/modules/packetizer/flac.c b/modules/packetizer/flac.c
index 090b601..16d3c46 100644
--- a/modules/packetizer/flac.c
+++ b/modules/packetizer/flac.c
@@ -248,6 +248,7 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
 
     while( 1 )
     {
+        int previous_size;
         switch( p_sys->i_state )
         {
         case STATE_NOSYNC:
@@ -315,6 +316,8 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
             /* TODO: If pp_block == NULL, flush the buffer without checking the
              * next sync word */
 
+            previous_size = 0; /* Try to return the biggest frame */
+
             /* Check if next expected frame contains the sync word */
             while( block_PeekOffsetBytes( &p_sys->bytestream,
                                           p_sys->i_frame_size, p_header,
@@ -330,13 +333,27 @@ static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
                                   &p_sys->i_rate,
                                   &p_sys->i_bits_per_sample );
 
-                    if( i_frame_length )
-                    {
-                        p_sys->i_state = STATE_SEND_DATA;
-                        break;
+                    if( i_frame_length ) {
+                        if( !p_sys->b_stream_info || p_sys->stream_info.max_framesize <= 0 ) {
+                            /* Stop immediately if we don't know the maximum framesize */
+                            p_sys->i_state = STATE_SEND_DATA;
+                            break;
+                        }
+                        previous_size = p_sys->i_frame_size;
                     }
                 }
                 p_sys->i_frame_size++;
+
+                if( p_sys->b_stream_info && p_sys->stream_info.max_framesize > 0 &&
+                    p_sys->i_frame_size > p_sys->stream_info.max_framesize )
+                    break;
+            }
+
+            if (previous_size)
+            {
+                /* Use the largest frame size */
+                p_sys->i_frame_size = previous_size;
+                p_sys->i_state = STATE_SEND_DATA;
             }
 
             if( p_sys->i_state != STATE_SEND_DATA )



More information about the vlc-commits mailing list