ffmpeg 분석 시리즈 중 하나(이 등록)
)
안녕하세요,저 는 내장 형 소프트웨어 엔지니어 입 니 다.현재 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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.