]> git.sesse.net Git - vlc/blobdiff - modules/codec/flac.c
use proper error
[vlc] / modules / codec / flac.c
index 3dda0073a18275fd5968eaec75ed0c4ec00679a0..b1b8e883466078998a41d4e4add5aa037f95ed85 100644 (file)
  * Preamble
  *****************************************************************************/
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
 #include <vlc_codec.h>
 #include <vlc_aout.h>
@@ -173,6 +177,7 @@ vlc_module_begin();
 
     set_category( CAT_INPUT );
     set_subcategory( SUBCAT_INPUT_ACODEC );
+    add_shortcut( "flac" );
 
 #ifdef USE_LIBFLAC
     set_description( _("Flac audio decoder") );
@@ -190,7 +195,6 @@ vlc_module_begin();
     set_capability( "packetizer", 100 );
     set_callbacks( OpenPacketizer, CloseDecoder );
 
-    add_shortcut( "flac" );
 vlc_module_end();
 
 /*****************************************************************************
@@ -211,7 +215,7 @@ static int OpenDecoder( vlc_object_t *p_this )
           (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
     {
         msg_Err( p_dec, "out of memory" );
-        return VLC_EGENERIC;
+        return VLC_ENOMEM;
     }
 
     /* Misc init */
@@ -219,7 +223,7 @@ static int OpenDecoder( vlc_object_t *p_this )
     p_sys->i_state = STATE_NOSYNC;
     p_sys->b_stream_info = VLC_FALSE;
     p_sys->p_block=NULL;
-    p_sys->bytestream = block_BytestreamInit( p_dec );
+    p_sys->bytestream = block_BytestreamInit();
 
 #ifdef USE_LIBFLAC
     /* Take care of flac init */
@@ -271,7 +275,6 @@ static int OpenDecoder( vlc_object_t *p_this )
 #ifdef USE_LIBFLAC
     p_dec->pf_decode_audio = DecodeBlock;
 #endif
-    p_dec->pf_packetize    = PacketizeBlock;
 
     return VLC_SUCCESS;
 }
@@ -279,18 +282,24 @@ static int OpenDecoder( vlc_object_t *p_this )
 static int OpenPacketizer( vlc_object_t *p_this )
 {
     decoder_t *p_dec = (decoder_t*)p_this;
+    es_format_t es_save = p_dec->fmt_out;
     int i_ret;
 
-    /* Hmmm, mem leak ?*/
+    /* */
     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
 
     i_ret = OpenDecoder( p_this );
+    p_dec->pf_decode_audio = NULL;
+    p_dec->pf_packetize    = PacketizeBlock;
 
     /* Set output properties */
     p_dec->fmt_out.i_codec = VLC_FOURCC('f','l','a','c');
 
-    if( i_ret != VLC_SUCCESS ) return i_ret;
-
+    if( i_ret != VLC_SUCCESS )
+    {
+        es_format_Clean( &p_dec->fmt_out );
+        p_dec->fmt_out = es_save;
+    }
     return i_ret;
 }
 
@@ -372,6 +381,18 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
 
     if( !pp_block || !*pp_block ) return NULL;
 
+    if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    {
+        if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
+        {
+            p_sys->i_state = STATE_NOSYNC;
+            block_BytestreamFlush( &p_sys->bytestream );
+        }
+//        aout_DateSet( &p_sys->end_date, 0 );
+        block_Release( *pp_block );
+        return NULL;
+    }
+
     if( !p_sys->b_stream_info ) ProcessHeader( p_dec );
 
     if( p_sys->stream_info.channels > 6 )
@@ -392,11 +413,6 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block )
         aout_DateSet( &p_sys->end_date, (*pp_block)->i_pts );
     }
 
-    if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
-    {
-        p_sys->i_state = STATE_NOSYNC;
-    }
-
     block_BytestreamPush( &p_sys->bytestream, *pp_block );
 
     while( 1 )
@@ -570,6 +586,7 @@ static FLAC__StreamDecoderReadStatus
 DecoderReadCallback( const FLAC__StreamDecoder *decoder, FLAC__byte buffer[],
                      unsigned *bytes, void *client_data )
 {
+    VLC_UNUSED(decoder);
     decoder_t *p_dec = (decoder_t *)client_data;
     decoder_sys_t *p_sys = p_dec->p_sys;
 
@@ -597,6 +614,7 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
                       const FLAC__Frame *frame,
                       const FLAC__int32 *const buffer[], void *client_data )
 {
+    VLC_UNUSED(decoder);
     decoder_t *p_dec = (decoder_t *)client_data;
     decoder_sys_t *p_sys = p_dec->p_sys;
 
@@ -632,22 +650,26 @@ static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
                                      const FLAC__StreamMetadata *metadata,
                                      void *client_data )
 {
+    VLC_UNUSED(decoder);
     decoder_t *p_dec = (decoder_t *)client_data;
     decoder_sys_t *p_sys = p_dec->p_sys;
 
-    switch( metadata->data.stream_info.bits_per_sample )
+    if( p_dec->pf_decode_audio )
     {
-    case 8:
-        p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
-        break;
-    case 16:
-        p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
-        break;
-    default:
-        msg_Dbg( p_dec, "strange bit/sample value: %d",
-                 metadata->data.stream_info.bits_per_sample );
-        p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
-        break;
+        switch( metadata->data.stream_info.bits_per_sample )
+        {
+        case 8:
+            p_dec->fmt_out.i_codec = VLC_FOURCC('s','8',' ',' ');
+            break;
+        case 16:
+            p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
+            break;
+        default:
+            msg_Dbg( p_dec, "strange bit/sample value: %d",
+                     metadata->data.stream_info.bits_per_sample );
+            p_dec->fmt_out.i_codec = VLC_FOURCC('f','i','3','2');
+            break;
+        }
     }
 
     /* Setup the format */
@@ -678,6 +700,7 @@ static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
                                   FLAC__StreamDecoderErrorStatus status,
                                   void *client_data )
 {
+    VLC_UNUSED(decoder);
     decoder_t *p_dec = (decoder_t *)client_data;
 
     switch( status )
@@ -1325,6 +1348,7 @@ static void EncoderMetadataCallback( const FLAC__StreamEncoder *encoder,
                                      const FLAC__StreamMetadata *metadata,
                                      void *client_data )
 {
+    VLC_UNUSED(encoder);
     encoder_t *p_enc = (encoder_t *)client_data;
 
     msg_Err( p_enc, "MetadataCallback: %i", metadata->type );
@@ -1340,6 +1364,7 @@ EncoderWriteCallback( const FLAC__StreamEncoder *encoder,
                       unsigned bytes, unsigned samples,
                       unsigned current_frame, void *client_data )
 {
+    VLC_UNUSED(encoder); VLC_UNUSED(current_frame);
     encoder_t *p_enc = (encoder_t *)client_data;
     encoder_sys_t *p_sys = p_enc->p_sys;
     block_t *p_block;