Commit d8470737 authored by Zuxy Meng's avatar Zuxy Meng Committed by Benoit Fouet

use asf stream information to set bitrate

patch by Zuxy Meng zuxy dot meng chez gmail tod com
reference thread: [Ffmpeg-devel] Third Try: Set bit_rate for asf format

Originally committed as revision 8861 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 7af636d4
......@@ -145,8 +145,10 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
int size, i;
int64_t gsize;
AVRational dar[128];
uint32_t bitrate[128];
memset(dar, 0, sizeof(dar));
memset(bitrate, 0, sizeof(bitrate));
get_guid(pb, &g);
if (memcmp(&g, &asf_header, sizeof(GUID)))
......@@ -421,13 +423,13 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
}
} else if (!memcmp(&g, &ext_stream_header, sizeof(GUID))) {
int ext_len, payload_ext_ct, stream_ct;
uint32_t ext_d;
uint32_t ext_d, leak_rate, stream_num;
int64_t pos_ex_st;
pos_ex_st = url_ftell(pb);
get_le64(pb); // starttime
get_le64(pb); // endtime
get_le32(pb); // leak-datarate
leak_rate = get_le32(pb); // leak-datarate
get_le32(pb); // bucket-datasize
get_le32(pb); // init-bucket-fullness
get_le32(pb); // alt-leak-datarate
......@@ -435,12 +437,15 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
get_le32(pb); // alt-init-bucket-fullness
get_le32(pb); // max-object-size
get_le32(pb); // flags (reliable,seekable,no_cleanpoints?,resend-live-cleanpoints, rest of bits reserved)
get_le16(pb); // stream-num
stream_num = get_le16(pb); // stream-num
get_le16(pb); // stream-language-id-index
get_le64(pb); // avg frametime in 100ns units
stream_ct = get_le16(pb); //stream-name-count
payload_ext_ct = get_le16(pb); //payload-extension-system-count
if (stream_num < 128)
bitrate[stream_num] = leak_rate;
for (i=0; i<stream_ct; i++){
get_le16(pb);
ext_len = get_le16(pb);
......@@ -504,8 +509,11 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
for(i=0; i<128; i++){
int stream_num= asf->asfid2avid[i];
if(stream_num>=0 && dar[i].num>0 && dar[i].den>0){
if(stream_num>=0){
AVCodecContext *codec= s->streams[stream_num]->codec;
if (!codec->bit_rate)
codec->bit_rate = bitrate[i];
if (dar[i].num > 0 && dar[i].den > 0)
av_reduce(&codec->sample_aspect_ratio.num,
&codec->sample_aspect_ratio.den,
dar[i].num, dar[i].den, INT_MAX);
......
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