Encoding
I420 (YUV), RGB24: http://blog.csdn.net/leixiaohua1020/article/details/12234821
1. I420 A frame in I420 (YUV 4:2:0) is size = width * height * 1.5Byte
I420 is YYYY…UUUUVVVV
NV21 is YYYY…UVUVUVUV (Maybe used in the deprecated Camera API)
YV12 IS YYYY…VVVVUUUU (Maybe used in the deprecated Camera API)
2. RGB24 A frame in RGB24 is size = width * height * 3Byte
Camera2 API
Usage
1. Official guide: https://developer.android.com/guide/topics/media/camera
2. Official samples
a. https://github.com/googlesamples/android-Camera2Basic/
b. https://github.com/googlesamples/android-Camera2Raw/
c. https://github.com/googlesamples/android-Camera2Video/
Format
1. Image class: https://www.polarxiong.com/archives/Android-Image%E7%B1%BB%E6%B5%85%E6%9E%90-%E7%BB%93%E5%90%88YUV_420_888.html
2. YUV_420_888 to I420: https://www.polarxiong.com/archives/Android-YUV_420_888%E7%BC%96%E7%A0%81Image%E8%BD%AC%E6%8D%A2%E4%B8%BAI420%E5%92%8CNV21%E6%A0%BC%E5%BC%8Fbyte%E6%95%B0%E7%BB%84.html
Open Source Libs
1. libyuv
It is used to rotate, crop and scale the captured video frames before transfer. The frames must be head-up no matter the phone orientation. The best order of image processing for downscaling the captured image is: scale -> crop -> rotate.
Use Neon to optimize the libyuv when compiling, so that we can do parallel processing.
2. libtheora
Use the unofficial libtheora 1.2 with neon optimization. Need to change the instruction “BLX” in lib/arm/armenquant.s to “BL” to avoid crush issue.
1). Get the tools:
a. sudo apt-get install autoconf
b. sudo apt-get install libtool
c. sudo apt-get install libogg-dev
2). set up the ndk build evn:
a. NDK=/build/toolchain/lin64/android-ndk-r12b
b. SYSROOT=$NDK/platforms/android-19/arch-arm (Use API Level 19 because the libogg and libtheora are too old to be compiled on newer platform)
c. PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
3). Build the libogg:
a. ./autogen.sh --prefix=$HOME/tmp/libogg --host=arm-linux --enable-shared CC="$PREBUILT/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT" LDFLAGS="-Wl,-O2,--as-needed" CFLAGS="-march=armv7-a -mfpu=neon"
b. make install
4). Build the libtheora
ARM compile options https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
Into Assambly: http://www.cnblogs.com/goodhacker/p/3206405.htmlhttp://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Cihfddaf.html
a. ./autogen.sh --prefix=$HOME/tmp/libtheora --host=arm-linux --disable-examples CC="$PREBUILT/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT" LDFLAGS="-Wl,-O2,-g,-L$HOME/tmp/libogg/lib" CPPFLAGS="-I$HOME/tmp/libogg/include" CFLAGS="-march=armv7-a -mfpu=neon -mthumb "
b. make install