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;
}