1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Support address sanitizer for utest and fix some leaks. (#3242)

* MP4: Fix memory leak when error.

* Kernel: Support free global objects for utest.

* HTTP: Fix memory leak when error.

* MP4: Support more sample rate for audio.

* RTMP: Support free field for utest.

* UTest: Support address sanitizer.
This commit is contained in:
Winlin 2022-11-18 11:19:01 +08:00 committed by GitHub
parent be0241efdb
commit 368356c223
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 360 additions and 154 deletions

View file

@ -68,6 +68,61 @@ string srs_audio_codec_id2str(SrsAudioCodecId codec)
}
}
SrsAudioSampleRate srs_audio_sample_rate_from_number(uint32_t v)
{
if (v == 5512) return SrsAudioSampleRate5512;
if (v == 11025) return SrsAudioSampleRate11025;
if (v == 22050) return SrsAudioSampleRate22050;
if (v == 44100) return SrsAudioSampleRate44100;
if (v == 12000) return SrsAudioSampleRate12000;
if (v == 24000) return SrsAudioSampleRate24000;
if (v == 48000) return SrsAudioSampleRate48000;
if (v == 8000) return SrsAudioSampleRateNB8kHz;
if (v == 12000) return SrsAudioSampleRateMB12kHz;
if (v == 16000) return SrsAudioSampleRateWB16kHz;
if (v == 24000) return SrsAudioSampleRateSWB24kHz;
if (v == 48000) return SrsAudioSampleRateFB48kHz;
return SrsAudioSampleRateForbidden;
}
SrsAudioSampleRate srs_audio_sample_rate_guess_number(uint32_t v)
{
if (v >= 48000) return SrsAudioSampleRate48000;
if (v >= 44100) return SrsAudioSampleRate44100;
if (v >= 24000) return SrsAudioSampleRate24000;
if (v >= 24000) return SrsAudioSampleRate24000;
if (v >= 22050) return SrsAudioSampleRate22050;
if (v >= 16000) return SrsAudioSampleRateWB16kHz;
if (v >= 12000) return SrsAudioSampleRate12000;
if (v >= 8000) return SrsAudioSampleRateNB8kHz;
if (v >= 5512) return SrsAudioSampleRate5512;
return SrsAudioSampleRateForbidden;
}
uint32_t srs_audio_sample_rate2number(SrsAudioSampleRate v)
{
if (v == SrsAudioSampleRate5512) return 5512;
if (v == SrsAudioSampleRate11025) return 11025;
if (v == SrsAudioSampleRate22050) return 22050;
if (v == SrsAudioSampleRate44100) return 44100;
if (v == SrsAudioSampleRate12000) return 12000;
if (v == SrsAudioSampleRate24000) return 24000;
if (v == SrsAudioSampleRate48000) return 48000;
if (v == SrsAudioSampleRateNB8kHz) return 8000;
if (v == SrsAudioSampleRateMB12kHz) return 12000;
if (v == SrsAudioSampleRateWB16kHz) return 16000;
if (v == SrsAudioSampleRateSWB24kHz) return 24000;
if (v == SrsAudioSampleRateFB48kHz) return 48000;
return 0;
}
string srs_audio_sample_rate2str(SrsAudioSampleRate v)
{
switch (v) {

View file

@ -196,6 +196,11 @@ enum SrsAudioSampleRate
SrsAudioSampleRate11025 = 1,
SrsAudioSampleRate22050 = 2,
SrsAudioSampleRate44100 = 3,
// For MP4, extra sampling rate to FLV.
SrsAudioSampleRate12000 = 12,
SrsAudioSampleRate24000 = 24,
SrsAudioSampleRate48000 = 48,
// For Opus, support 8, 12, 16, 24, 48KHz
// We will write a UINT8 sampling rate after FLV audio tag header.
@ -206,6 +211,9 @@ enum SrsAudioSampleRate
SrsAudioSampleRateSWB24kHz = 24, // SWB (super-wideband)
SrsAudioSampleRateFB48kHz = 48, // FB (fullband)
};
SrsAudioSampleRate srs_audio_sample_rate_from_number(uint32_t v);
SrsAudioSampleRate srs_audio_sample_rate_guess_number(uint32_t v);
uint32_t srs_audio_sample_rate2number(SrsAudioSampleRate v);
std::string srs_audio_sample_rate2str(SrsAudioSampleRate v);
/**

View file

@ -5237,6 +5237,8 @@ srs_error_t SrsMp4BoxReader::read(SrsSimpleStream* stream, SrsMp4Box** ppbox)
srs_error_t err = srs_success;
SrsMp4Box* box = NULL;
SrsAutoFree(SrsMp4Box, box);
while (true) {
// For the first time to read the box, maybe it's a basic box which is only 4bytes header.
// When we disconvery the real box, we know the size of the whole box, then read again and decode it.
@ -5277,10 +5279,9 @@ srs_error_t SrsMp4BoxReader::read(SrsSimpleStream* stream, SrsMp4Box** ppbox)
continue;
}
if (err != srs_success) {
srs_freep(box);
} else {
if (err == srs_success) {
*ppbox = box;
box = NULL;
}
break;
@ -5352,6 +5353,7 @@ srs_error_t SrsMp4Decoder::initialize(ISrsReadSeeker* rs)
while (true) {
SrsMp4Box* box = NULL;
SrsAutoFree(SrsMp4Box, box);
if ((err = load_next_box(&box, 0)) != srs_success) {
return srs_error_wrap(err, "load box");
@ -5375,8 +5377,6 @@ srs_error_t SrsMp4Decoder::initialize(ISrsReadSeeker* rs)
}
break;
}
srs_freep(box);
}
if (brand == SrsMp4BoxBrandForbidden) {
@ -5508,14 +5508,8 @@ srs_error_t SrsMp4Decoder::parse_moov(SrsMp4MovieBox* moov)
SrsMp4AudioSampleEntry* mp4a = soun? soun->mp4a():NULL;
if (mp4a) {
uint32_t sr = mp4a->samplerate>>16;
if (sr >= 44100) {
sample_rate = SrsAudioSampleRate44100;
} else if (sr >= 22050) {
sample_rate = SrsAudioSampleRate22050;
} else if (sr >= 11025) {
sample_rate = SrsAudioSampleRate11025;
} else {
sample_rate = SrsAudioSampleRate5512;
if ((sample_rate = srs_audio_sample_rate_from_number(sr)) == SrsAudioSampleRateForbidden) {
sample_rate = srs_audio_sample_rate_guess_number(sr);
}
if (mp4a->samplesize == 16) {
@ -5580,16 +5574,17 @@ srs_error_t SrsMp4Decoder::load_next_box(SrsMp4Box** ppbox, uint32_t required_bo
while (true) {
SrsMp4Box* box = NULL;
SrsAutoFree(SrsMp4Box, box);
if ((err = do_load_next_box(&box, required_box_type)) != srs_success) {
srs_freep(box);
return srs_error_wrap(err, "load box");
}
if (!required_box_type || (uint32_t)box->type == required_box_type) {
*ppbox = box;
box = NULL;
break;
}
srs_freep(box);
}
return err;
@ -5938,7 +5933,7 @@ srs_error_t SrsMp4Encoder::flush()
SrsMp4AudioSampleEntry* mp4a = new SrsMp4AudioSampleEntry();
mp4a->data_reference_index = 1;
mp4a->samplerate = uint32_t(srs_flv_srates[sample_rate]) << 16;
mp4a->samplerate = srs_audio_sample_rate2number(sample_rate);
if (sound_bits == SrsAudioSampleBits16bit) {
mp4a->samplesize = 16;
} else {
@ -6101,7 +6096,7 @@ SrsMp4ObjectType SrsMp4Encoder::get_audio_object_type()
case SrsAudioCodecIdAAC:
return SrsMp4ObjectTypeAac;
case SrsAudioCodecIdMP3:
return (srs_flv_srates[sample_rate] > 24000) ? SrsMp4ObjectTypeMp1a : SrsMp4ObjectTypeMp3; // 11172 - 3
return (srs_audio_sample_rate2number(sample_rate) > 24000) ? SrsMp4ObjectTypeMp1a : SrsMp4ObjectTypeMp3; // 11172 - 3
default:
return SrsMp4ObjectTypeForbidden;
}