2011년 12월 22일 목요일

FFmpeg 가지고 H.263 인코딩하기..

출처 : http://iamlow.tistory.com/entry/FFmpeg-%EA%B0%80%EC%A7%80%EA%B3%A0-H263-%EC%9D%B8%EC%BD%94%EB%94%A9%ED%95%98%EA%B8%B0

이 글도 테스트 과정을 적었다.

0. 환경은 MPEG4 테스트와 동일

1. 설정도 동일하다. 그러나 실행시켜 보면 아래와 같은 메시지가 나타난다.

[h263 @ 0x91a3020] warning, clipping 1 dct coefficients to -127..127

2. 코드 검색

  $ grep -R "dct coefficients to" ../../*
../../libavcodec/mpegvideo_enc.c:        av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);

3. 코드를 보자
  $ vi ../../libavcodec/mpegvideo_enc.c

1461     if(overflow && s->avctx->mb_decision == FF_MB_DECISION_SIMPLE)
1462         av_log(s->avctx, AV_LOG_INFO, "warning, clipping %d dct coefficients to %d..%d\n", overflow, minlevel, maxlevel);

 - ctags를 활용하여 "FF_MB_DECISION_SIMPLE" 추적..

2030     /**     
2031      * macroblock decision mode
2032      * - encoding: Set by user.
2033      * - decoding: unused
2034      */
2035     int mb_decision;
2036 #define FF_MB_DECISION_SIMPLE 0        ///< uses mb_cmp
2037 #define FF_MB_DECISION_BITS   1        ///< chooses the one which needs the fewest bits
2038 #define FF_MB_DECISION_RD     2        ///< rate distortion

  - mb_cmp 라는 주석을 보고 또 추적..  

1836      * macroblock comparison function (not supported yet)
1837      * - encoding: Set by user.
1838      * - decoding: unused
1839      */
1840     int mb_cmp;

  - not supported yet 이란다...
    avctx->mb_decision = FF_MB_DECISION_SIMPLE;
    avctx->mb_cmp = -127 ~ ... 127 설정;

   테스트 결과 not supported yet 이 검증됨...ㅋㅋ

  - FFmpeg 홈페이지에도 아래와 같은 문구가 있음.
`-mbd mode'
macroblock decision
`0'
FF_MB_DECISION_SIMPLE: Use mb_cmp (cannot change it yet in ffmpeg).
`1'
FF_MB_DECISION_BITS: Choose the one which needs the fewest bits.
`2'
FF_MB_DECISION_RD: rate distortion
 
4. MB_DECISION 이 뭔가 인터넷 검색...
   매크로블럭을 결정하는 방법들 이라는데.. 영상처리와 관련된 약간은 난이도가 있는 부분인듯하다..
  FF_MB_DECISION_BITS ==> 잘 모르겠음..
  FF_MB_DECISION_RD ==> 이 녀석이 화질이 가장 좋다고 하나, 처리하는데 시간이 오래 걸린덴다.. (모든 MB를 검색하여 가장 좋은 MB 모드를 설정한다고 한다.) 인터넷에 검색하니 약자로 RDO(Rate-distortion Optimization) 라고 불린다.

 아래처럼 설정하면 경고메시지가 사라지고 정상동작한다.
 avctx->mb_decision = FF_MB_DECISION_BITS; // or FF_MB_DECISION_RD;

이상!!!
그리고 비트레이트가 딱 떨어지게 영상이 인코딩되지는 않는다.
* 참고로.. 영상확인은 VLC 플레이어를 사용하여 정상적으로 인코딩 되었는지 확인했다..

댓글 없음:

댓글 쓰기