Skip to content

Commit f5a087b

Browse files
clean code
1 parent a2f1f4b commit f5a087b

File tree

7 files changed

+101
-82
lines changed

7 files changed

+101
-82
lines changed

app/avTranscoder/avTranscoder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
175175
exit( -1 );
176176
}
177177

178-
InputFile inputFile( inputfilename );
179-
inputFile.setup();
178+
InputFile inputFile;
179+
inputFile.setup( inputfilename );
180180

181181
if( ! of.addVideoStream( inputFile.getVideoDesc( 0 ) ) )
182182
{

src/AvTranscoder/DatasStructures/DataStreamDesc.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define _AV_TRANSCODER_DATA_DATA_STREAM_DESC_HPP_
33

44
#include <string>
5+
#include <vector>
56

67
extern "C" {
78
#ifndef __STDC_CONSTANT_MACROS
@@ -30,6 +31,9 @@ class DataStreamDesc
3031
class DataStream
3132
{
3233
public:
34+
typedef std::vector< unsigned char > DataBuffer;
35+
36+
3337
DataStream( const DataStreamDesc& ref )
3438
: m_dataBuffer( 0, 0 )
3539
, m_dataStreamDesc( ref )

src/AvTranscoder/DatasStructures/VideoDesc.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ extern "C" {
1111
#include <libavutil/imgutils.h>
1212
#include <libavutil/mathematics.h>
1313
#include <libavutil/opt.h>
14+
#include <libavutil/error.h>
1415
}
1516
#include <iostream>
1617
#include <stdexcept>
@@ -104,7 +105,9 @@ void VideoDesc::set( const std::string& key, const std::string& flag, const bool
104105
error = av_opt_get_int( m_codecContext, key.c_str(), AV_OPT_SEARCH_CHILDREN, &optVal );
105106
if( error != 0 )
106107
{
107-
throw std::runtime_error( "unknown key " + key + ": " + std::string( av_err2str( error ) ) );
108+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
109+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
110+
throw std::runtime_error( "unknown key " + key + ": " + err );
108111
}
109112

110113
if( enable )
@@ -115,7 +118,9 @@ void VideoDesc::set( const std::string& key, const std::string& flag, const bool
115118
error = av_opt_set_int( m_codecContext, key.c_str(), optVal, AV_OPT_SEARCH_CHILDREN );
116119
if( error != 0 )
117120
{
118-
throw std::runtime_error( "setting " + key + " parameter to " + flag + ": " + std::string( av_err2str( error ) ) );
121+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
122+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
123+
throw std::runtime_error( "setting " + key + " parameter to " + flag + ": " + err );
119124
}
120125
}
121126

@@ -124,7 +129,9 @@ void VideoDesc::set( const std::string& key, const bool value )
124129
int error = av_opt_set_int( m_codecContext, key.c_str(), value, AV_OPT_SEARCH_CHILDREN );
125130
if( error != 0 )
126131
{
127-
throw std::runtime_error( "setting " + key + " parameter to " + ( value ? "true" : "false" ) + ": " + std::string( av_err2str( error ) ) );
132+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
133+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
134+
throw std::runtime_error( "setting " + key + " parameter to " + ( value ? "true" : "false" ) + ": " + err );
128135
}
129136
}
130137

@@ -137,7 +144,9 @@ void VideoDesc::set( const std::string& key, const int value )
137144
{
138145
std::ostringstream os;
139146
os << value;
140-
throw std::runtime_error( "setting " + key + " parameter to " + os.str() + ": " + std::string( av_err2str( error ) ) );
147+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
148+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
149+
throw std::runtime_error( "setting " + key + " parameter to " + os.str() + ": " + err );
141150
}
142151
}
143152

@@ -151,7 +160,9 @@ void VideoDesc::set( const std::string& key, const int num, const int den )
151160
{
152161
std::ostringstream os;
153162
os << num << "/" << den;
154-
throw std::runtime_error( "setting " + key + " parameter to " + os.str() + ": " + std::string( av_err2str( error ) ) );
163+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
164+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
165+
throw std::runtime_error( "setting " + key + " parameter to " + os.str() + ": " + err );
155166
}
156167
}
157168

@@ -162,7 +173,9 @@ void VideoDesc::set( const std::string& key, const double value )
162173
{
163174
std::ostringstream os;
164175
os << value;
165-
throw std::runtime_error( "setting " + key + " parameter to " + os.str() + ": " + std::string( av_err2str( error ) ) );
176+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
177+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
178+
throw std::runtime_error( "setting " + key + " parameter to " + os.str() + ": " + err );
166179
}
167180
}
168181

@@ -171,8 +184,10 @@ void VideoDesc::set( const std::string& key, const std::string& value )
171184
int error = av_opt_set( m_codecContext, key.c_str(), value.c_str(), AV_OPT_SEARCH_CHILDREN );
172185
if( error != 0 )
173186
{
174-
throw std::runtime_error( "setting " + key + " parameter to " + value + ": " + std::string( av_err2str( error ) ) );
187+
std::string err( "", AV_ERROR_MAX_STRING_SIZE );
188+
av_make_error_string( const_cast<char*>(err.c_str()), err.size(), error );
189+
throw std::runtime_error( "setting " + key + " parameter to " + value + ": " + err );
175190
}
176191
}
177192

178-
}
193+
}

src/AvTranscoder/InputFile.cpp

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,48 @@ extern "C" {
1717
namespace avtranscoder
1818
{
1919

20-
InputFile::InputFile( const std::string& file )
21-
: m_inputFormat ( NULL )
22-
, m_formatContext ( NULL )
20+
InputFile::InputFile()
21+
: m_formatContext ( NULL )
2322
, m_codec ( NULL )
2423
, m_codecContext ( NULL )
2524
, m_stream ( NULL )
26-
, m_filename ( file )
25+
, m_filename ( "" )
2726
, m_packetCount ( 0 )
2827
{
2928
av_register_all(); // Warning: should be called only once
3029
}
3130

32-
bool InputFile::setup()
31+
InputFile::~InputFile()
3332
{
34-
av_register_all();
33+
if( m_formatContext )
34+
{
35+
avformat_close_input( &m_formatContext );
36+
m_formatContext = NULL;
37+
}
38+
if( m_codecContext )
39+
{
40+
avcodec_close( m_codecContext );
41+
m_codecContext = NULL;
42+
}
43+
}
3544

45+
InputFile& InputFile::setup( const std::string& filename )
46+
{
47+
m_filename = filename;
3648
if( avformat_open_input( &m_formatContext, m_filename.c_str(), NULL, NULL ) < 0 )
3749
{
38-
return false;
50+
throw std::runtime_error( "unable to open file" );
3951
}
4052

4153
// update format context informations from streams
4254
if( avformat_find_stream_info( m_formatContext, NULL ) < 0 )
4355
{
44-
return false;
56+
avformat_close_input( &m_formatContext );
57+
m_formatContext = NULL;
58+
throw std::runtime_error( "unable to find stream informations" );
4559
}
4660

47-
return m_formatContext != NULL;
61+
return *this;
4862
}
4963

5064
VideoDesc InputFile::getVideoDesc( size_t videoStreamId )
@@ -77,9 +91,37 @@ VideoDesc InputFile::getVideoDesc( size_t videoStreamId )
7791
return desc;
7892
}
7993

80-
bool unwrap( const Image& data, const size_t streamId )
94+
bool InputFile::unwrap( DataStream& data, const size_t streamIndex )
95+
{
96+
AVPacket packet;
97+
av_init_packet( &packet );
98+
99+
readNextPacket( packet, streamIndex );
100+
101+
data.getBuffer().resize( packet.size );
102+
memcpy( data.getPtr(), packet.data, packet.size );
103+
104+
av_free_packet( &packet );
105+
106+
return true;
107+
}
108+
109+
bool InputFile::readNextPacket( AVPacket& packet, const size_t streamIndex )
81110
{
82-
111+
while( 1 )
112+
{
113+
int ret = av_read_frame( m_formatContext, &packet );
114+
if( ret < 0 ) // error or end of file
115+
{
116+
return false;
117+
}
118+
119+
// We only read one stream and skip others
120+
if( packet.stream_index == (int)streamIndex )
121+
{
122+
return true;
123+
}
124+
}
83125
}
84126

85127
}

src/AvTranscoder/InputFile.hpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef _AV_TRANSCODER_INPUT_FILE_HPP_
22
#define _AV_TRANSCODER_INPUT_FILE_HPP_
33

4-
#include "DatasStructures/Image.hpp"
4+
#include "DatasStructures/DataStreamDesc.hpp"
55
#include "DatasStructures/VideoDesc.hpp"
66

77
#include <string>
@@ -19,18 +19,21 @@ namespace avtranscoder
1919
class InputFile
2020
{
2121
public:
22-
InputFile( const std::string& file = "" );
22+
InputFile();
23+
~InputFile();
2324

24-
bool setup();
25+
InputFile& setup( const std::string& file );
2526

2627
VideoDesc getVideoDesc( size_t videoStreamId );
2728
bool getAudioStream( );
2829

2930

30-
bool unwrap( const Image& data, const size_t streamId );
31+
bool unwrap( DataStream& data, const size_t streamIndex );
32+
33+
protected:
34+
bool readNextPacket( AVPacket& packet, const size_t streamIndex );
3135

3236
private:
33-
AVInputFormat* m_inputFormat;
3437
AVFormatContext* m_formatContext;
3538

3639
AVCodec* m_codec;

src/AvTranscoder/InputStreamVideo.cpp

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,7 @@ bool InputStreamVideo::setup( const std::string& filename, const size_t streamIn
4747
{
4848
av_register_all();
4949

50-
if( avformat_open_input( &m_formatContext, filename.c_str(), NULL, NULL ) < 0 )
51-
{
52-
return false;
53-
}
54-
55-
// update format context informations from streams
56-
if( avformat_find_stream_info( m_formatContext, NULL ) < 0 )
57-
{
58-
return false;
59-
}
50+
InputFile::setup( filename );
6051

6152
size_t videoStreamCount = 0;
6253
for( size_t streamId = 0; streamId < m_formatContext->nb_streams; streamId++ )
@@ -106,58 +97,24 @@ bool InputStreamVideo::setup( const std::string& filename, const size_t streamIn
10697
return true;
10798
}
10899

109-
bool InputStreamVideo::readNextCodedFrame( DataStream& frameBuffer )
110-
{
111-
bool gotData = false;
112-
113-
AVPacket pkt;
114-
av_init_packet( &pkt );
115-
116-
while( ! gotData )
117-
{
118-
int ret = av_read_frame( m_formatContext, &pkt );
119-
if( ret < 0 ) // error or end of file
120-
{
121-
av_free_packet( &pkt );
122-
return false;
123-
}
124-
125-
// We only read one stream and skip others
126-
if( pkt.stream_index == m_selectedStream )
127-
{
128-
gotData = true;
129-
}
130-
}
131-
132-
frameBuffer.getBuffer().resize( pkt.size );
133-
memcpy( frameBuffer.getPtr(), pkt.data, pkt.size );
134-
135-
av_free_packet( &pkt );
136-
137-
return true;
138-
}
139-
140100
bool InputStreamVideo::readNextFrame( Image& frameBuffer )
141101
{
142102
int got_frame = 0;
143103

144104
while( ! got_frame )
145105
{
146-
AVPacket pkt;
147-
av_init_packet( &pkt );
148-
int ret = av_read_frame( m_formatContext, &pkt );
149-
if( ret < 0 ) // error or end of file
106+
AVPacket packet;
107+
av_init_packet( &packet );
108+
109+
if( ! readNextPacket( packet, m_selectedStream ) ) // error or end of file
150110
{
151-
av_free_packet( &pkt );
111+
av_free_packet( &packet );
152112
return false;
153113
}
154114

155-
// We only read one stream and skip others
156-
if( pkt.stream_index == m_selectedStream )
157-
{
158-
avcodec_decode_video2( m_codecContext, m_frame, &got_frame, &pkt );
159-
}
160-
av_free_packet( &pkt );
115+
avcodec_decode_video2( m_codecContext, m_frame, &got_frame, &packet );
116+
117+
av_free_packet( &packet );
161118
}
162119

163120
size_t decodedSize = avpicture_get_size( (AVPixelFormat)m_frame->format, m_frame->width, m_frame->height );

src/AvTranscoder/InputStreamVideo.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef _AV_TRANSCODER_INPUT_STREAM_VIDEO_HPP_
22
#define _AV_TRANSCODER_INPUT_STREAM_VIDEO_HPP_
33

4-
#include "InputStream.hpp"
4+
#include "InputFile.hpp"
55
#include "DatasStructures/Image.hpp"
66
#include "DatasStructures/DataStreamDesc.hpp"
77

@@ -15,16 +15,14 @@ class AVFrame;
1515
namespace avtranscoder
1616
{
1717

18-
class InputStreamVideo : public InputStream
18+
class InputStreamVideo : public InputFile
1919
{
2020
public:
2121
InputStreamVideo();
2222
~InputStreamVideo();
2323

2424
bool setup( const std::string& filename, const size_t streamIndex );
2525

26-
bool readNextCodedFrame( DataStream& frameBuffer );
27-
2826
bool readNextFrame( Image& frameBuffer );
2927

3028
private:

0 commit comments

Comments
 (0)