File: AndroidBufferUtilities.cpp

package info (click to toggle)
halide 21.0.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 55,752 kB
  • sloc: cpp: 289,334; ansic: 22,751; python: 7,486; makefile: 4,299; sh: 2,508; java: 1,549; javascript: 282; pascal: 207; xml: 127; asm: 9
file content (91 lines) | stat: -rw-r--r-- 3,484 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "AndroidBufferUtilities.h"

#include <stdint.h>

#include <android/log.h>

#include "LockedSurface.h"
#include "YuvBufferT.h"

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, "AndroidBufferUtilities", __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, "AndroidBufferUtilities", __VA_ARGS__)

extern "C" {

JNIEXPORT
jlong JNICALL Java_com_example_helloandroidcamera2_AndroidBufferUtilities_allocNativeYuvBufferT(
    JNIEnv *env, jobject, jint srcWidth, jint srcHeight,
    jobject srcLumaByteBuffer, jint srcLumaRowStrideBytes,
    jobject srcChromaUByteBuffer, jobject srcChromaVByteBuffer,
    jint srcChromaElementStrideBytes, jint srcChromaRowStrideBytes) {
    uint8_t *srcLumaPtr = reinterpret_cast<uint8_t *>(
        env->GetDirectBufferAddress(srcLumaByteBuffer));
    uint8_t *srcChromaUPtr = reinterpret_cast<uint8_t *>(
        env->GetDirectBufferAddress(srcChromaUByteBuffer));
    uint8_t *srcChromaVPtr = reinterpret_cast<uint8_t *>(
        env->GetDirectBufferAddress(srcChromaVByteBuffer));
    if (srcLumaPtr == nullptr || srcChromaUPtr == nullptr ||
        srcChromaVPtr == nullptr) {
        return 0L;
    }

    YuvBufferT *buffer = new YuvBufferT(srcLumaPtr, srcWidth, srcHeight,
                                        1 /* srcLumaElementStrideBytes */, srcLumaRowStrideBytes,
                                        srcChromaUPtr, srcWidth / 2, srcHeight / 2,
                                        srcChromaElementStrideBytes, srcChromaRowStrideBytes,
                                        srcChromaVPtr, srcWidth / 2, srcHeight / 2,
                                        srcChromaElementStrideBytes, srcChromaRowStrideBytes);
    return reinterpret_cast<jlong>(buffer);
}

JNIEXPORT jboolean JNICALL Java_com_example_helloandroidcamera2_AndroidBufferUtilities_freeNativeYuvBufferT(
    JNIEnv *env, jobject obj, jlong handle) {
    if (handle == 0L) {
        return false;
    }
    YuvBufferT *yuvBufferT = reinterpret_cast<YuvBufferT *>(handle);
    delete yuvBufferT;
    return true;
}

JNIEXPORT
jboolean JNICALL Java_com_example_helloandroidcamera2_AndroidBufferUtilities_rotateNativeYuvBufferT180(
    JNIEnv *env, jobject obj, jlong handle) {
    if (handle == 0L) {
        return false;
    }
    YuvBufferT *yuvBufferT = reinterpret_cast<YuvBufferT *>(handle);
    yuvBufferT->rotate180();
    return true;
}

JNIEXPORT jlong JNICALL Java_com_example_helloandroidcamera2_AndroidBufferUtilities_lockSurface(
    JNIEnv *env, jobject obj, jobject surface) {
    return reinterpret_cast<jlong>(LockedSurface::lock(env, surface));
}

JNIEXPORT jlong JNICALL Java_com_example_helloandroidcamera2_AndroidBufferUtilities_allocNativeYuvBufferTFromSurfaceHandle(
    JNIEnv *env, jobject obj, jlong lockedSurfaceHandle) {
    if (lockedSurfaceHandle == 0L) {
        return 0L;
    }
    LockedSurface *ls = reinterpret_cast<LockedSurface *>(lockedSurfaceHandle);
    YuvBufferT tmp = ls->yuvView();
    if (tmp.isNull()) {
        return 0L;
    }
    YuvBufferT *yuvBufferT = new YuvBufferT(tmp);
    return reinterpret_cast<jlong>(yuvBufferT);
}

JNIEXPORT jboolean JNICALL Java_com_example_helloandroidcamera2_AndroidBufferUtilities_unlockSurface(
    JNIEnv *env, jobject obj, jlong lockedSurfaceHandle) {
    if (lockedSurfaceHandle == 0L) {
        return false;
    }
    LockedSurface *ls = reinterpret_cast<LockedSurface *>(lockedSurfaceHandle);
    delete ls;
    return true;
}

}  // extern "C"