@@ -43,16 +43,61 @@ StreamTranscoder::StreamTranscoder(
43
43
{
44
44
case AVMEDIA_TYPE_VIDEO :
45
45
{
46
+ VideoFrameDesc inputFrameDesc ( _inputStream->getVideoCodec ().getVideoFrameDesc () );
47
+
48
+ // generator decoder
49
+ VideoGenerator* generatorVideo = new VideoGenerator ();
50
+ generatorVideo->setVideoFrameDesc ( inputFrameDesc );
51
+ _generator = generatorVideo;
52
+
53
+ // buffers to process
54
+ _sourceBuffer = new VideoFrame ( inputFrameDesc );
55
+ _frameBuffer = new VideoFrame ( inputFrameDesc );
56
+
57
+ // transform
58
+ _transform = new VideoTransform ();
59
+
60
+ // output encoder
61
+ VideoEncoder* outputVideo = new VideoEncoder ( _inputStream->getVideoCodec ().getCodecName () );
62
+ outputVideo->getVideoCodec ().setImageParameters ( inputFrameDesc );
63
+ outputVideo->setup ();
64
+ _outputEncoder = outputVideo;
65
+
66
+ // output stream
46
67
_outputStream = &outputFile.addVideoStream ( _inputStream->getVideoCodec () );
68
+
47
69
break ;
48
70
}
49
71
case AVMEDIA_TYPE_AUDIO :
50
72
{
73
+ AudioFrameDesc inputFrameDesc ( _inputStream->getAudioCodec ().getAudioFrameDesc () );
74
+
75
+ // generator decoder
76
+ AudioGenerator* generatorAudio = new AudioGenerator ();
77
+ generatorAudio->setAudioFrameDesc ( inputFrameDesc );
78
+ _generator = generatorAudio;
79
+
80
+ // buffers to process
81
+ _sourceBuffer = new AudioFrame ( inputFrameDesc );
82
+ _frameBuffer = new AudioFrame ( inputFrameDesc );
83
+
84
+ // transform
85
+ _transform = new AudioTransform ();
86
+
87
+ // output encoder
88
+ AudioEncoder* outputAudio = new AudioEncoder ( _inputStream->getAudioCodec ().getCodecName () );
89
+ outputAudio->getAudioCodec ().setAudioParameters ( inputFrameDesc );
90
+ outputAudio->setup ();
91
+ _outputEncoder = outputAudio;
92
+
93
+ // output stream
51
94
_outputStream = &outputFile.addAudioStream ( _inputStream->getAudioCodec () );
95
+
52
96
break ;
53
97
}
54
98
case AVMEDIA_TYPE_DATA :
55
99
{
100
+ // @warning: rewrap a data stream can't be lengthen by a generator (end of rewrapping will end the all process)
56
101
_outputStream = &outputFile.addDataStream ( _inputStream->getDataCodec () );
57
102
break ;
58
103
}
@@ -247,8 +292,8 @@ StreamTranscoder::StreamTranscoder(
247
292
248
293
StreamTranscoder::~StreamTranscoder ()
249
294
{
250
- delete _frameBuffer;
251
295
delete _sourceBuffer;
296
+ delete _frameBuffer;
252
297
delete _generator;
253
298
delete _outputEncoder;
254
299
delete _transform;
@@ -258,7 +303,7 @@ StreamTranscoder::~StreamTranscoder()
258
303
void StreamTranscoder::preProcessCodecLatency ()
259
304
{
260
305
// rewrap case: no need to take care of the latency of codec
261
- if ( ! _inputDecoder )
306
+ if ( ! _currentDecoder )
262
307
return ;
263
308
264
309
int latency = _outputEncoder->getCodec ().getLatency ();
@@ -277,7 +322,7 @@ void StreamTranscoder::preProcessCodecLatency()
277
322
278
323
bool StreamTranscoder::processFrame ()
279
324
{
280
- if ( ! _inputDecoder )
325
+ if ( ! _currentDecoder )
281
326
{
282
327
return processRewrap ();
283
328
}
@@ -297,7 +342,14 @@ bool StreamTranscoder::processRewrap()
297
342
CodedData data;
298
343
299
344
if ( ! _inputStream->readNextPacket ( data ) )
345
+ {
346
+ if ( _canSwitchToGenerator )
347
+ {
348
+ switchToGeneratorDecoder ();
349
+ return processTranscode ();
350
+ }
300
351
return false ;
352
+ }
301
353
302
354
IOutputStream::EWrappingStatus wrappingStatus = _outputStream->wrap ( data );
303
355
@@ -317,7 +369,7 @@ bool StreamTranscoder::processRewrap()
317
369
318
370
bool StreamTranscoder::processTranscode ( const int subStreamIndex )
319
371
{
320
- assert ( _inputDecoder != NULL );
372
+ assert ( _outputStream != NULL );
321
373
assert ( _currentDecoder != NULL );
322
374
assert ( _outputEncoder != NULL );
323
375
assert ( _sourceBuffer != NULL );
0 commit comments