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

Commit 1b420c6f authored by Wonsik Kim's avatar Wonsik Kim Committed by android-build-merger
Browse files

Merge "codecs: check OMX buffer size before use in (avc|hevc|mpeg2)dec" into nyc-dev

am: 138cfd7d

* commit '138cfd7d':
  codecs: check OMX buffer size before use in (avc|hevc|mpeg2)dec

Change-Id: I80b7b8052cc5ea7515afb3f93e0c57fd131c6f3b
parents b9b9fa3d 138cfd7d
Loading
Loading
Loading
Loading
+19 −9
Original line number Original line Diff line number Diff line
@@ -381,7 +381,7 @@ void SoftAVC::onReset() {
    resetPlugin();
    resetPlugin();
}
}


void SoftAVC::setDecodeArgs(
bool SoftAVC::setDecodeArgs(
        ivd_video_decode_ip_t *ps_dec_ip,
        ivd_video_decode_ip_t *ps_dec_ip,
        ivd_video_decode_op_t *ps_dec_op,
        ivd_video_decode_op_t *ps_dec_op,
        OMX_BUFFERHEADERTYPE *inHeader,
        OMX_BUFFERHEADERTYPE *inHeader,
@@ -389,7 +389,6 @@ void SoftAVC::setDecodeArgs(
        size_t timeStampIx) {
        size_t timeStampIx) {
    size_t sizeY = outputBufferWidth() * outputBufferHeight();
    size_t sizeY = outputBufferWidth() * outputBufferHeight();
    size_t sizeUV;
    size_t sizeUV;
    uint8_t *pBuf;


    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
@@ -409,22 +408,28 @@ void SoftAVC::setDecodeArgs(
        ps_dec_ip->u4_num_Bytes = 0;
        ps_dec_ip->u4_num_Bytes = 0;
    }
    }


    sizeUV = sizeY / 4;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;

    uint8_t *pBuf;
    if (outHeader) {
    if (outHeader) {
        if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) {
            android_errorWriteLog(0x534e4554, "27569635");
            return false;
        }
        pBuf = outHeader->pBuffer;
        pBuf = outHeader->pBuffer;
    } else {
    } else {
        // mFlushOutBuffer always has the right size.
        pBuf = mFlushOutBuffer;
        pBuf = mFlushOutBuffer;
    }
    }


    sizeUV = sizeY / 4;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;

    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
    return;
    return true;
}
}
void SoftAVC::onPortFlushCompleted(OMX_U32 portIndex) {
void SoftAVC::onPortFlushCompleted(OMX_U32 portIndex) {
    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
@@ -573,7 +578,12 @@ void SoftAVC::onQueueFilled(OMX_U32 portIndex) {
            WORD32 timeDelay, timeTaken;
            WORD32 timeDelay, timeTaken;
            size_t sizeY, sizeUV;
            size_t sizeY, sizeUV;


            setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx);
            if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {
                ALOGE("Decoder arg setup failed");
                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
                mSignalledError = true;
                return;
            }
            // If input dump is enabled, then write to file
            // If input dump is enabled, then write to file
            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes);
            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes);


+1 −1
Original line number Original line Diff line number Diff line
@@ -109,7 +109,7 @@ private:
    status_t resetPlugin();
    status_t resetPlugin();




    void setDecodeArgs(
    bool setDecodeArgs(
            ivd_video_decode_ip_t *ps_dec_ip,
            ivd_video_decode_ip_t *ps_dec_ip,
            ivd_video_decode_op_t *ps_dec_op,
            ivd_video_decode_op_t *ps_dec_op,
            OMX_BUFFERHEADERTYPE *inHeader,
            OMX_BUFFERHEADERTYPE *inHeader,
+19 −9
Original line number Original line Diff line number Diff line
@@ -343,14 +343,13 @@ void SoftHEVC::onReset() {
    resetPlugin();
    resetPlugin();
}
}


void SoftHEVC::setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip,
bool SoftHEVC::setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip,
        ivd_video_decode_op_t *ps_dec_op,
        ivd_video_decode_op_t *ps_dec_op,
        OMX_BUFFERHEADERTYPE *inHeader,
        OMX_BUFFERHEADERTYPE *inHeader,
        OMX_BUFFERHEADERTYPE *outHeader,
        OMX_BUFFERHEADERTYPE *outHeader,
        size_t timeStampIx) {
        size_t timeStampIx) {
    size_t sizeY = outputBufferWidth() * outputBufferHeight();
    size_t sizeY = outputBufferWidth() * outputBufferHeight();
    size_t sizeUV;
    size_t sizeUV;
    uint8_t *pBuf;


    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
@@ -370,22 +369,28 @@ void SoftHEVC::setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip,
        ps_dec_ip->u4_num_Bytes = 0;
        ps_dec_ip->u4_num_Bytes = 0;
    }
    }


    sizeUV = sizeY / 4;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;

    uint8_t *pBuf;
    if (outHeader) {
    if (outHeader) {
        if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) {
            android_errorWriteLog(0x534e4554, "27569635");
            return false;
        }
        pBuf = outHeader->pBuffer;
        pBuf = outHeader->pBuffer;
    } else {
    } else {
        // mFlushOutBuffer always has the right size.
        pBuf = mFlushOutBuffer;
        pBuf = mFlushOutBuffer;
    }
    }


    sizeUV = sizeY / 4;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;

    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
    return;
    return true;
}
}
void SoftHEVC::onPortFlushCompleted(OMX_U32 portIndex) {
void SoftHEVC::onPortFlushCompleted(OMX_U32 portIndex) {
    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
@@ -520,7 +525,12 @@ void SoftHEVC::onQueueFilled(OMX_U32 portIndex) {
            WORD32 timeDelay, timeTaken;
            WORD32 timeDelay, timeTaken;
            size_t sizeY, sizeUV;
            size_t sizeY, sizeUV;


            setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx);
            if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {
                ALOGE("Decoder arg setup failed");
                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
                mSignalledError = true;
                return;
            }


            GETTIME(&mTimeStart, NULL);
            GETTIME(&mTimeStart, NULL);
            /* Compute time elapsed between end of previous decode()
            /* Compute time elapsed between end of previous decode()
+1 −1
Original line number Original line Diff line number Diff line
@@ -106,7 +106,7 @@ private:
    status_t resetDecoder();
    status_t resetDecoder();
    status_t resetPlugin();
    status_t resetPlugin();


    void setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip,
    bool setDecodeArgs(ivd_video_decode_ip_t *ps_dec_ip,
        ivd_video_decode_op_t *ps_dec_op,
        ivd_video_decode_op_t *ps_dec_op,
        OMX_BUFFERHEADERTYPE *inHeader,
        OMX_BUFFERHEADERTYPE *inHeader,
        OMX_BUFFERHEADERTYPE *outHeader,
        OMX_BUFFERHEADERTYPE *outHeader,
+21 −12
Original line number Original line Diff line number Diff line
@@ -466,7 +466,7 @@ OMX_ERRORTYPE SoftMPEG2::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR
    return ret;
    return ret;
}
}


void SoftMPEG2::setDecodeArgs(
bool SoftMPEG2::setDecodeArgs(
        ivd_video_decode_ip_t *ps_dec_ip,
        ivd_video_decode_ip_t *ps_dec_ip,
        ivd_video_decode_op_t *ps_dec_op,
        ivd_video_decode_op_t *ps_dec_op,
        OMX_BUFFERHEADERTYPE *inHeader,
        OMX_BUFFERHEADERTYPE *inHeader,
@@ -474,7 +474,6 @@ void SoftMPEG2::setDecodeArgs(
        size_t timeStampIx) {
        size_t timeStampIx) {
    size_t sizeY = outputBufferWidth() * outputBufferHeight();
    size_t sizeY = outputBufferWidth() * outputBufferHeight();
    size_t sizeUV;
    size_t sizeUV;
    uint8_t *pBuf;


    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t);
    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t);
@@ -494,22 +493,28 @@ void SoftMPEG2::setDecodeArgs(
        ps_dec_ip->u4_num_Bytes = 0;
        ps_dec_ip->u4_num_Bytes = 0;
    }
    }


    sizeUV = sizeY / 4;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;

    uint8_t *pBuf;
    if (outHeader) {
    if (outHeader) {
        if (outHeader->nAllocLen < sizeY + (sizeUV * 2)) {
            android_errorWriteLog(0x534e4554, "27569635");
            return false;
        }
        pBuf = outHeader->pBuffer;
        pBuf = outHeader->pBuffer;
    } else {
    } else {
        // mFlushOutBuffer always has the right size.
        pBuf = mFlushOutBuffer;
        pBuf = mFlushOutBuffer;
    }
    }


    sizeUV = sizeY / 4;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV;
    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV;

    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf;
    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY;
    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV;
    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
    ps_dec_ip->s_out_buffer.u4_num_bufs = 3;
    return;
    return true;
}
}
void SoftMPEG2::onPortFlushCompleted(OMX_U32 portIndex) {
void SoftMPEG2::onPortFlushCompleted(OMX_U32 portIndex) {
    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */
@@ -622,7 +627,11 @@ void SoftMPEG2::onQueueFilled(OMX_U32 portIndex) {
            WORD32 timeDelay, timeTaken;
            WORD32 timeDelay, timeTaken;
            size_t sizeY, sizeUV;
            size_t sizeY, sizeUV;


            setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx);
            if (!setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {
                ALOGE("Decoder arg setup failed");
                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
                return;
            }
            // If input dump is enabled, then write to file
            // If input dump is enabled, then write to file
            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes);
            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes);


@@ -665,9 +674,9 @@ void SoftMPEG2::onQueueFilled(OMX_U32 portIndex) {


                CHECK_EQ(reInitDecoder(), (status_t)OK);
                CHECK_EQ(reInitDecoder(), (status_t)OK);


                setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx);
                if (setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {

                    ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
                    ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
                }
                return;
                return;
            }
            }


Loading