Skip to content

Commit 7bd3b50

Browse files
committed
Merge pull request #68 from cchampet/dev_optimize_silent
Optimize generators Add options for avprocessor
2 parents 11b77d2 + 411a41e commit 7bd3b50

File tree

5 files changed

+113
-34
lines changed

5 files changed

+113
-34
lines changed

app/avProcessor/avProcessor.cpp

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@ static const size_t dummyWidth = 1920;
1212
static const size_t dummyHeight = 1080;
1313
static const std::string dummyPixelFormat = "yuv420p";
1414
static const std::string dummyVideoCodec = "mpeg2video";
15+
16+
static const size_t dummySampleRate = 48000;
17+
static const size_t dummyChannels = 1;
18+
static const std::string dummySampleFormat = "s16";
1519
static const std::string dummyAudioCodec = "pcm_s16le";
1620

17-
bool verbose = false;
21+
static bool useVideoGenerator = false;
22+
23+
static bool verbose = false;
1824

1925
void parseConfigFile( const std::string& configFilename, avtranscoder::Transcoder& transcoder )
2026
{
@@ -56,12 +62,24 @@ void parseConfigFile( const std::string& configFilename, avtranscoder::Transcode
5662
// dummy stream, need a ICodec (audio or video)
5763
if( ! filename.length() )
5864
{
59-
// video
60-
avtranscoder::VideoCodec inputVideoCodec( avtranscoder::eCodecTypeEncoder, dummyVideoCodec );
61-
avtranscoder::VideoFrameDesc imageDesc( dummyWidth, dummyHeight, dummyPixelFormat );
62-
inputVideoCodec.setImageParameters( imageDesc );
63-
64-
transcoder.add( filename, streamIndex, subStreamIndex, transcodeProfile, inputVideoCodec );
65+
if( useVideoGenerator )
66+
{
67+
// video
68+
avtranscoder::VideoCodec inputCodec( avtranscoder::eCodecTypeEncoder, dummyVideoCodec );
69+
avtranscoder::VideoFrameDesc imageDesc( dummyWidth, dummyHeight, dummyPixelFormat );
70+
inputCodec.setImageParameters( imageDesc );
71+
72+
transcoder.add( filename, streamIndex, subStreamIndex, transcodeProfile, inputCodec );
73+
}
74+
else
75+
{
76+
// audio
77+
avtranscoder::AudioCodec inputCodec( avtranscoder::eCodecTypeEncoder, dummyAudioCodec );
78+
avtranscoder::AudioFrameDesc audioDesc( dummySampleRate, dummyChannels, dummySampleFormat );
79+
inputCodec.setAudioParameters( audioDesc );
80+
81+
transcoder.add( filename, streamIndex, subStreamIndex, transcodeProfile, inputCodec );
82+
}
6583
}
6684
else
6785
{
@@ -76,14 +94,52 @@ void parseConfigFile( const std::string& configFilename, avtranscoder::Transcode
7694

7795
int main( int argc, char** argv )
7896
{
79-
if( argc != 3 )
97+
std::string help;
98+
help += "Usage\n";
99+
help += "\tavprocessor CONFIG.TXT OUTPUT_FILE_NAME [--generate-black] [--verbose] [--help]\n";
100+
help += "CONFIG.TXT\n";
101+
help += "\tEach line will be one stream in the output.\n";
102+
help += "\tPattern of each line is:\n";
103+
help += "\t[inputFile]=STREAM_ID.[subStreamId]:[profileName]\n";
104+
help += "\tNo inputFile: will generate black image / audio silence (audio by default)\n";
105+
help += "\tNo subStreamId: will process of channels of the stream\n";
106+
help += "\tNo profileName: will rewrap the stream\n";
107+
help += "Command line options\n";
108+
help += "\t--generate-black: stream which not referred to an input, will generate an output video stream with black images (by default generate audio stream with silence)\n";
109+
help += "\t--help: display this help\n";
110+
111+
// List command line arguments
112+
std::vector< std::string > arguments;
113+
for( int argument = 1; argument < argc; ++argument )
114+
{
115+
arguments.push_back( argv[argument] );
116+
}
117+
for( size_t argument = 0; argument < arguments.size(); ++argument )
118+
{
119+
if( arguments.at( argument ) == "--help" )
120+
{
121+
std::cout << help << std::endl;
122+
return 0;
123+
}
124+
if( arguments.at( argument ) == "--generate-black" )
125+
{
126+
useVideoGenerator = true;
127+
}
128+
if( arguments.at( argument ) == "--verbose" )
129+
{
130+
verbose = true;
131+
}
132+
}
133+
134+
// Check required arguments
135+
if( argc < 3 )
80136
{
81-
std::cout << "avprocessor require an input config file and an output media filename" << std::endl;
137+
std::cout << "avprocessor can rewrap or transcode inputs to create an output media file." << std::endl;
138+
std::cout << "Use option --help to display help" << std::endl;
82139
return( -1 );
83140
}
84141

85142
av_log_set_level( AV_LOG_FATAL );
86-
87143
if( verbose )
88144
av_log_set_level( AV_LOG_DEBUG );
89145

src/AvTranscoder/decoder/AudioGenerator.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
#include "AudioGenerator.hpp"
22

3+
#include <AvTranscoder/transform/AudioTransform.hpp>
4+
35
namespace avtranscoder
46
{
57

68
AudioGenerator::AudioGenerator()
79
: _inputFrame( NULL )
10+
, _silent( NULL )
811
, _frameDesc()
912
{
1013
}
@@ -21,21 +24,29 @@ void AudioGenerator::setFrame( Frame& inputFrame )
2124

2225
bool AudioGenerator::decodeNextFrame( Frame& frameBuffer )
2326
{
27+
// Generate silent
2428
if( ! _inputFrame )
2529
{
26-
AudioFrame& audioFrameBuffer = static_cast<AudioFrame&>( frameBuffer );
27-
audioFrameBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() );
28-
29-
//av_samples_set_silence( data.getPtr(), offset, nb_samples, nb_channels, sample_fmt );
30-
int fill_char = (
31-
_frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8 ||
32-
_frameDesc.getSampleFormat() == AV_SAMPLE_FMT_U8P
33-
) ? 0x80 : 0x00;
34-
35-
if( frameBuffer.getSize() != _frameDesc.getDataSize() )
36-
frameBuffer.getBuffer().resize( _frameDesc.getDataSize() );
37-
memset( frameBuffer.getPtr(), fill_char, frameBuffer.getSize() );
30+
// Generate the silent only once
31+
if( ! _silent )
32+
{
33+
int fillChar = 0;
34+
35+
AudioFrame intermediateBuffer( _frameDesc );
36+
intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() );
37+
memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() );
38+
39+
AudioTransform audioTransform;
40+
audioTransform.convert( intermediateBuffer, frameBuffer );
41+
42+
AudioFrame& audioBuffer = static_cast<AudioFrame&>( frameBuffer );
43+
audioBuffer.setNbSamples( 1.0 * _frameDesc.getSampleRate() / _frameDesc.getFps() );
44+
_silent = new AudioFrame( audioBuffer.desc() );
45+
_silent->copyData( audioBuffer.getPtr(), audioBuffer.getSize() );
46+
}
47+
frameBuffer = *_silent;
3848
}
49+
// Take audio frame from _inputFrame
3950
else
4051
{
4152
frameBuffer.copyData( _inputFrame->getPtr(), _inputFrame->getSize() );

src/AvTranscoder/decoder/AudioGenerator.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class AvExport AudioGenerator : public IDecoder
2424

2525
private:
2626
Frame* _inputFrame; ///< Has link (no ownership)
27-
AudioFrameDesc _frameDesc;
27+
AudioFrame* _silent; ///< The generated silent (has ownership)
28+
AudioFrameDesc _frameDesc; ///< The description of the silent (sample rate...)
2829
};
2930

3031
}

src/AvTranscoder/decoder/VideoGenerator.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace avtranscoder
77

88
VideoGenerator::VideoGenerator()
99
: _inputFrame( NULL )
10+
, _blackImage( NULL )
1011
, _frameDesc()
1112
{
1213
}
@@ -26,18 +27,27 @@ bool VideoGenerator::decodeNextFrame( Frame& frameBuffer )
2627
// Generate black image
2728
if( ! _inputFrame )
2829
{
29-
// @todo support PAL (0 to 255) and NTFS (16 to 235)
30-
char fillChar = 0;
30+
// Generate the black image only once
31+
if( ! _blackImage )
32+
{
33+
// @todo support PAL (0 to 255) and NTFS (16 to 235)
34+
char fillChar = 0;
3135

32-
VideoFrameDesc desc( _frameDesc );
33-
desc.setPixelFormat( "rgb24" );
36+
VideoFrameDesc desc( _frameDesc );
37+
desc.setPixelFormat( "rgb24" );
3438

35-
VideoFrame intermediateBuffer( desc );
36-
intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() );
37-
memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() );
39+
VideoFrame intermediateBuffer( desc );
40+
intermediateBuffer.getBuffer().resize( _frameDesc.getDataSize() );
41+
memset( intermediateBuffer.getPtr(), fillChar, _frameDesc.getDataSize() );
3842

39-
VideoTransform videoEssenceTransform;
40-
videoEssenceTransform.convert( intermediateBuffer, frameBuffer );
43+
VideoTransform videoTransform;
44+
videoTransform.convert( intermediateBuffer, frameBuffer );
45+
46+
VideoFrame& imageBuffer = static_cast<VideoFrame&>( frameBuffer );
47+
_blackImage = new VideoFrame( imageBuffer.desc() );
48+
_blackImage->copyData( imageBuffer.getPtr(), imageBuffer.getSize() );
49+
}
50+
frameBuffer = *_blackImage;
4151
}
4252
// Take image from _inputFrame
4353
else

src/AvTranscoder/decoder/VideoGenerator.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ class AvExport VideoGenerator : public IDecoder
2323
bool decodeNextFrame( Frame& frameBuffer, const size_t subStreamIndex );
2424

2525
private:
26-
Frame* _inputFrame; ///< Has link (no ownership)
27-
VideoFrameDesc _frameDesc;
26+
Frame* _inputFrame; ///< A frame given from outside (has link, no ownership)
27+
VideoFrame* _blackImage; ///< The generated black image (has ownership)
28+
VideoFrameDesc _frameDesc; ///< The description of the black image (width, height...)
2829
};
2930

3031
}

0 commit comments

Comments
 (0)