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

Commit 5520b9c2 authored by Andreas Huber's avatar Andreas Huber Committed by Android Git Automerger
Browse files

am 96076964: Make video encoders\' bitrate mode (constant, variable, ...) configurable

* commit '96076964':
  Make video encoders' bitrate mode (constant, variable, ...) configurable
parents 05caa748 7b426222
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -242,7 +242,10 @@ private:
    status_t setupAVCEncoderParameters(const sp<AMessage> &msg);

    status_t verifySupportForProfileAndLevel(int32_t profile, int32_t level);
    status_t configureBitrate(int32_t bitrate);

    status_t configureBitrate(
            int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode);

    status_t setupErrorCorrectionParameters();

    status_t initNativeWindow();
+21 −5
Original line number Diff line number Diff line
@@ -1636,6 +1636,15 @@ static OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) {
    return ret;
}

static OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) {
    int32_t tmp;
    if (!msg->findInt32("bitrate-mode", &tmp)) {
        return OMX_Video_ControlRateVariable;
    }

    return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp);
}

status_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) {
    int32_t bitrate, iFrameInterval;
    if (!msg->findInt32("bitrate", &bitrate)
@@ -1643,6 +1652,8 @@ status_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) {
        return INVALID_OPERATION;
    }

    OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg);

    float frameRate;
    if (!msg->findFloat("frame-rate", &frameRate)) {
        int32_t tmp;
@@ -1706,7 +1717,7 @@ status_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) {
        return err;
    }

    err = configureBitrate(bitrate);
    err = configureBitrate(bitrate, bitrateMode);

    if (err != OK) {
        return err;
@@ -1722,6 +1733,8 @@ status_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) {
        return INVALID_OPERATION;
    }

    OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg);

    float frameRate;
    if (!msg->findFloat("frame-rate", &frameRate)) {
        int32_t tmp;
@@ -1780,7 +1793,7 @@ status_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) {
        return err;
    }

    err = configureBitrate(bitrate);
    err = configureBitrate(bitrate, bitrateMode);

    if (err != OK) {
        return err;
@@ -1796,6 +1809,8 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) {
        return INVALID_OPERATION;
    }

    OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg);

    float frameRate;
    if (!msg->findFloat("frame-rate", &frameRate)) {
        int32_t tmp;
@@ -1881,7 +1896,7 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) {
        return err;
    }

    return configureBitrate(bitrate);
    return configureBitrate(bitrate, bitrateMode);
}

status_t ACodec::verifySupportForProfileAndLevel(
@@ -1910,7 +1925,8 @@ status_t ACodec::verifySupportForProfileAndLevel(
    }
}

status_t ACodec::configureBitrate(int32_t bitrate) {
status_t ACodec::configureBitrate(
        int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) {
    OMX_VIDEO_PARAM_BITRATETYPE bitrateType;
    InitOMXParams(&bitrateType);
    bitrateType.nPortIndex = kPortIndexOutput;
@@ -1923,7 +1939,7 @@ status_t ACodec::configureBitrate(int32_t bitrate) {
        return err;
    }

    bitrateType.eControlRate = OMX_Video_ControlRateVariable;
    bitrateType.eControlRate = bitrateMode;
    bitrateType.nTargetBitrate = bitrate;

    return mOMX->setParameter(
+3 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>

#include <OMX_Video.h>

namespace android {

Converter::Converter(
@@ -152,6 +154,7 @@ status_t Converter::initEncoder() {
        mOutputFormat->setInt32("bitrate", audioBitrate);
    } else {
        mOutputFormat->setInt32("bitrate", videoBitrate);
        mOutputFormat->setInt32("bitrate-mode", OMX_Video_ControlRateConstant);
        mOutputFormat->setInt32("frame-rate", 30);
        mOutputFormat->setInt32("i-frame-interval", 1);  // Iframes every 1 secs
        mOutputFormat->setInt32("prepend-sps-pps-to-idr-frames", 1);