in src/JNI/com/amazonaws/kinesis/video/producer/jni/KinesisVideoClientWrapper.cpp [458:551]
void KinesisVideoClientWrapper::getKinesisVideoStreamData(jlong streamHandle, jlong uploadHandle, jobject dataBuffer, jint offset, jint length, jobject readResult)
{
STATUS retStatus = STATUS_SUCCESS;
JNIEnv *env;
mJvm->GetEnv((PVOID*) &env, JNI_VERSION_1_6);
UINT32 filledSize = 0, bufferSize = 0;
PBYTE pBuffer = NULL;
jboolean isEos = JNI_FALSE;
jclass readResultClass;
jmethodID setterMethodId;
if (NULL == readResult)
{
DLOGE("NULL ReadResult object");
throwNativeException(env, EXCEPTION_NAME, "NULL ReadResult object is passsed.", STATUS_NULL_ARG);
goto CleanUp;
}
if (!IS_VALID_CLIENT_HANDLE(mClientHandle))
{
DLOGE("Invalid client object");
throwNativeException(env, EXCEPTION_NAME, "Invalid call after the client is freed.", STATUS_INVALID_OPERATION);
goto CleanUp;
}
if (!IS_VALID_STREAM_HANDLE(streamHandle))
{
DLOGE("Invalid stream handle 0x%016" PRIx64, (UINT64) streamHandle);
throwNativeException(env, EXCEPTION_NAME, "Invalid stream handle.", STATUS_INVALID_OPERATION);
goto CleanUp;
}
if (dataBuffer == NULL)
{
DLOGE("Invalid buffer object.");
throwNativeException(env, EXCEPTION_NAME, "Invalid buffer object.", STATUS_INVALID_OPERATION);
goto CleanUp;
}
// Convert the buffer of stream data to get
if (!setStreamDataBuffer(env, dataBuffer, offset, &pBuffer))
{
DLOGE("Failed converting kinesis video stream data buffer object.");
throwNativeException(env, EXCEPTION_NAME, "Failed converting kinesis video stream data buffer object.", STATUS_INVALID_OPERATION);
goto CleanUp;
}
retStatus = ::getKinesisVideoStreamData(streamHandle, uploadHandle, pBuffer, (UINT32) length, &filledSize);
if (STATUS_SUCCESS != retStatus && STATUS_AWAITING_PERSISTED_ACK != retStatus
&& STATUS_UPLOAD_HANDLE_ABORTED != retStatus
&& STATUS_NO_MORE_DATA_AVAILABLE != retStatus && STATUS_END_OF_STREAM != retStatus)
{
char errMessage[256];
SNPRINTF(errMessage, 256, "Failed to get data from the stream 0x%016" PRIx64 " with uploadHandle %" PRIu64 , (UINT64) streamHandle, (UINT64) uploadHandle);
DLOGE("Failed to get data from the stream with status code 0x%08x", retStatus);
throwNativeException(env, EXCEPTION_NAME, errMessage, retStatus);
goto CleanUp;
}
if (STATUS_END_OF_STREAM == retStatus || STATUS_UPLOAD_HANDLE_ABORTED == retStatus) {
isEos = JNI_TRUE;
}
// Get the class
readResultClass = env->GetObjectClass(readResult);
if (readResultClass == NULL){
DLOGE("Failed to get ReadResult class object");
throwNativeException(env, EXCEPTION_NAME, "Failed to get ReadResult class object.", STATUS_INVALID_OPERATION);
goto CleanUp;
}
// Get the Java method id
setterMethodId = env->GetMethodID(readResultClass, "setReadResult", "(IZ)V");
if (setterMethodId == NULL)
{
DLOGE("Failed to get the setter method id.");
throwNativeException(env, EXCEPTION_NAME, "Failed to get setter method id.", STATUS_INVALID_OPERATION);
goto CleanUp;
}
// Call the setter method
env->CallVoidMethod(readResult,
setterMethodId,
filledSize,
isEos);
CleanUp:
if (!releaseStreamDataBuffer(env, dataBuffer, offset, pBuffer))
{
DLOGE("Failed releasing kinesis video stream data buffer object.");
throwNativeException(env, EXCEPTION_NAME, "Failed releasing kinesis video stream data buffer object.", STATUS_INVALID_OPERATION);
}
}