Skip to content

Commit cc51d11

Browse files
add processing methods to stop or continue with dummies
1 parent bd205f4 commit cc51d11

File tree

4 files changed

+138
-23
lines changed

4 files changed

+138
-23
lines changed

src/AvTranscoder/Transcoder/StreamTranscoder.cpp

Lines changed: 68 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@ StreamTranscoder::StreamTranscoder(
2828
, _sourceBuffer( NULL )
2929
, _frameBuffer( NULL )
3030
, _inputEssence( NULL )
31+
, _dummyEssence( NULL )
3132
, _outputEssence( NULL )
3233
, _transform( NULL )
3334
, _subStreamIndex( -1 )
3435
, _transcodeStream( false )
36+
, _infiniteProcess( false )
3537
, _verbose( false )
3638
{
3739
// create a re-wrapping case
@@ -63,10 +65,12 @@ StreamTranscoder::StreamTranscoder(
6365
, _sourceBuffer( NULL )
6466
, _frameBuffer( NULL )
6567
, _inputEssence( NULL )
68+
, _dummyEssence( NULL )
6669
, _outputEssence( NULL )
6770
, _transform( NULL )
6871
, _subStreamIndex( subStreamIndex )
6972
, _transcodeStream( true )
73+
, _infiniteProcess( false )
7074
, _verbose( false )
7175
{
7276
// create a transcode case
@@ -92,6 +96,12 @@ StreamTranscoder::StreamTranscoder(
9296

9397
_transform = new VideoEssenceTransform();
9498

99+
DummyVideo* dummyVideo = new DummyVideo();
100+
dummyVideo->setVideoDesc( outputVideo->getVideoDesc() );
101+
_dummyEssence = dummyVideo;
102+
103+
_currentEssence = _inputEssence;
104+
95105
break;
96106
}
97107
case AVMEDIA_TYPE_AUDIO :
@@ -123,6 +133,12 @@ StreamTranscoder::StreamTranscoder(
123133

124134
_transform = new AudioEssenceTransform();
125135

136+
DummyAudio* dummyAudio = new DummyAudio();
137+
dummyAudio->setAudioDesc( outputAudio->getAudioDesc() );
138+
_dummyEssence = dummyAudio;
139+
140+
_currentEssence = _inputEssence;
141+
126142
break;
127143
}
128144
default:
@@ -143,10 +159,12 @@ StreamTranscoder::StreamTranscoder(
143159
, _sourceBuffer( NULL )
144160
, _frameBuffer( NULL )
145161
, _inputEssence( &inputEssence )
162+
, _dummyEssence( NULL )
146163
, _outputEssence( NULL )
147164
, _transform( NULL )
148165
, _subStreamIndex( -1 )
149166
, _transcodeStream( true )
167+
, _infiniteProcess( false )
150168
, _verbose( false )
151169
{
152170
// create a coding case based on a InputEssence (aka dummy reader)
@@ -166,7 +184,9 @@ StreamTranscoder::StreamTranscoder(
166184
_frameBuffer = new VideoFrame( outputVideo->getVideoDesc().getVideoFrameDesc() );
167185

168186
_transform = new VideoEssenceTransform();
169-
187+
188+
_currentEssence = _inputEssence;
189+
170190
return;
171191
}
172192

@@ -186,6 +206,7 @@ StreamTranscoder::StreamTranscoder(
186206

187207
_transform = new AudioEssenceTransform();
188208

209+
_currentEssence = _inputEssence;
189210
return;
190211
}
191212

@@ -200,6 +221,8 @@ StreamTranscoder::~StreamTranscoder()
200221
delete _sourceBuffer;
201222
if( _inputEssence && _inputStream )
202223
delete _inputEssence;
224+
if( _dummyEssence )
225+
delete _dummyEssence;
203226
if( _outputEssence )
204227
delete _outputEssence;
205228
if( _transform )
@@ -258,16 +281,17 @@ bool StreamTranscoder::processRewrap( const int subStreamIndex )
258281

259282
bool StreamTranscoder::processTranscode()
260283
{
261-
assert( _inputEssence != NULL );
262-
assert( _outputEssence != NULL );
263-
assert( _sourceBuffer != NULL );
264-
assert( _frameBuffer != NULL );
265-
assert( _transform != NULL );
284+
assert( _inputEssence != NULL );
285+
assert( _currentEssence != NULL );
286+
assert( _outputEssence != NULL );
287+
assert( _sourceBuffer != NULL );
288+
assert( _frameBuffer != NULL );
289+
assert( _transform != NULL );
266290

267291
DataStream dataStream;
268292
if( _verbose )
269293
std::cout << "transcode a frame " << std::endl;
270-
if( _inputEssence->readNextFrame( *_sourceBuffer ) )
294+
if( _currentEssence->readNextFrame( *_sourceBuffer ) )
271295
{
272296
if( _verbose )
273297
std::cout << "convert " << _sourceBuffer->getSize() << std::endl;
@@ -278,6 +302,12 @@ bool StreamTranscoder::processTranscode()
278302
}
279303
else
280304
{
305+
if( _infiniteProcess )
306+
{
307+
switchToDummyEssence();
308+
return processTranscode( );
309+
}
310+
281311
if( _verbose )
282312
std::cout << "encode last frame(s)" << std::endl;
283313
if( ! _outputEssence->encodeFrame( dataStream ) )
@@ -294,16 +324,17 @@ bool StreamTranscoder::processTranscode()
294324

295325
bool StreamTranscoder::processTranscode( const int subStreamIndex )
296326
{
297-
assert( _inputEssence != NULL );
298-
assert( _outputEssence != NULL );
299-
assert( _sourceBuffer != NULL );
300-
assert( _frameBuffer != NULL );
301-
assert( _transform != NULL );
327+
assert( _inputEssence != NULL );
328+
assert( _currentEssence != NULL );
329+
assert( _outputEssence != NULL );
330+
assert( _sourceBuffer != NULL );
331+
assert( _frameBuffer != NULL );
332+
assert( _transform != NULL );
302333

303334
DataStream dataStream;
304335
if( _verbose )
305336
std::cout << "transcode a frame " << std::endl;
306-
if( _inputEssence->readNextFrame( *_sourceBuffer, subStreamIndex ) )
337+
if( _currentEssence->readNextFrame( *_sourceBuffer, subStreamIndex ) )
307338
{
308339
if( _verbose )
309340
std::cout << "convert " << std::endl;
@@ -314,6 +345,12 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
314345
}
315346
else
316347
{
348+
if( _infiniteProcess )
349+
{
350+
switchToDummyEssence();
351+
return processTranscode( );
352+
}
353+
317354
if( ! _outputEssence->encodeFrame( dataStream ) )
318355
{
319356
return false;
@@ -325,4 +362,22 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
325362
return true;
326363
}
327364

365+
void StreamTranscoder::switchToDummyEssence()
366+
{
367+
if( _dummyEssence == NULL )
368+
return;
369+
_takeFromDummy = true;
370+
_currentEssence = _dummyEssence;
371+
assert( _currentEssence != NULL );
372+
}
373+
374+
void StreamTranscoder::switchToInputEssence()
375+
{
376+
if( _inputEssence == NULL )
377+
return;
378+
_takeFromDummy = false;
379+
_currentEssence = _inputEssence;
380+
assert( _currentEssence != NULL );
381+
}
382+
328383
}

src/AvTranscoder/Transcoder/StreamTranscoder.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ class StreamTranscoder
4747

4848
void setVerbose( bool verbose = true ){ _verbose = verbose; }
4949

50+
void switchToDummyEssence();
51+
void switchToInputEssence();
52+
void setInfinityProcess( bool infinity = true ){ _infiniteProcess = infinity; }
53+
5054
private:
5155
bool processRewrap();
5256
bool processRewrap( const int subStreamIndex );
@@ -61,12 +65,17 @@ class StreamTranscoder
6165
Frame* _frameBuffer;
6266

6367
InputEssence* _inputEssence;
68+
InputEssence* _dummyEssence;
69+
InputEssence* _currentEssence;
6470
OutputEssence* _outputEssence;
6571

6672
EssenceTransform* _transform;
6773

6874
int _subStreamIndex;
6975
bool _transcodeStream;
76+
bool _takeFromDummy;
77+
bool _infiniteProcess;
78+
7079
bool _verbose;
7180
};
7281

src/AvTranscoder/Transcoder/Transcoder.cpp

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ namespace avtranscoder
66
Transcoder::Transcoder( OutputFile& outputFile )
77
: _outputFile( outputFile )
88
, _profile( true )
9+
, _finalisedStreams( 0 )
10+
, _eProcessMethod ( eProcessMethodLongest )
911
, _verbose( false )
1012
{
1113
_outputFile.setup();
@@ -50,8 +52,8 @@ void Transcoder::add( const std::string& filename, const size_t streamIndex, Pro
5052
_profile.update( profileDesc );
5153
if( ! filename.length() )
5254
{
53-
if( _verbose )
54-
std::cerr << "can't add a stream with no filename indicated" << std::endl;
55+
// if( _verbose )
56+
std::cerr << "can't add a stream with no filename indicated" << std::endl;
5557
return;
5658
}
5759

@@ -161,9 +163,29 @@ bool Transcoder::processFrame()
161163
if( _verbose )
162164
std::cout << "process stream " << streamIndex << "/" << _streamTranscoders.size() - 1 << std::endl;
163165

164-
if( ! _streamTranscoders.at( streamIndex )->processFrame() )
166+
bool streamProcessStatus = _streamTranscoders.at( streamIndex )->processFrame();
167+
168+
if( streamProcessStatus )
169+
continue;
170+
171+
switch( _eProcessMethod )
165172
{
166-
_streamTranscoders.clear();
173+
case eProcessMethodShortest :
174+
_streamTranscoders.clear();
175+
break;
176+
case eProcessMethodLongest :
177+
++_finalisedStreams;
178+
_streamTranscoders.at( streamIndex )->switchToDummyEssence();
179+
if( _verbose )
180+
std::cout << "-> switch to dummy for stream " << streamIndex << std::endl;
181+
if( _finalisedStreams == _streamTranscoders.size() )
182+
_streamTranscoders.clear();
183+
break;
184+
case eProcessMethodInfinity :
185+
if( _verbose )
186+
std::cout << "-> infinity processing: switch to dummy for stream " << streamIndex << std::endl;
187+
_streamTranscoders.at( streamIndex )->switchToDummyEssence();
188+
break;
167189
}
168190
}
169191
return true;
@@ -173,7 +195,6 @@ void Transcoder::process( ProgressListener& progress )
173195
{
174196
size_t frame = 0;
175197

176-
177198
std::vector< DataStream > dataStreams;
178199

179200
dataStreams.reserve( _inputStreams.size() );
@@ -196,16 +217,21 @@ void Transcoder::process( ProgressListener& progress )
196217

197218
double totalDuration = _inputStreams.at( 0 )->getDuration();
198219

220+
if( _verbose )
221+
av_log_set_level( AV_LOG_DEBUG );
222+
199223
while( 1 )
200224
{
201-
if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), totalDuration ) == eJobStatusCancel )
225+
if( _verbose )
226+
std::cout << "process frame " << frame << std::endl;
227+
if( ! processFrame() )
228+
break;
229+
230+
if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame ), totalDuration ) == eJobStatusCancel )
202231
{
203232
break;
204233
}
205234

206-
if( ! processFrame() )
207-
break;
208-
209235
++frame;
210236
}
211237

@@ -215,19 +241,28 @@ void Transcoder::process( ProgressListener& progress )
215241
_outputFile.endWrap();
216242
}
217243

244+
void Transcoder::setProcessMethod( const EProcessMethod eProcessMethod )
245+
{
246+
_eProcessMethod = eProcessMethod;
247+
for( std::vector< StreamTranscoder* >::iterator it = _streamTranscoders.begin(); it != _streamTranscoders.end(); ++it )
248+
{
249+
(*it)->setInfinityProcess( eProcessMethod == eProcessMethodInfinity );
250+
}
251+
}
252+
218253
void Transcoder::setVerbose( bool verbose )
219254
{
220255
_verbose = verbose;
221256
for( std::vector< StreamTranscoder* >::iterator it = _streamTranscoders.begin(); it != _streamTranscoders.end(); ++it )
222257
{
223258
(*it)->setVerbose( _verbose );
224259
}
260+
_outputFile.setVerbose( _verbose );
225261
}
226262

227263
void Transcoder::addRewrapStream( const std::string& filename, const size_t streamIndex )
228264
{
229265
InputFile* referenceFile = addInputFile( filename, streamIndex );
230-
231266
_streamTranscoders.push_back( new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile ) );
232267
_inputStreams.push_back( &referenceFile->getStream( streamIndex ) );
233268
}
@@ -285,6 +320,8 @@ void Transcoder::addDummyStream( const Profile::ProfileDesc& profile, const Code
285320

286321
if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeAudio )
287322
{
323+
if( _verbose )
324+
std::cout << "add dummy audio" << std::endl;
288325
_dummyAudio.push_back( new DummyAudio() );
289326
_dummyAudio.back()->setAudioDesc( static_cast<AudioDesc>( essenceDesc ) );
290327

@@ -293,6 +330,8 @@ void Transcoder::addDummyStream( const Profile::ProfileDesc& profile, const Code
293330

294331
if( profile.find( Profile::avProfileType )->second == Profile::avProfileTypeVideo )
295332
{
333+
if( _verbose )
334+
std::cout << "add dummy video" << std::endl;
296335
_dummyVideo.push_back( new DummyVideo() );
297336
_dummyVideo.back()->setVideoDesc( static_cast<VideoDesc>( essenceDesc ) );
298337

src/AvTranscoder/Transcoder/Transcoder.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
namespace avtranscoder
2424
{
2525

26+
enum EProcessMethod
27+
{
28+
eProcessMethodShortest = 0,
29+
eProcessMethodLongest,
30+
eProcessMethodInfinity,
31+
};
32+
2633
class Transcoder
2734
{
2835
public:
@@ -75,6 +82,8 @@ class Transcoder
7582

7683
void process( ProgressListener& progress );
7784

85+
void setProcessMethod( const EProcessMethod eProcessMethod );
86+
7887
void setVerbose( bool verbose = true );
7988

8089
private:
@@ -101,6 +110,9 @@ class Transcoder
101110

102111
Profile _profile;
103112

113+
size_t _finalisedStreams;
114+
EProcessMethod _eProcessMethod;
115+
104116
bool _verbose;
105117
};
106118

0 commit comments

Comments
 (0)