Commit b58eb41e authored by Gildas Bazin's avatar Gildas Bazin

* modules/demux/ps.h: support for mp4v/mp4a/h264 + parse language descriptor in PSM.

parent 3d94c37e
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
typedef struct ps_psm_t ps_psm_t; typedef struct ps_psm_t ps_psm_t;
static inline int ps_id_to_type( ps_psm_t *, int ); static inline int ps_id_to_type( ps_psm_t *, int );
static inline char *ps_id_to_lang( ps_psm_t *, int );
typedef struct typedef struct
{ {
...@@ -99,7 +100,11 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id ) ...@@ -99,7 +100,11 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
es_format_Init( &tk->fmt, UNKNOWN_ES, 0 ); es_format_Init( &tk->fmt, UNKNOWN_ES, 0 );
if( (i_id&0xf0) == 0xe0 && i_type == 0x10 ) if( (i_id&0xf0) == 0xe0 && i_type == 0x1b )
{
es_format_Init( &tk->fmt, VIDEO_ES, VLC_FOURCC('h','2','6','4') );
}
else if( (i_id&0xf0) == 0xe0 && i_type == 0x10 )
{ {
es_format_Init( &tk->fmt, VIDEO_ES, VLC_FOURCC('m','p','4','v') ); es_format_Init( &tk->fmt, VIDEO_ES, VLC_FOURCC('m','p','4','v') );
} }
...@@ -107,6 +112,10 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id ) ...@@ -107,6 +112,10 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
{ {
es_format_Init( &tk->fmt, VIDEO_ES, VLC_FOURCC('m','p','g','v') ); es_format_Init( &tk->fmt, VIDEO_ES, VLC_FOURCC('m','p','g','v') );
} }
else if( ( i_id&0xe0 ) == 0xc0 && i_type == 0x0f )
{
es_format_Init( &tk->fmt, AUDIO_ES, VLC_FOURCC('m','p','4','a') );
}
else if( ( i_id&0xe0 ) == 0xc0 && i_type == 0x03 ) else if( ( i_id&0xe0 ) == 0xc0 && i_type == 0x03 )
{ {
es_format_Init( &tk->fmt, AUDIO_ES, VLC_FOURCC('m','p','g','a') ); es_format_Init( &tk->fmt, AUDIO_ES, VLC_FOURCC('m','p','g','a') );
...@@ -126,6 +135,13 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id ) ...@@ -126,6 +135,13 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm, int i_id )
/* PES packets usually contain truncated frames */ /* PES packets usually contain truncated frames */
tk->fmt.b_packetized = VLC_FALSE; tk->fmt.b_packetized = VLC_FALSE;
if( ps_id_to_lang( p_psm , i_id ) )
{
tk->fmt.psz_language = malloc( 4 );
memcpy( tk->fmt.psz_language, ps_id_to_lang( p_psm , i_id ), 3 );
tk->fmt.psz_language[3] = 0;
}
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -343,7 +359,7 @@ static inline int ps_pkt_parse_pes( block_t *p_pes, int i_skip_extra ) ...@@ -343,7 +359,7 @@ static inline int ps_pkt_parse_pes( block_t *p_pes, int i_skip_extra )
} }
/* Program stream map handling */ /* Program stream map handling */
typedef struct p_es_t typedef struct ps_es_t
{ {
int i_type; int i_type;
int i_id; int i_id;
...@@ -351,6 +367,9 @@ typedef struct p_es_t ...@@ -351,6 +367,9 @@ typedef struct p_es_t
int i_descriptor; int i_descriptor;
uint8_t *p_descriptor; uint8_t *p_descriptor;
/* Language is iso639-2T */
uint8_t lang[3];
} ps_es_t; } ps_es_t;
struct ps_psm_t struct ps_psm_t
...@@ -371,6 +390,16 @@ static inline int ps_id_to_type( ps_psm_t *p_psm, int i_id ) ...@@ -371,6 +390,16 @@ static inline int ps_id_to_type( ps_psm_t *p_psm, int i_id )
return 0; return 0;
} }
static inline char *ps_id_to_lang( ps_psm_t *p_psm, int i_id )
{
int i;
for( i = 0; p_psm && i < p_psm->i_es; i++ )
{
if( p_psm->es[i]->i_id == i_id ) return p_psm->es[i]->lang;
}
return 0;
}
static inline void ps_psm_init( ps_psm_t *p_psm ) static inline void ps_psm_init( ps_psm_t *p_psm )
{ {
p_psm->i_version = 0xFFFF; p_psm->i_version = 0xFFFF;
...@@ -422,6 +451,7 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt, ...@@ -422,6 +451,7 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,
while( i_es_base + 4 < i_length ) while( i_es_base + 4 < i_length )
{ {
ps_es_t es; ps_es_t es;
es.lang[0] = es.lang[1] = es.lang[2] = 0;
es.i_type = p_buffer[ i_es_base ]; es.i_type = p_buffer[ i_es_base ];
es.i_id = p_buffer[ i_es_base + 1 ]; es.i_id = p_buffer[ i_es_base + 1 ];
...@@ -434,8 +464,28 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt, ...@@ -434,8 +464,28 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,
es.i_descriptor = i_info_length; es.i_descriptor = i_info_length;
if( i_info_length > 0 ) if( i_info_length > 0 )
{ {
int i = 0;
es.p_descriptor = malloc( i_info_length ); es.p_descriptor = malloc( i_info_length );
memcpy( es.p_descriptor, p_buffer + i_es_base + 4, i_info_length); memcpy( es.p_descriptor, p_buffer + i_es_base + 4, i_info_length);
while( i <= es.i_descriptor - 2 )
{
/* Look for the ISO639 language descriptor */
if( es.p_descriptor[i] != 0x0a )
{
i += es.p_descriptor[i+1];
continue;
}
if( i <= es.i_descriptor - 6 )
{
es.lang[0] = es.p_descriptor[i+2];
es.lang[1] = es.p_descriptor[i+3];
es.lang[2] = es.p_descriptor[i+4];
}
break;
}
} }
p_psm->es = realloc( p_psm->es, sizeof(ps_es_t *) * (p_psm->i_es+1) ); p_psm->es = realloc( p_psm->es, sizeof(ps_es_t *) * (p_psm->i_es+1) );
......
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