Skip to content

Commit 86e8a4b

Browse files
adding method to get demux audio data channels
1 parent b6e449d commit 86e8a4b

File tree

2 files changed

+63
-22
lines changed

2 files changed

+63
-22
lines changed

src/AvTranscoder/InputStreamAudio.cpp

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extern "C" {
99
#include <libavformat/avformat.h>
1010
#include <libavutil/avutil.h>
1111
#include <libavutil/pixdesc.h>
12+
#include <libavutil/channel_layout.h>
1213
}
1314

1415
#include "AvInputStream.hpp"
@@ -20,7 +21,7 @@ namespace avtranscoder
2021
{
2122

2223
InputStreamAudio::InputStreamAudio( AvInputStream& inputStream )
23-
: InputStreamReader::InputStreamReader( inputStream )
24+
: InputStreamReader( inputStream )
2425
, _inputStream ( &inputStream )
2526
, _codec ( NULL )
2627
, _codecContext ( NULL )
@@ -107,7 +108,62 @@ void InputStreamAudio::setup()
107108
}
108109

109110
bool InputStreamAudio::readNextFrame( Frame& frameBuffer )
110-
{
111+
{
112+
if( ! getNextFrame() )
113+
return false;
114+
115+
size_t decodedSize = av_samples_get_buffer_size(NULL, _codecContext->channels,
116+
_frame->nb_samples,
117+
_codecContext->sample_fmt, 1);
118+
119+
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer );
120+
121+
audioBuffer.setNbSamples( _frame->nb_samples );
122+
123+
if( decodedSize )
124+
{
125+
if( audioBuffer.getSize() != decodedSize )
126+
audioBuffer.getBuffer().resize( decodedSize, 0 );
127+
128+
unsigned char* dst = audioBuffer.getPtr();
129+
av_samples_copy(&dst, (uint8_t* const* )_frame->data, 0,
130+
0, _frame->nb_samples, _codecContext->channels,
131+
_codecContext->sample_fmt);
132+
}
133+
134+
return true;
135+
}
136+
137+
bool InputStreamAudio::readNextFrame( std::vector<Frame>& frameBuffer )
138+
{
139+
if( ! getNextFrame() )
140+
return false;
141+
142+
size_t nbChannels = av_get_channel_layout_nb_channels( _frame->channel_layout );
143+
size_t bytePerSample = av_get_bytes_per_sample( (AVSampleFormat)_frame->format );
144+
145+
frameBuffer.resize( nbChannels );
146+
147+
for( size_t channel = 0; channel < nbChannels; ++ channel )
148+
{
149+
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer.at( channel ) );
150+
audioBuffer.setNbSamples( _frame->nb_samples );
151+
152+
unsigned char* src = *_frame->data;
153+
unsigned char* dst = audioBuffer.getPtr();
154+
155+
for( int sample = 0; sample < _frame->nb_samples; ++sample )
156+
{
157+
memcpy( dst, src, bytePerSample );
158+
dst += bytePerSample;
159+
src += bytePerSample * nbChannels;
160+
}
161+
}
162+
return true;
163+
}
164+
165+
bool InputStreamAudio::getNextFrame()
166+
{
111167
int got_frame = 0;
112168
while( ! got_frame )
113169
{
@@ -134,26 +190,6 @@ bool InputStreamAudio::readNextFrame( Frame& frameBuffer )
134190

135191
av_free_packet( &packet );
136192
}
137-
138-
size_t decodedSize = av_samples_get_buffer_size(NULL, _codecContext->channels,
139-
_frame->nb_samples,
140-
_codecContext->sample_fmt, 1);
141-
142-
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer );
143-
144-
audioBuffer.setNbSamples( _frame->nb_samples );
145-
146-
if( decodedSize )
147-
{
148-
if( audioBuffer.getSize() != decodedSize )
149-
audioBuffer.getBuffer().resize( decodedSize, 0 );
150-
151-
unsigned char* dst = audioBuffer.getPtr();
152-
av_samples_copy(&dst, (uint8_t* const* )_frame->data, 0,
153-
0, _frame->nb_samples, _codecContext->channels,
154-
_codecContext->sample_fmt);
155-
}
156-
157193
return true;
158194
}
159195

src/AvTranscoder/InputStreamAudio.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ class AvExport InputStreamAudio : public InputStreamReader
2424

2525
bool readNextFrame( Frame& frameBuffer );
2626

27+
bool readNextFrame( std::vector<Frame>& frameBuffer );
28+
2729
private:
30+
31+
bool getNextFrame();
32+
2833
AvInputStream* _inputStream;
2934
AVCodec* _codec;
3035
AVCodecContext* _codecContext;

0 commit comments

Comments
 (0)