Updated vgmstream to fix a crash

CQTexperiment
Chris Moeller 2015-02-13 16:58:18 -08:00
parent 739af5e36a
commit 1503ece011
1 changed files with 77 additions and 12 deletions

View File

@ -3308,9 +3308,68 @@ fail:
return; return;
} }
static int get_vgmstream_channel_average_bitrate(VGMSTREAMCHANNEL * channel, int sample_rate, int length_samples) static int get_vgmstream_channel_count(VGMSTREAM * vgmstream)
{ {
return (int)((int64_t)get_streamfile_size(channel->streamfile) * 8 * sample_rate / length_samples); if (vgmstream->layout_type==layout_scd_int) {
scd_int_codec_data *data = vgmstream->codec_data;
if (data) {
return data->substream_count;
}
else {
return 0;
}
}
#ifdef VGM_USE_VORBIS
if (vgmstream->coding_type==coding_ogg_vorbis) {
ogg_vorbis_codec_data *data = vgmstream->codec_data;
if (data) {
return 1;
}
else {
return 0;
}
}
#endif
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
if (vgmstream->coding_type==coding_MP4_AAC) {
mp4_aac_codec_data *data = vgmstream->codec_data;
if (data) {
return 1;
}
else {
return 0;
}
}
#endif
return vgmstream->channels;
}
static STREAMFILE * get_vgmstream_streamfile(VGMSTREAM * vgmstream, int channel)
{
if (vgmstream->layout_type==layout_scd_int) {
scd_int_codec_data *data = vgmstream->codec_data;
return data->intfiles[channel];
}
#ifdef VGM_USE_VORBIS
if (vgmstream->coding_type==coding_ogg_vorbis) {
ogg_vorbis_codec_data *data = vgmstream->codec_data;
return data->ov_streamfile.streamfile;
}
#endif
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
if (vgmstream->coding_type==coding_MP4_AAC) {
mp4_aac_codec_data *data = vgmstream->codec_data;
return data->if_file.streamfile;
}
#endif
return vgmstream->ch[channel].streamfile;
}
static int get_vgmstream_channel_average_bitrate(STREAMFILE * streamfile, int sample_rate, int length_samples)
{
return (int)((int64_t)get_streamfile_size(streamfile) * 8 * sample_rate / length_samples);
} }
int get_vgmstream_average_bitrate(VGMSTREAM * vgmstream) int get_vgmstream_average_bitrate(VGMSTREAM * vgmstream)
@ -3322,27 +3381,33 @@ int get_vgmstream_average_bitrate(VGMSTREAM * vgmstream)
int bitrate = 0; int bitrate = 0;
int sample_rate = vgmstream->sample_rate; int sample_rate = vgmstream->sample_rate;
int length_samples = vgmstream->num_samples; int length_samples = vgmstream->num_samples;
int channels = get_vgmstream_channel_count(vgmstream);
STREAMFILE * streamFile;
if (vgmstream->channels >= 1) if (channels >= 1) {
bitrate += get_vgmstream_channel_average_bitrate(&vgmstream->ch[0], sample_rate, length_samples); streamFile = get_vgmstream_streamfile(vgmstream, 0);
if (streamFile) {
bitrate += get_vgmstream_channel_average_bitrate(streamFile, sample_rate, length_samples);
}
}
for (i = 1; i < vgmstream->channels; ++i) for (i = 1; i < channels; ++i)
{ {
VGMSTREAMCHANNEL * ch = &vgmstream->ch[i]; streamFile = get_vgmstream_streamfile(vgmstream, i);
if (!ch->streamfile) if (!streamFile)
continue; continue;
ch->streamfile->get_name(ch->streamfile, path_current, sizeof(path_current)); streamFile->get_name(streamFile, path_current, sizeof(path_current));
for (j = 0; j < i; ++j) for (j = 0; j < i; ++j)
{ {
VGMSTREAMCHANNEL * chc = &vgmstream->ch[j]; STREAMFILE * compareFile = get_vgmstream_streamfile(vgmstream, j);
if (!chc->streamfile) if (!compareFile)
continue; continue;
chc->streamfile->get_name(chc->streamfile, path_compare, sizeof(path_compare)); streamFile->get_name(compareFile, path_compare, sizeof(path_compare));
if (!strcmp(path_current, path_compare)) if (!strcmp(path_current, path_compare))
break; break;
} }
if (j == i) if (j == i)
bitrate += get_vgmstream_channel_average_bitrate(ch, sample_rate, length_samples); bitrate += get_vgmstream_channel_average_bitrate(streamFile, sample_rate, length_samples);
} }
return bitrate; return bitrate;