Commit 5e22d74d authored by Sam Hocevar's avatar Sam Hocevar

- include des PES de type AC3 pour pr�parer une bidouille inf�me

 - reformatage des commentaires � 80 colonnes au lieu de 81 parce que
  �a a le don de m'�nerver prodigieusement.
parent ab03c05d
...@@ -164,6 +164,7 @@ typedef struct ...@@ -164,6 +164,7 @@ typedef struct
#define MPEG2_VIDEO_ES 0x02 #define MPEG2_VIDEO_ES 0x02
#define MPEG1_AUDIO_ES 0x03 #define MPEG1_AUDIO_ES 0x03
#define MPEG2_AUDIO_ES 0x04 #define MPEG2_AUDIO_ES 0x04
#define AC3_AUDIO_ES 0x05
/******************************************************************************* /*******************************************************************************
......
/******************************************************************************* /******************************************************************************
* generic_decoder.c : generic decoder thread * generic_decoder.c : generic decoder thread
* (c)1999 VideoLAN * (c)1999 VideoLAN
******************************************************************************* ******************************************************************************
* This decoder provides a way to parse packets which do not belong to any * This decoder provides a way to parse packets which do not belong to any
* known stream type, or to redirect packets to files. It can extract PES files * known stream type, or to redirect packets to files. It can extract PES files
* from a multiplexed stream, identify automatically ES in a stream missing * from a multiplexed stream, identify automatically ES in a stream missing
...@@ -10,11 +10,11 @@ ...@@ -10,11 +10,11 @@
* mode. * mode.
* A single generic decoder is able to handle several ES, therefore it can be * A single generic decoder is able to handle several ES, therefore it can be
* used as a 'default' decoder by the input thread. * used as a 'default' decoder by the input thread.
*******************************************************************************/ ******************************************************************************/
/******************************************************************************* /******************************************************************************
* Preamble * Preamble
*******************************************************************************/ ******************************************************************************/
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -56,20 +56,20 @@ static void IdentifyPES ( gdec_thread_t *p_gdec, pes_packet_t *p_pes ...@@ -56,20 +56,20 @@ static void IdentifyPES ( gdec_thread_t *p_gdec, pes_packet_t *p_pes
int i_stream_id ); int i_stream_id );
static void PrintPES ( pes_packet_t *p_pes, int i_stream_id ); static void PrintPES ( pes_packet_t *p_pes, int i_stream_id );
/******************************************************************************* /******************************************************************************
* gdec_CreateThread: create a generic decoder thread * gdec_CreateThread: create a generic decoder thread
******************************************************************************* ******************************************************************************
* This function creates a new generic decoder thread, and returns a pointer * This function creates a new generic decoder thread, and returns a pointer
* to its description. On error, it returns NULL. * to its description. On error, it returns NULL.
* Following configuration properties are used: * Following configuration properties are used:
* GDEC_CFG_ACTIONS (required) * GDEC_CFG_ACTIONS (required)
* ?? * ??
*******************************************************************************/ ******************************************************************************/
gdec_thread_t * gdec_CreateThread( gdec_cfg_t *p_cfg, input_thread_t *p_input, gdec_thread_t * gdec_CreateThread( gdec_cfg_t *p_cfg, input_thread_t *p_input,
int *pi_status ) int *pi_status )
{ {
gdec_thread_t * p_gdec; /* thread descriptor */ gdec_thread_t * p_gdec; /* thread descriptor */
int i_status; /* thread status */ int i_status; /* thread status */
/* /*
* Check configuration * Check configuration
...@@ -81,7 +81,7 @@ gdec_thread_t * gdec_CreateThread( gdec_cfg_t *p_cfg, input_thread_t *p_input, ...@@ -81,7 +81,7 @@ gdec_thread_t * gdec_CreateThread( gdec_cfg_t *p_cfg, input_thread_t *p_input,
/* Allocate descriptor and initialize flags */ /* Allocate descriptor and initialize flags */
p_gdec = (gdec_thread_t *) malloc( sizeof(gdec_thread_t) ); p_gdec = (gdec_thread_t *) malloc( sizeof(gdec_thread_t) );
if( p_gdec == NULL ) /* error */ if( p_gdec == NULL ) /* error */
{ {
return( NULL ); return( NULL );
} }
...@@ -127,16 +127,16 @@ gdec_thread_t * gdec_CreateThread( gdec_cfg_t *p_cfg, input_thread_t *p_input, ...@@ -127,16 +127,16 @@ gdec_thread_t * gdec_CreateThread( gdec_cfg_t *p_cfg, input_thread_t *p_input,
return( p_gdec ); return( p_gdec );
} }
/******************************************************************************* /******************************************************************************
* gdec_DestroyThread: destroy a generic decoder thread * gdec_DestroyThread: destroy a generic decoder thread
******************************************************************************* ******************************************************************************
* Destroy a terminated thread. This function will return 0 if the thread could * Destroy a terminated thread. This function will return 0 if the thread could
* be destroyed, and non 0 else. The last case probably means that the thread * be destroyed, and non 0 else. The last case probably means that the thread
* was still active, and another try may succeed. * was still active, and another try may succeed.
*******************************************************************************/ ******************************************************************************/
void gdec_DestroyThread( gdec_thread_t *p_gdec, int *pi_status ) void gdec_DestroyThread( gdec_thread_t *p_gdec, int *pi_status )
{ {
int i_status; /* thread status */ int i_status; /* thread status */
/* Set status */ /* Set status */
p_gdec->pi_status = (pi_status != NULL) ? pi_status : &i_status; p_gdec->pi_status = (pi_status != NULL) ? pi_status : &i_status;
...@@ -164,12 +164,12 @@ void gdec_DestroyThread( gdec_thread_t *p_gdec, int *pi_status ) ...@@ -164,12 +164,12 @@ void gdec_DestroyThread( gdec_thread_t *p_gdec, int *pi_status )
/* following functions are local */ /* following functions are local */
/******************************************************************************* /******************************************************************************
* CheckConfiguration: check gdec_CreateThread() configuration * CheckConfiguration: check gdec_CreateThread() configuration
******************************************************************************* ******************************************************************************
* Set default parameters where required. In DEBUG mode, check if configuration * Set default parameters where required. In DEBUG mode, check if configuration
* is valid. * is valid.
*******************************************************************************/ ******************************************************************************/
static int CheckConfiguration( gdec_cfg_t *p_cfg ) static int CheckConfiguration( gdec_cfg_t *p_cfg )
{ {
#ifdef DEBUG #ifdef DEBUG
...@@ -183,13 +183,13 @@ static int CheckConfiguration( gdec_cfg_t *p_cfg ) ...@@ -183,13 +183,13 @@ static int CheckConfiguration( gdec_cfg_t *p_cfg )
return( 0 ); return( 0 );
} }
/******************************************************************************* /******************************************************************************
* InitThread: initialize gdec thread * InitThread: initialize gdec thread
******************************************************************************* ******************************************************************************
* This function is called from RunThread and performs the second step of the * This function is called from RunThread and performs the second step of the
* initialization. It returns 0 on success. Note that the thread's flag are not * initialization. It returns 0 on success. Note that the thread's flag are not
* modified inside this function. * modified inside this function.
*******************************************************************************/ ******************************************************************************/
static int InitThread( gdec_thread_t *p_gdec ) static int InitThread( gdec_thread_t *p_gdec )
{ {
/* ?? */ /* ?? */
...@@ -210,16 +210,16 @@ static int InitThread( gdec_thread_t *p_gdec ) ...@@ -210,16 +210,16 @@ static int InitThread( gdec_thread_t *p_gdec )
return(0); return(0);
} }
/******************************************************************************* /******************************************************************************
* RunThread: generic decoder thread * RunThread: generic decoder thread
******************************************************************************* ******************************************************************************
* Generic decoder thread. This function does only returns when the thread is * Generic decoder thread. This function does only returns when the thread is
* terminated. * terminated.
*******************************************************************************/ ******************************************************************************/
static void RunThread( gdec_thread_t *p_gdec ) static void RunThread( gdec_thread_t *p_gdec )
{ {
pes_packet_t * p_pes; /* current packet */ pes_packet_t * p_pes; /* current packet */
int i_stream_id; /* PES stream id */ int i_stream_id; /* PES stream id */
/* /*
* Initialize thread and free configuration * Initialize thread and free configuration
...@@ -227,7 +227,7 @@ static void RunThread( gdec_thread_t *p_gdec ) ...@@ -227,7 +227,7 @@ static void RunThread( gdec_thread_t *p_gdec )
p_gdec->b_error = InitThread( p_gdec ); p_gdec->b_error = InitThread( p_gdec );
if( p_gdec->b_error ) if( p_gdec->b_error )
{ {
free( p_gdec ); /* destroy descriptor */ free( p_gdec ); /* destroy descriptor */
return; return;
} }
...@@ -299,16 +299,16 @@ static void RunThread( gdec_thread_t *p_gdec ) ...@@ -299,16 +299,16 @@ static void RunThread( gdec_thread_t *p_gdec )
EndThread( p_gdec ); EndThread( p_gdec );
} }
/******************************************************************************* /******************************************************************************
* ErrorThread: RunThread() error loop * ErrorThread: RunThread() error loop
******************************************************************************* ******************************************************************************
* This function is called when an error occured during thread main's loop. The * This function is called when an error occured during thread main's loop. The
* thread can still receive feed, but must be ready to terminate as soon as * thread can still receive feed, but must be ready to terminate as soon as
* possible. * possible.
*******************************************************************************/ ******************************************************************************/
static void ErrorThread( gdec_thread_t *p_gdec ) static void ErrorThread( gdec_thread_t *p_gdec )
{ {
pes_packet_t * p_pes; /* pes packet */ pes_packet_t * p_pes; /* pes packet */
/* Wait until a `die' order */ /* Wait until a `die' order */
while( !p_gdec->b_die ) while( !p_gdec->b_die )
...@@ -326,15 +326,15 @@ static void ErrorThread( gdec_thread_t *p_gdec ) ...@@ -326,15 +326,15 @@ static void ErrorThread( gdec_thread_t *p_gdec )
} }
} }
/******************************************************************************* /******************************************************************************
* EndThread: thread destruction * EndThread: thread destruction
******************************************************************************* ******************************************************************************
* This function is called when the thread ends after a sucessfull * This function is called when the thread ends after a sucessfull
* initialization. * initialization.
*******************************************************************************/ ******************************************************************************/
static void EndThread( gdec_thread_t *p_gdec ) static void EndThread( gdec_thread_t *p_gdec )
{ {
int * pi_status; /* thread status */ int * pi_status; /* thread status */
/* Store status */ /* Store status */
pi_status = p_gdec->pi_status; pi_status = p_gdec->pi_status;
...@@ -346,27 +346,27 @@ static void EndThread( gdec_thread_t *p_gdec ) ...@@ -346,27 +346,27 @@ static void EndThread( gdec_thread_t *p_gdec )
#endif #endif
/* Destroy thread structures allocated by InitThread */ /* Destroy thread structures allocated by InitThread */
free( p_gdec ); /* destroy descriptor */ free( p_gdec ); /* destroy descriptor */
*pi_status = THREAD_OVER; *pi_status = THREAD_OVER;
intf_DbgMsg("%p\n", p_gdec); intf_DbgMsg("%p\n", p_gdec);
} }
/******************************************************************************* /******************************************************************************
* IdentifyPES: identify a PES packet * IdentifyPES: identify a PES packet
******************************************************************************* ******************************************************************************
* Update ES tables in the input thread according to the stream_id value. See * Update ES tables in the input thread according to the stream_id value. See
* ISO 13818-1, table 2-18. * ISO 13818-1, table 2-18.
*******************************************************************************/ ******************************************************************************/
static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_stream_id ) static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_stream_id )
{ {
int i_id; /* stream id in es table */ int i_id; /* stream id in es table */
int i_type; /* stream type according ISO/IEC 13818-1 table 2-29 */ int i_type; /* stream type according ISO/IEC 13818-1 table 2-29 */
/* Search where the elementary stream id does come from */ /* Search where the elementary stream id does come from */
switch( p_gdec->p_input->i_method ) switch( p_gdec->p_input->i_method )
{ {
case INPUT_METHOD_TS_FILE: /* TS methods: id is TS PID */ case INPUT_METHOD_TS_FILE: /* TS methods: id is TS PID */
case INPUT_METHOD_TS_UCAST: case INPUT_METHOD_TS_UCAST:
case INPUT_METHOD_TS_BCAST: case INPUT_METHOD_TS_BCAST:
case INPUT_METHOD_TS_VLAN_BCAST: case INPUT_METHOD_TS_VLAN_BCAST:
...@@ -377,7 +377,7 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea ...@@ -377,7 +377,7 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea
break; break;
#ifdef DEBUG #ifdef DEBUG
default: /* unknown id origin */ default: /* unknown id origin */
intf_DbgMsg("unable to identify PES using input method %d\n", intf_DbgMsg("unable to identify PES using input method %d\n",
p_gdec->p_input->i_method ); p_gdec->p_input->i_method );
break; break;
...@@ -385,14 +385,20 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea ...@@ -385,14 +385,20 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea
} }
/* Try to identify PES stream_id - see ISO 13818-1 table 2-18 */ /* Try to identify PES stream_id - see ISO 13818-1 table 2-18 */
if( (i_stream_id & 0xe0) == 0xc0 ) if( i_stream_id == 0xbd )
{
/* Dolby AC-3 stream - might be specific to DVD PS streams */
i_type = AC3_AUDIO_ES;
intf_DbgMsg("PES %p identified as AC3\n", p_pes);
}
else if( (i_stream_id & 0xe0) == 0xc0 )
{ {
/* ISO/IEC 13818-3 or ISO/IEC 11172-3 audio stream - since there is no /* ISO/IEC 13818-3 or ISO/IEC 11172-3 audio stream - since there is no
* way to make the difference between the two possibilities, and since * way to make the difference between the two possibilities, and since
* an ISO/IEC 13818-3 is capable of decoding an ISO/IEC 11172-3 stream, * an ISO/IEC 13818-3 is capable of decoding an ISO/IEC 11172-3 stream,
* the first one is used */ * the first one is used */
i_type = MPEG2_AUDIO_ES; i_type = MPEG2_AUDIO_ES;
intf_DbgMsg("PES %p identified as AUDIO\n", p_pes); intf_DbgMsg("PES %p identified as AUDIO\n", p_pes);
} }
else if( (i_stream_id & 0xf0) == 0xe0 ) else if( (i_stream_id & 0xf0) == 0xe0 )
{ {
...@@ -401,7 +407,7 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea ...@@ -401,7 +407,7 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea
* an ISO/IEC 13818-2 is capable of decoding an ISO/IEC 11172-2 stream, * an ISO/IEC 13818-2 is capable of decoding an ISO/IEC 11172-2 stream,
* the first one is used */ * the first one is used */
i_type = MPEG2_VIDEO_ES; i_type = MPEG2_VIDEO_ES;
intf_DbgMsg("PES %p identified as VIDEO\n", p_pes); intf_DbgMsg("PES %p identified as VIDEO\n", p_pes);
} }
else else
{ {
...@@ -414,17 +420,17 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea ...@@ -414,17 +420,17 @@ static void IdentifyPES( gdec_thread_t *p_gdec, pes_packet_t *p_pes, int i_strea
/* ?? */ /* ?? */
} }
/******************************************************************************* /******************************************************************************
* PrintPES: print informations about a PES packet * PrintPES: print informations about a PES packet
******************************************************************************* ******************************************************************************
* This function will print information about a received PES packet. It is * This function will print information about a received PES packet. It is
* probably usefull only for debugging purposes, or before demultiplexing a * probably usefull only for debugging purposes, or before demultiplexing a
* stream. It has two different formats, depending of the presence of the DEBUG * stream. It has two different formats, depending of the presence of the DEBUG
* symbol. * symbol.
*******************************************************************************/ ******************************************************************************/
static void PrintPES( pes_packet_t *p_pes, int i_stream_id ) static void PrintPES( pes_packet_t *p_pes, int i_stream_id )
{ {
char psz_pes[128]; /* descriptor buffer */ char psz_pes[128]; /* descriptor buffer */
#ifdef DEBUG #ifdef DEBUG
/* PES informations, long (DEBUG) format - this string is maximum 70 bytes /* PES informations, long (DEBUG) format - this string is maximum 70 bytes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment