@@ -14,7 +14,26 @@ namespace avtranscoder
14
14
15
15
AudioEncoder::AudioEncoder ( const std::string& audioCodecName )
16
16
: _codec( eCodecTypeEncoder, audioCodecName )
17
+ , _frame( NULL )
17
18
{
19
+ #if LIBAVCODEC_VERSION_MAJOR > 54
20
+ _frame = av_frame_alloc ();
21
+ #else
22
+ _frame = avcodec_alloc_frame ();
23
+ #endif
24
+ }
25
+
26
+ AudioEncoder::~AudioEncoder ()
27
+ {
28
+ #if LIBAVCODEC_VERSION_MAJOR > 54
29
+ av_frame_free ( &_frame );
30
+ #else
31
+ #if LIBAVCODEC_VERSION_MAJOR > 53
32
+ avcodec_free_frame ( &_frame );
33
+ #else
34
+ av_free ( _frame );
35
+ #endif
36
+ #endif
18
37
}
19
38
20
39
void AudioEncoder::setup ()
@@ -24,42 +43,32 @@ void AudioEncoder::setup()
24
43
25
44
bool AudioEncoder::encodeFrame ( const Frame& sourceFrame, Frame& codedFrame )
26
45
{
27
- #if LIBAVCODEC_VERSION_MAJOR > 54
28
- AVFrame* frame = av_frame_alloc ();
29
- #else
30
- AVFrame* frame = avcodec_alloc_frame ();
31
- #endif
32
-
33
46
AVCodecContext& avCodecContext = _codec.getAVCodecContext ();
34
47
35
48
// Set default frame parameters
36
49
#if LIBAVCODEC_VERSION_MAJOR > 54
37
- av_frame_unref ( frame );
50
+ av_frame_unref ( _frame );
38
51
#else
39
- avcodec_get_frame_defaults ( frame );
52
+ avcodec_get_frame_defaults ( _frame );
40
53
#endif
41
54
42
55
const AudioFrame& sourceAudioFrame = static_cast <const AudioFrame&>( sourceFrame );
43
56
44
- frame ->nb_samples = sourceAudioFrame.getNbSamples ();
45
- frame ->format = avCodecContext.sample_fmt ;
46
- frame ->channel_layout = avCodecContext.channel_layout ;
57
+ _frame ->nb_samples = sourceAudioFrame.getNbSamples ();
58
+ _frame ->format = avCodecContext.sample_fmt ;
59
+ _frame ->channel_layout = avCodecContext.channel_layout ;
47
60
48
61
// we calculate the size of the samples buffer in bytes
49
- int bufferSize = av_samples_get_buffer_size ( NULL , avCodecContext.channels , frame ->nb_samples , avCodecContext.sample_fmt , 0 );
62
+ int bufferSize = av_samples_get_buffer_size ( NULL , avCodecContext.channels , _frame ->nb_samples , avCodecContext.sample_fmt , 0 );
50
63
if ( bufferSize < 0 )
51
64
{
52
- char err[AV_ERROR_MAX_STRING_SIZE];
53
- av_strerror ( bufferSize, err, sizeof (err) );
54
- throw std::runtime_error ( " Encode audio frame error: buffer size < 0 - " + std::string (err) );
65
+ throw std::runtime_error ( " Encode audio frame error: buffer size < 0 - " + getDescriptionFromErrorCode ( bufferSize ) );
55
66
}
56
67
57
- int retvalue = avcodec_fill_audio_frame ( frame , avCodecContext.channels , avCodecContext.sample_fmt , sourceAudioFrame.getData (), bufferSize, 0 );
68
+ int retvalue = avcodec_fill_audio_frame ( _frame , avCodecContext.channels , avCodecContext.sample_fmt , sourceAudioFrame.getData (), bufferSize, 0 );
58
69
if ( retvalue < 0 )
59
70
{
60
- char err[AV_ERROR_MAX_STRING_SIZE];
61
- av_strerror ( retvalue, err, sizeof (err) );
62
- throw std::runtime_error ( " Encode audio frame error: avcodec fill audio frame - " + std::string ( err ) );
71
+ throw std::runtime_error ( " Encode audio frame error: avcodec fill audio frame - " + getDescriptionFromErrorCode ( retvalue ) );
63
72
}
64
73
65
74
AVPacket& packet = codedFrame.getAVPacket ();
@@ -79,33 +88,21 @@ bool AudioEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
79
88
80
89
#if LIBAVCODEC_VERSION_MAJOR > 53
81
90
int gotPacket = 0 ;
82
- int ret = avcodec_encode_audio2 ( &avCodecContext, &packet, frame , &gotPacket );
91
+ int ret = avcodec_encode_audio2 ( &avCodecContext, &packet, _frame , &gotPacket );
83
92
if ( ret != 0 && gotPacket == 0 )
84
93
{
85
- char err[AV_ERROR_MAX_STRING_SIZE];
86
- av_strerror ( ret, err, sizeof (err) );
87
- throw std::runtime_error ( " Encode audio frame error: avcodec encode audio frame - " + std::string ( err ) );
94
+ throw std::runtime_error ( " Encode audio frame error: avcodec encode audio frame - " + getDescriptionFromErrorCode ( ret ) );
88
95
}
89
96
#else
90
- int ret = avcodec_encode_audio ( &avCodecContext, packet.data , packet.size , frame );
97
+ int ret = avcodec_encode_audio ( &avCodecContext, packet.data , packet.size , _frame );
91
98
if ( ret < 0 )
92
99
{
93
- char err[AV_ERROR_MAX_STRING_SIZE];
94
- av_strerror ( ret, err, sizeof (err) );
95
- throw std::runtime_error ( " Encode audio frame error: avcodec encode audio frame - " + std::string ( err ) );
100
+ throw std::runtime_error ( " Encode audio frame error: avcodec encode audio frame - " + getDescriptionFromErrorCode ( ret ) );
96
101
}
97
102
#endif
98
103
99
- #if LIBAVCODEC_VERSION_MAJOR > 54
100
- av_frame_free ( &frame );
104
+ #if LIBAVCODEC_VERSION_MAJOR > 53
101
105
return ret == 0 && gotPacket == 1 ;
102
- #else
103
- #if LIBAVCODEC_VERSION_MAJOR > 53
104
- avcodec_free_frame ( &frame );
105
- return ret == 0 && gotPacket == 1 ;
106
- #else
107
- av_free ( frame );
108
- #endif
109
106
#endif
110
107
return ret == 0 ;
111
108
}
@@ -122,19 +119,15 @@ bool AudioEncoder::encodeFrame( Frame& codedFrame )
122
119
int ret = avcodec_encode_audio2 ( &avCodecContext, &packet, NULL , &gotPacket );
123
120
if ( ret != 0 && gotPacket == 0 )
124
121
{
125
- char err[AV_ERROR_MAX_STRING_SIZE];
126
- av_strerror ( ret, err, sizeof (err) );
127
- throw std::runtime_error ( " Encode audio frame error: avcodec encode last audio frame - " + std::string ( err ) );
122
+ throw std::runtime_error ( " Encode audio frame error: avcodec encode last audio frame - " + getDescriptionFromErrorCode ( ret ) );
128
123
}
129
124
return ret == 0 && gotPacket == 1 ;
130
125
131
126
#else
132
127
int ret = avcodec_encode_audio ( &avCodecContext, packet.data , packet.size , NULL );
133
128
if ( ret < 0 )
134
129
{
135
- char err[AV_ERROR_MAX_STRING_SIZE];
136
- av_strerror ( ret, err, sizeof (err) );
137
- throw std::runtime_error ( " Encode audio frame error: avcodec encode last audio frame - " + std::string ( err ) );
130
+ throw std::runtime_error ( " Encode audio frame error: avcodec encode last audio frame - " + getDescriptionFromErrorCode ( ret ) );
138
131
}
139
132
return ret == 0 ;
140
133
@@ -146,9 +139,12 @@ void AudioEncoder::setProfile( const ProfileLoader::Profile& profile, const Audi
146
139
// set sampleRate, number of channels, sample format
147
140
_codec.setAudioParameters ( frameDesc );
148
141
149
- // set threads if not in profile
150
- if ( ! profile.count ( " threads" ) )
151
- _codec.getOption ( " threads" ).setString ( " auto" );
142
+ // set threads before any other options
143
+ if ( profile.count ( constants::avProfileThreads ) )
144
+ _codec.getOption ( constants::avProfileThreads ).setString ( profile.at ( constants::avProfileThreads ) );
145
+ else
146
+ _codec.getOption ( constants::avProfileThreads ).setString ( " auto" );
147
+
152
148
153
149
// set encoder options
154
150
for ( ProfileLoader::Profile::const_iterator it = profile.begin (); it != profile.end (); ++it )
@@ -157,7 +153,8 @@ void AudioEncoder::setProfile( const ProfileLoader::Profile& profile, const Audi
157
153
(*it).first == constants::avProfileIdentificatorHuman ||
158
154
(*it).first == constants::avProfileType ||
159
155
(*it).first == constants::avProfileCodec ||
160
- (*it).first == constants::avProfileSampleFormat )
156
+ (*it).first == constants::avProfileSampleFormat ||
157
+ (*it).first == constants::avProfileThreads )
161
158
continue ;
162
159
163
160
try
@@ -177,7 +174,8 @@ void AudioEncoder::setProfile( const ProfileLoader::Profile& profile, const Audi
177
174
(*it).first == constants::avProfileIdentificatorHuman ||
178
175
(*it).first == constants::avProfileType ||
179
176
(*it).first == constants::avProfileCodec ||
180
- (*it).first == constants::avProfileSampleFormat )
177
+ (*it).first == constants::avProfileSampleFormat ||
178
+ (*it).first == constants::avProfileThreads )
181
179
continue ;
182
180
183
181
try
0 commit comments