Skip to content

Commit 16a004f

Browse files
refactoring for clean usage of Image struct
1 parent d34ab32 commit 16a004f

15 files changed

+282
-161
lines changed

SConstruct

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ envJava.Replace(
5050
],
5151
LINKFLAGS = [
5252
],
53+
LIBPATH = [
54+
libavLibDir,
55+
"#src",
56+
],
5357
)
5458

5559
envJava.Append(
@@ -77,6 +81,10 @@ envPy.Replace(
7781
],
7882
LINKFLAGS = [
7983
],
84+
LIBPATH = [
85+
libavLibDir,
86+
"#src",
87+
],
8088
)
8189

8290
envPy.Append( SWIGPATH = envPy['CPPPATH'] )

app/avTranscoder/avTranscoder.cpp

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <iostream>
2+
#include <iomanip>
23

34
#include <AvTranscoder/Media.hpp>
45
#include <AvTranscoder/InputStream.hpp>
@@ -30,6 +31,13 @@ void displayMetadatas( const char* filename )
3031
std::cout << "number of video streams : " << input.getProperties().videoStreams.size() << std::endl;
3132
std::cout << "number of audio streams : " << input.getProperties().audioStreams.size() << std::endl;
3233

34+
// std::vector< std::pair< std::string, std::string > > metadatas
35+
std::cout << "---------- Metadatas ----------" << std::endl;
36+
for( size_t metadataIndex = 0; metadataIndex < input.getProperties().metadatas.size(); ++metadataIndex )
37+
{
38+
std::cout << std::left << std::setw( 24 ) << input.getProperties().metadatas.at(metadataIndex).first <<" : " << input.getProperties().metadatas.at(metadataIndex).second << std::endl;
39+
}
40+
3341
for( size_t videoStreamIndex = 0; videoStreamIndex < input.getProperties().videoStreams.size(); ++videoStreamIndex )
3442
{
3543
std::cout << "---------- Video stream " << videoStreamIndex << " ----------" << std::endl;
@@ -82,9 +90,16 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
8290
{
8391
using namespace avtranscoder;
8492

93+
Media input( inputfilename );
94+
input.analyse();
95+
8596
// init video decoders
8697
InputStreamVideo inputStreamVideo; // take the first video stream per default
8798

99+
av_log_set_level( AV_LOG_FATAL );
100+
//av_log_set_level( AV_LOG_DEBUG );
101+
102+
88103
if( !inputStreamVideo.setup( inputfilename, 0 ) )
89104
{
90105
std::cout << "error during initialising video input reader" << std::endl;
@@ -109,18 +124,28 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
109124

110125
oPixel.setSubsampling( eSubsampling422 );
111126
oPixel.setBitsPerPixel( 16 );
112-
//std::cout << oPixel.findPixel() << std::endl;
113127

114-
Image image;
115-
image.setWidth ( inputStreamVideo.getWidth() );
116-
image.setHeight( inputStreamVideo.getHeight() );
117-
image.setPixel( oPixel );
128+
ImageDesc imageDesc;
129+
imageDesc.setWidth ( input.getProperties().videoStreams.at(0).width );
130+
imageDesc.setHeight( input.getProperties().videoStreams.at(0).height );
131+
imageDesc.setPixel ( oPixel );
132+
133+
Image sourceImage( imageDesc );
118134

119135
videoStream.setVideoCodec( "dnxhd" );
120-
videoStream.setBitrate( 120000000 );
136+
videoStream.set( "b", 120000000 );
137+
try
138+
{
139+
videoStream.set( "unknownParameter", 120000000 );
140+
}
141+
catch( const std::exception& e )
142+
{
143+
std::cout << "[ERROR] " << e.what() << std::endl;
144+
}
145+
121146
videoStream.setTimeBase( 1, 25 ); // 25 fps
122147

123-
videoStream.setParametersFromImage( image );
148+
videoStream.setParametersFromImage( sourceImage );
124149

125150
//videoStream.initCodecContext();
126151

@@ -130,6 +155,9 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
130155
exit( -1 );
131156
}
132157

158+
Image imageToEncode( sourceImage );
159+
Image codedImage( sourceImage );
160+
133161

134162
OutputStreamAudio osAudioLeft ( ); // "AudioStreamEncoder" / "AudioOutputStream" ?
135163
OutputStreamAudio osAudioRight( );
@@ -165,31 +193,20 @@ void transcodeVideo( const char* inputfilename, const char* outputFilename )
165193
wrapper.createAudioEncoder( eAudioLeft, 2 );*/
166194

167195
ColorTransform ct;
168-
ct.setWidth( inputStreamVideo.getWidth() );
169-
ct.setHeight( inputStreamVideo.getHeight() );
170-
//ct.setInputPixel( const Pixel& pixel );
171-
ct.init();
172-
//ct.convert( codedImage, codedImage );
173196

174197

175198
// Encodage/transcodage
176-
177-
Image frameBuffer;
178-
std::vector<unsigned char> sourceImage( inputStreamVideo.getWidth() * inputStreamVideo.getHeight() * 3, 120 );
179-
180-
Image codedImage;
181-
182199
std::cout << "start transcoding" << std::endl;
183200

184201
for( size_t count = 0; count < 10; ++count )
185202
{
186-
inputStreamVideo.readNextFrame( frameBuffer );
203+
inputStreamVideo.readNextFrame( sourceImage );
187204

188-
// ct.convert( codedImage, codedImage );
189-
190-
outputStreamVideo.encodeFrame( frameBuffer, codedImage );
205+
ct.convert( sourceImage, imageToEncode );
206+
std::cout << "encode" << std::endl;
207+
outputStreamVideo.encodeFrame( imageToEncode, codedImage );
191208
//std::cout << "decoded size " << frameBuffer.size() << " encode frame " << count << " size " << codedImage.size() << std::endl;
192-
209+
std::cout << "wrap" << std::endl;
193210
of.wrap( codedImage, 0 );
194211
}
195212

@@ -223,7 +240,7 @@ int main( int argc, char** argv )
223240

224241

225242
// a simply metadata getter
226-
//displayMetadatas( argv[1] );
243+
displayMetadatas( argv[1] );
227244

228245
// example of video Transcoding
229246
transcodeVideo( argv[1], "transcodedVideo.mxf" );

src/AvTranscoder/ColorTransform.cpp

Lines changed: 62 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extern "C" {
44
#ifndef __STDC_CONSTANT_MACROS
55
#define __STDC_CONSTANT_MACROS
66
#endif
7+
#include <libavcodec/avcodec.h>
78
#include <libswscale/swscale.h>
89
#include <libavutil/imgutils.h>
910
#include <libavutil/pixdesc.h>
@@ -12,67 +13,85 @@ extern "C" {
1213

1314
#include <iostream>
1415
#include <iomanip>
16+
#include <assert.h>
17+
#include <stdexcept>
1518

1619
namespace avtranscoder
1720
{
1821

1922
ColorTransform::ColorTransform()
20-
: m_width( 0 )
21-
, m_height( 0 )
23+
: m_imageConvertContext( NULL )
24+
, srcData ( MAX_SWS_PLANE, NULL )
25+
, dstData ( MAX_SWS_PLANE, NULL )
26+
, srcLineSize ( MAX_SWS_PLANE, 0 )
27+
, dstLineSize ( MAX_SWS_PLANE, 0 )
28+
, srcOffsets ( MAX_SWS_PLANE, 0 )
29+
, dstOffsets ( MAX_SWS_PLANE, 0 )
2230
{
23-
// m_inputPixel = AV_PIX_FMT_YUV422P10;
24-
// m_outputPixel = AV_PIX_FMT_YUV422P;
2531
}
2632

27-
void ColorTransform::setWidth ( const size_t width )
33+
bool ColorTransform::init( const Image& src, const Image& dst )
2834
{
29-
m_width = width;
30-
}
35+
assert( src.desc().getWidth() != 0 );
36+
assert( src.desc().getHeight() != 0 );
37+
assert( src.desc().getWidth() == dst.desc().getWidth() );
38+
assert( src.desc().getHeight() == dst.desc().getHeight() );
39+
40+
m_imageConvertContext = sws_getContext(
41+
src.desc().getWidth(), src.desc().getHeight(), src.desc().getPixelDesc().findPixel(),
42+
dst.desc().getWidth(), dst.desc().getHeight(), dst.desc().getPixelDesc().findPixel(),
43+
SWS_POINT, NULL, NULL, NULL);
3144

32-
void ColorTransform::setHeight( const size_t height )
33-
{
34-
m_height = height;
35-
}
45+
av_image_fill_linesizes( &srcLineSize[0], src.desc().getPixelDesc().findPixel(), src.desc().getWidth() );
46+
av_image_fill_linesizes( &dstLineSize[0], dst.desc().getPixelDesc().findPixel(), dst.desc().getWidth() );
3647

37-
void ColorTransform::setInputPixel( const Pixel& pixel )
38-
{
39-
m_inputPixel = pixel;
40-
}
48+
size_t cumulSrcOffset = 0;
49+
size_t cumulDstOffset = 0;
4150

42-
void ColorTransform::setOutputPixel( const Pixel& pixel )
43-
{
44-
m_outputPixel = pixel;
45-
}
51+
for( size_t plane = 0; plane < MAX_SWS_PLANE; ++plane )
52+
{
53+
srcLineSize.at( plane ) = FFALIGN( srcLineSize.at( plane ), 16 );
54+
dstLineSize.at( plane ) = FFALIGN( dstLineSize.at( plane ), 16 );
55+
56+
srcOffsets.at( plane ) = cumulSrcOffset;
57+
dstOffsets.at( plane ) = cumulDstOffset;
58+
59+
cumulSrcOffset += srcLineSize.at( plane ) * src.desc().getHeight();
60+
cumulDstOffset += dstLineSize.at( plane ) * dst.desc().getHeight();
61+
}
4662

47-
bool ColorTransform::init()
48-
{
4963
return true;
5064
}
5165

5266
void ColorTransform::convert( const Image& src, Image& dst )
5367
{
54-
55-
SwsContext* m_imageConvertContext = sws_getContext(
56-
m_width, m_height, m_inputPixel.findPixel(),
57-
m_width, m_height, m_outputPixel.findPixel(),
58-
SWS_POINT, NULL, NULL, NULL);
59-
60-
// resize dst buffer ? using :
61-
// av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);
62-
63-
std::vector< std::vector< unsigned char > > dataIn ( AV_NUM_DATA_POINTERS );
64-
std::vector< std::vector< unsigned char > > dataOut( AV_NUM_DATA_POINTERS );
65-
std::vector< int > lineSizeIn ( AV_NUM_DATA_POINTERS, 0 );
66-
std::vector< int > lineSizeOut( AV_NUM_DATA_POINTERS, 0 );
67-
68-
//dataIn[0] = &src.getPtr();
69-
//dataOut[0] = &dst[0];
70-
lineSizeIn [0] = av_image_get_linesize( m_inputPixel.findPixel(), src.getWidth(), 3 );
71-
lineSizeOut[0] = av_image_get_linesize( m_outputPixel.findPixel(), src.getWidth(), 3 );
72-
73-
// sws_scale( m_imageConvertContext,
74-
// dataIn, lineSizeIn, 0, src.getHeight(),
75-
// dataOut, lineSizeOut );
68+
assert( src.desc().getWidth() != 0 );
69+
assert( src.desc().getHeight() != 0 );
70+
assert( src.desc().getWidth() == dst.desc().getWidth() );
71+
assert( src.desc().getHeight() == dst.desc().getHeight() );
72+
assert( src.desc().getPixelDesc().getComponents() != 0 );
73+
assert( src.desc().getPixelDesc().getComponents() == dst.desc().getPixelDesc().getComponents() );
74+
75+
if( ! m_isInit )
76+
m_isInit = init( src, dst );
77+
78+
for( size_t plane = 0; plane < MAX_SWS_PLANE; ++plane )
79+
{
80+
srcData.at( plane ) = (uint8_t*)const_cast< unsigned char* >( src.getPtr() + srcOffsets.at( plane ) );
81+
dstData.at( plane ) = (uint8_t*)dst.getPtr() + dstOffsets.at( plane );
82+
}
83+
84+
if( !m_imageConvertContext )
85+
{
86+
throw std::runtime_error( "unknown convert context" );
87+
}
88+
89+
int ret = sws_scale( m_imageConvertContext,
90+
&srcData[0], &srcLineSize[0], 0, src.desc().getHeight(),
91+
&dstData[0], &dstLineSize[0] );
92+
93+
if( ret != src.desc().getHeight() )
94+
throw std::runtime_error( "error in color converter" );
7695
}
7796

7897
}

src/AvTranscoder/ColorTransform.hpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,32 @@
77
#include <vector>
88
#include <string>
99

10+
class SwsContext;
11+
1012
namespace avtranscoder
1113
{
1214

1315
class ColorTransform
1416
{
17+
#define MAX_SWS_PLANE 4
1518
public:
1619
ColorTransform();
1720

18-
void setWidth ( const size_t width );
19-
void setHeight( const size_t height );
20-
21-
void setInputPixel ( const Pixel& pixel ); // ColorProfile
22-
void setOutputPixel( const Pixel& pixel );
23-
24-
bool init();
25-
2621
void convert( const Image& src, Image& dst );
2722

28-
2923
private:
30-
size_t m_width;
31-
size_t m_height;
24+
bool init( const Image& src, const Image& dst );
25+
26+
SwsContext* m_imageConvertContext;
27+
28+
std::vector<uint8_t *> srcData;
29+
std::vector<uint8_t *> dstData;
30+
std::vector<int> srcLineSize;
31+
std::vector<int> dstLineSize;
32+
std::vector<size_t> srcOffsets;
33+
std::vector<size_t> dstOffsets;
3234

33-
Pixel m_inputPixel;
34-
Pixel m_outputPixel;
35+
bool m_isInit;
3536
};
3637

3738
}

0 commit comments

Comments
 (0)