#include <vlc_aout.h>
#include <vlc_block_helper.h>
-#define DTS_HEADER_SIZE 14
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+static int OpenDecoder ( vlc_object_t * );
+static int OpenPacketizer( vlc_object_t * );
+static void CloseCommon ( vlc_object_t * );
+
+vlc_module_begin ()
+ set_description( N_("DTS parser") )
+ set_capability( "decoder", 100 )
+ set_callbacks( OpenDecoder, CloseCommon )
+
+ add_submodule ()
+ set_description( N_("DTS audio packetizer") )
+ set_capability( "packetizer", 10 )
+ set_callbacks( OpenPacketizer, CloseCommon )
+vlc_module_end ()
/*****************************************************************************
* decoder_sys_t : decoder descriptor
STATE_SEND_DATA
};
+#define DTS_HEADER_SIZE 14
+
/****************************************************************************
* Local prototypes
****************************************************************************/
-static int OpenDecoder ( vlc_object_t * );
-static int OpenPacketizer( vlc_object_t * );
-static void CloseDecoder ( vlc_object_t * );
-static void *DecodeBlock ( decoder_t *, block_t ** );
+static int OpenCommon( vlc_object_t *, bool b_packetizer );
+static void *DecodeBlock( decoder_t *, block_t ** );
static inline int SyncCode( const uint8_t * );
-static int SyncInfo ( const uint8_t *, unsigned int *, unsigned int *,
- unsigned int *, unsigned int *, unsigned int * );
+static int SyncInfo( const uint8_t *, unsigned int *, unsigned int *,
+ unsigned int *, unsigned int *, unsigned int * );
static uint8_t *GetOutBuffer ( decoder_t *, void ** );
static aout_buffer_t *GetAoutBuffer( decoder_t * );
static block_t *GetSoutBuffer( decoder_t * );
/*****************************************************************************
- * Module descriptor
+ * OpenDecoder: probe the decoder
*****************************************************************************/
-vlc_module_begin ()
- set_description( N_("DTS parser") )
- set_capability( "decoder", 100 )
- set_callbacks( OpenDecoder, CloseDecoder )
+static int OpenDecoder( vlc_object_t *p_this )
+{
+ /* HACK: Don't use this codec if we don't have an dts audio filter */
+ if( !module_exists( "dtstofloat32" ) )
+ return VLC_EGENERIC;
- add_submodule ()
- set_description( N_("DTS audio packetizer") )
- set_capability( "packetizer", 10 )
- set_callbacks( OpenPacketizer, CloseDecoder )
-vlc_module_end ()
+ return OpenCommon( p_this, false );
+}
/*****************************************************************************
- * OpenDecoder: probe the decoder and return score
+ * OpenPacketizer: probe the packetizer
*****************************************************************************/
-static int OpenDecoder( vlc_object_t *p_this )
+static int OpenPacketizer( vlc_object_t *p_this )
+{
+ return OpenCommon( p_this, true );
+}
+
+/*****************************************************************************
+ * OpenCommon:
+ *****************************************************************************/
+static int OpenCommon( vlc_object_t *p_this, bool b_packetizer )
{
decoder_t *p_dec = (decoder_t*)p_this;
decoder_sys_t *p_sys;
- if( p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s',' ')
- && p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s','b') )
+ if( p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s',' ') &&
+ p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s','b') )
{
return VLC_EGENERIC;
}
/* Allocate the memory needed to store the decoder's structure */
- if( ( p_dec->p_sys = p_sys =
- (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
+ if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
return VLC_ENOMEM;
/* Misc init */
- p_sys->b_packetizer = false;
+ p_sys->b_packetizer = b_packetizer;
p_sys->i_state = STATE_NOSYNC;
aout_DateSet( &p_sys->end_date, 0 );
return VLC_SUCCESS;
}
-static int OpenPacketizer( vlc_object_t *p_this )
-{
- decoder_t *p_dec = (decoder_t*)p_this;
-
- int i_ret = OpenDecoder( p_this );
-
- if( i_ret == VLC_SUCCESS ) p_dec->p_sys->b_packetizer = true;
-
- return i_ret;
-}
-
/****************************************************************************
* DecodeBlock: the whole thing
- ****************************************************************************
- * This function is called just after the thread is launched.
****************************************************************************/
static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
{
uint8_t *p_buf;
void *p_out_buffer;
- if( !pp_block || !*pp_block ) return NULL;
+ if( !pp_block || !*pp_block )
+ return NULL;
if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{
}
/*****************************************************************************
- * CloseDecoder: clean up the decoder
+ * CloseCommon: clean up the decoder
*****************************************************************************/
-static void CloseDecoder( vlc_object_t *p_this )
+static void CloseCommon( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t*)p_this;
decoder_sys_t *p_sys = p_dec->p_sys;