15
15
16
16
#include < cassert>
17
17
#include < iostream>
18
+ #include < limits>
18
19
19
20
namespace avtranscoder
20
21
{
@@ -32,9 +33,12 @@ StreamTranscoder::StreamTranscoder(
32
33
, _outputEssence( NULL )
33
34
, _transform( NULL )
34
35
, _subStreamIndex( -1 )
35
- , _transcodeStream( false )
36
- , _infiniteProcess( false )
36
+ , _frameProcessed( 0 )
37
+ , _offset( 0 )
38
+ , _takeFromDummy( false )
37
39
, _verbose( false )
40
+ , _offsetPassed( false )
41
+ , _infinityStream( false )
38
42
{
39
43
// create a re-wrapping case
40
44
switch ( _inputStream->getStreamType () )
@@ -58,7 +62,8 @@ StreamTranscoder::StreamTranscoder(
58
62
InputStream& inputStream,
59
63
OutputFile& outputFile,
60
64
const Profile::ProfileDesc& profile,
61
- const int subStreamIndex
65
+ const int subStreamIndex,
66
+ const size_t offset
62
67
)
63
68
: _inputStream( &inputStream )
64
69
, _outputStream( NULL )
@@ -69,9 +74,12 @@ StreamTranscoder::StreamTranscoder(
69
74
, _outputEssence( NULL )
70
75
, _transform( NULL )
71
76
, _subStreamIndex( subStreamIndex )
72
- , _transcodeStream( true )
73
- , _infiniteProcess( false )
77
+ , _frameProcessed( 0 )
78
+ , _offset( offset )
79
+ , _takeFromDummy( false )
74
80
, _verbose( false )
81
+ , _offsetPassed( false )
82
+ , _infinityStream( false )
75
83
{
76
84
// create a transcode case
77
85
switch ( _inputStream->getStreamType () )
@@ -99,8 +107,6 @@ StreamTranscoder::StreamTranscoder(
99
107
DummyVideo* dummyVideo = new DummyVideo ();
100
108
dummyVideo->setVideoDesc ( outputVideo->getVideoDesc () );
101
109
_dummyEssence = dummyVideo;
102
-
103
- _currentEssence = _inputEssence;
104
110
105
111
break ;
106
112
}
@@ -137,8 +143,6 @@ StreamTranscoder::StreamTranscoder(
137
143
dummyAudio->setAudioDesc ( outputAudio->getAudioDesc () );
138
144
_dummyEssence = dummyAudio;
139
145
140
- _currentEssence = _inputEssence;
141
-
142
146
break ;
143
147
}
144
148
default :
@@ -147,6 +151,7 @@ StreamTranscoder::StreamTranscoder(
147
151
break ;
148
152
}
149
153
}
154
+ switchEssence ( offset != 0 );
150
155
}
151
156
152
157
StreamTranscoder::StreamTranscoder (
@@ -163,9 +168,12 @@ StreamTranscoder::StreamTranscoder(
163
168
, _outputEssence( NULL )
164
169
, _transform( NULL )
165
170
, _subStreamIndex( -1 )
166
- , _transcodeStream( true )
167
- , _infiniteProcess( false )
171
+ , _frameProcessed( 0 )
172
+ , _offset( 0 )
173
+ , _takeFromDummy( false )
168
174
, _verbose( false )
175
+ , _offsetPassed( false )
176
+ , _infinityStream( false )
169
177
{
170
178
// create a coding case based on a InputEssence (aka dummy reader)
171
179
if ( ! profile.count ( Profile::avProfileType ) )
@@ -237,7 +245,8 @@ StreamTranscoder::~StreamTranscoder()
237
245
238
246
bool StreamTranscoder::processFrame ()
239
247
{
240
- if ( _transcodeStream )
248
+ ++_frameProcessed;
249
+ if ( _transform )
241
250
{
242
251
if ( _subStreamIndex < 0 )
243
252
{
@@ -275,12 +284,10 @@ bool StreamTranscoder::processRewrap( const int subStreamIndex )
275
284
assert ( _outputStream != NULL );
276
285
277
286
DataStream dataStream;
278
- // std::vector<DataStream> dataStream;
279
287
280
288
if ( ! _inputStream->readNextPacket ( dataStream ) )
281
289
return false ;
282
290
_outputStream->wrap ( dataStream );
283
- // outputStream.wrap( dataStream.at( subStreamIndex ) );
284
291
285
292
return true ;
286
293
}
@@ -297,6 +304,16 @@ bool StreamTranscoder::processTranscode()
297
304
DataStream dataStream;
298
305
if ( _verbose )
299
306
std::cout << " transcode a frame " << std::endl;
307
+
308
+ if ( _offset &&
309
+ _frameProcessed > _offset &&
310
+ ! _offsetPassed &&
311
+ _takeFromDummy )
312
+ {
313
+ switchToInputEssence ();
314
+ _offsetPassed = true ;
315
+ }
316
+
300
317
if ( _currentEssence->readNextFrame ( *_sourceBuffer ) )
301
318
{
302
319
if ( _verbose )
@@ -308,16 +325,15 @@ bool StreamTranscoder::processTranscode()
308
325
}
309
326
else
310
327
{
311
- if ( _infiniteProcess )
312
- {
313
- switchToDummyEssence ();
314
- return processTranscode ( );
315
- }
316
-
317
328
if ( _verbose )
318
329
std::cout << " encode last frame(s)" << std::endl;
319
330
if ( ! _outputEssence->encodeFrame ( dataStream ) )
320
331
{
332
+ if ( _infinityStream )
333
+ {
334
+ switchToDummyEssence ();
335
+ return processTranscode ();
336
+ }
321
337
return false ;
322
338
}
323
339
}
@@ -340,6 +356,16 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
340
356
DataStream dataStream;
341
357
if ( _verbose )
342
358
std::cout << " transcode a frame " << std::endl;
359
+
360
+ if ( _offset &&
361
+ _frameProcessed > _offset &&
362
+ ! _offsetPassed &&
363
+ _takeFromDummy )
364
+ {
365
+ switchToInputEssence ();
366
+ _offsetPassed = true ;
367
+ }
368
+
343
369
if ( _currentEssence->readNextFrame ( *_sourceBuffer, subStreamIndex ) )
344
370
{
345
371
if ( _verbose )
@@ -351,14 +377,15 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
351
377
}
352
378
else
353
379
{
354
- if ( _infiniteProcess )
355
- {
356
- switchToDummyEssence ();
357
- return processTranscode ( );
358
- }
359
-
380
+ if ( _verbose )
381
+ std::cout << " encode last frame(s)" << std::endl;
360
382
if ( ! _outputEssence->encodeFrame ( dataStream ) )
361
383
{
384
+ if ( _infinityStream )
385
+ {
386
+ switchToDummyEssence ();
387
+ return processTranscode ();
388
+ }
362
389
return false ;
363
390
}
364
391
}
@@ -368,22 +395,35 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
368
395
return true ;
369
396
}
370
397
371
- void StreamTranscoder::switchToDummyEssence ( )
398
+ void StreamTranscoder::switchEssence ( bool swithToDummy )
372
399
{
373
- if ( _dummyEssence == NULL )
374
- return ;
375
- _takeFromDummy = true ;
376
- _currentEssence = _dummyEssence;
400
+ _takeFromDummy = swithToDummy;
401
+ _currentEssence = swithToDummy ? _dummyEssence : _inputEssence;
377
402
assert ( _currentEssence != NULL );
378
403
}
379
404
405
+ void StreamTranscoder::switchToDummyEssence ()
406
+ {
407
+ switchEssence ( true );
408
+ }
409
+
380
410
void StreamTranscoder::switchToInputEssence ()
381
411
{
382
- if ( _inputEssence == NULL )
383
- return ;
384
- _takeFromDummy = false ;
385
- _currentEssence = _inputEssence;
386
- assert ( _currentEssence != NULL );
412
+ switchEssence ( false );
413
+ }
414
+
415
+ double StreamTranscoder::getDuration () const
416
+ {
417
+ if ( _inputStream )
418
+ {
419
+ double totalDuration = 0 ;
420
+ totalDuration += _inputStream->getDuration ();
421
+ // @todo add offset
422
+ return totalDuration;
423
+ }
424
+ // dummy
425
+ else
426
+ return std::numeric_limits<double >::max ();
387
427
}
388
428
389
429
}
0 commit comments