Skip to content

Commit 3e85e31

Browse files
author
Clement Champetier
committed
StreamTranscoder: refactored how to add decoder
* Add provate method 'addDecoder'. * Will be used to add several decoders.
1 parent 1753141 commit 3e85e31

File tree

2 files changed

+57
-19
lines changed

2 files changed

+57
-19
lines changed

src/AvTranscoder/transcoder/StreamTranscoder.cpp

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
145145
_inputStreamDesc.push_back(inputStreamDesc);
146146
_inputStreams.push_back(&inputStream);
147147

148+
addDecoder(inputStreamDesc, inputStream);
149+
148150
// create a transcode case
149151
switch(inputStream.getProperties().getStreamType())
150152
{
@@ -153,12 +155,6 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
153155
// filter
154156
_filterGraph = new FilterGraph(inputStream.getVideoCodec());
155157

156-
// input decoder
157-
VideoDecoder* inputVideo = new VideoDecoder(*static_cast<InputStream*>(&inputStream));
158-
inputVideo->setupDecoder();
159-
_inputDecoders.push_back(inputVideo);
160-
_currentDecoder = inputVideo;
161-
162158
// output encoder
163159
VideoEncoder* outputVideo = new VideoEncoder(profile.at(constants::avProfileCodec));
164160
_outputEncoder = outputVideo;
@@ -171,29 +167,19 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
171167
_outputStream = &outputFile.addVideoStream(outputVideo->getVideoCodec());
172168

173169
// buffers to process
174-
_decodedData.push_back(VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc()));
175170
_filteredData = VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc());
176171
_transformedData = VideoFrame(outputVideo->getVideoCodec().getVideoFrameDesc());
177172

178173
// transform
179174
_transform = new VideoTransform();
180175

181-
// generator decoder
182-
_generators.push_back(new VideoGenerator());
183-
184176
break;
185177
}
186178
case AVMEDIA_TYPE_AUDIO:
187179
{
188180
// filter
189181
_filterGraph = new FilterGraph(inputStream.getAudioCodec());
190182

191-
// input decoder
192-
AudioDecoder* inputAudio = new AudioDecoder(*static_cast<InputStream*>(&inputStream));
193-
inputAudio->setupDecoder();
194-
_inputDecoders.push_back(inputAudio);
195-
_currentDecoder = inputAudio;
196-
197183
// output encoder
198184
AudioEncoder* outputAudio = new AudioEncoder(profile.at(constants::avProfileCodec));
199185
_outputEncoder = outputAudio;
@@ -212,25 +198,70 @@ StreamTranscoder::StreamTranscoder(const InputStreamDesc& inputStreamDesc, IInpu
212198
if(inputStreamDesc.demultiplexing())
213199
inputFrameDesc._nbChannels = inputStreamDesc._channelIndexArray.size();
214200

215-
_decodedData.push_back(AudioFrame(inputFrameDesc));
216201
_filteredData = AudioFrame(inputFrameDesc);
217202
_transformedData = AudioFrame(outputAudio->getAudioCodec().getAudioFrameDesc());
218203

219204
// transform
220205
_transform = new AudioTransform();
221206

207+
break;
208+
}
209+
default:
210+
{
211+
throw std::runtime_error("unupported stream type");
212+
break;
213+
}
214+
}
215+
setOffset(offset);
216+
}
217+
218+
void StreamTranscoder::addDecoder(const InputStreamDesc& inputStreamDesc, IInputStream& inputStream)
219+
{
220+
// create a transcode case
221+
switch(inputStream.getProperties().getStreamType())
222+
{
223+
case AVMEDIA_TYPE_VIDEO:
224+
{
225+
// corresponding input decoder
226+
VideoDecoder* inputVideo = new VideoDecoder(static_cast<InputStream&>(inputStream));
227+
inputVideo->setupDecoder();
228+
_inputDecoders.push_back(inputVideo);
229+
_currentDecoder = inputVideo;
230+
231+
// generator decoder
232+
_generators.push_back(new VideoGenerator());
233+
234+
// buffers to process
235+
_decodedData.push_back(VideoFrame(inputStream.getVideoCodec().getVideoFrameDesc()));
236+
237+
break;
238+
}
239+
case AVMEDIA_TYPE_AUDIO:
240+
{
241+
// corresponding input decoder
242+
AudioDecoder* inputAudio = new AudioDecoder(static_cast<InputStream&>(inputStream));
243+
inputAudio->setupDecoder();
244+
_inputDecoders.push_back(inputAudio);
245+
_currentDecoder = inputAudio;
246+
222247
// generator decoder
223248
_generators.push_back(new AudioGenerator());
224249

250+
// buffers to process
251+
AudioFrameDesc inputFrameDesc(inputStream.getAudioCodec().getAudioFrameDesc());
252+
if(inputStreamDesc.demultiplexing())
253+
inputFrameDesc._nbChannels = inputStreamDesc._channelIndexArray.size();
254+
255+
_decodedData.push_back(AudioFrame(inputFrameDesc));
256+
225257
break;
226258
}
227259
default:
228260
{
229-
throw std::runtime_error("unupported stream type");
261+
throw std::runtime_error("Unupported stream type");
230262
break;
231263
}
232264
}
233-
setOffset(offset);
234265
}
235266

236267
StreamTranscoder::StreamTranscoder(IOutputFile& outputFile, const ProfileLoader::Profile& profile)

src/AvTranscoder/transcoder/StreamTranscoder.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,13 @@ class AvExport StreamTranscoder
118118
//@}
119119

120120
private:
121+
/**
122+
* @brief Create the decoder (and the other related objects needed) which decodes the given input stream.
123+
* @param inputStreamDesc
124+
* @param inputStream
125+
*/
126+
void addDecoder(const InputStreamDesc& inputStreamDesc, IInputStream& inputStream);
127+
121128
bool processRewrap();
122129
bool processTranscode();
123130

0 commit comments

Comments
 (0)