Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 315f7aab authored by Wonsik Kim's avatar Wonsik Kim Committed by Android (Google) Code Review
Browse files

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
parents 9eef0acf 602749a2
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -205,15 +205,6 @@ c2_status_t C2SoftOpusEnc::configureEncoder() {
        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 @@ void C2SoftOpusEnc::process(const std::unique_ptr<C2Work>& work,
    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);

+2 −5
Original line number Diff line number Diff line
@@ -754,11 +754,8 @@ void CCodec::configure(const sp<AMessage> &msg) {
                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;
+1 −8
Original line number Diff line number Diff line
@@ -358,14 +358,7 @@ void CCodecConfig::initializeStandardParams() {
        .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));
+9 −0
Original line number Diff line number Diff line
@@ -1754,6 +1754,15 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
                // 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]);