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

Commit a56fc930 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "ACodec: Set input surface parameters immediately" am: 146a6de5

parents 33562a4e 146a6de5
Loading
Loading
Loading
Loading
+110 −29
Original line number Diff line number Diff line
@@ -293,6 +293,8 @@ protected:
        }
    }

    void setSurfaceParameters(const sp<AMessage> &msg);

private:
    // Handles an OMX message. Returns true iff message was handled.
    bool onOMXMessage(const sp<AMessage> &msg);
@@ -6502,6 +6504,59 @@ void ACodec::BaseState::getMoreInputDataIfPossible() {
    postFillThisBuffer(eligible);
}

void ACodec::BaseState::setSurfaceParameters(const sp<AMessage> &msg) {
    sp<AMessage> params;
    CHECK(msg->findMessage("params", &params));

    status_t err = mCodec->setSurfaceParameters(params);
    if (err != OK) {
        ALOGE("[%s] Unable to set input surface parameters (err %d)",
                mCodec->mComponentName.c_str(),
                err);
        return;
    }

    int64_t timeOffsetUs;
    if (params->findInt64(PARAMETER_KEY_OFFSET_TIME, &timeOffsetUs)) {
        params->removeEntryAt(params->findEntryByName(PARAMETER_KEY_OFFSET_TIME));

        if (params->countEntries() == 0) {
            msg->removeEntryAt(msg->findEntryByName("params"));
            return;
        }
    }

    int64_t skipFramesBeforeUs;
    if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) {
        params->removeEntryAt(params->findEntryByName("skip-frames-before"));

        if (params->countEntries() == 0) {
            msg->removeEntryAt(msg->findEntryByName("params"));
            return;
        }
    }

    int32_t dropInputFrames;
    if (params->findInt32(PARAMETER_KEY_SUSPEND, &dropInputFrames)) {
        params->removeEntryAt(params->findEntryByName(PARAMETER_KEY_SUSPEND));

        if (params->countEntries() == 0) {
            msg->removeEntryAt(msg->findEntryByName("params"));
            return;
        }
    }

    int64_t stopTimeUs;
    if (params->findInt64("stop-time-us", &stopTimeUs)) {
        params->removeEntryAt(params->findEntryByName("stop-time-us"));

        if (params->countEntries() == 0) {
            msg->removeEntryAt(msg->findEntryByName("params"));
            return;
        }
    }
}

bool ACodec::BaseState::onOMXFillBufferDone(
        IOMX::buffer_id bufferID,
        size_t rangeOffset, size_t rangeLength,
@@ -7368,6 +7423,13 @@ status_t ACodec::LoadedToIdleState::allocateBuffers() {
bool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
        case kWhatSetParameters:
        {
            BaseState::setSurfaceParameters(msg);
            if (msg->countEntries() > 0) {
                mCodec->deferMessage(msg);
            }
            return true;
        }
        case kWhatShutdown:
        {
            mCodec->deferMessage(msg);
@@ -7444,6 +7506,13 @@ void ACodec::IdleToExecutingState::stateEntered() {
bool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
        case kWhatSetParameters:
        {
            BaseState::setSurfaceParameters(msg);
            if (msg->countEntries() > 0) {
                mCodec->deferMessage(msg);
            }
            return true;
        }
        case kWhatShutdown:
        {
            mCodec->deferMessage(msg);
@@ -7723,27 +7792,7 @@ bool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) {
    return handled;
}

status_t ACodec::setParameters(const sp<AMessage> &params) {
    int32_t videoBitrate;
    if (params->findInt32("video-bitrate", &videoBitrate)) {
        OMX_VIDEO_CONFIG_BITRATETYPE configParams;
        InitOMXParams(&configParams);
        configParams.nPortIndex = kPortIndexOutput;
        configParams.nEncodeBitrate = videoBitrate;

        status_t err = mOMXNode->setConfig(
                OMX_IndexConfigVideoBitrate,
                &configParams,
                sizeof(configParams));

        if (err != OK) {
            ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d",
                   videoBitrate, err);

            return err;
        }
    }

status_t ACodec::setSurfaceParameters(const sp<AMessage> &params) {
    int64_t timeOffsetUs;
    if (params->findInt64(PARAMETER_KEY_OFFSET_TIME, &timeOffsetUs)) {
        if (mGraphicBufferSource == NULL) {
@@ -7831,9 +7880,41 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
        mInputFormat->setInt64("android._stop-time-offset-us", stopTimeOffsetUs);
    }

    return OK;
}

status_t ACodec::setParameters(const sp<AMessage> &params) {
    status_t err;

    int32_t videoBitrate;
    if (params->findInt32("video-bitrate", &videoBitrate)) {
        OMX_VIDEO_CONFIG_BITRATETYPE configParams;
        InitOMXParams(&configParams);
        configParams.nPortIndex = kPortIndexOutput;
        configParams.nEncodeBitrate = videoBitrate;

        err = mOMXNode->setConfig(
                OMX_IndexConfigVideoBitrate,
                &configParams,
                sizeof(configParams));

        if (err != OK) {
            ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d",
                   videoBitrate, err);

            return err;
        }
    }

    err = setSurfaceParameters(params);
    if (err != OK) {
        ALOGE("Failed to set input surface parameters (err %d)", err);
        return err;
    }

    int32_t tmp;
    if (params->findInt32("request-sync", &tmp)) {
        status_t err = requestIDRFrame();
        err = requestIDRFrame();

        if (err != OK) {
            ALOGE("Requesting a sync frame failed w/ err %d", err);
@@ -7848,7 +7929,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
        rateFloat = (float) rateInt; // 16MHz (FLINTMAX) is OK for upper bound.
    }
    if (rateFloat > 0) {
        status_t err = setOperatingRate(rateFloat, mIsVideo);
        err = setOperatingRate(rateFloat, mIsVideo);
        if (err != OK) {
            ALOGI("Failed to set parameter 'operating-rate' (err %d)", err);
        }
@@ -7857,7 +7938,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
    int32_t intraRefreshPeriod = 0;
    if (params->findInt32("intra-refresh-period", &intraRefreshPeriod)
            && intraRefreshPeriod > 0) {
        status_t err = setIntraRefreshPeriod(intraRefreshPeriod, false);
        err = setIntraRefreshPeriod(intraRefreshPeriod, false);
        if (err != OK) {
            ALOGI("[%s] failed setIntraRefreshPeriod. Failure is fine since this key is optional",
                    mComponentName.c_str());
@@ -7867,7 +7948,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {

    int32_t lowLatency = 0;
    if (params->findInt32("low-latency", &lowLatency)) {
        status_t err = setLowLatency(lowLatency);
        err = setLowLatency(lowLatency);
        if (err != OK) {
            return err;
        }
@@ -7875,7 +7956,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {

    int32_t latency = 0;
    if (params->findInt32("latency", &latency) && latency > 0) {
        status_t err = setLatency(latency);
        err = setLatency(latency);
        if (err != OK) {
            ALOGI("[%s] failed setLatency. Failure is fine since this key is optional",
                    mComponentName.c_str());
@@ -7887,7 +7968,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
    if (params->findInt32("audio-presentation-presentation-id", &presentationId)) {
        int32_t programId = -1;
        params->findInt32("audio-presentation-program-id", &programId);
        status_t err = setAudioPresentation(presentationId, programId);
        err = setAudioPresentation(presentationId, programId);
        if (err != OK) {
            ALOGI("[%s] failed setAudioPresentation. Failure is fine since this key is optional",
                    mComponentName.c_str());
@@ -7960,7 +8041,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
    {
        int32_t tunnelPeek = 0;
        if (params->findInt32(TUNNEL_PEEK_KEY, &tunnelPeek)) {
            status_t err = setTunnelPeek(tunnelPeek);
            err = setTunnelPeek(tunnelPeek);
            if (err != OK) {
                return err;
            }
@@ -7969,7 +8050,7 @@ status_t ACodec::setParameters(const sp<AMessage> &params) {
    {
        int32_t tunnelPeekSetLegacy = 0;
        if (params->findInt32(TUNNEL_PEEK_SET_LEGACY_KEY, &tunnelPeekSetLegacy)) {
            status_t err = setTunnelPeekLegacy(tunnelPeekSetLegacy);
            err = setTunnelPeekLegacy(tunnelPeekSetLegacy);
            if (err != OK) {
                return err;
            }
+1 −0
Original line number Diff line number Diff line
@@ -601,6 +601,7 @@ private:
            status_t internalError = UNKNOWN_ERROR);

    status_t requestIDRFrame();
    status_t setSurfaceParameters(const sp<AMessage> &params);
    status_t setParameters(const sp<AMessage> &params);

    // set vendor extension parameters specified in params that are supported by the codec