void KinesisVideoClientWrapper::getKinesisVideoStreamData()

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