+ bo_addle_u32( &bo, i_header_ext_size - 46 );
+
+ /* extended stream properties */
+ for( i = 0; i < vlc_array_count( p_sys->p_tracks ); i++ )
+ {
+ const asf_track_t *p_track = vlc_array_item_at_index( p_sys->p_tracks, i );
+ const es_format_t *p_fmt = &p_track->fmt;
+
+ if( !p_track->b_extended )
+ continue;
+
+ uint64_t i_avg_duration = 0;
+ if( p_fmt->i_cat == VIDEO_ES &&
+ p_fmt->video.i_frame_rate > 0 && p_fmt->video.i_frame_rate_base > 0 )
+ i_avg_duration = ( INT64_C(10000000) * p_fmt->video.i_frame_rate_base +
+ p_fmt->video.i_frame_rate/2 ) / p_fmt->video.i_frame_rate;
+
+ bo_add_guid ( &bo, &asf_object_extended_stream_properties_guid );
+ bo_addle_u64( &bo, 88 );
+ bo_addle_u64( &bo, 0 );
+ bo_addle_u64( &bo, 0 );
+ bo_addle_u32( &bo, p_fmt->i_bitrate ); /* Bitrate */
+ bo_addle_u32( &bo, 0 ); /* Buffer size */
+ bo_addle_u32( &bo, 0 ); /* Initial buffer fullness */
+ bo_addle_u32( &bo, p_fmt->i_bitrate ); /* Alternate Bitrate */
+ bo_addle_u32( &bo, 0 ); /* Alternate Buffer size */
+ bo_addle_u32( &bo, 0 ); /* Alternate Initial buffer fullness */
+ bo_addle_u32( &bo, 0 ); /* Maximum object size (0 = unkown) */
+ bo_addle_u32( &bo, 0x02 ); /* Flags (seekable) */
+ bo_addle_u16( &bo, p_track->i_id ); /* Stream number */
+ bo_addle_u16( &bo, 0 ); /* Stream language index */
+ bo_addle_u64( &bo, i_avg_duration ); /* Average time per frame */
+ bo_addle_u16( &bo, 0 ); /* Stream name count */
+ bo_addle_u16( &bo, 0 ); /* Payload extension system count */
+ }
+
+ /* metadata object (part of header extension) */
+ if( i_cm_size )
+ {
+ unsigned int i_dst_num, i_dst_den;
+
+ asf_track_t *tk = NULL;
+ for( i = 0; i < vlc_array_count( p_sys->p_tracks ); i++ )
+ {
+ tk = vlc_array_item_at_index( p_sys->p_tracks, i );
+ if( tk->i_cat == VIDEO_ES &&
+ tk->fmt.video.i_sar_num != 0 &&
+ tk->fmt.video.i_sar_den != 0 )
+ break;
+ }
+ assert( tk != NULL );
+
+ vlc_ureduce( &i_dst_num, &i_dst_den,
+ tk->fmt.video.i_sar_num,
+ tk->fmt.video.i_sar_den, 0 );
+
+ msg_Dbg( p_mux, "pixel aspect-ratio: %i/%i", i_dst_num, i_dst_den );
+
+ bo_add_guid ( &bo, &asf_object_metadata_guid );
+ bo_addle_u64( &bo, i_cm_size );
+ bo_addle_u16( &bo, 2 ); /* description records count */
+ /* 1st description record */
+ bo_addle_u16( &bo, 0 ); /* reserved */
+ bo_addle_u16( &bo, tk->i_id ); /* stream number (0 for the whole file) */
+ bo_addle_u16( &bo, 2 * sizeof("AspectRatioX") ); /* name length */
+ bo_addle_u16( &bo, 0x3 /* DWORD */ ); /* data type */
+ bo_addle_u32( &bo, 4 ); /* data length */
+ bo_addle_str16_nosize( &bo, "AspectRatioX" );
+ bo_addle_u32( &bo, i_dst_num ); /* data */
+ /* 2nd description record */
+ bo_addle_u16( &bo, 0 ); /* reserved */
+ bo_addle_u16( &bo, tk->i_id ); /* stream number (0 for the whole file) */
+ bo_addle_u16( &bo, 2 * sizeof("AspectRatioY") ); /* name length */
+ bo_addle_u16( &bo, 0x3 /* DWORD */ ); /* data type */
+ bo_addle_u32( &bo, 4 ); /* data length */
+ bo_addle_str16_nosize( &bo, "AspectRatioY" );
+ bo_addle_u32( &bo, i_dst_den ); /* data */
+ }