2012-06-19 4 views
0

вYUV в RGB на ассемблере

public void onPreviewFrame(byte[] data, Camera camera) 

мы получаем данные в формате YUV. Теперь для преобразования в RGB я использовал конвертер в NDK. Но это еще не достаточно быстро.

Так что я нашел это: http://www.roman10.net/effective-color-conversion-yuv-rgb-in-android-in-assembly/

, который имеет этот метод NDK: https://github.com/roman10/roman10-android-tutorial/blob/master/colorConversion/jni/test.c

, но я не знаю, как изменить его, чтобы он принял бы YUV массив байтов «данных» и вернуть мне массив RGB int?

ответ

0

Вы должны написать функцию JNI, аналогичную naGetConvertedFrame(). Новая функция будет иметь следующее заявление:

JNIEXPORT void JNICALL Java_<name>_convert(JNIEnv * pEnv, jobject pObj, jobject pBitmap, jbyteArray jData, jint jWidth, jint jHeight) 

Имя функции должно отражать имя класса Java, который будет объявлять эту функцию native метода (см RenderView.java как пример). В примере Романа общая библиотека загружается из другого класса, в Main.java, но этот loadLibrary() может быть легко передан в файл RenderView.java.

private static native void convert(Bitmap _bitmap, byte[] data, int _width, int _height); 

Ваша функция будет похож на оригинальный, например, только он не будет читать файл, но лучше использовать GetByteArrayElements() приобрести у, у и v указатели для конвертора.

+0

Я googled для GetByteArrayElemnts(), но все еще не знаю, как получить значения YUV из байта [] – tomi

+0

Байт [], который вы получаете от камеры, является полупланарным: сначала введите Y байты (_width * _height), а после этого - (_width * _height/4) пары байтов V и U. Как я вижу, библиотека, которую вы собираетесь использовать, поддерживает только плоскостной YUV (где U пикселей и V пикселей отдельно). Вам, вероятно, потребуется написать свою собственную функцию на основе их кода, который принимает полупланарный ввод. –

+0

THX для объяснения. – tomi

Смежные вопросы