Skip to content

Commit fa359ad

Browse files
author
Clement Champetier
committed
StreamTranscoder: rewrap a video/audio stream can be lengthen by a generator
1 parent 6e50bca commit fa359ad

File tree

1 file changed

+56
-4
lines changed

1 file changed

+56
-4
lines changed

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,61 @@ StreamTranscoder::StreamTranscoder(
4343
{
4444
case AVMEDIA_TYPE_VIDEO :
4545
{
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
4667
_outputStream = &outputFile.addVideoStream( _inputStream->getVideoCodec() );
68+
4769
break;
4870
}
4971
case AVMEDIA_TYPE_AUDIO :
5072
{
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
5194
_outputStream = &outputFile.addAudioStream( _inputStream->getAudioCodec() );
95+
5296
break;
5397
}
5498
case AVMEDIA_TYPE_DATA :
5599
{
100+
// @warning: rewrap a data stream can't be lengthen by a generator (end of rewrapping will end the all process)
56101
_outputStream = &outputFile.addDataStream( _inputStream->getDataCodec() );
57102
break;
58103
}
@@ -247,8 +292,8 @@ StreamTranscoder::StreamTranscoder(
247292

248293
StreamTranscoder::~StreamTranscoder()
249294
{
250-
delete _frameBuffer;
251295
delete _sourceBuffer;
296+
delete _frameBuffer;
252297
delete _generator;
253298
delete _outputEncoder;
254299
delete _transform;
@@ -258,7 +303,7 @@ StreamTranscoder::~StreamTranscoder()
258303
void StreamTranscoder::preProcessCodecLatency()
259304
{
260305
// rewrap case: no need to take care of the latency of codec
261-
if( ! _inputDecoder )
306+
if( ! _currentDecoder )
262307
return;
263308

264309
int latency = _outputEncoder->getCodec().getLatency();
@@ -277,7 +322,7 @@ void StreamTranscoder::preProcessCodecLatency()
277322

278323
bool StreamTranscoder::processFrame()
279324
{
280-
if( ! _inputDecoder )
325+
if( ! _currentDecoder )
281326
{
282327
return processRewrap();
283328
}
@@ -297,7 +342,14 @@ bool StreamTranscoder::processRewrap()
297342
CodedData data;
298343

299344
if( ! _inputStream->readNextPacket( data ) )
345+
{
346+
if( _canSwitchToGenerator )
347+
{
348+
switchToGeneratorDecoder();
349+
return processTranscode();
350+
}
300351
return false;
352+
}
301353

302354
IOutputStream::EWrappingStatus wrappingStatus = _outputStream->wrap( data );
303355

@@ -317,7 +369,7 @@ bool StreamTranscoder::processRewrap()
317369

318370
bool StreamTranscoder::processTranscode( const int subStreamIndex )
319371
{
320-
assert( _inputDecoder != NULL );
372+
assert( _outputStream != NULL );
321373
assert( _currentDecoder != NULL );
322374
assert( _outputEncoder != NULL );
323375
assert( _sourceBuffer != NULL );

0 commit comments

Comments
 (0)