Commit 9187e4c8 authored by Francois Cartegnie's avatar Francois Cartegnie

demux: mp4: add support for wmapro

parent 2ae1a2a2
...@@ -389,6 +389,27 @@ int SetupVideoES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample ) ...@@ -389,6 +389,27 @@ int SetupVideoES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample )
return 1; return 1;
} }
static bool SetupAudioFromWaveFormatEx( es_format_t *p_fmt, const MP4_Box_t *p_WMA2 )
{
if( p_WMA2 && BOXDATA(p_WMA2) )
{
wf_tag_to_fourcc(BOXDATA(p_WMA2)->Format.wFormatTag, &p_fmt->i_codec, NULL);
p_fmt->audio.i_channels = BOXDATA(p_WMA2)->Format.nChannels;
p_fmt->audio.i_rate = BOXDATA(p_WMA2)->Format.nSamplesPerSec;
p_fmt->i_bitrate = BOXDATA(p_WMA2)->Format.nAvgBytesPerSec * 8;
p_fmt->audio.i_blockalign = BOXDATA(p_WMA2)->Format.nBlockAlign;
p_fmt->audio.i_bitspersample = BOXDATA(p_WMA2)->Format.wBitsPerSample;
p_fmt->i_extra = BOXDATA(p_WMA2)->i_extra;
if( p_fmt->i_extra > 0 )
{
p_fmt->p_extra = malloc( BOXDATA(p_WMA2)->i_extra );
memcpy( p_fmt->p_extra, BOXDATA(p_WMA2)->p_extra, p_fmt->i_extra );
}
return true;
}
return false;
}
int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample ) int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample )
{ {
MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun; MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun;
...@@ -714,21 +735,9 @@ int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample ) ...@@ -714,21 +735,9 @@ int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample )
} }
case ATOM_WMA2: case ATOM_WMA2:
{ {
MP4_Box_t *p_WMA2 = MP4_BoxGet( p_sample, "wave/WMA2" ); if( SetupAudioFromWaveFormatEx( &p_track->fmt,
if( p_WMA2 && BOXDATA(p_WMA2) ) MP4_BoxGet( p_sample, "wave/WMA2" ) ) )
{ {
p_track->fmt.audio.i_channels = BOXDATA(p_WMA2)->Format.nChannels;
p_track->fmt.audio.i_rate = BOXDATA(p_WMA2)->Format.nSamplesPerSec;
p_track->fmt.i_bitrate = BOXDATA(p_WMA2)->Format.nAvgBytesPerSec * 8;
p_track->fmt.audio.i_blockalign = BOXDATA(p_WMA2)->Format.nBlockAlign;
p_track->fmt.audio.i_bitspersample = BOXDATA(p_WMA2)->Format.wBitsPerSample;
p_track->fmt.i_extra = BOXDATA(p_WMA2)->i_extra;
if( p_track->fmt.i_extra > 0 )
{
p_track->fmt.p_extra = malloc( BOXDATA(p_WMA2)->i_extra );
memcpy( p_track->fmt.p_extra, BOXDATA(p_WMA2)->p_extra,
p_track->fmt.i_extra );
}
p_track->p_asf = MP4_BoxGet( p_sample, "wave/ASF " ); p_track->p_asf = MP4_BoxGet( p_sample, "wave/ASF " );
} }
else else
...@@ -737,6 +746,11 @@ int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample ) ...@@ -737,6 +746,11 @@ int SetupAudioES( demux_t *p_demux, mp4_track_t *p_track, MP4_Box_t *p_sample )
} }
break; break;
} }
case ATOM_wma: /* isml wmapro */
{
if( !SetupAudioFromWaveFormatEx( &p_track->fmt, MP4_BoxGet( p_sample, "wfex" ) ) )
msg_Err( p_demux, "missing wfex for wma" );
}
default: default:
msg_Dbg( p_demux, "Unrecognized FourCC %4.4s", (char *)&p_sample->i_type ); msg_Dbg( p_demux, "Unrecognized FourCC %4.4s", (char *)&p_sample->i_type );
......
...@@ -3779,11 +3779,13 @@ static const struct ...@@ -3779,11 +3779,13 @@ static const struct
{ ATOM_OggS, MP4_ReadBox_sample_soun, ATOM_stsd }, { ATOM_OggS, MP4_ReadBox_sample_soun, ATOM_stsd },
{ ATOM_alac, MP4_ReadBox_sample_soun, ATOM_stsd }, { ATOM_alac, MP4_ReadBox_sample_soun, ATOM_stsd },
{ ATOM_WMA2, MP4_ReadBox_sample_soun, ATOM_stsd }, /* flip4mac */ { ATOM_WMA2, MP4_ReadBox_sample_soun, ATOM_stsd }, /* flip4mac */
{ ATOM_wma, MP4_ReadBox_sample_soun, ATOM_stsd }, /* ismv wmapro */
{ ATOM_Opus, MP4_ReadBox_sample_soun, ATOM_stsd }, { ATOM_Opus, MP4_ReadBox_sample_soun, ATOM_stsd },
/* Sound extensions */ /* Sound extensions */
{ ATOM_chan, MP4_ReadBox_stsdext_chan, 0 }, { ATOM_chan, MP4_ReadBox_stsdext_chan, 0 },
{ ATOM_WMA2, MP4_ReadBox_WMA2, ATOM_wave }, /* flip4mac */ { ATOM_WMA2, MP4_ReadBox_WMA2, ATOM_wave }, /* flip4mac */
{ ATOM_dOps, MP4_ReadBox_Binary, ATOM_Opus }, { ATOM_dOps, MP4_ReadBox_Binary, ATOM_Opus },
{ ATOM_wfex, MP4_ReadBox_WMA2, ATOM_wma }, /* ismv formatex */
{ ATOM_drmi, MP4_ReadBox_sample_vide, ATOM_stsd }, { ATOM_drmi, MP4_ReadBox_sample_vide, ATOM_stsd },
{ ATOM_vide, MP4_ReadBox_sample_vide, ATOM_stsd }, { ATOM_vide, MP4_ReadBox_sample_vide, ATOM_stsd },
......
...@@ -163,6 +163,7 @@ typedef int64_t stime_t; ...@@ -163,6 +163,7 @@ typedef int64_t stime_t;
#define ATOM_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' ) #define ATOM_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' )
#define ATOM_dvc1 VLC_FOURCC( 'd', 'v', 'c', '1' ) #define ATOM_dvc1 VLC_FOURCC( 'd', 'v', 'c', '1' )
#define ATOM_WMA2 VLC_FOURCC( 'W', 'M', 'A', '2' ) #define ATOM_WMA2 VLC_FOURCC( 'W', 'M', 'A', '2' )
#define ATOM_wma VLC_FOURCC( 'w', 'm', 'a', ' ' )
#define ATOM_enda VLC_FOURCC( 'e', 'n', 'd', 'a' ) #define ATOM_enda VLC_FOURCC( 'e', 'n', 'd', 'a' )
#define ATOM_gnre VLC_FOURCC( 'g', 'n', 'r', 'e' ) #define ATOM_gnre VLC_FOURCC( 'g', 'n', 'r', 'e' )
#define ATOM_trkn VLC_FOURCC( 't', 'r', 'k', 'n' ) #define ATOM_trkn VLC_FOURCC( 't', 'r', 'k', 'n' )
...@@ -216,6 +217,7 @@ typedef int64_t stime_t; ...@@ -216,6 +217,7 @@ typedef int64_t stime_t;
#define ATOM_dv5p VLC_FOURCC( 'd', 'v', '5', 'p' ) #define ATOM_dv5p VLC_FOURCC( 'd', 'v', '5', 'p' )
#define ATOM_raw VLC_FOURCC( 'r', 'a', 'w', ' ' ) #define ATOM_raw VLC_FOURCC( 'r', 'a', 'w', ' ' )
#define ATOM_dOps VLC_FOURCC( 'd', 'O', 'p', 's' ) #define ATOM_dOps VLC_FOURCC( 'd', 'O', 'p', 's' )
#define ATOM_wfex VLC_FOURCC( 'w', 'f', 'e', 'x' )
#define ATOM_jpeg VLC_FOURCC( 'j', 'p', 'e', 'g' ) #define ATOM_jpeg VLC_FOURCC( 'j', 'p', 'e', 'g' )
......
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