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