@@ -9,6 +9,7 @@ extern "C" {
9
9
#include < libavformat/avformat.h>
10
10
#include < libavutil/avutil.h>
11
11
#include < libavutil/pixdesc.h>
12
+ #include < libavutil/channel_layout.h>
12
13
}
13
14
14
15
#include " AvInputStream.hpp"
@@ -20,7 +21,7 @@ namespace avtranscoder
20
21
{
21
22
22
23
InputStreamAudio::InputStreamAudio ( AvInputStream& inputStream )
23
- : InputStreamReader::InputStreamReader ( inputStream )
24
+ : InputStreamReader( inputStream )
24
25
, _inputStream ( &inputStream )
25
26
, _codec ( NULL )
26
27
, _codecContext ( NULL )
@@ -107,7 +108,62 @@ void InputStreamAudio::setup()
107
108
}
108
109
109
110
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
+ {
111
167
int got_frame = 0 ;
112
168
while ( ! got_frame )
113
169
{
@@ -134,26 +190,6 @@ bool InputStreamAudio::readNextFrame( Frame& frameBuffer )
134
190
135
191
av_free_packet ( &packet );
136
192
}
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
-
157
193
return true ;
158
194
}
159
195
0 commit comments