Recently for my project I wanted to rotate NV21 raw data obtained from device camera when the device is held in portrait mode. Sadly android does not provide any API that alters the raw data it provides through the onPreviewFrame callback, so was looking for a way to rotate the NV21 by 90 degrees and libyuv came to the rescue.
Prerequisites:-
LRD contains an Android.mk file which we are going to use to build our shared library (of-course some modifications would be needed).
Once the above prerequisites have been met, then proceed with the following steps to build the shared library:-
In my next post I'll try to show how to write a JNI wrapper to use the libyuv shared library.
Prerequisites:-
- NDK setup must be done, and you must be able to compile sample ndk-apps provided in the android-ndk.
- Download the libyuv codebase, do an SVN checkout from here.
LRD contains an Android.mk file which we are going to use to build our shared library (of-course some modifications would be needed).
Once the above prerequisites have been met, then proceed with the following steps to build the shared library:-
- Create a jni folder in LRD.
- Copy the Android.mk file to it.
- Create an Application.mk file and add the following lines to it.
APP_PLATFORM := android-9
APP_ABI := all
- Modify the Android.mk file as below to point to the source code correctly
# This is the Android makefile for libyuv for both platform and NDK.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := \
$(LOCAL_PATH)/../source/compare.cc \
$(LOCAL_PATH)/../source/compare_common.cc \
$(LOCAL_PATH)/../source/compare_neon64.cc \
$(LOCAL_PATH)/../source/compare_posix.cc \
$(LOCAL_PATH)/../source/convert.cc \
$(LOCAL_PATH)/../source/convert_argb.cc \
$(LOCAL_PATH)/../source/convert_from.cc \
$(LOCAL_PATH)/../source/convert_from_argb.cc \
$(LOCAL_PATH)/../source/convert_to_argb.cc \
$(LOCAL_PATH)/../source/convert_to_i420.cc \
$(LOCAL_PATH)/../source/cpu_id.cc \
$(LOCAL_PATH)/../source/planar_functions.cc \
$(LOCAL_PATH)/../source/rotate.cc \
$(LOCAL_PATH)/../source/rotate_argb.cc \
$(LOCAL_PATH)/../source/rotate_mips.cc \
$(LOCAL_PATH)/../source/rotate_neon64.cc \
$(LOCAL_PATH)/../source/row_any.cc \
$(LOCAL_PATH)/../source/row_common.cc \
$(LOCAL_PATH)/../source/row_mips.cc \
$(LOCAL_PATH)/../source/row_neon64.cc \
$(LOCAL_PATH)/../source/row_posix.cc \
$(LOCAL_PATH)/../source/scale.cc \
$(LOCAL_PATH)/../source/scale_any.cc \
$(LOCAL_PATH)/../source/scale_argb.cc \
$(LOCAL_PATH)/../source/scale_common.cc \
$(LOCAL_PATH)/../source/scale_mips.cc \
$(LOCAL_PATH)/../source/scale_neon64.cc \
$(LOCAL_PATH)/../source/scale_posix.cc \
$(LOCAL_PATH)/../source/video_common.cc
# TODO(fbarchard): Enable mjpeg encoder.
# source/mjpeg_decoder.cc
# source/convert_jpeg.cc
# source/mjpeg_validate.cc
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_CFLAGS += -DLIBYUV_NEON
LOCAL_SRC_FILES += \
$(LOCAL_PATH)/../source/compare_neon.cc.neon \
$(LOCAL_PATH)/../source/rotate_neon.cc.neon \
$(LOCAL_PATH)/../source/row_neon.cc.neon \
$(LOCAL_PATH)/../source/scale_neon.cc.neon
endif
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
LOCAL_MODULE := libyuv_static
LOCAL_MODULE_TAGS := optional
include $(BUILD_STATIC_LIBRARY)
- Open command prompt (on Windows) or Terminal in Linux or MAC, navigate to LRD/jni and type ndk-build
- This should trigger the build process and if all goes well the libyuv_static.a (a static library) will get created inside LRD/obj/local/armeabi/
- But we cannot use a static library with android so we need to generate a shared library (.so), for that simply modify the following tags as below (Android.mk file)
LOCAL_MODULE := libyuv_shared
include $(BUILD_SHARED_LIBRARY)
- Again trigger ndk-build to generate the .so at LRD/libs/
To check the functions available use the following command on Linux or MSYS(for windows)
nm -C -D libyuv_shared.so
In my next post I'll try to show how to write a JNI wrapper to use the libyuv shared library.
No comments:
Post a Comment