@@ -11,13 +11,15 @@ extern "C" {
11
11
#include < libavutil/pixdesc.h>
12
12
}
13
13
14
+ #include " AvInputStream.hpp"
15
+
14
16
#include < iostream>
15
17
#include < stdexcept>
16
18
17
19
namespace avtranscoder
18
20
{
19
21
20
- InputStreamAudio::InputStreamAudio ( const InputStream & inputStream )
22
+ InputStreamAudio::InputStreamAudio ( AvInputStream & inputStream )
21
23
: m_inputStream ( &inputStream )
22
24
, m_codec ( NULL )
23
25
, m_codecContext ( NULL )
@@ -26,14 +28,12 @@ InputStreamAudio::InputStreamAudio( const InputStream& inputStream )
26
28
{
27
29
avcodec_register_all ();
28
30
29
- std::cout << " Audio codec Id : " << m_inputStream->getAudioDesc ().getAudioCodecId () << std::endl;
30
-
31
31
m_codec = avcodec_find_decoder ( m_inputStream->getAudioDesc ().getAudioCodecId () );
32
32
if ( m_codec == NULL )
33
33
{
34
34
throw std::runtime_error ( " codec not supported" );
35
35
}
36
-
36
+
37
37
m_codecContext = avcodec_alloc_context3 ( m_codec );
38
38
if ( m_codecContext == NULL )
39
39
{
@@ -43,6 +43,7 @@ InputStreamAudio::InputStreamAudio( const InputStream& inputStream )
43
43
m_codecContext->channels = m_inputStream->getAudioDesc ().getChannels ();
44
44
45
45
std::cout << " Audio codec Id : " << m_codecContext->codec_id << std::endl;
46
+ std::cout << " Audio codec Id : " << m_codec->name << std::endl;
46
47
std::cout << " Audio codec Id : " << m_codec->long_name << std::endl;
47
48
48
49
m_codecContext->channels = m_inputStream->getAudioDesc ().getCodecContext ()->channels ;
@@ -102,22 +103,20 @@ InputStreamAudio::~InputStreamAudio()
102
103
}
103
104
104
105
bool InputStreamAudio::readNextFrame ( AudioFrame& audioFrameBuffer )
105
- {
106
- /* int got_frame = 0;
106
+ {
107
+ int got_frame = 0 ;
107
108
while ( ! got_frame )
108
109
{
109
- AVPacket packet;
110
- av_init_packet( &packet );
111
-
112
- if( ! m_inputStream.readNextPacket( packet ) ) // error or end of file
113
- {
114
- av_free_packet( &packet );
110
+ DataStream data;
111
+ if ( ! m_inputStream->readNextPacket ( data ) ) // error or end of file
115
112
return false ;
116
- }
117
113
114
+ AVPacket packet;
115
+ av_init_packet ( &packet );
116
+
118
117
packet.stream_index = m_selectedStream;
119
- packet.data = audioFrameBuffer .getPtr();
120
- packet.size = audioFrameBuffer .getSize();
118
+ packet.data = data .getPtr ();
119
+ packet.size = data .getSize ();
121
120
122
121
int ret = avcodec_decode_audio4 ( m_codecContext, m_frame, &got_frame, &packet );
123
122
@@ -128,15 +127,22 @@ bool InputStreamAudio::readNextFrame( AudioFrame& audioFrameBuffer )
128
127
129
128
av_free_packet ( &packet );
130
129
}
131
- */
132
- // size_t unpadded_linesize = m_frame->nb_samples * av_get_bytes_per_sample( m_frame->format );
133
-
134
- // size_t decodedSize = avpicture_get_size( (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height );
135
- // if( frameBuffer.getBuffer().size() != decodedSize )
136
- // frameBuffer.getBuffer().resize( avpicture_get_size( (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height ) );
137
-
138
- // // Copy pixel data from an AVPicture into one contiguous buffer.
139
- // avpicture_layout( (AVPicture*)m_frame, (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height, &frameBuffer.getBuffer()[0], frameBuffer.getBuffer().size() );
130
+
131
+ size_t decodedSize = av_samples_get_buffer_size (NULL , m_codecContext->channels ,
132
+ m_frame->nb_samples ,
133
+ m_codecContext->sample_fmt , 1 );
134
+
135
+ if ( decodedSize )
136
+ {
137
+ if ( audioFrameBuffer.getSize () != decodedSize )
138
+ audioFrameBuffer.getBuffer ().resize ( decodedSize );
139
+
140
+ unsigned char * dest = audioFrameBuffer.getPtr ();
141
+ av_samples_fill_arrays (&dest, m_frame->linesize ,
142
+ m_frame->data [0 ],
143
+ m_frame->channels , m_frame->nb_samples ,
144
+ m_codecContext->sample_fmt , 1 );
145
+ }
140
146
141
147
return true ;
142
148
}
0 commit comments