@@ -28,10 +28,12 @@ StreamTranscoder::StreamTranscoder(
28
28
, _sourceBuffer( NULL )
29
29
, _frameBuffer( NULL )
30
30
, _inputEssence( NULL )
31
+ , _dummyEssence( NULL )
31
32
, _outputEssence( NULL )
32
33
, _transform( NULL )
33
34
, _subStreamIndex( -1 )
34
35
, _transcodeStream( false )
36
+ , _infiniteProcess( false )
35
37
, _verbose( false )
36
38
{
37
39
// create a re-wrapping case
@@ -63,10 +65,12 @@ StreamTranscoder::StreamTranscoder(
63
65
, _sourceBuffer( NULL )
64
66
, _frameBuffer( NULL )
65
67
, _inputEssence( NULL )
68
+ , _dummyEssence( NULL )
66
69
, _outputEssence( NULL )
67
70
, _transform( NULL )
68
71
, _subStreamIndex( subStreamIndex )
69
72
, _transcodeStream( true )
73
+ , _infiniteProcess( false )
70
74
, _verbose( false )
71
75
{
72
76
// create a transcode case
@@ -92,6 +96,12 @@ StreamTranscoder::StreamTranscoder(
92
96
93
97
_transform = new VideoEssenceTransform ();
94
98
99
+ DummyVideo* dummyVideo = new DummyVideo ();
100
+ dummyVideo->setVideoDesc ( outputVideo->getVideoDesc () );
101
+ _dummyEssence = dummyVideo;
102
+
103
+ _currentEssence = _inputEssence;
104
+
95
105
break ;
96
106
}
97
107
case AVMEDIA_TYPE_AUDIO :
@@ -123,6 +133,12 @@ StreamTranscoder::StreamTranscoder(
123
133
124
134
_transform = new AudioEssenceTransform ();
125
135
136
+ DummyAudio* dummyAudio = new DummyAudio ();
137
+ dummyAudio->setAudioDesc ( outputAudio->getAudioDesc () );
138
+ _dummyEssence = dummyAudio;
139
+
140
+ _currentEssence = _inputEssence;
141
+
126
142
break ;
127
143
}
128
144
default :
@@ -143,16 +159,37 @@ StreamTranscoder::StreamTranscoder(
143
159
, _sourceBuffer( NULL )
144
160
, _frameBuffer( NULL )
145
161
, _inputEssence( &inputEssence )
162
+ , _dummyEssence( NULL )
146
163
, _outputEssence( NULL )
147
164
, _transform( NULL )
148
165
, _subStreamIndex( -1 )
149
166
, _transcodeStream( true )
167
+ , _infiniteProcess( false )
150
168
, _verbose( false )
151
169
{
152
170
// create a coding case based on a InputEssence (aka dummy reader)
153
171
if ( ! profile.count ( Profile::avProfileType ) )
154
172
throw std::runtime_error ( " unable to found stream type (audio, video, etc.)" );
155
173
174
+ if ( profile.find ( Profile::avProfileType )->second == Profile::avProfileTypeVideo )
175
+ {
176
+ OutputVideo* outputVideo = new OutputVideo ();
177
+
178
+ _outputEssence = outputVideo;
179
+ VideoFrameDesc inputVideoFrameDesc = static_cast <DummyVideo*>( _inputEssence )->getVideoDesc ().getVideoFrameDesc ();
180
+ outputVideo->setProfile ( profile, inputVideoFrameDesc );
181
+
182
+ _outputStream = &outputFile.addVideoStream ( outputVideo->getVideoDesc () );
183
+ _sourceBuffer = new VideoFrame ( outputVideo->getVideoDesc ().getVideoFrameDesc () );
184
+ _frameBuffer = new VideoFrame ( outputVideo->getVideoDesc ().getVideoFrameDesc () );
185
+
186
+ _transform = new VideoEssenceTransform ();
187
+
188
+ _currentEssence = _inputEssence;
189
+
190
+ return ;
191
+ }
192
+
156
193
if ( profile.find ( Profile::avProfileType )->second == Profile::avProfileTypeAudio )
157
194
{
158
195
OutputAudio* outputAudio = new OutputAudio ();
@@ -169,23 +206,7 @@ StreamTranscoder::StreamTranscoder(
169
206
170
207
_transform = new AudioEssenceTransform ();
171
208
172
- return ;
173
- }
174
-
175
- if ( profile.find ( Profile::avProfileType )->second == Profile::avProfileTypeVideo )
176
- {
177
- OutputVideo* outputVideo = new OutputVideo ();
178
-
179
- _outputEssence = outputVideo;
180
- VideoFrameDesc inputVideoFrameDesc = static_cast <DummyVideo*>( _inputEssence )->getVideoDesc ().getVideoFrameDesc ();
181
- outputVideo->setProfile ( profile, inputVideoFrameDesc );
182
-
183
- _outputStream = &outputFile.addVideoStream ( outputVideo->getVideoDesc () );
184
- _sourceBuffer = new VideoFrame ( outputVideo->getVideoDesc ().getVideoFrameDesc () );
185
- _frameBuffer = new VideoFrame ( outputVideo->getVideoDesc ().getVideoFrameDesc () );
186
-
187
- _transform = new VideoEssenceTransform ();
188
-
209
+ _currentEssence = _inputEssence;
189
210
return ;
190
211
}
191
212
@@ -200,6 +221,8 @@ StreamTranscoder::~StreamTranscoder()
200
221
delete _sourceBuffer;
201
222
if ( _inputEssence && _inputStream )
202
223
delete _inputEssence;
224
+ if ( _dummyEssence )
225
+ delete _dummyEssence;
203
226
if ( _outputEssence )
204
227
delete _outputEssence;
205
228
if ( _transform )
@@ -258,16 +281,17 @@ bool StreamTranscoder::processRewrap( const int subStreamIndex )
258
281
259
282
bool StreamTranscoder::processTranscode ()
260
283
{
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 );
266
290
267
291
DataStream dataStream;
268
292
if ( _verbose )
269
293
std::cout << " transcode a frame " << std::endl;
270
- if ( _inputEssence ->readNextFrame ( *_sourceBuffer ) )
294
+ if ( _currentEssence ->readNextFrame ( *_sourceBuffer ) )
271
295
{
272
296
if ( _verbose )
273
297
std::cout << " convert " << _sourceBuffer->getSize () << std::endl;
@@ -278,6 +302,12 @@ bool StreamTranscoder::processTranscode()
278
302
}
279
303
else
280
304
{
305
+ if ( _infiniteProcess )
306
+ {
307
+ switchToDummyEssence ();
308
+ return processTranscode ( );
309
+ }
310
+
281
311
if ( _verbose )
282
312
std::cout << " encode last frame(s)" << std::endl;
283
313
if ( ! _outputEssence->encodeFrame ( dataStream ) )
@@ -294,16 +324,17 @@ bool StreamTranscoder::processTranscode()
294
324
295
325
bool StreamTranscoder::processTranscode ( const int subStreamIndex )
296
326
{
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 );
302
333
303
334
DataStream dataStream;
304
335
if ( _verbose )
305
336
std::cout << " transcode a frame " << std::endl;
306
- if ( _inputEssence ->readNextFrame ( *_sourceBuffer, subStreamIndex ) )
337
+ if ( _currentEssence ->readNextFrame ( *_sourceBuffer, subStreamIndex ) )
307
338
{
308
339
if ( _verbose )
309
340
std::cout << " convert " << std::endl;
@@ -314,6 +345,12 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
314
345
}
315
346
else
316
347
{
348
+ if ( _infiniteProcess )
349
+ {
350
+ switchToDummyEssence ();
351
+ return processTranscode ( );
352
+ }
353
+
317
354
if ( ! _outputEssence->encodeFrame ( dataStream ) )
318
355
{
319
356
return false ;
@@ -325,4 +362,22 @@ bool StreamTranscoder::processTranscode( const int subStreamIndex )
325
362
return true ;
326
363
}
327
364
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
+
328
383
}
0 commit comments