History

Always maintain size of audio output buffer.

More debug output.

Dale Glass committed 6 years ago

Commit bf3d9ce1 parent fdab09c1 file · +35 −15Browse files

Showing the changes to plugins/opusCodec/src/OpusDecoder.cpp (1 of 1 file). Show all

Unified · Split

plugins/opusCodec/src/OpusDecoder.cpp+35−15
@@ -59,23 +59,32 @@ AthenaOpusDecoder::~AthenaOpusDecoder() · 58 unmodified lines
59void AthenaOpusDecoder::decode(const QByteArray &encodedBuffer, QByteArray &decodedBuffer)59void AthenaOpusDecoder::decode(const QByteArray &encodedBuffer, QByteArray &decodedBuffer)
60{60{
61 assert(_decoder);61 assert(_decoder);
62
63 PerformanceTimer perfTimer("AthenaOpusDecoder::decode");62 PerformanceTimer perfTimer("AthenaOpusDecoder::decode");
64 63
65 64 // The audio system encodes and decodes always in fixed size chunks
66 int buffer_size = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * static_cast<int>(sizeof(int16_t)) * _opus_num_channels;65 int buffer_size = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * static_cast<int>(sizeof(int16_t)) * _opus_num_channels;
67 66
68 decodedBuffer.resize( buffer_size );67 decodedBuffer.resize( buffer_size );
69 int frame_size = decodedBuffer.size() / _opus_num_channels / static_cast<int>(sizeof( opus_int16 ));68 int buffer_frames = decodedBuffer.size() / _opus_num_channels / static_cast<int>(sizeof( opus_int16 ));
69
70 qCDebug(decoder) << "Opus decode: encodedBytes = " << encodedBuffer.length() << "; decodedBufferBytes = " << decodedBuffer.size() << "; frameCount = " << buffer_frames;
71 int decoded_frames = opus_decode( _decoder, reinterpret_cast<const unsigned char*>(encodedBuffer.data()), encodedBuffer.length(), reinterpret_cast<opus_int16*>(decodedBuffer.data()), buffer_frames, 0 );
72
73 if ( decoded_frames >= 0 ) {
74 qCDebug(decoder) << "Decoded " << decoded_frames << " Opus frames, " << buffer_frames << " expected";
70 75
71 qCDebug(decoder) << "Opus decode: encodedBytes = " << encodedBuffer.length() << "; decodedBufferBytes = " << decodedBuffer.size() << "; frameCount = " << frame_size;76 if ( decoded_frames < buffer_frames ) {
72 int frames = opus_decode( _decoder, reinterpret_cast<const unsigned char*>(encodedBuffer.data()), encodedBuffer.length(), reinterpret_cast<opus_int16*>(decodedBuffer.data()), frame_size, 0 );77 qCWarning(decoder) << "Opus decoder returned " << decoded_frames << ", but " << buffer_frames << " were expected!";
73 78
74 if ( frames >= 0 ) {79 int start = decoded_frames * static_cast<int>(sizeof(int16_t)) * _opus_num_channels;
75 qCDebug(decoder) << "Decoded " << frames << " Opus frames";80 memset( &decodedBuffer.data()[start], 0, static_cast<size_t>(decodedBuffer.length() - start));
76 decodedBuffer.resize( frames * static_cast<int>(sizeof( opus_int16 )) * _opus_num_channels );81 } else if ( decoded_frames > buffer_frames ) {
82 // This should never happen
83 qCCritical(decoder) << "Opus decoder returned " << decoded_frames << ", but only " << buffer_frames << " were expected! Buffer overflow!?";
84 }
77 } else {85 } else {
78 qCCritical(decoder) << "Failed to decode audio: " << error_to_string(frames);86 qCCritical(decoder) << "Failed to decode audio: " << error_to_string(decoded_frames);
87 decodedBuffer.fill('\0');
79 }88 }
80 89
81}90}
@@ -88,15 +97,26 @@ void AthenaOpusDecoder::lostFrame(QByteArray &decodedBuffer) · 6 unmodified lines
88 97
89 int buffer_size = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * static_cast<int>(sizeof(int16_t)) * _opus_num_channels;98 int buffer_size = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * static_cast<int>(sizeof(int16_t)) * _opus_num_channels;
90 decodedBuffer.resize( buffer_size );99 decodedBuffer.resize( buffer_size );
91 int frame_size = decodedBuffer.size() / _opus_num_channels / static_cast<int>(sizeof( opus_int16 ));100 int buffer_frames = decodedBuffer.size() / _opus_num_channels / static_cast<int>(sizeof( opus_int16 ));
101
102 int decoded_frames = opus_decode( _decoder, nullptr, 0, reinterpret_cast<opus_int16*>(decodedBuffer.data()), buffer_frames, 1 );
103
104 if ( decoded_frames >= 0 ) {
105
106 qCDebug(decoder) << "Produced " << decoded_frames << " opus frames from a lost frame, " << buffer_frames << " expected";
92 107
93 int frames = opus_decode( _decoder, nullptr, 0, reinterpret_cast<opus_int16*>(decodedBuffer.data()), frame_size, 1 );108 if ( decoded_frames < buffer_frames ) {
109 qCWarning(decoder) << "Opus decoder returned " << decoded_frames << ", but " << buffer_frames << " were expected!";
94 110
95 if ( frames >= 0 ) {111 int start = decoded_frames * static_cast<int>(sizeof(int16_t)) * _opus_num_channels;
96 qCDebug(decoder) << "Produced " << frames << " opus frames from a lost frame";112 memset( &decodedBuffer.data()[start], 0, static_cast<size_t>(decodedBuffer.length() - start));
97 decodedBuffer.resize( frames * static_cast<int>(sizeof( opus_int16 )) * _opus_num_channels );113 } else if ( decoded_frames > buffer_frames ) {
114 // This should never happen
115 qCCritical(decoder) << "Opus decoder returned " << decoded_frames << ", but only " << buffer_frames << " were expected! Buffer overflow!?";
116 }
98 } else {117 } else {
99 qCCritical(decoder) << "Failed to decode lost frame: " << error_to_string(frames);118 qCCritical(decoder) << "Failed to decode lost frame: " << error_to_string(decoded_frames);
119 decodedBuffer.fill('\0');
100 }120 }
101}121}
102 122