int videoCapturerGetFrame()

in source/T31/T31VideoCapturer.c [302:369]


int videoCapturerGetFrame(VideoCapturerHandle handle, void* pFrameDataBuffer, const size_t frameDataBufferSize, uint64_t* pTimestamp,
                          size_t* pFrameSize)
{
    T31_HANDLE_NULL_CHECK(handle);
    T31_HANDLE_GET(handle);

    T31_HANDLE_STATUS_CHECK(t31Handle, VID_CAP_STATUS_STREAM_ON);

    if (!pFrameDataBuffer || !pTimestamp || !pFrameSize) {
        return -EINVAL;
    }

    int ret = 0;

    if (t31Handle->format == VID_FMT_RAW) {
        IMPFrameInfo* rawFrame = NULL;
        if (IMP_FrameSource_GetFrame(t31Handle->channelNum, &rawFrame)) {
            LOG("IMP_FrameSource_GetFrame(%d) failed", t31Handle->channelNum);
            return -EAGAIN;
        }
        if (frameDataBufferSize < rawFrame->size) {
            LOG("FrameDataBufferSize(%d) < frameSize(%d), frame dropped", frameDataBufferSize, rawFrame->size);
            ret = -ENOMEM;
        } else {
            memcpy(pFrameDataBuffer, (void*) rawFrame->virAddr, rawFrame->size);
            *pFrameSize = rawFrame->size;
            *pTimestamp = IMP_System_GetTimeStamp();
        }

        IMP_FrameSource_ReleaseFrame(t31Handle->channelNum, rawFrame);
    } else {
        size_t uPacketLen = 0;
        IMPEncoderStream encodeStream = {0};

        if (IMP_Encoder_PollingStream(t31Handle->channelNum, T31_POLLING_STREAM_TIMEOUT_MS)) {
            LOG("IMP_Encoder_PollingStream(%d) timeout", t31Handle->channelNum);
            return -EAGAIN;
        }

        if (IMP_Encoder_GetStream(t31Handle->channelNum, &encodeStream, 1)) {
            LOG("IMP_Encoder_GetStream(%d) failed", t31Handle->channelNum);
            return -EAGAIN;
        }

        for (int i = 0; i < encodeStream.packCount; i++) {
            uPacketLen += encodeStream.pack[i].length;
        }

        if (frameDataBufferSize < uPacketLen) {
            LOG("FrameDataBufferSize(%d) < frameSize(%d), frame dropped", frameDataBufferSize, uPacketLen);
            *pFrameSize = 0;
            ret = -ENOMEM;
        } else {
            size_t offset = 0;

            for (int i = 0; i < encodeStream.packCount; i++) {
                getPacket(&encodeStream, &encodeStream.pack[i], pFrameDataBuffer + offset, uPacketLen - offset);
                offset += encodeStream.pack[i].length;
            }
            *pFrameSize = uPacketLen;
            *pTimestamp = IMP_System_GetTimeStamp();
        }

        IMP_Encoder_ReleaseStream(t31Handle->channelNum, &encodeStream);
    }

    return ret;
}