]> git.sesse.net Git - vlc/blobdiff - modules/codec/flac.c
Correctly reset date after a discontinuity in audio decoder.
[vlc] / modules / codec / flac.c
index 65e798e8d67003c3241dc113cee157426dc541be..6ebd53cb461ef135c1ae6f6c8a3fd32e6951621a 100644 (file)
@@ -161,6 +161,8 @@ static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
 
 static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
                           int i_nb_channels, int i_samples );
+static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
+                          int i_nb_channels, int i_samples );
 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
                           int i_nb_channels, int i_samples );
 
@@ -174,29 +176,29 @@ static uint8_t flac_crc8( const uint8_t *data, unsigned len );
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
-vlc_module_begin();
+vlc_module_begin ()
 
-    set_category( CAT_INPUT );
-    set_subcategory( SUBCAT_INPUT_ACODEC );
-    add_shortcut( "flac" );
+    set_category( CAT_INPUT )
+    set_subcategory( SUBCAT_INPUT_ACODEC )
+    add_shortcut( "flac" )
 
 #ifdef USE_LIBFLAC
-    set_description( N_("Flac audio decoder") );
-    set_capability( "decoder", 100 );
-    set_callbacks( OpenDecoder, CloseDecoder );
+    set_description( N_("Flac audio decoder") )
+    set_capability( "decoder", 100 )
+    set_callbacks( OpenDecoder, CloseDecoder )
 
-    add_submodule();
-    set_description( N_("Flac audio encoder") );
-    set_capability( "encoder", 100 );
-    set_callbacks( OpenEncoder, CloseEncoder );
+    add_submodule ()
+    set_description( N_("Flac audio encoder") )
+    set_capability( "encoder", 100 )
+    set_callbacks( OpenEncoder, CloseEncoder )
 
-    add_submodule();
+    add_submodule ()
 #endif
-    set_description( N_("Flac audio packetizer") );
-    set_capability( "packetizer", 100 );
-    set_callbacks( OpenPacketizer, CloseDecoder );
+    set_description( N_("Flac audio packetizer") )
+    set_capability( "packetizer", 100 )
+    set_callbacks( OpenPacketizer, CloseDecoder )
 
-vlc_module_end();
+vlc_module_end ()
 
 /*****************************************************************************
  * OpenDecoder: probe the decoder and return score
@@ -386,7 +388,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
             p_sys->i_state = STATE_NOSYNC;
             block_BytestreamFlush( &p_sys->bytestream );
         }
-//        aout_DateSet( &p_sys->end_date, 0 );
+        aout_DateSet( &p_sys->end_date, 0 );
         block_Release( *pp_block );
         return NULL;
     }
@@ -619,7 +621,7 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
     decoder_sys_t *p_sys = p_dec->p_sys;
 
     p_sys->p_aout_buffer =
-        p_dec->pf_aout_buffer_new( p_dec, frame->header.blocksize );
+        decoder_NewAudioBuffer( p_dec, frame->header.blocksize );
 
     if( p_sys->p_aout_buffer == NULL )
         return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
@@ -630,6 +632,10 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
         Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
                       frame->header.channels, frame->header.blocksize );
         break;
+    case 24:
+        Interleave24( (int8_t *)p_sys->p_aout_buffer->p_buffer, buffer,
+                      frame->header.channels, frame->header.blocksize );
+        break;
     default:
         Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
                       frame->header.channels, frame->header.blocksize );
@@ -664,6 +670,9 @@ static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
         case 16:
             p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
             break;
+        case 24:
+            p_dec->fmt_out.i_codec = AOUT_FMT_S24_NE;
+            break;
         default:
             msg_Dbg( p_dec, "strange bit/sample value: %d",
                      metadata->data.stream_info.bits_per_sample );
@@ -739,6 +748,28 @@ static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
         }
     }
 }
+
+static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
+                          int i_nb_channels, int i_samples )
+{
+    int i, j;
+    for ( j = 0; j < i_samples; j++ )
+    {
+        for ( i = 0; i < i_nb_channels; i++ )
+        {
+#ifdef WORDS_BIGENDIAN
+            p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 16) & 0xff;
+            p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff;
+            p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 0 ) & 0xff;
+#else
+            p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 16) & 0xff;
+            p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff;
+            p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 0 ) & 0xff;
+#endif
+        }
+    }
+}
+
 static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
                           int i_nb_channels, int i_samples )
 {