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

Commit c3cd45d7 authored by Mahes Lanka's avatar Mahes Lanka Committed by Ricardo Cerqueira
Browse files

libstagefright: Fallback to software encoder for high resolutions

Add error check conditions to fallback to software encoder if
q6 encoder fails in configure codec. Q6 encoder fails
for resolutions greater than FWVGA

CRs-Fixed: 511608

Change-Id: I4d765f45cd3b9c128260e7c96f139b671950d0ce
parent 2e880916
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -258,7 +258,7 @@ private:
            OMX_VIDEO_CODINGTYPE compressionFormat,
            OMX_COLOR_FORMATTYPE colorFormat);

    void setVideoInputFormat(
    status_t setVideoInputFormat(
            const char *mime, const sp<MetaData>& meta);

    status_t setupBitRate(int32_t bitRate);
+43 −14
Original line number Diff line number Diff line
@@ -614,7 +614,10 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) {
    if (!strncasecmp(mMIME, "video/", 6)) {

        if (mIsEncoder) {
            setVideoInputFormat(mMIME, meta);
            status_t err = setVideoInputFormat(mMIME, meta);
            if (err != OK) {
                return err;
            }
        } else {
            status_t err = setVideoOutputFormat(
                    mMIME, meta);
@@ -875,7 +878,7 @@ status_t OMXCodec::isColorFormatSupported(
    return UNKNOWN_ERROR;
}

void OMXCodec::setVideoInputFormat(
status_t OMXCodec::setVideoInputFormat(
        const char *mime, const sp<MetaData>& meta) {

    int32_t width, height, frameRate, bitRate, stride, sliceHeight;
@@ -908,21 +911,30 @@ void OMXCodec::setVideoInputFormat(
    OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video;

    //////////////////////// Input port /////////////////////////
    CHECK_EQ(setVideoPortFormatType(
            kPortIndexInput, OMX_VIDEO_CodingUnused,
            colorFormat), (status_t)OK);
    err = setVideoPortFormatType(
            kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat);
    if(err != OK) {
        ALOGE("Setting OMX_VIDEO_CodingUnused failed");
        return err;
    }

    InitOMXParams(&def);
    def.nPortIndex = kPortIndexInput;

    err = mOMX->getParameter(
            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
    CHECK_EQ(err, (status_t)OK);
    if(err != OK) {
        ALOGE("Getting OMX_IndexParamPortDefinition failed");
        return err;
    }

    def.nBufferSize = getFrameSize(colorFormat,
            stride > 0? stride: -stride, sliceHeight);

    CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo);
    if((int)def.eDomain != (int)OMX_PortDomainVideo) {
        ALOGE("Input port: Not a Video Domain!!");
        return UNKNOWN_ERROR;
    }

    video_def->nFrameWidth = width;
    video_def->nFrameHeight = height;
@@ -934,20 +946,33 @@ void OMXCodec::setVideoInputFormat(

    err = mOMX->setParameter(
            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
    CHECK_EQ(err, (status_t)OK);
    if(err != OK) {
        ALOGE("Setting Video InPort Definition failed");
        return err;
    }

    //////////////////////// Output port /////////////////////////
    CHECK_EQ(setVideoPortFormatType(
            kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused),
            (status_t)OK);
    err = setVideoPortFormatType(
            kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused);
    if(err != OK) {
        ALOGE("Setting compressionFormat failed");
        return err;
    }

    InitOMXParams(&def);
    def.nPortIndex = kPortIndexOutput;

    err = mOMX->getParameter(
            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
    if(err != OK) {
        ALOGE("Getting Video InPort Definition failed");
        return err;
    }

    CHECK_EQ(err, (status_t)OK);
    CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo);
    if((int)def.eDomain != (int)OMX_PortDomainVideo) {
        ALOGE("Output port: Not a Video Domain");
        return UNKNOWN_ERROR;
    }

    video_def->nFrameWidth = width;
    video_def->nFrameHeight = height;
@@ -962,7 +987,10 @@ void OMXCodec::setVideoInputFormat(

    err = mOMX->setParameter(
            mNode, OMX_IndexParamPortDefinition, &def, sizeof(def));
    CHECK_EQ(err, (status_t)OK);
    if(err != OK) {
        ALOGE("Setting Video OutPort Definition failed");
        return err;
    }

    /////////////////// Codec-specific ////////////////////////
    switch (compressionFormat) {
@@ -986,6 +1014,7 @@ void OMXCodec::setVideoInputFormat(
            CHECK(!"Support for this compressionFormat to be implemented.");
            break;
    }
    return OK;
}

static OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) {