Skip to content

Commit 1b0235f

Browse files
author
Clement Champetier
committed
StreamTranscoder: constructor can take an IInputEssence
* To manage cases with generators: a user can overload his Generator and create a StreamTranscoder. * Update testSetFrame.py
1 parent e5e706e commit 1b0235f

File tree

5 files changed

+51
-39
lines changed

5 files changed

+51
-39
lines changed

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,15 @@ StreamTranscoder::StreamTranscoder(
162162
}
163163

164164
StreamTranscoder::StreamTranscoder(
165-
const ICodec& inputCodec,
165+
IInputEssence& inputEssence,
166166
OutputFile& outputFile,
167167
const Profile::ProfileDesc& profile
168168
)
169169
: _inputStream( NULL )
170170
, _outputStream( NULL )
171171
, _sourceBuffer( NULL )
172172
, _frameBuffer( NULL )
173-
, _inputEssence( NULL )
173+
, _inputEssence( &inputEssence )
174174
, _generatorEssence( NULL )
175175
, _currentEssence( NULL )
176176
, _outputEssence( NULL )
@@ -189,14 +189,8 @@ StreamTranscoder::StreamTranscoder(
189189

190190
if( profile.find( constants::avProfileType )->second == constants::avProfileTypeVideo )
191191
{
192-
// Create input essence based on a given input VideoCodec
193-
GeneratorVideo* generatorVideo = new GeneratorVideo();
194-
const VideoCodec& inputVideoCodec = static_cast<const VideoCodec&>( inputCodec );
195-
generatorVideo->setVideoFrameDesc( inputVideoCodec.getVideoFrameDesc() );
196-
_inputEssence = generatorVideo;
197-
198192
// Create inputFrame, and outputFrame which is based on a given profile
199-
VideoFrameDesc inputFrameDesc = inputVideoCodec.getVideoFrameDesc();
193+
VideoFrameDesc inputFrameDesc = static_cast<GeneratorVideo&>( inputEssence ).getVideoFrameDesc();
200194
VideoFrameDesc outputFrameDesc = inputFrameDesc;
201195
outputFrameDesc.setParameters( profile );
202196
_sourceBuffer = new VideoFrame( inputFrameDesc );
@@ -216,14 +210,8 @@ StreamTranscoder::StreamTranscoder(
216210
}
217211
else if( profile.find( constants::avProfileType )->second == constants::avProfileTypeAudio )
218212
{
219-
// Create input essence based on a given input AudioCodec
220-
GeneratorAudio* generatorAudio = new GeneratorAudio();
221-
const AudioCodec& inputAudioCodec = static_cast<const AudioCodec&>( inputCodec );
222-
generatorAudio->setAudioFrameDesc( inputAudioCodec.getAudioFrameDesc() );
223-
_inputEssence = generatorAudio;
224-
225213
// Create inputFrame, and outputFrame which is based on a given profile
226-
AudioFrameDesc inputFrameDesc = inputAudioCodec.getAudioFrameDesc();
214+
AudioFrameDesc inputFrameDesc = static_cast<GeneratorAudio&>( inputEssence ).getAudioFrameDesc();
227215
AudioFrameDesc outputFrameDesc = inputFrameDesc;
228216
outputFrameDesc.setParameters( profile );
229217
_sourceBuffer = new AudioFrame( inputFrameDesc );
@@ -251,10 +239,12 @@ StreamTranscoder::~StreamTranscoder()
251239
{
252240
delete _frameBuffer;
253241
delete _sourceBuffer;
242+
// _inputEssence is a link to an existing InputEssence if _generatorEssence is NULL
243+
if( _generatorEssence )
244+
delete _inputEssence;
254245
delete _generatorEssence;
255246
delete _outputEssence;
256247
delete _transform;
257-
delete _inputEssence;
258248
}
259249

260250
void StreamTranscoder::init()

src/AvTranscoder/transcoder/StreamTranscoder.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class AvExport StreamTranscoder
3636
* @brief encode from a generated stream
3737
* @note offset feature has no sense here
3838
**/
39-
StreamTranscoder( const ICodec& inputCodec, OutputFile& outputFile, const Profile::ProfileDesc& profile );
39+
StreamTranscoder( IInputEssence& inputEssence, OutputFile& outputFile, const Profile::ProfileDesc& profile );
4040

4141
~StreamTranscoder();
4242

src/AvTranscoder/transcoder/Transcoder.cpp

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#include "Transcoder.hpp"
22

3+
#include <AvTranscoder/essenceStream/GeneratorAudio.hpp>
4+
#include <AvTranscoder/essenceStream/GeneratorVideo.hpp>
5+
36
#include <limits>
47
#include <iostream>
58
#include <algorithm>
@@ -30,6 +33,10 @@ Transcoder::~Transcoder()
3033
{
3134
delete (*it);
3235
}
36+
for( std::vector< IInputEssence* >::iterator it = _internalEssences.begin(); it != _internalEssences.end(); ++it )
37+
{
38+
delete (*it);
39+
}
3340
}
3441

3542
void Transcoder::add( const std::string& filename, const size_t streamIndex, const std::string& profileName, const size_t offset )
@@ -364,16 +371,30 @@ void Transcoder::addDummyStream( const Profile::ProfileDesc& profile, const ICod
364371
if( ! profile.count( constants::avProfileType ) )
365372
throw std::runtime_error( "unable to found stream type (audio, video, etc.)" );
366373

367-
if( _verbose )
374+
if( profile.find( constants::avProfileType )->second == constants::avProfileTypeVideo )
368375
{
369-
if( profile.find( constants::avProfileType )->second == constants::avProfileTypeVideo )
376+
if( _verbose )
370377
std::cout << "add a generated video stream" << std::endl;
371-
else if( profile.find( constants::avProfileType )->second == constants::avProfileTypeAudio )
372-
std::cout << "add a generated audio stream" << std::endl;
378+
379+
GeneratorVideo* video = new GeneratorVideo();
380+
video->setVideoFrameDesc( static_cast<const VideoCodec&>( codec ).getVideoFrameDesc() );
381+
_internalEssences.push_back( video );
382+
383+
_streamTranscodersAllocated.push_back( new StreamTranscoder( *video, _outputFile, profile ) );
384+
_streamTranscoders.push_back( _streamTranscodersAllocated.back() );
373385
}
386+
else if( profile.find( constants::avProfileType )->second == constants::avProfileTypeAudio )
387+
{
388+
if( _verbose )
389+
std::cout << "add a generated audio stream" << std::endl;
374390

375-
_streamTranscodersAllocated.push_back( new StreamTranscoder( codec, _outputFile, profile ) );
376-
_streamTranscoders.push_back( _streamTranscodersAllocated.back() );
391+
GeneratorAudio* audio = new GeneratorAudio();
392+
audio->setAudioFrameDesc( static_cast<const AudioCodec&>( codec ).getAudioFrameDesc() );
393+
_internalEssences.push_back( audio );
394+
395+
_streamTranscodersAllocated.push_back( new StreamTranscoder( *audio, _outputFile, profile ) );
396+
_streamTranscoders.push_back( _streamTranscodersAllocated.back() );
397+
}
377398
}
378399

379400
InputFile* Transcoder::addInputFile( const std::string& filename, const size_t streamIndex )

src/AvTranscoder/transcoder/Transcoder.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
#include <AvTranscoder/file/InputFile.hpp>
77
#include <AvTranscoder/file/OutputFile.hpp>
88

9-
#include <AvTranscoder/codedStream/IInputStream.hpp>
10-
11-
#include <AvTranscoder/essenceStream/GeneratorAudio.hpp>
12-
#include <AvTranscoder/essenceStream/GeneratorVideo.hpp>
9+
#include <AvTranscoder/essenceStream/IInputEssence.hpp>
10+
#include <AvTranscoder/essenceStream/IOutputEssence.hpp>
1311

1412
#include <AvTranscoder/progress/IProgress.hpp>
1513

@@ -172,6 +170,8 @@ class AvExport Transcoder
172170
std::vector< StreamTranscoder* > _streamTranscoders; ///< All streams of the output media file after process.
173171
std::vector< StreamTranscoder* > _streamTranscodersAllocated; ///< Streams allocated inside the Transcoder.
174172

173+
std::vector< IInputEssence* > _internalEssences; ///< Internal essences allocated inside the Transcoder.
174+
175175
Profile _profile; ///< Objet to get existing profiles, and add new ones for the Transcoder.
176176

177177
EProcessMethod _eProcessMethod;

test/pyTest/testSetFrame.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def testSetVideoFrame():
99
"""
1010
Generate a video stream, and set its frame during process.
1111
"""
12+
profile = av.Profile(True)
1213

1314
# create output
1415
outputFileName = "testSetVideoFrame.mov"
@@ -26,13 +27,13 @@ def testSetVideoFrame():
2627

2728
imageDesc.setPixel( inputPixel );
2829

29-
inputVideoCodec = av.VideoCodec( av.eCodecTypeEncoder, "mpeg2video" );
30-
inputVideoCodec.setImageParameters( imageDesc );
30+
video = av.GeneratorVideo()
31+
video.setVideoFrameDesc( imageDesc )
3132

3233
# create transcoder and add a video stream
3334
transcoder = av.Transcoder( ouputFile )
34-
transcoder.add( "", 0, "xdcamhd422", inputVideoCodec )
35-
videoEssence = transcoder.getStreamTranscoder( 0 ).getCurrentEssence()
35+
streamTranscoder = av.StreamTranscoder( video, ouputFile, profile.getProfile( "xdcamhd422" ) )
36+
transcoder.add( streamTranscoder )
3637

3738
# start process
3839
transcoder.init()
@@ -44,7 +45,7 @@ def testSetVideoFrame():
4445
# set video frame
4546
frame = av.VideoFrame( imageDesc )
4647
frame.getBuffer().assign(frame.getBuffer().size(), i)
47-
videoEssence.setFrame( frame )
48+
video.setFrame( frame )
4849

4950
# end process
5051
ouputFile.endWrap()
@@ -63,11 +64,11 @@ def testSetVideoFrame():
6364
assert_equals( 16, dst_videoStream.dar.num )
6465
assert_equals( 9, dst_videoStream.dar.den )
6566

66-
6767
def testSetAudioFrame():
6868
"""
6969
Generate a audio stream, and set its frame during process.
7070
"""
71+
profile = av.Profile(True)
7172

7273
# create output
7374
outputFileName = "testSetAudioFrame.wav"
@@ -79,13 +80,13 @@ def testSetAudioFrame():
7980
audioDesc.setChannels( 1 )
8081
audioDesc.setSampleFormat( "s32" )
8182

82-
inputAudioCodec = av.AudioCodec( av.eCodecTypeEncoder, "pcm_s24le" );
83-
inputAudioCodec.setAudioParameters( audioDesc );
83+
audio = av.GeneratorAudio()
84+
audio.setAudioFrameDesc( audioDesc )
8485

8586
# create transcoder and add a video stream
8687
transcoder = av.Transcoder( ouputFile )
87-
transcoder.add( "", 0, "wave24b48kmono", inputAudioCodec )
88-
audioEssence = transcoder.getStreamTranscoder( 0 ).getCurrentEssence()
88+
streamTranscoder = av.StreamTranscoder( audio, ouputFile, profile.getProfile( "wave24b48kmono" ) )
89+
transcoder.add( streamTranscoder )
8990

9091
# start process
9192
transcoder.init()
@@ -97,7 +98,7 @@ def testSetAudioFrame():
9798
# set video frame
9899
frame = av.AudioFrame( audioDesc )
99100
frame.getBuffer().assign(frame.getBuffer().size(), i)
100-
audioEssence.setFrame( frame )
101+
audio.setFrame( frame )
101102

102103
# end process
103104
ouputFile.endWrap()

0 commit comments

Comments
 (0)