Skip to content

Commit 8ad7ce8

Browse files
Merge pull request #47 from cchampet/dev_offset
Transcoder: add offset
2 parents 02cbb66 + 50b61a1 commit 8ad7ce8

File tree

5 files changed

+224
-111
lines changed

5 files changed

+224
-111
lines changed

app/genericProcessor/genericProcessor.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,16 @@ int main( int argc, char** argv )
108108
avtranscoder::OutputFile outputFile( argv[2] );
109109

110110
avtranscoder::Transcoder transcoder( outputFile );
111-
transcoder.setVerbose( verbose );
112-
transcoder.setProcessMethod( avtranscoder::eProcessMethodShortest );
113111

114112
if( verbose )
115113
std::cout << "parse config file" << std::endl;
116114
parseConfigFile( inputConfigFile, transcoder, profiles );
117115

116+
// set verbose of all stream
117+
transcoder.setVerbose( verbose );
118+
transcoder.setProcessMethod( avtranscoder::eProcessMethodInfinity );
119+
//transcoder.setOutputFps( 12 );
120+
118121
if( verbose )
119122
std::cout << "start Transcode" << std::endl;
120123

src/AvTranscoder/Transcoder/StreamTranscoder.cpp

Lines changed: 76 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <cassert>
1717
#include <iostream>
18+
#include <limits>
1819

1920
namespace avtranscoder
2021
{
@@ -32,9 +33,12 @@ StreamTranscoder::StreamTranscoder(
3233
, _outputEssence( NULL )
3334
, _transform( NULL )
3435
, _subStreamIndex( -1 )
35-
, _transcodeStream( false )
36-
, _infiniteProcess( false )
36+
, _frameProcessed( 0 )
37+
, _offset( 0 )
38+
, _takeFromDummy( false )
3739
, _verbose( false )
40+
, _offsetPassed( false )
41+
, _infinityStream( false )
3842
{
3943
// create a re-wrapping case
4044
switch( _inputStream->getStreamType() )
@@ -58,7 +62,8 @@ StreamTranscoder::StreamTranscoder(
5862
InputStream& inputStream,
5963
OutputFile& outputFile,
6064
const Profile::ProfileDesc& profile,
61-
const int subStreamIndex
65+
const int subStreamIndex,
66+
const size_t offset
6267
)
6368
: _inputStream( &inputStream )
6469
, _outputStream( NULL )
@@ -69,9 +74,12 @@ StreamTranscoder::StreamTranscoder(
6974
, _outputEssence( NULL )
7075
, _transform( NULL )
7176
, _subStreamIndex( subStreamIndex )
72-
, _transcodeStream( true )
73-
, _infiniteProcess( false )
77+
, _frameProcessed( 0 )
78+
, _offset( offset )
79+
, _takeFromDummy( false )
7480
, _verbose( false )
81+
, _offsetPassed( false )
82+
, _infinityStream( false )
7583
{
7684
// create a transcode case
7785
switch( _inputStream->getStreamType() )
@@ -99,8 +107,6 @@ StreamTranscoder::StreamTranscoder(
99107
DummyVideo* dummyVideo = new DummyVideo();
100108
dummyVideo->setVideoDesc( outputVideo->getVideoDesc() );
101109
_dummyEssence = dummyVideo;
102-
103-
_currentEssence = _inputEssence;
104110

105111
break;
106112
}
@@ -137,8 +143,6 @@ StreamTranscoder::StreamTranscoder(
137143
dummyAudio->setAudioDesc( outputAudio->getAudioDesc() );
138144
_dummyEssence = dummyAudio;
139145

140-
_currentEssence = _inputEssence;
141-
142146
break;
143147
}
144148
default:
@@ -147,6 +151,7 @@ StreamTranscoder::StreamTranscoder(
147151
break;
148152
}
149153
}
154+
switchEssence( offset != 0 );
150155
}
151156

152157
StreamTranscoder::StreamTranscoder(
@@ -163,9 +168,12 @@ StreamTranscoder::StreamTranscoder(
163168
, _outputEssence( NULL )
164169
, _transform( NULL )
165170
, _subStreamIndex( -1 )
166-
, _transcodeStream( true )
167-
, _infiniteProcess( false )
171+
, _frameProcessed( 0 )
172+
, _offset( 0 )
173+
, _takeFromDummy( false )
168174
, _verbose( false )
175+
, _offsetPassed( false )
176+
, _infinityStream( false )
169177
{
170178
// create a coding case based on a InputEssence (aka dummy reader)
171179
if( ! profile.count( Profile::avProfileType ) )
@@ -237,7 +245,8 @@ StreamTranscoder::~StreamTranscoder()
237245

238246
bool StreamTranscoder::processFrame()
239247
{
240-
if( _transcodeStream )
248+
++_frameProcessed;
249+
if( _transform )
241250
{
242251
if( _subStreamIndex < 0 )
243252
{
@@ -275,12 +284,10 @@ bool StreamTranscoder::processRewrap( const int subStreamIndex )
275284
assert( _outputStream != NULL );
276285

277286
DataStream dataStream;
278-
// std::vector<DataStream> dataStream;
279287

280288
if( ! _inputStream->readNextPacket( dataStream ) )
281289
return false;
282290
_outputStream->wrap( dataStream );
283-
// outputStream.wrap( dataStream.at( subStreamIndex ) );
284291

285292
return true;
286293
}
@@ -297,6 +304,16 @@ bool StreamTranscoder::processTranscode()
297304
DataStream dataStream;
298305
if( _verbose )
299306
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+
300317
if( _currentEssence->readNextFrame( *_sourceBuffer ) )
301318
{
302319
if( _verbose )
@@ -308,16 +325,15 @@ bool StreamTranscoder::processTranscode()
308325
}
309326
else
310327
{
311-
if( _infiniteProcess )
312-
{
313-
switchToDummyEssence();
314-
return processTranscode( );
315-
}
316-
317328
if( _verbose )
318329
std::cout << "encode last frame(s)" << std::endl;
319330
if( ! _outputEssence->encodeFrame( dataStream ) )
320331
{
332+
if( _infinityStream )
333+
{
334+
switchToDummyEssence();
335+
return processTranscode();
336+
}
321337
return false;
322338
}
323339
}
@@ -340,6 +356,16 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
340356
DataStream dataStream;
341357
if( _verbose )
342358
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+
343369
if( _currentEssence->readNextFrame( *_sourceBuffer, subStreamIndex ) )
344370
{
345371
if( _verbose )
@@ -351,14 +377,15 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
351377
}
352378
else
353379
{
354-
if( _infiniteProcess )
355-
{
356-
switchToDummyEssence();
357-
return processTranscode( );
358-
}
359-
380+
if( _verbose )
381+
std::cout << "encode last frame(s)" << std::endl;
360382
if( ! _outputEssence->encodeFrame( dataStream ) )
361383
{
384+
if( _infinityStream )
385+
{
386+
switchToDummyEssence();
387+
return processTranscode();
388+
}
362389
return false;
363390
}
364391
}
@@ -368,22 +395,35 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
368395
return true;
369396
}
370397

371-
void StreamTranscoder::switchToDummyEssence()
398+
void StreamTranscoder::switchEssence( bool swithToDummy )
372399
{
373-
if( _dummyEssence == NULL )
374-
return;
375-
_takeFromDummy = true;
376-
_currentEssence = _dummyEssence;
400+
_takeFromDummy = swithToDummy;
401+
_currentEssence = swithToDummy ? _dummyEssence : _inputEssence;
377402
assert( _currentEssence != NULL );
378403
}
379404

405+
void StreamTranscoder::switchToDummyEssence()
406+
{
407+
switchEssence( true );
408+
}
409+
380410
void StreamTranscoder::switchToInputEssence()
381411
{
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();
387427
}
388428

389429
}

src/AvTranscoder/Transcoder/StreamTranscoder.hpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,18 @@ class StreamTranscoder
2222
public:
2323
/**
2424
* @brief rewrap stream
25+
* @note offset feature when rewrap a stream is not supported
2526
**/
2627
StreamTranscoder( InputStream& inputStream, OutputFile& outputFile );
2728

2829
/**
2930
* @brief transcode stream
3031
**/
31-
StreamTranscoder( InputStream& inputStream, OutputFile& outputFile, const Profile::ProfileDesc& profile, const int subStreamIndex = -1 );
32+
StreamTranscoder( InputStream& inputStream, OutputFile& outputFile, const Profile::ProfileDesc& profile, const int subStreamIndex = -1, const size_t offset = 0 );
3233

3334
/**
3435
* @brief encode from dummy stream
36+
* @note offset feature has no sense here
3537
**/
3638
StreamTranscoder( InputEssence& inputEssence, OutputFile& outputFile, const Profile::ProfileDesc& profile );
3739

@@ -43,13 +45,21 @@ class StreamTranscoder
4345
*/
4446
bool processFrame();
4547

46-
bool isTranscodeStream() const { return _transcodeStream; }
48+
void switchEssence( bool swithToDummy = true );
49+
void switchToDummyEssence();
50+
void switchToInputEssence();
4751

4852
void setVerbose( bool verbose = true ){ _verbose = verbose; }
4953

50-
void switchToDummyEssence();
51-
void switchToInputEssence();
52-
void setInfinityProcess( bool infinity = true ){ _infiniteProcess = infinity; }
54+
void setInfinityStream( bool isInfinity ) { _infinityStream = isInfinity; }
55+
56+
void setOffset( bool offset = true ){ _offset = offset; }
57+
58+
/**
59+
* @brief Get the duration of the stream.
60+
* @note if it's a dummy stream, return limit of double.
61+
*/
62+
double getDuration() const;
5363

5464
private:
5565
bool processRewrap();
@@ -72,11 +82,27 @@ class StreamTranscoder
7282
EssenceTransform* _transform;
7383

7484
int _subStreamIndex;
75-
bool _transcodeStream;
85+
86+
/**
87+
* @brief How many frame processed for this StreamTranscoder.
88+
*/
89+
size_t _frameProcessed;
90+
/**
91+
* @brief Offset, in frame, at the beginning of the StreamTranscoder.
92+
*/
93+
size_t _offset;
94+
7695
bool _takeFromDummy;
77-
bool _infiniteProcess;
7896

7997
bool _verbose;
98+
99+
bool _offsetPassed;
100+
101+
/**
102+
* @brief Automatic switch to dummy
103+
* @note not applicable when rewrap
104+
*/
105+
bool _infinityStream;
80106
};
81107

82108
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy