Skip to content

Commit 2f4918c

Browse files
first commit
1 parent e567ea1 commit 2f4918c

24 files changed

+1432
-0
lines changed

SConstruct

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import os
2+
import ConfigParser
3+
4+
config = ConfigParser.RawConfigParser()
5+
6+
config.read( [
7+
'scons.cfg',
8+
] )
9+
10+
javaInclude = config.get( 'JAVA', 'inc' ).split(':')
11+
pyInclude = config.get( 'PYTHON', 'inc' ).split(':')
12+
libavInclude = config.get( 'LIBAV', 'inc' ).split(':')
13+
libavLibDir = config.get( 'LIBAV', 'libdir' ).split(':')
14+
15+
env = Environment().Clone()
16+
envJava = Environment().Clone()
17+
envPy = Environment().Clone()
18+
19+
# C++ environment
20+
21+
env.Append(
22+
CPPPATH = [
23+
libavInclude,
24+
"src",
25+
],
26+
CXXFLAGS = [
27+
'-Wall',
28+
],
29+
LIBPATH = [
30+
libavLibDir,
31+
"src",
32+
],
33+
)
34+
35+
# Java environment
36+
envJava.Replace(
37+
CPPPATH = [
38+
javaInclude,
39+
libavInclude,
40+
".",
41+
],
42+
SWIGCXXFILESUFFIX= '_wrapJava$CXXFILESUFFIX',
43+
CXXFLAGS = [
44+
'-Wall',
45+
],
46+
SWIGFLAGS = [
47+
'-java',
48+
'-c++',
49+
'-fcompact',
50+
],
51+
LINKFLAGS = [
52+
],
53+
)
54+
55+
envJava.Append( SWIGPATH = envJava['CPPPATH'] )
56+
57+
# Python environment
58+
envPy.Replace(
59+
CPPPATH = [
60+
pyInclude,
61+
libavInclude,
62+
".",
63+
],
64+
SWIGCXXFILESUFFIX= '_wrapPython$CXXFILESUFFIX',
65+
SHLIBPREFIX= '_',
66+
CXXFLAGS = [
67+
'-std=gnu++0x',
68+
'-Wall',
69+
],
70+
SWIGFLAGS = [
71+
'-python',
72+
'-c++',
73+
'-fcompact',
74+
],
75+
LINKFLAGS = [
76+
],
77+
)
78+
79+
envPy.Append( SWIGPATH = envPy['CPPPATH'] )
80+
81+
Export( "env" )
82+
Export( "envJava" )
83+
Export( "envPy" )
84+
85+
VariantDir( 'build/lib', 'src', duplicate = 0 )
86+
SConscript( 'build/lib/SConscript' )

app/avTranscoder.cpp

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
#include <iostream>
2+
3+
#include <Media.hpp>
4+
#include <InputStream.hpp>
5+
#include <InputStreamAudio.hpp>
6+
#include <InputStreamVideo.hpp>
7+
#include <OutputStream.hpp>
8+
#include <OutputStreamAudio.hpp>
9+
#include <OutputStreamVideo.hpp>
10+
#include <OutputFile.hpp>
11+
12+
int main( int argc, char** argv )
13+
{
14+
using namespace avtranscoder;
15+
if( argc != 2 )
16+
{
17+
std::cout << "av++ require a media filename" << std::endl;
18+
return( -1 );
19+
}
20+
21+
std::cout << "start ..." << std::endl;
22+
23+
24+
// a simply metadata getter
25+
Media input( argv[1] );
26+
input.analyse();
27+
std::cout << "format name : " << input.getProperties().formatName << std::endl;
28+
std::cout << "format long name : " << input.getProperties().formatLongName << std::endl;
29+
std::cout << "start time : " << input.getProperties().startTime << std::endl;
30+
std::cout << "duration : " << input.getProperties().duration << std::endl;
31+
std::cout << "bitrate : " << input.getProperties().bitRate << std::endl;
32+
std::cout << "number of streams : " << input.getProperties().streamsCount << std::endl;
33+
std::cout << "number of video streams : " << input.getProperties().videoStreams.size() << std::endl;
34+
std::cout << "number of audio streams : " << input.getProperties().audioStreams.size() << std::endl;
35+
36+
37+
for( size_t videoStreamIndex = 0; videoStreamIndex < input.getProperties().videoStreams.size(); ++videoStreamIndex )
38+
{
39+
std::cout << "---------- Video stream " << videoStreamIndex << " ----------" << std::endl;
40+
std::cout << "codec name : " << input.getProperties().videoStreams.at(videoStreamIndex).codecName << std::endl;
41+
std::cout << "codec long name : " << input.getProperties().videoStreams.at(videoStreamIndex).codecLongName << std::endl;
42+
std::cout << "profile name : " << input.getProperties().videoStreams.at(videoStreamIndex).profileName << std::endl;
43+
std::cout << "profile : " << input.getProperties().videoStreams.at(videoStreamIndex).profile << std::endl;
44+
std::cout << "level : " << input.getProperties().videoStreams.at(videoStreamIndex).level << std::endl;
45+
std::cout << "width : " << input.getProperties().videoStreams.at(videoStreamIndex).width << std::endl;
46+
std::cout << "height : " << input.getProperties().videoStreams.at(videoStreamIndex).height << std::endl;
47+
std::cout << "pixel aspect ratio : " << input.getProperties().videoStreams.at(videoStreamIndex).sar.num << "/" <<
48+
input.getProperties().videoStreams.at(videoStreamIndex).sar.den << std::endl;
49+
std::cout << "display aspect ratio : " << input.getProperties().videoStreams.at(videoStreamIndex).dar.num << "/" <<
50+
input.getProperties().videoStreams.at(videoStreamIndex).dar.den << std::endl;
51+
52+
std::cout << "gop : ";
53+
for( size_t frameIndex = 0; frameIndex < input.getProperties().videoStreams.at(videoStreamIndex).gopStructure.size(); ++frameIndex )
54+
{
55+
std::cout << input.getProperties().videoStreams.at(videoStreamIndex).gopStructure.at( frameIndex ).first;
56+
std::cout << ( input.getProperties().videoStreams.at(videoStreamIndex).gopStructure.at( frameIndex ).second ? "*" : " " );
57+
}
58+
std::cout << std::endl;
59+
60+
}
61+
62+
// init video decoders
63+
InputStreamVideo isVideo; // take the first video stream per default
64+
65+
if( !isVideo.setup( argv[1], 0 ) )
66+
{
67+
std::cout << "error during initialising video input reader" << std::endl;
68+
return( -1 );
69+
}
70+
71+
std::cout << "Input Video Stream Properties " << std::endl;
72+
std::cout << "size " << isVideo.getWidth() << "x" << isVideo.getHeight() << std::endl;
73+
std::cout << "components " << isVideo.getComponents() << std::endl;
74+
std::cout << "bit depth " << isVideo.getBitDepth() << std::endl;
75+
//dVideo.set( key, value );
76+
77+
// same as
78+
//DecoderVideo dVideo( "inputFilename.mov", 1 );
79+
80+
// init audio decoders
81+
InputStreamAudio isAudioLeft ( "inputFilename.wav" ); // take the first audio stream per default
82+
InputStreamAudio isAudioRight( "inputFilename.wav", 2 );
83+
84+
// init video & audio encoders
85+
OutputStreamVideo osVideo;
86+
87+
osVideo.setWidth( isVideo.getWidth() );
88+
osVideo.setHeight( isVideo.getHeight() );
89+
osVideo.setComponents( isVideo.getComponents() );
90+
osVideo.setBitDepth( isVideo.getBitDepth() );
91+
//eVideo.set( "mv_method", "me_hex" );
92+
93+
if( !osVideo.setup( ) )
94+
{
95+
std::cout << "error during initialising video output stream" << std::endl;
96+
return( -1 );
97+
}
98+
99+
100+
OutputStreamAudio osAudioLeft ( ); // "AudioStreamEncoder" / "AudioOutputStream" ?
101+
OutputStreamAudio osAudioRight( );
102+
OutputStreamAudio osAudioLfe ( );
103+
104+
// setup wrapper
105+
OutputFile of( "codedFilename.mxf" ); // "Format" ? to keep libav naming
106+
107+
if( ! of.setup() )
108+
{
109+
std::cout << "error during setup output file" << std::endl;
110+
return( -1 );
111+
}
112+
113+
if( ! of.addVideoStream() )
114+
{
115+
std::cout << "error during adding output video stream" << std::endl;
116+
return( -1 );
117+
}
118+
/*of.addAudioStream();
119+
of.addAudioStream();
120+
of.addAudioStream();
121+
of.addAudioStream();*/
122+
123+
124+
/*eVideoLeft = wrapper.createVideoEncoder( );
125+
eVideoRight = wrapper.createVideoEncoder( dVideo );
126+
127+
eAudioLeft = wrapper.createAudioEncoder( 2 );
128+
129+
130+
wrapper.createAudioEncoder( eAudioLeft, 2 );*/
131+
132+
133+
// Encodage/transcodage
134+
135+
std::vector<unsigned char> frameBuffer;
136+
std::vector<unsigned char> sourceImage( isVideo.getWidth() * isVideo.getHeight() * 3, 120 );
137+
138+
std::vector<unsigned char> codedImage;
139+
140+
for( size_t count = 0; count < 10; ++count )
141+
{
142+
isVideo.readNextFrame( frameBuffer );
143+
144+
osVideo.encodeFrame( frameBuffer, codedImage );
145+
//std::cout << "decoded size " << frameBuffer.size() << " encode frame " << count << " size " << codedImage.size() << std::endl;
146+
147+
of.wrap( codedImage, 0 );
148+
}
149+
150+
151+
//for( size_t frame : dVideo.framesCount() )
152+
{
153+
// read & decode source image,
154+
// send it to encoder which wraps it automatically
155+
//eVideo.encode( /* raw data */ dVideo.readNextFrame() );
156+
//eVideo.write()
157+
158+
// also to access to decoded data image
159+
//dVideo.getDataFrame();
160+
161+
162+
//wrapper.write( /* char */ myRawData, streamIndex );
163+
}
164+
165+
//eAudioLeft.encode( );
166+
167+
std::cout << "end ..." << std::endl;
168+
169+
170+
// TESTS
171+
172+
// audio -> audio
173+
174+
// video -> video
175+
176+
// Audio + video -> Audio + video
177+
178+
// Audio // Video -> Audio + video
179+
180+
// Audio * N // Video -> Audio *N + video
181+
182+
// Audio * N // Video * N -> Audio *N + video * N
183+
184+
}

src/SConscript

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
3+
Import( "env" )
4+
Import( "envJava" )
5+
Import( "envPy" )
6+
7+
avTranscoder = env.SharedLibrary(
8+
'avTranscoder',
9+
Glob( 'avTranscoder/*.cpp' ),
10+
LIBS = [
11+
'libavcodec'
12+
]
13+
)
14+
15+
jAvTranscoder = envJava.SharedLibrary(
16+
'javTranscoder',
17+
[
18+
'avTranscoder/avTranscoder.i'
19+
],
20+
LIBS=[ avTranscoder ],
21+
)
22+
23+
pyAvTranscoder = envPy.SharedLibrary(
24+
'avTranscoder',
25+
[
26+
'avTranscoder/avTranscoder.i'
27+
],
28+
LIBS=[ avTranscoder ],
29+
)

src/avTranscoder/InputStream.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "InputStream.hpp"

src/avTranscoder/InputStream.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef _AV_TRANSCODER_INPUT_STREAM_HPP_
2+
#define _AV_TRANSCODER_INPUT_STREAM_HPP_
3+
4+
#include <string>
5+
6+
namespace avtranscoder
7+
{
8+
9+
class InputStream
10+
{
11+
public:
12+
InputStream( const std::string& filename = "", size_t streamIndex = 0 )
13+
{};
14+
15+
private:
16+
17+
};
18+
19+
}
20+
21+
#endif

src/avTranscoder/InputStreamAudio.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "InputStreamAudio.hpp"

src/avTranscoder/InputStreamAudio.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#ifndef _AV_TRANSCODER_INPUT_STREAM_AUDIO_HPP_
2+
#define _AV_TRANSCODER_INPUT_STREAM_AUDIO_HPP_
3+
4+
#include "InputStream.hpp"
5+
6+
namespace avtranscoder
7+
{
8+
9+
class InputStreamAudio : InputStream
10+
{
11+
public:
12+
InputStreamAudio( const std::string& filename = "", const size_t streamIndex = 0 )
13+
{};
14+
15+
private:
16+
17+
};
18+
19+
}
20+
21+
#endif

src/avTranscoder/InputStreamData.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "InputStreamData.hpp"

src/avTranscoder/InputStreamData.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef _AV_TRANSCODER_INPUT_STREAM_DATA_HPP_
2+
#define _AV_TRANSCODER_INPUT_STREAM_DATA_HPP_
3+
4+
#include "InputStream.hpp"
5+
6+
namespace avtranscoder
7+
{
8+
9+
class InputStreamData : InputStream
10+
{
11+
public:
12+
InputStreamData(){};
13+
14+
private:
15+
16+
};
17+
18+
}
19+
20+
#endif

0 commit comments

Comments
 (0)