/* display size only ! */
int i_width;
int i_height;
+ float f_rotation;
/* more internal data */
uint64_t i_timescale; /* time scale for this track only */
p_pasp = MP4_BoxGet( p_sample, "pasp" );
- if( p_track->fmt.i_cat == AUDIO_ES && ( p_track->i_sample_size == 1 || p_track->i_sample_size == 2 ) )
- {
- MP4_Box_data_sample_soun_t *p_soun;
-
- p_soun = p_sample->data.p_sample_soun;
-
- if( p_soun->i_qt_version == 0 )
- {
- switch( p_sample->i_type )
- {
- case VLC_FOURCC( 'i', 'm', 'a', '4' ):
- p_soun->i_qt_version = 1;
- p_soun->i_sample_per_packet = 64;
- p_soun->i_bytes_per_packet = 34;
- p_soun->i_bytes_per_frame = 34 * p_soun->i_channelcount;
- p_soun->i_bytes_per_sample = 2;
- break;
- case VLC_FOURCC( 'M', 'A', 'C', '3' ):
- p_soun->i_qt_version = 1;
- p_soun->i_sample_per_packet = 6;
- p_soun->i_bytes_per_packet = 2;
- p_soun->i_bytes_per_frame = 2 * p_soun->i_channelcount;
- p_soun->i_bytes_per_sample = 2;
- break;
- case VLC_FOURCC( 'M', 'A', 'C', '6' ):
- p_soun->i_qt_version = 1;
- p_soun->i_sample_per_packet = 12;
- p_soun->i_bytes_per_packet = 2;
- p_soun->i_bytes_per_frame = 2 * p_soun->i_channelcount;
- p_soun->i_bytes_per_sample = 2;
- break;
- case VLC_FOURCC( 'a', 'l', 'a', 'w' ):
- case VLC_FOURCC( 'u', 'l', 'a', 'w' ):
- p_soun->i_samplesize = 8;
- p_track->i_sample_size = p_soun->i_channelcount;
- break;
- case VLC_FOURCC( 'N', 'O', 'N', 'E' ):
- case VLC_FOURCC( 'r', 'a', 'w', ' ' ):
- case VLC_FOURCC( 't', 'w', 'o', 's' ):
- case VLC_FOURCC( 's', 'o', 'w', 't' ):
- /* What would be the fun if you could trust the .mov */
- p_track->i_sample_size = ((p_soun->i_samplesize+7)/8) * p_soun->i_channelcount;
- break;
- default:
- break;
- }
-
- }
- else if( p_soun->i_qt_version == 1 && p_soun->i_sample_per_packet <= 0 )
- {
- p_soun->i_qt_version = 0;
- }
- }
- else if( p_track->fmt.i_cat == AUDIO_ES && p_sample->data.p_sample_soun->i_qt_version == 1 )
- {
- MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun;
-
- switch( p_sample->i_type )
- {
- case( VLC_FOURCC( '.', 'm', 'p', '3' ) ):
- case( VLC_FOURCC( 'm', 's', 0x00, 0x55 ) ):
- {
- if( p_track->i_sample_size > 1 )
- p_soun->i_qt_version = 0;
- break;
- }
- case( VLC_FOURCC( 'a', 'c', '-', '3' ) ):
- case( VLC_FOURCC( 'e', 'c', '-', '3' ) ):
- case( VLC_FOURCC( 'm', 's', 0x20, 0x00 ) ):
- p_soun->i_qt_version = 0;
- break;
- default:
- break;
- }
- }
-
/* */
switch( p_track->fmt.i_cat )
{
p_track, i_sample_description_index, i_chunk );
p_demux->p_sys->f_fps = (float)p_track->fmt.video.i_frame_rate /
(float)p_track->fmt.video.i_frame_rate_base;
+
+ /* Rotation */
+ switch( (int)p_track->f_rotation ) {
+ case 90:
+ p_track->fmt.video.orientation = ORIENT_ROTATED_90;
+ break;
+ case 180:
+ p_track->fmt.video.orientation = ORIENT_ROTATED_180;
+ break;
+ case 270:
+ p_track->fmt.video.orientation = ORIENT_ROTATED_270;
+ break;
+ }
+
break;
case AUDIO_ES:
p_track->fmt.audio.i_bitspersample =
p_sample->data.p_sample_soun->i_samplesize;
+ if( ( p_track->i_sample_size == 1 || p_track->i_sample_size == 2 ) )
+ {
+ MP4_Box_data_sample_soun_t *p_soun;
+ p_soun = p_sample->data.p_sample_soun;
+
+ if( p_soun->i_qt_version == 0 )
+ {
+ switch( p_sample->i_type )
+ {
+ case VLC_FOURCC( 'i', 'm', 'a', '4' ):
+ p_soun->i_qt_version = 1;
+ p_soun->i_sample_per_packet = 64;
+ p_soun->i_bytes_per_packet = 34;
+ p_soun->i_bytes_per_frame = 34 * p_soun->i_channelcount;
+ p_soun->i_bytes_per_sample = 2;
+ break;
+ case VLC_FOURCC( 'M', 'A', 'C', '3' ):
+ p_soun->i_qt_version = 1;
+ p_soun->i_sample_per_packet = 6;
+ p_soun->i_bytes_per_packet = 2;
+ p_soun->i_bytes_per_frame = 2 * p_soun->i_channelcount;
+ p_soun->i_bytes_per_sample = 2;
+ break;
+ case VLC_FOURCC( 'M', 'A', 'C', '6' ):
+ p_soun->i_qt_version = 1;
+ p_soun->i_sample_per_packet = 12;
+ p_soun->i_bytes_per_packet = 2;
+ p_soun->i_bytes_per_frame = 2 * p_soun->i_channelcount;
+ p_soun->i_bytes_per_sample = 2;
+ break;
+ case VLC_FOURCC( 'a', 'l', 'a', 'w' ):
+ case VLC_FOURCC( 'u', 'l', 'a', 'w' ):
+ p_soun->i_samplesize = 8;
+ p_track->i_sample_size = p_soun->i_channelcount;
+ break;
+ case VLC_FOURCC( 'N', 'O', 'N', 'E' ):
+ case VLC_FOURCC( 'r', 'a', 'w', ' ' ):
+ case VLC_FOURCC( 't', 'w', 'o', 's' ):
+ case VLC_FOURCC( 's', 'o', 'w', 't' ):
+ /* What would be the fun if you could trust the .mov */
+ p_track->i_sample_size = ((p_soun->i_samplesize+7)/8) * p_soun->i_channelcount;
+ break;
+ default:
+ break;
+ }
+
+ }
+ else if( p_soun->i_qt_version == 1 && p_soun->i_sample_per_packet <= 0 )
+ {
+ p_soun->i_qt_version = 0;
+ }
+ }
+ else if( p_sample->data.p_sample_soun->i_qt_version == 1 )
+ {
+ MP4_Box_data_sample_soun_t *p_soun = p_sample->data.p_sample_soun;
+
+ switch( p_sample->i_type )
+ {
+ case( VLC_FOURCC( '.', 'm', 'p', '3' ) ):
+ case( VLC_FOURCC( 'm', 's', 0x00, 0x55 ) ):
+ {
+ if( p_track->i_sample_size > 1 )
+ p_soun->i_qt_version = 0;
+ break;
+ }
+ case( VLC_FOURCC( 'a', 'c', '-', '3' ) ):
+ case( VLC_FOURCC( 'e', 'c', '-', '3' ) ):
+ case( VLC_FOURCC( 'm', 's', 0x20, 0x00 ) ):
+ p_soun->i_qt_version = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
if( p_track->i_sample_size != 0 &&
- p_sample->data.p_sample_soun->i_qt_version == 1 && p_sample->data.p_sample_soun->i_sample_per_packet <= 0 )
+ p_sample->data.p_sample_soun->i_qt_version == 1 &&
+ p_sample->data.p_sample_soun->i_sample_per_packet <= 0 )
{
msg_Err( p_demux, "Invalid sample per packet value for qt_version 1" );
return VLC_EGENERIC;
p_track->fmt.i_codec = VLC_FOURCC( 'M','J','2','C' );
break;
case( 0xa3 ): /* vc1 */
- p_track->fmt.i_codec = VLC_FOURCC( 'W','V','C','1' );
+ p_track->fmt.i_codec = VLC_CODEC_VC1;
break;
case( 0xa4 ):
p_track->fmt.i_codec = VLC_CODEC_DIRAC;
}
break;
+ case VLC_FOURCC( 'v', 'c', '-', '1' ):
+ {
+ MP4_Box_t *p_dvc1 = MP4_BoxGet( p_sample, "dvc1" );
+ if( p_dvc1 )
+ {
+ p_track->fmt.i_extra = p_dvc1->data.p_dvc1->i_vc1;
+ if( p_track->fmt.i_extra > 0 )
+ {
+ p_track->fmt.p_extra = malloc( p_dvc1->data.p_dvc1->i_vc1 );
+ memcpy( p_track->fmt.p_extra, p_dvc1->data.p_dvc1->p_vc1,
+ p_track->fmt.i_extra );
+ }
+ }
+ else
+ {
+ msg_Err( p_demux, "missing dvc1" );
+ }
+ break;
+ }
+
/* avc1: send avcC (h264 without annexe B, ie without start code)*/
case VLC_FOURCC( 'a', 'v', 'c', '1' ):
{
break;
default:
+ msg_Dbg( p_demux, "Unrecognized FourCC %4.4s", (char *)&p_sample->i_type );
break;
}
}
p_track->i_track_ID = p_tkhd->data.p_tkhd->i_track_ID;
p_track->i_width = p_tkhd->data.p_tkhd->i_width / 65536;
p_track->i_height = p_tkhd->data.p_tkhd->i_height / 65536;
+ p_track->f_rotation = p_tkhd->data.p_tkhd->f_rotation;
if( p_tref )
{