From e656b0b464f5649688fc722f1238013b040d28e2 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sun, 24 Aug 2003 22:20:43 +0000 Subject: [PATCH] * asf: more stuff (bitrate and time). --- modules/mux/asf.c | 61 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/modules/mux/asf.c b/modules/mux/asf.c index cd64fc1b47..f254c866bb 100644 --- a/modules/mux/asf.c +++ b/modules/mux/asf.c @@ -2,7 +2,7 @@ * asf.c ***************************************************************************** * Copyright (C) 2003 VideoLAN - * $Id: asf.c,v 1.1 2003/08/24 16:38:38 fenrir Exp $ + * $Id: asf.c,v 1.2 2003/08/24 22:20:43 fenrir Exp $ * * Authors: Laurent Aimar * @@ -77,6 +77,8 @@ struct sout_mux_sys_t int i_packet_size; int64_t i_packet_count; mtime_t i_dts_first; + mtime_t i_dts_last; + int64_t i_bitrate; int i_track; asf_track_t track[128]; @@ -128,9 +130,11 @@ static int Open( vlc_object_t *p_this ) p_mux->p_sys = p_sys = malloc( sizeof( sout_mux_sys_t ) ); p_sys->pk = NULL; - p_sys->i_pk_used = 0; - p_sys->i_pk_frame = 0; - p_sys->i_dts_first = -1; + p_sys->i_pk_used = 0; + p_sys->i_pk_frame = 0; + p_sys->i_dts_first = -1; + p_sys->i_dts_last = 0; + p_sys->i_bitrate = 0; p_sys->b_write_header = VLC_TRUE; p_sys->i_track = 1; @@ -271,8 +275,19 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) bo_addle_u16( &bo, i_blockalign ); bo_addle_u16( &bo, i_bitspersample ); bo_addle_u16( &bo, p_input->p_fmt->i_extra_data ); - bo_add_mem ( &bo, p_input->p_fmt->p_extra_data, - p_input->p_fmt->i_extra_data ); + if( p_input->p_fmt->i_extra_data > 0 ) + { + bo_add_mem ( &bo, p_input->p_fmt->p_extra_data, + p_input->p_fmt->i_extra_data ); + } + if( p_input->p_fmt->i_bitrate > 24000 ) + { + p_sys->i_bitrate += p_input->p_fmt->i_bitrate; + } + else + { + p_sys->i_bitrate += 512000; + } break; } case VIDEO_ES: @@ -309,8 +324,13 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input ) bo_addle_u32( &bo, 0 ); bo_addle_u32( &bo, 0 ); bo_addle_u32( &bo, 0 ); - bo_add_mem ( &bo, p_input->p_fmt->p_extra_data, - p_input->p_fmt->i_extra_data ); + if( p_input->p_fmt->i_extra_data > 0 ) + { + bo_add_mem ( &bo, p_input->p_fmt->p_extra_data, + p_input->p_fmt->i_extra_data ); + } + + p_sys->i_bitrate += 2000000; break; } default: @@ -367,6 +387,10 @@ static int Mux ( sout_mux_t *p_mux ) { p_sys->i_dts_first = i_dts; } + if( p_sys->i_dts_last < i_dts ) + { + p_sys->i_dts_last = i_dts; + } p_input = p_mux->pp_inputs[i_stream]; tk = (asf_track_t*)p_input->p_sys; @@ -571,11 +595,21 @@ static sout_buffer_t *asf_header_create( sout_mux_t *p_mux, sout_mux_sys_t *p_sys = p_mux->p_sys; asf_track_t *tk; + mtime_t i_duration = 0; int i_size; sout_buffer_t *out; bo_t bo; int i; + if( p_sys->i_dts_first > 0 ) + { + i_duration = p_sys->i_dts_last - p_sys->i_dts_first; + if( i_duration < 0 ) + { + i_duration = 0; + } + } + /* calculate header size */ i_size = 30 + 104 + 46; for( i = 1; i < p_sys->i_track; i++ ) @@ -600,15 +634,15 @@ static sout_buffer_t *asf_header_create( sout_mux_t *p_mux, bo_add_guid ( &bo, &p_sys->fid ); bo_addle_u64( &bo, i_size + p_sys->i_packet_count * p_sys->i_packet_size ); /* file size */ - bo_addle_u64( &bo, 0 ); /* creation date */ + bo_addle_u64( &bo, 0 ); /* creation date */ bo_addle_u64( &bo, p_sys->i_packet_count ); - bo_addle_u64( &bo, 0 ) ; /* play duration */ - bo_addle_u64( &bo, 0 ); /* send duration */ - bo_addle_u64( &bo, 10000 ); /* preroll duration */ + bo_addle_u64( &bo, i_duration * 10 ); /* play duration (100ns) */ + bo_addle_u64( &bo, i_duration * 10 ); /* send duration (100ns) */ + bo_addle_u64( &bo, 10000 ); /* preroll duration (ms) */ bo_addle_u32( &bo, b_broadcast ? 0x01 : 0x00); /* flags */ bo_addle_u32( &bo, p_sys->i_packet_size ); /* packet size min */ bo_addle_u32( &bo, p_sys->i_packet_size ); /* packet size max */ - bo_addle_u32( &bo, 0 ); /* maxbitrate */ + bo_addle_u32( &bo, p_sys->i_bitrate ); /* maxbitrate */ /* header extention */ bo_add_guid ( &bo, &asf_object_header_extention_guid ); @@ -731,4 +765,3 @@ static sout_buffer_t *asf_packet_create( sout_mux_t *p_mux, } - -- 2.20.1