Android xbmc

image

안드로이드용 xbmc가 있어 갤럭시 S2 폰에 설치해봤다.

구글 플레이 스토어에 없고 xbmc-korea 에서 다운 받아 설치해야한다.

화면이 작아 버튼 누르기가 힘들고 해상도가 큰 비디오은

제대로 재생이 되지 않고 가끔 버뻑거리지만 쓸만 하다.

갤럭시 S2용 HDMI 케이블이 있다면 TV에 연결해서 봐도 좋을것 같다.

 

xbmc에 대한 자세한 내용은 다음 사이트를 참조

http://xbmc-korea.com/xe/intro

Linaro android modify init.rc

Linaro 기반 안드로이드에서는 init.rc 파일이 boot.tar.bz2 압축 파일내 uInitrd 에 CPIO 사용하여 저장 되어 있다.
init.rc 수정 방법은 다음과 같다.

tar xjf boot.tar.bz2
mkdir unpacked && cd unpacked
dd if=../boot/uInitrd bs=64 skip=1 | gunzip -c | sudo cpio -i -d -H newc –no-absolute-filenames
sudo vi init.rc
sudo find . | sudo cpio -o -H newc | gzip -c > ../initrd.new
mkimage -A arm -O linux -C gzip -T ramdisk -d ../initrd.new ../boot/uInitrd
rm ../initrd.new
cd ..
rm boot.tar.bz2 && tar cjf boot.tar.bz2 boot

또는 boot.tar.bz2가 저장되어 있는 mmc 파티션에 마운트 하여 uInitrd 파일을 풀어 수정 하면 된다.

OpenMP

Android에서 SVC 디코딩 성능이 나오지 않아 OpenMP 사용하기 위해 android toolchian를 받아 OpenMP 페치를 하여 빌드 하였다.

빌드 후 OpenMP 를 적용하여 빌드하여 실행 했더니 특정 함수에서만 실행 OpenMP가 적용되고 특정 루틴에서는 프로그램이 죽는 현상이 발생하였다.

원인를 찾아 보니 pthread에 내에 있는 함수에서 OpenMP를 적용하면 프로그램이 죽는 현상이었다. 다시 페치 파일을 찾아 pthread에서 OpenMP를 적용해도 프로그램이 죽지 않았다.

그런데 OpenMP를 적용해도 성능이 향상되지 않는다.

문제의 원인를 모르겠다. 디코딩 성능은 안나오는데 CPU 부하는 50% 정도 밖에 되지 않고 OpenMP를 적용해도 성능은 그대로다.

android toolchain build

ubuntu 12.04 32bit desktop 에서 android-ndk-r7b 받아 빌드

 

소스 다운로드

# cd  android-ndk-r7b

# ./build/tools/download-toolchain-sources.sh src

 

라이브러리 다운로드

# apt-get install m4

# apt-get install libncurses5-dev

# apt-get install flex

 

페치 ( -ldl 추가 )

src/gcc/gcc-4.4.3/configure.ac : gmplibs=”-lmpfr -lgmp -ldl”

src/gcc/gcc-4.4.3/configure : gmplibs=”-lmpfr -lgmp -ldl”

 

OpenMP 

patch : https://android-review.googlesource.com/#/c/34491/

patch 방법 : https://groups.google.com/forum/?fromgroups#!topic/android-ndk/pUfqxURgNbQ

 

빌드

# ./build/tools/build-gcc.sh $(pwd)/src $(pwd) arm-linux-androideabi-4.4.3

OpenMAX AL for ffmpeg

OpenMAX AL

  • OpenMAX Application Layer
  • Application-level multimedia playback and recording API for mobile embedded devices.
  • Device independent
  • Cross-platform interface for applications to access a devices audio, video and imaging capabilities.
  • OpenMAX AL 를 사용하면 디바이스에 독립적으로 media player/recorder를 만들 수 있다.

 

NativeMedia Sample

  • ndk/samples/nativemedia 풀더에 OpenMAX AL를 사용하여 MPEG TS 파일을 재생하는 예제가 있다.
  • 이 예제는 android.media.MediaPlayer java class 를 이용하는 방법과 native api를 사용하는 방법
  • 그리고 video sink를 일반surface를 사용하는 법과 opengl GLSurfaceview를 사용하는 예제가 들어 있다.
  • 예제를 실행하기 위해서는 풀더에 포함된 NatieMedia.ts 파일을 /sdcard/NativeMedia.ts 에 저장 되어 있어야 한다.
  • ffmpeg를 사용하여 플레이어를 만들기 위해서는 native 방법을 사용해야 한다.

 

주요 native 함수

  • createEngine() – create the engine and output mix objects
  • createStreamingMediaPlayer(String filename) – crate streaming media player
    • TS file를 open
    • image video sink 와 data source에 대한 format를 정의 하고 media player를 생성
    • 필요한 인터페이스들을 얻는다.
  • setSurface(Surface surface) – set the surface
    • ANativeWindwo_fromSurface 함수 이용 surface와 video sink를 연결
  • setPlayingStreamingMediaPlayer(boolean isPlaying) – set the playing state for the streaming media player
  • shutdown() – shut down the native media system
  • rewindStramingMediaPlayer() – rewind th streaming media player

 

XDataFormat_XXX

  • 예제에서는 XDataFormat_MIME를 사용하여 버퍼에 ts 파일을 직접 밀어 넣어 재생하였다.
  • ffmpeg에서 적용하려면 XDataFormat_RawImage를 사용하여 ffmpeg에서 디코딩한 raw 데이터를 밀어 넣으면 되지 않을까?
  • raw 데이터 처리가 된다면 OpenMAX IL 까지 보지 않아도 될것 같다.!!
  • XADataFormat_RawImage ( OpenMAX AL 1.0 SPEC Chapter 9.1.9 )
    typedef struct XADataFormat_RawImage_ {
        XAuint32 formatType;
        XAuint32 colorFormat;
        XAuint32 height;
        XAuint32 width;
        XAuint32 stride;
    } XADataFormat_RawImage;
    • Structure used to describe the raw image data:
      Field Description
      formatType The format type, which must always be XA_DATAFORMAT_RAWIMAGE for this structure.
      colorFormat Raw image color format. Refer to XA_COLORFORMAT macros.
      height Frame height (vertical) resolution.
      width Frame width (horizontal) resolution.
      stride Number of bytes in a line of the image.
    • formatType
      #define XA_DATAFORMAT_MIME              ((XAuint32) 0x00000001)
      #define XA_DATAFORMAT_PCM               ((XAuint32) 0x00000002)
      #define XA_DATAFORMAT_RAWIMAGE          ((XAuint32) 0x00000003)
    • colorFormat
      #define XA_COLORFORMAT_UNUSED                   ((XAuint32) 0x00000000)
      #define XA_COLORFORMAT_MONOCHROME               ((XAuint32) 0x00000001)
      #define XA_COLORFORMAT_8BITRGB332               ((XAuint32) 0x00000002)
      #define XA_COLORFORMAT_12BITRGB444              ((XAuint32) 0x00000003)
      #define XA_COLORFORMAT_16BITARGB4444            ((XAuint32) 0x00000004)
      #define XA_COLORFORMAT_16BITARGB1555            ((XAuint32) 0x00000005)
      #define XA_COLORFORMAT_16BITRGB565              ((XAuint32) 0x00000006)
      #define XA_COLORFORMAT_16BITBGR565              ((XAuint32) 0x00000007)
      #define XA_COLORFORMAT_18BITRGB666              ((XAuint32) 0x00000008)
      #define XA_COLORFORMAT_18BITARGB1665            ((XAuint32) 0x00000009)
      #define XA_COLORFORMAT_19BITARGB1666            ((XAuint32) 0x0000000A)
      #define XA_COLORFORMAT_24BITRGB888              ((XAuint32) 0x0000000B)
      #define XA_COLORFORMAT_24BITBGR888              ((XAuint32) 0x0000000C)
      #define XA_COLORFORMAT_24BITARGB1887            ((XAuint32) 0x0000000D)
      #define XA_COLORFORMAT_25BITARGB1888            ((XAuint32) 0x0000000E)
      #define XA_COLORFORMAT_32BITBGRA8888            ((XAuint32) 0x0000000F)
      #define XA_COLORFORMAT_32BITARGB8888            ((XAuint32) 0x00000010)
      #define XA_COLORFORMAT_YUV411PLANAR             ((XAuint32) 0x00000011)
      #define XA_COLORFORMAT_YUV420PLANAR             ((XAuint32) 0x00000013)
      #define XA_COLORFORMAT_YUV420SEMIPLANAR         ((XAuint32) 0x00000015)
      #define XA_COLORFORMAT_YUV422PLANAR             ((XAuint32) 0x00000016)
      #define XA_COLORFORMAT_YUV422SEMIPLANAR         ((XAuint32) 0x00000018)
      #define XA_COLORFORMAT_YCBYCR                   ((XAuint32) 0x00000019)
      #define XA_COLORFORMAT_YCRYCB                   ((XAuint32) 0x0000001A)
      #define XA_COLORFORMAT_CBYCRY                   ((XAuint32) 0x0000001B)
      #define XA_COLORFORMAT_CRYCBY                   ((XAuint32) 0x0000001C)
      #define XA_COLORFORMAT_YUV444INTERLEAVED        ((XAuint32) 0x0000001D)
      #define XA_COLORFORMAT_RAWBAYER8BIT             ((XAuint32) 0x0000001E)
      #define XA_COLORFORMAT_RAWBAYER10BIT            ((XAuint32) 0x0000001F)
      #define XA_COLORFORMAT_RAWBAYER8BITCOMPRESSED   ((XAuint32) 0x00000020)
      #define XA_COLORFORMAT_L2                       ((XAuint32) 0x00000021)
      #define XA_COLORFORMAT_L4                       ((XAuint32) 0x00000022)
      #define XA_COLORFORMAT_L8                       ((XAuint32) 0x00000023)
      #define XA_COLORFORMAT_L16                      ((XAuint32) 0x00000024)
      #define XA_COLORFORMAT_L24                      ((XAuint32) 0x00000025)
      #define XA_COLORFORMAT_L32                      ((XAuint32) 0x00000026)
      #define XA_COLORFORMAT_18BITBGR666              ((XAuint32) 0x00000029)
      #define XA_COLORFORMAT_24BITARGB6666            ((XAuint32) 0x0000002A)
      #define XA_COLORFORMAT_24BITABGR6666            ((XAuint32) 0x0000002B)

 

Wiki : http://howto.homelinux.com/wiki/AndroidFFMPEG#OpenMAXAL

OpenSL ES for ffmpeg

OpenSL ES

  • Native language application-level audio API for embedded mobile multimedia devices.
  • Device independent
  • Cross-platform interface for applications to access a devices audio capabilities.
  • Android에서 Platform 9 에서 부터 지원 한다.
  • NDK 풀더의 Platforms/android-9/arch-arm/usr/include/SLES 풀더에 관련 헤더 파일이 있다.

 

Android NDK Native-Audio Sample

  • ndk/samples/native-audio 에 위치
  • OpenSL ES 사용하여 mp3 파일 재생, uri 재생, queue 재생 하는 프로그램
  • ffmpeg 에서 디코딩 오디오 데이터를 재생 하려면 queue 재생 방법을 참조 한다.
  • Native Audio.java 에서 queue 재생을 위한 주요 Native 함수는 다음과 같다.
    • createEngine() – create the engine and output mix objects
      • Java_com_example_nativeaudio_NativeAudio_createEngine() 함수를 호출 한다.
      • Audio player object와 mixer object를 생성 한다.
    • createBufferQueueAudioPlayer() – create buffer queue audio player
      • Java_com_example_nativeaudio_NativeAudio_createBufferQueueAudioPlayer() 함수를 호출 한다.
      • buffer queue audio player를 생성한다.
      • PCM 데이터의 비트레이트와 채널 수는 SLDataFormat_PCM 구조체를 사용하여 설정 한다.
      • SLAndroidSimpleBufferQueueItf 의 Enqueue() 함수를 통해 지정된 버퍼의 내용을 재생 한다.
      • 지정된 버퍼 재생이 끝나면 SLAndroidSimpleBufferQueueItf 의 RegisterCallback 함수에 등록된 callback 함수가 호출 된다.
      • callback 함수에서 다음 데이터의 버퍼 주소를 넣어 주어 재생이 이루어 진다.
    • selectClip() – audio buffer select and loop count setting
      • Java_com_example_nativeaudio_NativeAudio_selectClip() 함수를 호출 한다.
      • audio buffer clip를 선택하고 Enqueue() 함수 호출 하여 오디오 재생을 시작 한다.
  • SLDataFormat_PCM
    /** PCM-type-based data format definition where formatType must be SL_DATAFORMAT_PCM*/
    typedef struct SLDataFormat_PCM_ {
            SLuint32                formatType;
            SLuint32                numChannels;
            SLuint32                samplesPerSec;
            SLuint32                bitsPerSample;
            SLuint32                containerSize;
            SLuint32                channelMask;
            SLuint32                endianness;
    } SLDataFormat_PCM;
  • ffmpeg 에서 디코딩된 오디오 데이터의 형식를 보고 SLDataFormat_PCM 에 정의해 주어야 정상적으로 오디오가 재생 된다.
  • AVCodecContext 의 sample_rate, sample_fmt 와 channel 값등을 참조 하면 된다.

Unity

유니티(Unity)는 게임 개발 톨이다. 유니티를 사용하면 3D게임을 GUI 환경에서 쉽게 제작 할 수 있고 완성된 게임을 다양한 플랫품에서 실행 할 수 있다. 유니티로 제작한 게임은 web application 이나 iOS 그리고 안드로이드에서 동일 하게 동작 한다.

유니티 버전은 무료 버전과 프로 버전이 있으며 프로 버전은 $1500이다. 무료 버전의 경우 iOS와 Android Target Platform 빌드 할 수 있는 기능이 4월 8일 까지 무료 이다.

무료 버전을 받아서 윈도우 PC에 설치해 보았다. 인터페이스는 3D 제작 툴과 유사하게 3D로 게임 공간을 편집 할 수 있도록 되어 있고 바로 실행 하여 테스트가 가능 했다.  다양한 기능이 있지만 툴을 배우려면 시간이 필요해 보인다.  프로그램에 포함된 데모 게임 “Angry Bots”를 빌드하여 웹서버에 올려봤다.

Angry Bots 게임은 Android Market과 Apple Market에서 무료로 받을 수 있다.

유니티 국내 사이트 주소는 다음과 같다.

http://www.unity3dkorea.com/