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

Commit a2eb22c1 authored by Andreas Huber's avatar Andreas Huber
Browse files

Allow for dynamic reconfiguration of the video bitrate used

to encode video while running as a wfd source.

Change-Id: I44f7b2350c88fc5807047c61bfe594ef8fa79275
parent a0dd0068
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@ struct ACodec : public AHierarchicalStateMachine {
    void signalResume();
    void initiateShutdown(bool keepComponentAllocated = false);

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

    void initiateAllocateComponent(const sp<AMessage> &msg);
    void initiateConfigureComponent(const sp<AMessage> &msg);
    void initiateStart();
@@ -105,6 +107,7 @@ private:
        kWhatConfigureComponent      = 'conf',
        kWhatStart                   = 'star',
        kWhatRequestIDRFrame         = 'ridr',
        kWhatSetParameters           = 'setP',
    };

    enum {
@@ -270,6 +273,7 @@ private:
            status_t internalError = UNKNOWN_ERROR);

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

    DISALLOW_EVIL_CONSTRUCTORS(ACodec);
};
+5 −0
Original line number Diff line number Diff line
@@ -115,6 +115,8 @@ struct MediaCodec : public AHandler {

    status_t getName(AString *componentName) const;

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

protected:
    virtual ~MediaCodec();
    virtual void onMessageReceived(const sp<AMessage> &msg);
@@ -157,6 +159,7 @@ private:
        kWhatRequestIDRFrame                = 'ridr',
        kWhatRequestActivityNotification    = 'racN',
        kWhatGetName                        = 'getN',
        kWhatSetParameters                  = 'setP',
    };

    enum {
@@ -230,6 +233,8 @@ private:

    void postActivityNotificationIfPossible();

    status_t onSetParameters(const sp<AMessage> &params);

    DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
};

+48 −0
Original line number Diff line number Diff line
@@ -374,6 +374,12 @@ void ACodec::initiateSetup(const sp<AMessage> &msg) {
    msg->post();
}

void ACodec::signalSetParameters(const sp<AMessage> &params) {
    sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
    msg->setMessage("params", params);
    msg->post();
}

void ACodec::initiateAllocateComponent(const sp<AMessage> &msg) {
    msg->setWhat(kWhatAllocateComponent);
    msg->setTarget(id());
@@ -3550,6 +3556,23 @@ bool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatSetParameters:
        {
            sp<AMessage> params;
            CHECK(msg->findMessage("params", &params));

            status_t err = mCodec->setParameters(params);

            sp<AMessage> reply;
            if (msg->findMessage("reply", &reply)) {
                reply->setInt32("err", err);
                reply->post();
            }

            handled = true;
            break;
        }

        default:
            handled = BaseState::onMessageReceived(msg);
            break;
@@ -3558,6 +3581,31 @@ bool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) {
    return handled;
}

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

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

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

            return err;
        }
    }

    return OK;
}

bool ACodec::ExecutingState::onOMXEvent(
        OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
    switch (event) {
+31 −0
Original line number Diff line number Diff line
@@ -1203,6 +1203,23 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatSetParameters:
        {
            uint32_t replyID;
            CHECK(msg->senderAwaitsResponse(&replyID));

            sp<AMessage> params;
            CHECK(msg->findMessage("params", &params));

            status_t err = onSetParameters(params);

            sp<AMessage> response = new AMessage;
            response->setInt32("err", err);

            response->postReply(replyID);
            break;
        }

        default:
            TRESPASS();
    }
@@ -1556,4 +1573,18 @@ void MediaCodec::postActivityNotificationIfPossible() {
    }
}

status_t MediaCodec::setParameters(const sp<AMessage> &params) {
    sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
    msg->setMessage("params", params);

    sp<AMessage> response;
    return PostAndAwaitResponse(msg, &response);
}

status_t MediaCodec::onSetParameters(const sp<AMessage> &params) {
    mCodec->signalSetParameters(params);

    return OK;
}

}  // namespace android
+14 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ Converter::Converter(
      ,mFirstSilentFrameUs(-1ll)
      ,mInSilentMode(false)
#endif
      ,mPrevVideoBitrate(-1)
    {
    AString mime;
    CHECK(mInputFormat->findString("mime", &mime));
@@ -185,6 +186,7 @@ status_t Converter::initEncoder() {

    int32_t audioBitrate = getBitrate("media.wfd.audio-bitrate", 128000);
    int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000);
    mPrevVideoBitrate = videoBitrate;

    ALOGI("using audio bitrate of %d bps, video bitrate of %d bps",
          audioBitrate, videoBitrate);
@@ -606,6 +608,18 @@ status_t Converter::feedEncoderInputBuffers() {
}

status_t Converter::doMoreWork() {
    if (mIsVideo) {
        int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000);
        if (videoBitrate != mPrevVideoBitrate) {
            sp<AMessage> params = new AMessage;

            params->setInt32("videoBitrate", videoBitrate);
            mEncoder->setParameters(params);

            mPrevVideoBitrate = videoBitrate;
        }
    }

    status_t err;

    for (;;) {
Loading