Skip to content

Commit 9c02a02

Browse files
author
Clement Champetier
committed
readers: fix allocation of buffer of decoded data
1 parent a5ad30e commit 9c02a02

File tree

4 files changed

+19
-15
lines changed

4 files changed

+19
-15
lines changed

src/AvTranscoder/reader/AudioReader.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ void AudioReader::init()
4646

4747
// create src frame
4848
const AudioFrameDesc srcFrameDesc = _inputFile->getStream(_streamIndex).getAudioCodec().getAudioFrameDesc();
49-
_srcFrame = new AudioFrame(srcFrameDesc);
49+
bool allocateDecodedData = false;
50+
if(_channelIndex != -1)
51+
allocateDecodedData = true;
52+
_srcFrame = new AudioFrame(srcFrameDesc, allocateDecodedData);
5053
AudioFrame* srcFrame = static_cast<AudioFrame*>(_srcFrame);
5154
// create dst frame
5255
_outputSampleRate = srcFrame->getSampleRate();

src/AvTranscoder/reader/IReader.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ IFrame* IReader::readFrameAt(const size_t frame)
8686
// generate data (ie silence or black)
8787
if(_continueWithGenerator)
8888
{
89+
// allocate the frame since the process will continue with some generated data
90+
if(! _srcFrame->isDataAllocated())
91+
_srcFrame->allocateData();
8992
_currentDecoder = _generator;
9093
return readFrameAt(frame);
9194
}

src/AvTranscoder/reader/VideoReader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void VideoReader::init()
4545

4646
// create src frame
4747
const VideoFrameDesc srcFrameDesc = _inputFile->getStream(_streamIndex).getVideoCodec().getVideoFrameDesc();
48-
_srcFrame = new VideoFrame(srcFrameDesc);
48+
_srcFrame = new VideoFrame(srcFrameDesc, false);
4949
VideoFrame* srcFrame = static_cast<VideoFrame*>(_srcFrame);
5050
// create dst frame
5151
_outputWidth = srcFrame->getWidth();

test/pyTest/testReader.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def testVideoReaderCreateNewInputFile():
2323

2424
# read all frames and check their size
2525
for i in xrange(0, reader.getSourceVideoProperties().getNbFrames()):
26-
frame = av.VideoFrame(reader.readNextFrame())
26+
frame = reader.readNextFrame()
2727
bytesPerPixel = reader.getOutputBitDepth() / 8
2828
assert_equals( frame.getSize(), reader.getOutputWidth() * reader.getOutputHeight() * bytesPerPixel )
2929

@@ -43,7 +43,7 @@ def testVideoReaderReferenceInputFile():
4343

4444
# read all frames and check their size
4545
for i in xrange(0, reader.getSourceVideoProperties().getNbFrames()):
46-
frame = av.VideoFrame(reader.readNextFrame())
46+
frame = reader.readNextFrame()
4747
bytesPerPixel = reader.getOutputBitDepth() / 8
4848
assert_equals( frame.getSize(), reader.getOutputWidth() * reader.getOutputHeight() * bytesPerPixel )
4949

@@ -65,13 +65,13 @@ def testAudioReaderChannelsExtraction():
6565
readerOfAllChannels = av.AudioReader(inputFile, streamIndex)
6666
nbChannels = readerOfAllChannels.getOutputNbChannels()
6767
# read first frame
68-
frame = av.AudioFrame(readerOfAllChannels.readNextFrame())
68+
frame = readerOfAllChannels.readNextFrame()
6969
sizeOfFrameWithAllChannels = frame.getSize()
7070

7171
# create reader to read one channel of the audio stream
7272
readerOfOneChannel = av.AudioReader(inputFile, streamIndex, channelIndex)
7373
# read first frame
74-
frame = av.AudioFrame(readerOfOneChannel.readNextFrame())
74+
frame = readerOfOneChannel.readNextFrame()
7575
sizeOfFrameWithOneChannels = frame.getSize()
7676

7777
assert_equals( sizeOfFrameWithAllChannels / nbChannels, sizeOfFrameWithOneChannels )
@@ -87,7 +87,7 @@ def testVideoReaderWithGenerator():
8787

8888
# read all frames and check their size
8989
for i in xrange(0, reader.getSourceVideoProperties().getNbFrames()):
90-
frame = av.VideoFrame(reader.readNextFrame())
90+
frame = reader.readNextFrame()
9191
bytesPerPixel = reader.getOutputBitDepth() / 8
9292
assert_equals( frame.getSize(), reader.getOutputWidth() * reader.getOutputHeight() * bytesPerPixel )
9393

@@ -97,7 +97,7 @@ def testVideoReaderWithGenerator():
9797
# generate 10 frames of black
9898
reader.continueWithGenerator()
9999
for i in xrange(0, 9):
100-
frame = av.VideoFrame(reader.readNextFrame())
100+
frame = reader.readNextFrame()
101101
bytesPerPixel = reader.getOutputBitDepth() / 8
102102
assert_equals( frame.getSize(), reader.getOutputWidth() * reader.getOutputHeight() * bytesPerPixel )
103103

@@ -116,18 +116,16 @@ def testAudioReaderWithGenerator():
116116
frame = reader.readNextFrame()
117117
if not frame:
118118
break
119-
frame = av.AudioFrame(frame)
120-
nbSamplesPerChannel = frame.getNbSamplesPerChannel()
121-
bytesPerSample = 2
122-
assert_equals( frame.getSize(), reader.getOutputNbChannels() * nbSamplesPerChannel * bytesPerSample )
119+
assert_greater(frame.getSize(), 0)
123120

124121
# check if there is no next frame
125122
assert_equals( reader.readNextFrame(), None )
126123

127124
# generate 10 frames of silence
128125
reader.continueWithGenerator()
129126
for i in xrange(0, 9):
130-
frame = av.AudioFrame(reader.readNextFrame())
131-
nbSamplesPerChannel = frame.getNbSamplesPerChannel()
127+
frame = reader.readNextFrame()
128+
# assuming we generate data of 1920 samples of 2 bytes
129+
nbSamplesPerChannel = 1920
132130
bytesPerSample = 2
133-
assert_equals( frame.getSize(), reader.getOutputNbChannels() * nbSamplesPerChannel * bytesPerSample )
131+
assert_equals(frame.getSize(), reader.getOutputNbChannels() * nbSamplesPerChannel * bytesPerSample )

0 commit comments

Comments
 (0)