커널 버젼은 3.x , CPU는 ARM 멀티코어인 exynos4를 선택한다.

1. 커널 소스 받기
 
2. 툴체인 설치하기
  1) codesourcery 에서 다운로드 ( http://www.codesourcery.com/sgpp/lite/arm )
  2) root 권한으로 설치

$ cd /
$ tar zxvf /다운로드경로/codesourcery.tar.gz
$
  3) 툴체인은 codesourcery 것을 사용한다.
     일전에 3개의 툴체인을 동일한 환경에서 벤치마크를 한 적이 있다.
     예상대로 
codesourcery가 가장 빠른 성능을 보였다. 

  4) 예전에 받은 것을 그대로 사용한다. 만약 최근에 릴리즈 된 툴체인을 사용하려 한다면, 다운로드 URL과
      설치 경로가 지금 기록과 다를 수 있다.
 
3. 환경변수 설정 및 컴파일 테스트
  1) 툴체인의 설치 경로는 /opt/codesourcery/ 밑으로 된다.
  2) 환경변수 PATH에 컴파일러 및 실행 가능한 파일의 경로 /opt/codesourcery/bin 를 추가한다.
  3) 툴체인을 검증하기 위해서 테스트로 컴파일 해 본다.

$ export PATH=$PATH:/opt/codesourcery/bin
$ arm-none-linux-gnueabi-gcc -o test test.c
$

  4) 로그인시 자동 설정되도록 ~/.bash_profile 수정

$ vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/sbin:/opt/codesourcery/bin
export PATH


4. 커널 컴파일

$ cd /KERNEL_ROOT/
$ export ARCH=arm
$ export CROSS_COMPILE=/opt/codesourcery/bin/arm-linux-
$ make distclean
$ make exynos4_defconfig
$ make V=1 > make.out 2>&1
$
  1) 환경변수 ARCH, CROSS_COMPILE를 설정 하는 이유는 별도의 Makefile 수정 없이
      해당 ARCH와 툴체인으로 컴파일 하기 위해서다. 
  2) 커널 설정은 exynos4_defconfig ( arch/arm/configs/exynos4_defconfig ) 를 기본으로
      특별한 변경없이 사용한다.
  3) make 의 V=1 옵션은 컴파일 내용을 자세히 출력하고, make.out 으로 리다이렉션 하는 것은
     혹, 나중에 컴파일 과정이 궁금해 질 수 있기 때문이다.
 
5. ctags, cscope 생성

$ export ARCH=arm
$ export CROSS_COMPILE=/opt/codesourcery/bin/arm-linux-
$ rm -f tags cscope.*
$ make tags
$ make cscope

  1) make 에 의한 ctags, cscope의 생성은 검색 되는 코드의 ARCH 가 arm에 존속되도록 한다.
 
6. 어셈블리 코드 생성
  1) 커널의 어셈블리 코드 생성

$ arm-linux-objdump -d vmlinux > vmlinux.objdump


  2) 압축된 커널의 어셈블리 코드 생성

$ cd arch/arm/boot/compressed/
$ arm-linux-objdump -d vmlinux > vmlinux.objdump
  3) 어셈블리 코드를 생성 해 두는 이유는 소스 분석 중에 복잡한 전처리 과정,
      코드의 살리고, 버리는 부분이 모호 할때, 상수 값이 모호 할때 참조 하면 유용하다.
 
Posted by blee
,

IAMROOT.ORG에서 세미나를 한 문서

2010년 11월 20일, 서울대학교에서 함. 끝나고, 동호회 사람들이랑 찐하게 뒷풀이.. 


Posted by blee
,
항상 HW 코덱을 사용하다가, SW 코덱을 사용해야 하는 경우가 발생했다. 그래서 ffmpeg를 선택하게 되었는데, 최종 목적은 안드로이드 앱에서 사용 할 목적이다. 

막상 NDK 용으로 빌드를 했지만, 도대체 어떻게 돌아 가는 것인지 복잡한 코드를 분석하는 것은 쉽지 않았다. 그래서 고민 끝에 MSVC++ 에서 디버깅 및 트레이스를 해 보기로 했다. 다행히 인터넷에서는 ffmpeg를 원도우 환경으로 컴파일 하는 문서가 많았다. 하지만, ffplay를 MSVC++ 에서 컴파일 한 경우는 없는 듯하였다. 

이를 정리 하면, 나와 같은 고민에 빠진 사람들에게 도움이 될 것이다.

1.    다운로드 MinGW

http://sourceforge.net/projects/mingw/files/

mingw-get-inst-20101030.exe (796.0 KB)

 

2.    MinGW 설치

인스톨 옵션 : 풀 인스톨

설치 경로 : C:\MinGW

 

3.    다운로드 ffmpeg

http://www.ffmpeg.org/download.html#release

ffmpeg-0.6.1.tar.bz2

ffmpeg 작업 디렉토리에 압축해제

– MinGW Shell의 홈 디렉토리에 풀었다.

 

C:\MinGW\msys\1.0\home\MYHOME

C:\MinGW\msys\1.0\home\MYHOME\ffmpeg-0.6.1\ffmpeg-0.6.1

 

4.    MinGW Shell 실행, ffmpeg 컴파일

$ ./configure --enable-memalign-hack --enable-shared --enable-swscale

--enable-postproc --enable-gpl --enable-avfilter --enable-avfilter-lavf


$make

$install

 


5.    헤더파일 설치 경로

 

6.    inttypes.h, stdint.h 다운로드 및 복사

헤더파일 경로에 같이 위치 시킨다.

 

7.    라이브러리 설치 경로


8.    SDL 다운로드

http://www.libsdl.org/download-1.2.php

Development Libraries:

Win32: 
SDL-devel-1.2.14-VC6.zip (Visual C++ 6.0)

 

9.    압축 해제 및 복사


라이브러리는 ffmpeg 라이브러리와 동일한 위치에 복사

 


헤더 파일은 ffmpeg 헤더파일과 동일한 위치에 복사

 

10. MSVC 6.0 프로젝트 생성


Win32 Console Application 선택 및 Project name , Location 를 입력한다.

Location ffmpeg 디렉토리로 하였다.

11. Cpp 파일을 c 파일로 수정 ( Blee2.cpp -> blee2.c )


 

프로젝터 파일에 ffplay.c, cmdutils.c 포함한다.

 

12. 설정

Project settings -> C/C++, Precompiled Headers -> Not using precompiled headers


Project Settings -> Link  라이브러리 추가


avcodec-52.lib avdevice-52.lib avformat-52.lib avutil-50.lib

swscale-0.lib postproc-51.lib avfilter-1.lib SDL.lib

 

11. 헤더파일과 라이브러리 경로 추가

Tools -> Options -> Directories


Include files 추가

C:\MINGW\MSYS\1.0\LOCAL\INCLUDE

C:\MINGW\MSYS\1.0\INCLUDE

 


C:\MINGW\MSYS\1.0\LOCAL\BIN

 

13. 소스 수정

//-----------------------------------------------

// ffplay.c

//-----------------------------------------------

#include <windows.h>

void usleep(unsigned long usec)

{

     Sleep(usec/1000);

}

 

#define rint(x) (floor((x)+0.5))

 

//    DECLARE_ALIGNED(16,uint8_t,audio_buf1)[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

//    DECLARE_ALIGNED(16,uint8_t,audio_buf2)[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

    uint8_t audio_buf1[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

    uint8_t audio_buf2[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];

 

//static int wanted_stream[AVMEDIA_TYPE_NB]={

//    [AVMEDIA_TYPE_AUDIO]=-1,

//    [AVMEDIA_TYPE_VIDEO]=-1,

//    [AVMEDIA_TYPE_SUBTITLE]=-1,

//};

static int wanted_stream[AVMEDIA_TYPE_NB]={

     0,

    -1,

    -1,

     0,

    -1

};

 

//    ap->time_base= (AVRational){1, 25};

     ap->time_base.num = 1;

     ap->time_base.den = 25;

 

//uint64_t size=  url_fsize(cur_stream->ic->pb);

int64_t size=  url_fsize(cur_stream->ic->pb);

 

//            FFTSample data[2][2*nb_freq];

                FFTSample data[2][4096];

 

int main(int argc, char **argv) -> int ff_main(int argc, char **argv)

 

//#if !defined(__MINGW32__) && !defined(__APPLE__)

//    flags |= SDL_INIT_EVENTTHREAD; /* Not supported on Windows or Mac OS X */

//#endif

 

//-----------------------------------------------

// libavutil\common.h

//-----------------------------------------------

#define inline __inline

 

14.   라이브러리 복사


 

15. 빌드 및 실행 화면


 


 

16. 기타

정리하지 못한 문제도 있을 것임.


다음은 투토리얼을 따라 해 보고, 정리 되면, 문서를 만들어 볼 계획이다.

Posted by blee
,