Skip to content
Snippets Groups Projects
Commit 08d0c727 authored by Adrien Béraud's avatar Adrien Béraud
Browse files

jni: handle real YUV422 video

Change-Id: I39ebed2ee053db5b963c5e550c8452f49492d0e6
parent 2f772e3b
Branches
No related tags found
No related merge requests found
...@@ -161,16 +161,24 @@ JNIEXPORT void JNICALL Java_cx_ring_daemon_RingserviceJNI_captureVideoFrame(JNIE ...@@ -161,16 +161,24 @@ JNIEXPORT void JNICALL Java_cx_ring_daemon_RingserviceJNI_captureVideoFrame(JNIE
jclass planeClass = jenv->GetObjectClass(yplane); jclass planeClass = jenv->GetObjectClass(yplane);
jmethodID getBuffer = jenv->GetMethodID(planeClass, "getBuffer", "()Ljava/nio/ByteBuffer;"); jmethodID getBuffer = jenv->GetMethodID(planeClass, "getBuffer", "()Ljava/nio/ByteBuffer;");
jmethodID getRowStride = jenv->GetMethodID(planeClass, "getRowStride", "()I"); jmethodID getRowStride = jenv->GetMethodID(planeClass, "getRowStride", "()I");
jobject ybuffer = jenv->CallObjectMethod(yplane, getBuffer); jmethodID getPixelStride = jenv->GetMethodID(planeClass, "getPixelStride", "()I");
jobject ubuffer = jenv->CallObjectMethod(uplane, getBuffer); auto ydata = (uint8_t*)jenv->GetDirectBufferAddress(jenv->CallObjectMethod(yplane, getBuffer));
jobject vbuffer = jenv->CallObjectMethod(vplane, getBuffer); auto udata = (uint8_t*)jenv->GetDirectBufferAddress(jenv->CallObjectMethod(uplane, getBuffer));
auto ydata = (uint8_t*)jenv->GetDirectBufferAddress(ybuffer); auto vdata = (uint8_t*)jenv->GetDirectBufferAddress(jenv->CallObjectMethod(vplane, getBuffer));
auto udata = (uint8_t*)jenv->GetDirectBufferAddress(ubuffer);
auto vdata = (uint8_t*)jenv->GetDirectBufferAddress(vbuffer);
auto uvdata = std::min(udata, vdata);
auto ystride = jenv->CallIntMethod(yplane, getRowStride); auto ystride = jenv->CallIntMethod(yplane, getRowStride);
auto uvstride = jenv->CallIntMethod(uplane, getRowStride); auto uvstride = jenv->CallIntMethod(uplane, getRowStride);
auto uvpixstride = jenv->CallIntMethod(uplane, getPixelStride);
if (uvpixstride == 1) {
avframe->data[0] = ydata;
avframe->linesize[0] = ystride;
avframe->data[1] = udata;
avframe->linesize[1] = uvstride;
avframe->data[2] = vdata;
avframe->linesize[2] = uvstride;
} else if (uvpixstride == 2) {
// False YUV422, actually NV12 or NV21
auto uvdata = std::min(udata, vdata);
avframe->format = uvdata == udata ? AV_PIX_FMT_NV12 : AV_PIX_FMT_NV21; avframe->format = uvdata == udata ? AV_PIX_FMT_NV12 : AV_PIX_FMT_NV21;
if (rotation == 0) { if (rotation == 0) {
avframe->data[0] = ydata; avframe->data[0] = ydata;
...@@ -188,6 +196,7 @@ JNIEXPORT void JNICALL Java_cx_ring_daemon_RingserviceJNI_captureVideoFrame(JNIE ...@@ -188,6 +196,7 @@ JNIEXPORT void JNICALL Java_cx_ring_daemon_RingserviceJNI_captureVideoFrame(JNIE
rotateNV21(ydata, uvdata, ystride, uvstride, ow, oh, rotation, avframe->data[0], avframe->data[1]); rotateNV21(ydata, uvdata, ystride, uvstride, ow, oh, rotation, avframe->data[0], avframe->data[1]);
jenv->CallVoidMethod(image, jenv->GetMethodID(imageClass, "close", "()V")); jenv->CallVoidMethod(image, jenv->GetMethodID(imageClass, "close", "()V"));
} }
}
} else { } else {
for (int i=0; i<planeCount; i++) { for (int i=0; i<planeCount; i++) {
jobject plane = jenv->GetObjectArrayElement(planes, i); jobject plane = jenv->GetObjectArrayElement(planes, i);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment