Merge changes I05aeb909,Iee31eed6,I2544a7cb into qt-dev
* changes:
C2SoftOpusEnc: Populate skip_samples in OpusHeader
MPEG4Extractor: Overwrite opus version as 1
CCodecConfig: Fix mapping to bitrate-mode
diff --git a/media/codec2/components/opus/C2SoftOpusEnc.cpp b/media/codec2/components/opus/C2SoftOpusEnc.cpp
index 7b58c9b..2d110f7 100644
--- a/media/codec2/components/opus/C2SoftOpusEnc.cpp
+++ b/media/codec2/components/opus/C2SoftOpusEnc.cpp
@@ -205,15 +205,6 @@
return C2_BAD_VALUE;
}
- // Get codecDelay
- int32_t lookahead;
- if (opus_multistream_encoder_ctl(mEncoder, OPUS_GET_LOOKAHEAD(&lookahead)) !=
- OPUS_OK) {
- ALOGE("failed to get lookahead");
- return C2_BAD_VALUE;
- }
- mCodecDelay = lookahead * 1000000000ll / mSampleRate;
-
// Set seek preroll to 80 ms
mSeekPreRoll = 80000000;
return C2_OK;
@@ -406,13 +397,26 @@
if (!mHeaderGenerated) {
uint8_t header[AOPUS_UNIFIED_CSD_MAXSIZE];
memset(header, 0, sizeof(header));
+
+ // Get codecDelay
+ int32_t lookahead;
+ if (opus_multistream_encoder_ctl(mEncoder, OPUS_GET_LOOKAHEAD(&lookahead)) !=
+ OPUS_OK) {
+ ALOGE("failed to get lookahead");
+ mSignalledError = true;
+ work->result = C2_CORRUPTED;
+ return;
+ }
+ mCodecDelay = lookahead * 1000000000ll / mSampleRate;
+
OpusHeader opusHeader;
+ memset(&opusHeader, 0, sizeof(opusHeader));
opusHeader.channels = mChannelCount;
opusHeader.num_streams = mChannelCount;
opusHeader.num_coupled = 0;
opusHeader.channel_mapping = ((mChannelCount > 8) ? 255 : (mChannelCount > 2));
opusHeader.gain_db = 0;
- opusHeader.skip_samples = 0;
+ opusHeader.skip_samples = lookahead;
int headerLen = WriteOpusHeaders(opusHeader, mSampleRate, header,
sizeof(header), mCodecDelay, mSeekPreRoll);
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index 008e20e..4b7fa56 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -754,11 +754,8 @@
return BAD_VALUE;
}
if ((config->mDomain & Config::IS_ENCODER) && (config->mDomain & Config::IS_VIDEO)) {
- C2Config::bitrate_mode_t mode = C2Config::BITRATE_VARIABLE;
- if (msg->findInt32(KEY_BITRATE_MODE, &i32)) {
- mode = (C2Config::bitrate_mode_t) i32;
- }
- if (mode == BITRATE_MODE_CQ) {
+ int32_t mode = BITRATE_MODE_VBR;
+ if (msg->findInt32(KEY_BITRATE_MODE, &mode) && mode == BITRATE_MODE_CQ) {
if (!msg->findInt32(KEY_QUALITY, &i32)) {
ALOGD("quality is missing, which is required for video encoders in CQ.");
return BAD_VALUE;
diff --git a/media/codec2/sfplugin/CCodecConfig.cpp b/media/codec2/sfplugin/CCodecConfig.cpp
index 428f032..4c3fff7 100644
--- a/media/codec2/sfplugin/CCodecConfig.cpp
+++ b/media/codec2/sfplugin/CCodecConfig.cpp
@@ -358,14 +358,7 @@
.limitTo(D::ENCODER & D::VIDEO & D::PARAM));
add(ConfigMapper(KEY_BITRATE_MODE, C2_PARAMKEY_BITRATE_MODE, "value")
.limitTo(D::ENCODER & D::CODED)
- .withMapper([](C2Value v) -> C2Value {
- int32_t value;
- C2Config::bitrate_mode_t mode;
- if (v.get(&value) && C2Mapper::map(value, &mode)) {
- return mode;
- }
- return C2Value();
- }));
+ .withC2Mappers<C2Config::bitrate_mode_t>());
// remove when codecs switch to PARAMKEY and new modes
deprecated(ConfigMapper(KEY_BITRATE_MODE, "coded.bitrate-mode", "value")
.limitTo(D::ENCODER));
diff --git a/media/extractors/mp4/MPEG4Extractor.cpp b/media/extractors/mp4/MPEG4Extractor.cpp
index f54690d..527bb77 100755
--- a/media/extractors/mp4/MPEG4Extractor.cpp
+++ b/media/extractors/mp4/MPEG4Extractor.cpp
@@ -1754,6 +1754,15 @@
// http://wiki.xiph.org/OggOpus#ID_Header
strncpy((char *)opusInfo, "OpusHead", 8);
+ // Version shall be 0 as per mp4 Opus Specific Box
+ // (https://opus-codec.org/docs/opus_in_isobmff.html#4.3.2)
+ if (opusInfo[8]) {
+ return ERROR_MALFORMED;
+ }
+ // Force version to 1 as per OpusHead definition
+ // (http://wiki.xiph.org/OggOpus#ID_Header)
+ opusInfo[8] = 1;
+
// Read Opus Specific Box values
size_t opusOffset = 10;
uint16_t pre_skip = U16_AT(&opusInfo[opusOffset]);