ffmpeg 분석 시리즈 중 하나(이 등록)

(원본 출처 를 모 르 겠 습 니 다.http://hi.baidu.com/monkeyifox
)
안녕하세요,저 는 내장 형 소프트웨어 엔지니어 입 니 다.현재 ffmpeg 을 사용 하여 내장 형 멀티미디어 재생 기 를 개발 하고 있 습 니 다.시리즈 박문 은 본인 이 ffmpeg 소스 코드 를 읽 을 때 한 노트 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.분석 과정 은 아래 의 규칙 과 결합 합 니 다.     http://dranger.com/ffmpeg/tutorial05.c
 1.av 호출register_all 함수 가 모든 형식 과 인 코딩 디코더 를 등록 합 니 다.1.1 avcodecregister_all 함수 가 모든 인 코딩 디코더 를 등록 합 니 다.1.H264 와 관련 된 등록 목록 을 보 여 줍 니 다.   //
     REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);
     REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);

    //
     REGISTER_DECODER (H264, h264);
     REGISTER_DECODER (H264_VDPAU, h264_vdpau);

    //
     REGISTER_ENCODER (LIBX264, libx264);

    //
     REGISTER_PARSER (H264, h264);

    //
     REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);

2.등록 매크로 목록:#define REGISTER_HWACCEL(X,x) { \
          extern AVHWAccel x##_hwaccel; \
          if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&x##_hwaccel); }

#define REGISTER_ENCODER(X,x) { \
          extern AVCodec x##_encoder; \
          if(CONFIG_##X##_ENCODER) avcodec_register(&x##_encoder); }

#define REGISTER_DECODER(X,x) { \
          extern AVCodec x##_decoder; \
          if(CONFIG_##X##_DECODER) avcodec_register(&x##_decoder); }

#define REGISTER_ENCDEC(X,x) REGISTER_ENCODER(X,x); REGISTER_DECODER(X,x)

#define REGISTER_PARSER(X,x) { \
          extern AVCodecParser x##_parser; \
          if(CONFIG_##X##_PARSER) av_register_codec_parser(&x##_parser); }

#define REGISTER_BSF(X,x) { \
          extern AVBitStreamFilter x##_bsf; \
          if(CONFIG_##X##_BSF) av_register_bitstream_filter(&x##_bsf); }

3.등록 함 수 를 분석 하여 avcodecregister 함 수 를 예 로 들 면:void avcodec_register(AVCodec *codec)
{
     AVCodec **p;
     avcodec_init();
     p = &first_avcodec;
    while (*p != NULL) p = &(*p)->next;
    *p = codec;
     codec->next = NULL;
}

   avcodecregister 함수 가 입력 한 AVCodec 를 하나의 링크 로 연결 하면 다른 등록 함수 와 유사 하 므 로 더 이상 말 하지 않 습 니 다.
4.위 에 avcodec 호출 됨init 함수:void avcodec_init(void)
{
    static int initialized = 0;

     if (initialized != 0)
        return;
     initialized = 1;

     dsputil_static_init ();
}

   이 함 수 는 한 번 만 실 행 됩 니 다.5.위 에 dsputil 을 호출 했 습 니 다.static_init 함수:av_cold void dsputil_static_init(void)
{
    int i;

     for(i=0;i<256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i;
    for(i=0;i<MAX_NEG_CROP;i++) {
         ff_cropTbl[i] = 0;
         ff_cropTbl[i + MAX_NEG_CROP + 256] = 255;
    }

     for(i=0;i<512;i++) {
         ff_squareTbl[i] = (i - 256) * (i - 256);
    }

     for(i=0; i<64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;
}

      정적 데 이 터 를 초기 화 했 습 니 다.1.2 모든 형식 과 외부 라 이브 러 리 및 프로 토 콜 을 등록 합 니 다.
1.H264 와 관련 된 등록 목록:   //
     REGISTER_MUXDEMUX (H264, h264);

    //
     REGISTER_PROTOCOL (FILE, file);

2.등록 매크로 목록:#define REGISTER_MUXER(X,x) { \
    extern AVOutputFormat x##_muxer; \
    if(CONFIG_##X##_MUXER) av_register_output_format(&x##_muxer); }

#define REGISTER_DEMUXER(X,x) { \
    extern AVInputFormat x##_demuxer; \
    if(CONFIG_##X##_DEMUXER) av_register_input_format(&x##_demuxer); }

#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)

#define REGISTER_PROTOCOL(X,x) { \
    extern URLProtocol x##_protocol; \
    if(CONFIG_##X##_PROTOCOL) av_register_protocol(&x##_protocol); }

   이 등록 함수 와 avcodecregister 함수 가 유사 하면 더 이상 말 하지 않 겠 습 니 다.@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

좋은 웹페이지 즐겨찾기