Skip to content

Commit f443503

Browse files
committed
Merge pull request #106 from cchampet/dev_checkFFmpegErrorInFormatContext
* common: add getDescriptionFromErrorCode function. * Check FFmpeg error in FormatContext.
2 parents 2f16e38 + 401d378 commit f443503

File tree

9 files changed

+41
-68
lines changed

9 files changed

+41
-68
lines changed

src/AvTranscoder/Option.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,19 +212,15 @@ void Option::checkFFmpegGetOption( const int ffmpegReturnCode ) const
212212
{
213213
if( ffmpegReturnCode )
214214
{
215-
char err[AV_ERROR_MAX_STRING_SIZE];
216-
av_strerror( ffmpegReturnCode, err, sizeof(err) );
217-
throw std::runtime_error( "unknown key " + getName() + ": " + err );
215+
throw std::runtime_error( "unknown key " + getName() + ": " + getDescriptionFromErrorCode( ffmpegReturnCode ) );
218216
}
219217
}
220218

221219
void Option::checkFFmpegSetOption( const int ffmpegReturnCode, const std::string& optionValue )
222220
{
223221
if( ffmpegReturnCode )
224222
{
225-
char err[AV_ERROR_MAX_STRING_SIZE];
226-
av_strerror( ffmpegReturnCode, err, sizeof(err) );
227-
throw std::runtime_error( "setting " + getName() + " parameter to " + optionValue + ": " + err );
223+
throw std::runtime_error( "setting " + getName() + " parameter to " + optionValue + ": " + getDescriptionFromErrorCode( ffmpegReturnCode ) );
228224
}
229225
}
230226

src/AvTranscoder/codec/ICodec.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,7 @@ void ICodec::open()
6767
msg += ") ";
6868
avcodec_close( _avCodecContext );
6969

70-
char err[AV_ERROR_MAX_STRING_SIZE];
71-
av_strerror( ret, err, sizeof(err) );
72-
msg += err;
70+
msg += getDescriptionFromErrorCode( ret );
7371

7472
throw std::runtime_error( msg );
7573
}

src/AvTranscoder/common.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,11 @@ void setLogLevel( const int level )
1717
av_log_set_level( level );
1818
}
1919

20+
std::string AvExport getDescriptionFromErrorCode( const int code )
21+
{
22+
char err[AV_ERROR_MAX_STRING_SIZE];
23+
av_strerror( code, err, sizeof(err) );
24+
return std::string( err );
25+
}
26+
2027
}

src/AvTranscoder/common.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ void AvExport preloadCodecsAndFormats();
6565
*/
6666
void AvExport setLogLevel( const int level );
6767

68+
69+
/// Get the string description corresponding to the error code provided by ffmpeg/libav
70+
std::string AvExport getDescriptionFromErrorCode( const int code );
71+
6872
}
6973

7074
#endif

src/AvTranscoder/decoder/AudioDecoder.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,7 @@ bool AudioDecoder::decodeNextFrame()
141141

142142
if( ret < 0 )
143143
{
144-
char err[AV_ERROR_MAX_STRING_SIZE];
145-
av_strerror( ret, err, sizeof(err) );
146-
throw std::runtime_error( "an error occured during audio decoding" + std::string( err ) );
144+
throw std::runtime_error( "an error occured during audio decoding" + getDescriptionFromErrorCode( ret ) );
147145
}
148146
}
149147
return true;

src/AvTranscoder/decoder/VideoDecoder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ bool VideoDecoder::decodeNextFrame()
9797
{
9898
char err[AV_ERROR_MAX_STRING_SIZE];
9999
av_strerror( ret, err, sizeof(err) );
100-
throw std::runtime_error( "an error occured during video decoding - " + std::string(err) );
100+
throw std::runtime_error( "an error occured during video decoding - " + getDescriptionFromErrorCode( ret ) );
101101
}
102102
}
103103
return true;

src/AvTranscoder/encoder/AudioEncoder.cpp

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,13 @@ bool AudioEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
6262
int bufferSize = av_samples_get_buffer_size( NULL, avCodecContext.channels, _frame->nb_samples, avCodecContext.sample_fmt, 0 );
6363
if( bufferSize < 0 )
6464
{
65-
char err[AV_ERROR_MAX_STRING_SIZE];
66-
av_strerror( bufferSize, err, sizeof(err) );
67-
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 ) );
6866
}
6967

7068
int retvalue = avcodec_fill_audio_frame( _frame, avCodecContext.channels, avCodecContext.sample_fmt, sourceAudioFrame.getData(), bufferSize, 0 );
7169
if( retvalue < 0 )
7270
{
73-
char err[AV_ERROR_MAX_STRING_SIZE];
74-
av_strerror( retvalue, err, sizeof(err) );
75-
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 ) );
7672
}
7773

7874
AVPacket& packet = codedFrame.getAVPacket();
@@ -95,17 +91,13 @@ bool AudioEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
9591
int ret = avcodec_encode_audio2( &avCodecContext, &packet, _frame, &gotPacket );
9692
if( ret != 0 && gotPacket == 0 )
9793
{
98-
char err[AV_ERROR_MAX_STRING_SIZE];
99-
av_strerror( ret, err, sizeof(err) );
100-
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 ) );
10195
}
10296
#else
10397
int ret = avcodec_encode_audio( &avCodecContext, packet.data, packet.size, _frame );
10498
if( ret < 0 )
10599
{
106-
char err[AV_ERROR_MAX_STRING_SIZE];
107-
av_strerror( ret, err, sizeof(err) );
108-
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 ) );
109101
}
110102
#endif
111103

@@ -127,19 +119,15 @@ bool AudioEncoder::encodeFrame( Frame& codedFrame )
127119
int ret = avcodec_encode_audio2( &avCodecContext, &packet, NULL, &gotPacket );
128120
if( ret != 0 && gotPacket == 0 )
129121
{
130-
char err[AV_ERROR_MAX_STRING_SIZE];
131-
av_strerror( ret, err, sizeof(err) );
132-
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 ) );
133123
}
134124
return ret == 0 && gotPacket == 1;
135125

136126
#else
137127
int ret = avcodec_encode_audio( &avCodecContext, packet.data, packet.size, NULL );
138128
if( ret < 0 )
139129
{
140-
char err[AV_ERROR_MAX_STRING_SIZE];
141-
av_strerror( ret, err, sizeof(err) );
142-
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 ) );
143131
}
144132
return ret == 0;
145133

src/AvTranscoder/encoder/VideoEncoder.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,7 @@ bool VideoEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
6363
int bufferSize = avpicture_fill( (AVPicture*)_frame, const_cast< unsigned char * >( sourceImageFrame.getData() ), avCodecContext.pix_fmt, avCodecContext.width, avCodecContext.height );
6464
if( bufferSize < 0 )
6565
{
66-
char err[AV_ERROR_MAX_STRING_SIZE];
67-
av_strerror( bufferSize, err, sizeof(err) );
68-
throw std::runtime_error( "Encode video frame error: buffer size < 0 - " + std::string(err) );
66+
throw std::runtime_error( "Encode video frame error: buffer size < 0 - " + getDescriptionFromErrorCode( bufferSize ) );
6967
}
7068

7169
AVPacket& packet = codedFrame.getAVPacket();
@@ -88,17 +86,13 @@ bool VideoEncoder::encodeFrame( const Frame& sourceFrame, Frame& codedFrame )
8886
int ret = avcodec_encode_video2( &avCodecContext, &packet, _frame, &gotPacket );
8987
if( ret != 0 && gotPacket == 0 )
9088
{
91-
char err[AV_ERROR_MAX_STRING_SIZE];
92-
av_strerror( ret, err, sizeof(err) );
93-
throw std::runtime_error( "Encode video frame error: avcodec encode video frame - " + std::string( err ) );
89+
throw std::runtime_error( "Encode video frame error: avcodec encode video frame - " + getDescriptionFromErrorCode( ret ) );
9490
}
9591
#else
9692
int ret = avcodec_encode_video( &avCodecContext, packet.data, packet.size, _frame );
9793
if( ret < 0 )
9894
{
99-
char err[AV_ERROR_MAX_STRING_SIZE];
100-
av_strerror( ret, err, sizeof(err) );
101-
throw std::runtime_error( "Encode video frame error: avcodec encode video frame - " + std::string( err ) );
95+
throw std::runtime_error( "Encode video frame error: avcodec encode video frame - " + getDescriptionFromErrorCode( ret ) );
10296
}
10397
#endif
10498

@@ -120,18 +114,14 @@ bool VideoEncoder::encodeFrame( Frame& codedFrame )
120114
int ret = avcodec_encode_video2( &avCodecContext, &packet, NULL, &gotPacket );
121115
if( ret != 0 && gotPacket == 0 )
122116
{
123-
char err[AV_ERROR_MAX_STRING_SIZE];
124-
av_strerror( ret, err, sizeof(err) );
125-
throw std::runtime_error( "Encode video frame error: avcodec encode last video frame - " + std::string( err ) );
117+
throw std::runtime_error( "Encode video frame error: avcodec encode last video frame - " + getDescriptionFromErrorCode( ret ) );
126118
}
127119
return ret == 0 && gotPacket == 1;
128120
#else
129121
int ret = avcodec_encode_video( &avCodecContext, packet.data, packet.size, NULL );
130122
if( ret < 0 )
131123
{
132-
char err[AV_ERROR_MAX_STRING_SIZE];
133-
av_strerror( ret, err, sizeof(err) );
134-
throw std::runtime_error( "Encode video frame error: avcodec encode last video frame - " + std::string( err ) );
124+
throw std::runtime_error( "Encode video frame error: avcodec encode last video frame - " + getDescriptionFromErrorCode( ret ) );
135125
}
136126
return ret == 0;
137127
#endif

src/AvTranscoder/file/FormatContext.cpp

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ FormatContext::FormatContext( const std::string& filename, int req_flags )
1515
int ret = avformat_open_input( &_avFormatContext, filename.c_str(), NULL, NULL );
1616
if( ret < 0 )
1717
{
18-
char err[AV_ERROR_MAX_STRING_SIZE];
19-
av_strerror( ret, err, sizeof(err) );
2018
std::string msg = "unable to open file ";
2119
msg += filename;
2220
msg += ": ";
23-
msg += err;
21+
msg += getDescriptionFromErrorCode( ret );
2422
throw std::ios_base::failure( msg );
2523
}
2624
_isOpen = true;
@@ -53,7 +51,7 @@ void FormatContext::findStreamInfo( AVDictionary** options )
5351
int err = avformat_find_stream_info( _avFormatContext, options );
5452
if( err < 0 )
5553
{
56-
throw std::ios_base::failure( "unable to find stream informations" );
54+
throw std::ios_base::failure( "unable to find stream informations: " + getDescriptionFromErrorCode( err ) );
5755
}
5856
}
5957

@@ -65,7 +63,7 @@ void FormatContext::openRessource( const std::string& url, int flags )
6563
int err = avio_open2( &_avFormatContext->pb, url.c_str(), flags, NULL, NULL );
6664
if( err < 0 )
6765
{
68-
throw std::ios_base::failure( "error when opening output format" );
66+
throw std::ios_base::failure( "error when opening output format: " + getDescriptionFromErrorCode( err ) );
6967
}
7068
}
7169

@@ -77,7 +75,7 @@ void FormatContext::closeRessource()
7775
int err = avio_close( _avFormatContext->pb );
7876
if( err < 0 )
7977
{
80-
throw std::ios_base::failure( "error when close output format" );
78+
throw std::ios_base::failure( "error when close output format: " + getDescriptionFromErrorCode( err ) );
8179
}
8280
}
8381

@@ -86,11 +84,7 @@ void FormatContext::writeHeader( AVDictionary** options )
8684
int ret = avformat_write_header( _avFormatContext, options );
8785
if( ret != 0 )
8886
{
89-
char err[AV_ERROR_MAX_STRING_SIZE];
90-
av_strerror( ret, err, sizeof(err) );
91-
std::string msg = "could not write header: ";
92-
msg += err;
93-
throw std::runtime_error( msg );
87+
throw std::runtime_error( "could not write header: " + getDescriptionFromErrorCode( ret ) );
9488
}
9589
}
9690

@@ -100,23 +94,23 @@ void FormatContext::writeFrame( AVPacket& packet, bool interleaved )
10094
if( interleaved )
10195
ret = av_interleaved_write_frame( _avFormatContext, &packet );
10296
else
97+
{
98+
// returns 1 if flushed and there is no more data to flush
10399
ret = av_write_frame( _avFormatContext, &packet );
100+
}
104101

105-
if( ret != 0 )
102+
if( ret < 0 )
106103
{
107-
char err[AV_ERROR_MAX_STRING_SIZE];
108-
av_strerror( ret, err, sizeof(err) );
109-
std::string msg = "error when writting packet in stream: ";
110-
msg += err;
111-
throw std::runtime_error( msg );
104+
throw std::runtime_error( "error when writting packet in stream: " + getDescriptionFromErrorCode( ret ) );
112105
}
113106
}
114107

115108
void FormatContext::writeTrailer()
116109
{
117-
if( av_write_trailer( _avFormatContext ) != 0)
110+
int ret = av_write_trailer( _avFormatContext );
111+
if( ret != 0 )
118112
{
119-
throw std::runtime_error( "could not write trailer" );
113+
throw std::runtime_error( "could not write trailer: " + getDescriptionFromErrorCode( ret ) );
120114
}
121115
}
122116

@@ -125,9 +119,7 @@ void FormatContext::addMetaData( const std::string& key, const std::string& valu
125119
int ret = av_dict_set( &_avFormatContext->metadata, key.c_str(), value.c_str(), 0 );
126120
if( ret < 0 )
127121
{
128-
char err[AV_ERROR_MAX_STRING_SIZE];
129-
av_strerror( ret, err, sizeof(err) );
130-
std::cout << err << std::endl;
122+
std::cout << getDescriptionFromErrorCode( ret ) << std::endl;
131123
}
132124
}
133125

0 commit comments

Comments
 (0)