stagefright: Updates to Opus unified CSD syntax
Added a marker and length field before OpusHead data as well.
This will prevent any potential truncation of OpusHead, when
data inside OpusHead matches one of the markers defined
Added checks to validate sizes parsed.
If the sizes are not as expected, then treat that as an error
OggWriter updated to not write codec config data as frame data
Test: With a local AMediaCodec api based application to decode
opus encoder's output
Test: Test with mediamuxer api based application to mux encoders output
to ogg file
Test: cts-tradefed run cts -m CtsMediaTestCases \
-t android.media.cts.EncoderTest#testOpusEncoders
Bug: 123581317
Bug: 124053011
Change-Id: Ic3c7613ff47855e16be39dc60939e1e715522bc6
diff --git a/media/codec2/components/opus/C2SoftOpusDec.cpp b/media/codec2/components/opus/C2SoftOpusDec.cpp
index 680712e..13e3df5 100644
--- a/media/codec2/components/opus/C2SoftOpusDec.cpp
+++ b/media/codec2/components/opus/C2SoftOpusDec.cpp
@@ -252,20 +252,25 @@
const uint8_t *data = rView.data() + inOffset;
if (mInputBufferCount < 3) {
if (mInputBufferCount == 0) {
- size_t opusHeadSize = inSize;
+ size_t opusHeadSize = 0;
size_t codecDelayBufSize = 0;
size_t seekPreRollBufSize = 0;
- void *opusHeadBuf = (void *)data;
+ void *opusHeadBuf = NULL;
void *codecDelayBuf = NULL;
void *seekPreRollBuf = NULL;
- GetOpusHeaderBuffers(data, inSize, &opusHeadBuf,
- &opusHeadSize, &codecDelayBuf,
- &codecDelayBufSize, &seekPreRollBuf,
- &seekPreRollBufSize);
+ if (!GetOpusHeaderBuffers(data, inSize, &opusHeadBuf,
+ &opusHeadSize, &codecDelayBuf,
+ &codecDelayBufSize, &seekPreRollBuf,
+ &seekPreRollBufSize)) {
+ ALOGE("%s encountered error in GetOpusHeaderBuffers", __func__);
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
if (!ParseOpusHeader((uint8_t *)opusHeadBuf, opusHeadSize, &mHeader)) {
- ALOGE("Encountered error while Parsing Opus Header.");
+ ALOGE("%s Encountered error while Parsing Opus Header.", __func__);
mSignalledError = true;
work->result = C2_CORRUPTED;
return;
@@ -304,14 +309,14 @@
return;
}
- if (codecDelayBuf && codecDelayBufSize == 8) {
+ if (codecDelayBuf && codecDelayBufSize == sizeof(uint64_t)) {
uint64_t value;
memcpy(&value, codecDelayBuf, sizeof(uint64_t));
mCodecDelay = ns_to_samples(value, kRate);
mSamplesToDiscard = mCodecDelay;
++mInputBufferCount;
}
- if (seekPreRollBuf && seekPreRollBufSize == 8) {
+ if (seekPreRollBuf && seekPreRollBufSize == sizeof(uint64_t)) {
uint64_t value;
memcpy(&value, codecDelayBuf, sizeof(uint64_t));
mSeekPreRoll = ns_to_samples(value, kRate);