Skip to content

Commit eb1e9af

Browse files
author
Clement Champetier
committed
AudioDecoder: improved perf if all channels of the stream are extracted
This is the common case of the audio decoding.
1 parent b022bfb commit eb1e9af

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

src/AvTranscoder/decoder/AudioDecoder.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,17 +118,19 @@ bool AudioDecoder::decodeNextFrame(Frame& frameBuffer)
118118

119119
bool AudioDecoder::decodeNextFrame(Frame& frameBuffer, const std::vector<size_t> channelIndexArray)
120120
{
121-
AudioFrame& audioBuffer = static_cast<AudioFrame&>(frameBuffer);
122-
123-
// decode all data of the next frame
124-
AudioFrame allDataOfNextFrame(audioBuffer);
125-
if(!decodeNextFrame(allDataOfNextFrame))
126-
return false;
127-
128121
AVCodecContext& avCodecContext = _inputStream->getAudioCodec().getAVCodecContext();
129122
const size_t srcNbChannels = avCodecContext.channels;
130123
const size_t bytePerSample = av_get_bytes_per_sample((AVSampleFormat)frameBuffer.getAVFrame().format);
131124

125+
// if all channels of the stream are extracted
126+
if(srcNbChannels == channelIndexArray.size())
127+
return decodeNextFrame(frameBuffer);
128+
129+
// else decode all data in an intermediate buffer
130+
AudioFrame allDataOfNextFrame(frameBuffer);
131+
if(!decodeNextFrame(allDataOfNextFrame))
132+
return false;
133+
132134
const int dstNbChannels = 1;
133135
const int noAlignment = 0;
134136
const size_t decodedSize = av_samples_get_buffer_size(NULL, dstNbChannels, frameBuffer.getAVFrame().nb_samples,
@@ -153,6 +155,7 @@ bool AudioDecoder::decodeNextFrame(Frame& frameBuffer, const std::vector<size_t>
153155
}
154156

155157
// copy frame properties of decoded frame
158+
AudioFrame& audioBuffer = static_cast<AudioFrame&>(frameBuffer);
156159
audioBuffer.copyProperties(allDataOfNextFrame);
157160
av_frame_set_channels(&audioBuffer.getAVFrame(), channelIndexArray.size());
158161
av_frame_set_channel_layout(&audioBuffer.getAVFrame(), av_get_default_channel_layout(channelIndexArray.size()));

0 commit comments

Comments
 (0)