Skip to content

Commit 34fef16

Browse files
author
Clement Champetier
committed
readers: added _currentDecoder attribute to easily switch between decoders
* If we want to call the generator, no need to call decodeNextFrame on the other decoder each time. This commit avoids this. * This is the same solution in StreamTranscoder class.
1 parent 2ff4b51 commit 34fef16

File tree

4 files changed

+12
-5
lines changed

4 files changed

+12
-5
lines changed

src/AvTranscoder/reader/AudioReader.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void AudioReader::init()
4242
// setup decoder
4343
_decoder = new AudioDecoder(_inputFile->getStream(_streamIndex));
4444
_decoder->setupDecoder();
45+
_currentDecoder = _decoder;
4546

4647
// generator
4748
_generator = new AudioGenerator(_inputFile->getStream(_streamIndex).getAudioCodec().getAudioFrameDesc());

src/AvTranscoder/reader/IReader.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ IReader::IReader(const std::string& filename, const size_t streamIndex, const in
99
: _inputFile(NULL)
1010
, _streamProperties(NULL)
1111
, _decoder(NULL)
12+
, _generator(NULL)
13+
, _currentDecoder(NULL)
1214
, _srcFrame(NULL)
1315
, _dstFrame(NULL)
1416
, _transform(NULL)
@@ -25,6 +27,8 @@ IReader::IReader(InputFile& inputFile, const size_t streamIndex, const int chann
2527
: _inputFile(&inputFile)
2628
, _streamProperties(NULL)
2729
, _decoder(NULL)
30+
, _generator(NULL)
31+
, _currentDecoder(NULL)
2832
, _srcFrame(NULL)
2933
, _dstFrame(NULL)
3034
, _transform(NULL)
@@ -54,8 +58,7 @@ Frame* IReader::readPrevFrame()
5458

5559
Frame* IReader::readFrameAt(const size_t frame)
5660
{
57-
assert(_decoder != NULL);
58-
assert(_generator != NULL);
61+
assert(_currentDecoder != NULL);
5962
assert(_transform != NULL);
6063
assert(_srcFrame != NULL);
6164
assert(_dstFrame != NULL);
@@ -70,16 +73,17 @@ Frame* IReader::readFrameAt(const size_t frame)
7073
// decode
7174
bool decodingStatus = false;
7275
if(_channelIndex != -1)
73-
decodingStatus = _decoder->decodeNextFrame(*_srcFrame, _channelIndex);
76+
decodingStatus = _currentDecoder->decodeNextFrame(*_srcFrame, _channelIndex);
7477
else
75-
decodingStatus = _decoder->decodeNextFrame(*_srcFrame);
78+
decodingStatus = _currentDecoder->decodeNextFrame(*_srcFrame);
7679
// if decoding failed
7780
if(!decodingStatus)
7881
{
7982
// generate data (ie silence or black)
8083
if(_continueWithGenerator)
8184
{
82-
_generator->decodeNextFrame(*_srcFrame);
85+
_currentDecoder = _generator;
86+
return readFrameAt(frame);
8387
}
8488
// or return NULL
8589
else

src/AvTranscoder/reader/IReader.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class AvExport IReader
6868
const StreamProperties* _streamProperties;
6969
IDecoder* _decoder;
7070
IDecoder* _generator;
71+
IDecoder* _currentDecoder; ///< Link to _inputDecoder or _generator
7172

7273
Frame* _srcFrame;
7374
Frame* _dstFrame;

src/AvTranscoder/reader/VideoReader.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ void VideoReader::init()
4141
// setup decoder
4242
_decoder = new VideoDecoder(_inputFile->getStream(_streamIndex));
4343
_decoder->setupDecoder();
44+
_currentDecoder = _decoder;
4445

4546
// generator
4647
_generator = new VideoGenerator(_inputFile->getStream(_streamIndex).getVideoCodec().getVideoFrameDesc());

0 commit comments

Comments
 (0)