--- stream/asf_mmst_streaming.c 2009-03-20 09:06:31.000000000 +0100 +++ stream/asf_mmst_streaming.c.ultimo_riferimento3 2009-03-20 09:04:44.000000000 +0100 @@ -84,6 +84,7 @@ ASFtype stream_type[MAX_STREAMS]; uint32_t stream_bitrates[MAX_STREAMS]; uint32_t packet_size; + uint64_t preroll; int audio_id, video_id; }; @@ -324,6 +325,16 @@ } } +static void adjust_prebuffer_size(streaming_ctrl_t *streaming_ctrl) +{ + struct asf_mms_streaming_ctrl *mms_ctrl = streaming_ctrl->data; + uint32_t max_bitrate = mms_ctrl->stream_bitrates[mms_ctrl->audio_id]; + max_bitrate += mms_ctrl->stream_bitrates[mms_ctrl->video_id]; + + if (max_bitrate) + streaming_ctrl->prebuffer_size = (unsigned int)((mms_ctrl->preroll / 1000.0) * (max_bitrate / 8.0)); +} + static int interp_header (uint8_t *header, int len, streaming_ctrl_t *streaming_ctrl) { struct asf_mms_streaming_ctrl *mms_ctrl = streaming_ctrl->data; @@ -335,6 +346,8 @@ pos += sizeof(ASF_file_header_t); if (pos > len) goto len_err_out; mms_ctrl->packet_size = (uint32_t) AV_RL32(&file_properties->max_packet_size); + mms_ctrl->preroll = file_properties->preroll; + streaming_ctrl->prebuffer_size = (unsigned int)((file_properties->preroll / 1000.0) * (file_properties->max_bitrate / 8.0)); } else { mp_msg(MSGT_NETWORK, MSGL_FATAL, "File properties object in ASF header not found, exiting.\n"); @@ -667,6 +680,8 @@ } } + adjust_prebuffer_size(stream->streaming_ctrl); + for (i = 1; i < MAX_STREAMS; i++) { if (mms_ctrl->stream_type[i] != ASF_NO_STREAM) { num_stream_ids++;