Skip to content

Commit dff9f2c

Browse files
author
Valentin Noel
committed
Add modifications into Transcoder process: move wrapping to StreamTranscoder and add first version of transcoding
1 parent cfeb589 commit dff9f2c

File tree

2 files changed

+61
-32
lines changed

2 files changed

+61
-32
lines changed

src/AvTranscoder/StreamTranscoder.cpp

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,29 +27,49 @@ StreamTranscoder::~StreamTranscoder()
2727

2828
void StreamTranscoder::init( const std::string& profile )
2929
{
30-
if( profile.empty() )
31-
{
32-
return;
33-
}
34-
35-
_transcodeStream = true;
36-
30+
_transcodeStream = profile.size();
31+
3732
switch( _stream->getStreamType() )
3833
{
3934
case AVMEDIA_TYPE_VIDEO :
4035
{
4136
_inputStreamReader = new InputStreamVideo( *_stream );
42-
_outputStreamWriter = new OutputStreamVideo();
43-
_outputStreamWriter->setProfile( profile );
44-
_frameBuffer = new Image( _stream->getVideoDesc().getImageDesc() );
37+
_inputStreamReader->setup();
38+
39+
if( ! profile.empty() )
40+
{
41+
_outputStreamWriter = new OutputStreamVideo();
42+
OutputStreamVideo* outputStreamVideo = static_cast<OutputStreamVideo*>( _outputStreamWriter );
43+
44+
outputStreamVideo->setProfile( profile );
45+
_outputFile->addVideoStream( outputStreamVideo->getVideoDesc() );
46+
_frameBuffer = new Image( outputStreamVideo->getVideoDesc().getImageDesc() );
47+
}
48+
else
49+
{
50+
_outputFile->addVideoStream( _stream->getVideoDesc() );
51+
}
52+
4553
break;
4654
}
4755
case AVMEDIA_TYPE_AUDIO :
4856
{
4957
_inputStreamReader = new InputStreamAudio( *_stream );
50-
_outputStreamWriter = new OutputStreamAudio();
51-
_outputStreamWriter->setProfile( profile );
52-
_frameBuffer = new AudioFrame( _stream->getAudioDesc().getFrameDesc() );
58+
_inputStreamReader->setup();
59+
if( ! profile.empty() )
60+
{
61+
_outputStreamWriter = new OutputStreamAudio();
62+
OutputStreamAudio* outputStreamAudio = static_cast<OutputStreamAudio*>( _outputStreamWriter );
63+
64+
outputStreamAudio->setProfile( profile );
65+
_outputFile->addAudioStream( outputStreamAudio->getAudioDesc() );
66+
_frameBuffer = new AudioFrame( outputStreamAudio->getAudioDesc().getFrameDesc() );
67+
}
68+
else
69+
{
70+
_outputFile->addAudioStream( _stream->getAudioDesc() );
71+
}
72+
5373
break;
5474
}
5575
default:
@@ -62,13 +82,22 @@ bool StreamTranscoder::processFrame()
6282
DataStream dataStream;
6383
if( ! _transcodeStream )
6484
{
65-
_stream->readNextPacket( dataStream );
85+
if( ! _stream->readNextPacket( dataStream ) )
86+
return false;
6687
_outputFile->wrap( dataStream, _streamIndex );
6788
return true;
6889
}
69-
// transcodes
70-
_inputStreamReader->readNextFrame( *_frameBuffer );
71-
_outputStreamWriter->encodeFrame( *_frameBuffer, dataStream );
90+
91+
// std::cout << "encode & wrap" << _streamIndex << std::endl;
92+
93+
if( _inputStreamReader->readNextFrame( *_frameBuffer ) )
94+
{
95+
_outputStreamWriter->encodeFrame( *_frameBuffer, dataStream );
96+
}
97+
else if( ! _outputStreamWriter->encodeFrame( dataStream ) )
98+
{
99+
return false;
100+
}
72101

73102
_outputFile->wrap( dataStream, _streamIndex );
74103
return true;

src/AvTranscoder/Transcoder.tcc

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,15 @@ void Transcoder::add( const std::string& filename, const size_t streamIndex, con
7575
StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, _streamTranscoders.size() );
7676
streamTranscoder->init( profile );
7777
_streamTranscoders.push_back( streamTranscoder );
78-
7978
_inputStreams.push_back( & referenceFile->getStream( streamIndex ) );
80-
_outputFile.addVideoStream( _inputStreams.back()->getVideoDesc() );
8179
break;
8280
}
8381
case AVMEDIA_TYPE_AUDIO:
8482
{
8583
StreamTranscoder* streamTranscoder = new StreamTranscoder( referenceFile->getStream( streamIndex ), _outputFile, _streamTranscoders.size() );
8684
streamTranscoder->init( profile );
8785
_streamTranscoders.push_back( streamTranscoder );
88-
8986
_inputStreams.push_back( & referenceFile->getStream( streamIndex ) );
90-
_outputFile.addAudioStream( _inputStreams.back()->getAudioDesc() );
9187
break;
9288
}
9389
case AVMEDIA_TYPE_DATA:
@@ -127,30 +123,34 @@ void Transcoder::process( ProgressListener& progress )
127123
dataStreams.push_back( dataStream );
128124
}
129125

130-
// _outputFile.beginWrap();
126+
_outputFile.beginWrap();
127+
131128

132129
while( 1 )
133130
{
134-
// read one frame for each streamIndex, and stop process when one of the stream is ended (the shorter)
135-
// if( ! getStreamsNextPacket( dataStreams ) )
136-
// break;
137-
138-
// display process progression // first stream duration (not the shorter !!!!)
139131
if( progress.progress( _inputStreams.at( 0 )->getPacketDuration() * ( frame + 1 ), _inputStreams.at( 0 )->getDuration() ) == eJobStatusCancel )
132+
{
140133
break;
134+
}
135+
141136

142137
for( size_t streamIndex = 0; streamIndex < _inputStreams.size(); ++streamIndex )
143138
{
144-
if( _streamTranscoders.at( streamIndex ) )
145-
_streamTranscoders.at( streamIndex )->processFrame();
146-
// _outputFile.wrap( dataStreams.at( streamIndex ), streamIndex );
139+
if( _streamTranscoders.at( streamIndex ) && ! _streamTranscoders.at( streamIndex )->processFrame() )
140+
{
141+
_inputStreams.erase( _inputStreams.begin() + streamIndex );
142+
}
143+
}
144+
145+
if( _inputStreams.size() == 0 )
146+
{
147+
break;
147148
}
148149

149150
++frame;
150151
}
151152

152-
// _outputFile.endWrap();
153-
153+
_outputFile.endWrap();
154154
}
155155

156156
bool Transcoder::getStreamsNextPacket( std::vector< DataStream >& dataStreams )

0 commit comments

Comments
 (0)