diff --git a/src/audioDecoder.cc b/src/audioDecoder.cc index 742a908..ce547c7 100644 --- a/src/audioDecoder.cc +++ b/src/audioDecoder.cc @@ -34,24 +34,20 @@ int RequestAudioFrame(AudioParam& param, uint8_t* audioBuffer, int bufSize) return -1; } - if (frame->channels > 0 && frame->channel_layout == 0) { - frame->channel_layout = av_get_default_channel_layout(frame->channels); - } - else if (frame->channels == 0 && frame->channel_layout > 0) { - frame->channels = av_get_channel_layout_nb_channels(frame->channel_layout); + if (frame->ch_layout.nb_channels > 0) { + av_channel_layout_default(&frame->ch_layout, frame->ch_layout.nb_channels); } - AVSampleFormat dstFormat = AV_SAMPLE_FMT_S16; - uint64_t dstLayout = av_get_default_channel_layout(frame->channels); - swrCtx = swr_alloc_set_opts(nullptr, dstLayout, dstFormat, frame->sample_rate, frame->channel_layout, (AVSampleFormat)frame->format, frame->sample_rate, 0, nullptr); + constexpr AVSampleFormat dstFormat = AV_SAMPLE_FMT_S16; + swr_alloc_set_opts2(&swrCtx, &frame->ch_layout, dstFormat, frame->sample_rate, &frame->ch_layout, static_cast(frame->format), frame->sample_rate, 0, nullptr); if (!swrCtx || swr_init(swrCtx) < 0) { av_frame_unref(frame); return -1; - } + } - uint64_t dstNbSamples = av_rescale_rnd(swr_get_delay(swrCtx, frame->sample_rate) + frame->nb_samples, frame->sample_rate, frame->sample_rate, AVRounding(1)); - int nb = swr_convert(swrCtx, &audioBuffer, dstNbSamples, const_cast(frame->data), frame->nb_samples); - dataSize = frame->channels * nb * av_get_bytes_per_sample(dstFormat); + const uint64_t dstNbSamples = av_rescale_rnd(swr_get_delay(swrCtx, frame->sample_rate) + frame->nb_samples, frame->sample_rate, frame->sample_rate, static_cast(1)); + const int nb = swr_convert(swrCtx, &audioBuffer, static_cast(dstNbSamples), const_cast(frame->data), frame->nb_samples); + dataSize = frame->ch_layout.nb_channels * nb * av_get_bytes_per_sample(dstFormat); av_frame_free(&frame); swr_free(&swrCtx); return dataSize; @@ -60,13 +56,11 @@ int RequestAudioFrame(AudioParam& param, uint8_t* audioBuffer, int bufSize) void audioCallback(void* userdata, uint8_t* stream, int len) { AudioParam* param = static_cast(userdata); SDL_memset(stream, 0, len); - int audioSize = 0; - int len1 = 0; while (len > 0) { if (param->bufferIndex >= param->bufferSize) { - audioSize = RequestAudioFrame(*param, param->buffer, sizeof(param->buffer)); + const int audioSize = RequestAudioFrame(*param, param->buffer, sizeof(param->buffer)); if (audioSize < 0) { param->bufferSize = 0; @@ -78,7 +72,7 @@ void audioCallback(void* userdata, uint8_t* stream, int len) { } param->bufferIndex = 0; } - len1 = param->bufferSize - param->bufferIndex; + int len1 = static_cast(param->bufferSize - param->bufferIndex); if (len1 > len) len1 = len; @@ -100,7 +94,6 @@ void RequestAudioPacket(MediaParam& param) { std::this_thread::sleep_for(100ms); continue; } - //FIX: const int ret = av_read_frame(fmtCtx, packet); if (param.audioParam.eof) { std::this_thread::sleep_for(100ms);