@@ -118,17 +118,19 @@ bool AudioDecoder::decodeNextFrame(Frame& frameBuffer)
118
118
119
119
bool AudioDecoder::decodeNextFrame (Frame& frameBuffer, const std::vector<size_t > channelIndexArray)
120
120
{
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
-
128
121
AVCodecContext& avCodecContext = _inputStream->getAudioCodec ().getAVCodecContext ();
129
122
const size_t srcNbChannels = avCodecContext.channels ;
130
123
const size_t bytePerSample = av_get_bytes_per_sample ((AVSampleFormat)frameBuffer.getAVFrame ().format );
131
124
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
+
132
134
const int dstNbChannels = 1 ;
133
135
const int noAlignment = 0 ;
134
136
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>
153
155
}
154
156
155
157
// copy frame properties of decoded frame
158
+ AudioFrame& audioBuffer = static_cast <AudioFrame&>(frameBuffer);
156
159
audioBuffer.copyProperties (allDataOfNextFrame);
157
160
av_frame_set_channels (&audioBuffer.getAVFrame (), channelIndexArray.size ());
158
161
av_frame_set_channel_layout (&audioBuffer.getAVFrame (), av_get_default_channel_layout (channelIndexArray.size ()));
0 commit comments