FFmpeg 소스 코드 간단한 분석:libavdevice의 avdeviceregister_all()

5009 단어 FFMPEGFFmpeg
=====================================================
FFmpeg의 라이브러리 함수 소스 코드 분석 문서 목록:
【구조도】
FFmpeg 소스 코드 구성도 - 디코딩
FFmpeg 소스 코드 구성도 - 인코딩
【통용】
FFmpeg 소스 코드 단순 분석:avregister_all()
FFmpeg 소스 코드 단순 분석:avcodecregister_all()
FFmpeg 소스 코드 간단한 분석: 메모리의 분배와 방출(av malloc(), avfree () 등
FFmpeg 소스 코드 간단한 분석: 일반적인 구조체의 초기화와 소각(AVFormatContext, AVFrame 등)
FFmpeg 소스 코드 단순 분석:avioopen2()
FFmpeg 소스 코드 단순 분석:avfind_decoder() 및 avfind_encoder()
FFmpeg 소스 코드 단순 분석:avcodecopen2()
FFmpeg 소스 코드 단순 분석:avcodecclose()[디코딩]
그림 FFMPEG 미디어 열기 함수 avformatopen_input
FFmpeg 소스 코드 단순 분석: avformatopen_input()
FFmpeg 소스 코드 단순 분석: avformatfind_stream_info()
FFmpeg 소스 코드 단순 분석:avread_frame()
FFmpeg 소스 코드 단순 분석:avcodecdecode_video2()
FFmpeg 소스 코드 단순 분석: avformatclose_input()
[인코딩]
FFmpeg 소스 코드 단순 분석: avformatalloc_output_context2()
FFmpeg 소스 코드 단순 분석: avformatwrite_header()
FFmpeg 소스 코드 단순 분석:avcodecencode_video()
FFmpeg 소스 코드 단순 분석:avwrite_frame()
FFmpeg 소스 코드 단순 분석:avwrite_trailer()
【기타】
FFmpeg 소스 코드 단순 분석: 로그 출력 시스템(av log () 등)
FFmpeg 소스 코드 간단한 분석: 구조체 구성원 관리 시스템 - AVclass
FFmpeg 소스 코드 단순 분석: 구조체 구성원 관리 시스템 - AVOption
FFmpeg 소스 코드 간단한 분석:libswscale의 swsgetContext()
FFmpeg 소스 코드 간단한 분석:libswscale의 swsscale()
FFmpeg 소스 코드 간단한 분석:libavdevice의 avdeviceregister_all()
FFmpeg 소스 코드 간단한 분석:libavdevice의 gdigrab
[스크립트]
FFmpeg 소스 코드 단순 분석:makefile
FFmpeg 소스 코드 단순 분석:configure
【H.264】
FFmpeg의 H.264 디코더 소스 코드 간단한 분석: 개요
=====================================================
본고는 FFmpeg에서libavdevice 등록 장치의 함수 avdevice 를 간단하게 기록합니다register_all().avdevice_register_all () 프로그래밍에서 사용되는 예는 다음과 같습니다.
"가장 간단한 FFmpeg 기반 AVDevice 예(카메라 읽기)"
libavdevice를 사용하기 전에 avdevice를 실행해야 합니다.register_all () 장치를 등록합니다. 그렇지 않으면 오류가 발생합니다.avdevice_register_all ()의 등록 방법 및 avregister_all()、avcodec_register_all () 이 몇 개의 함수는 유사하다.참고 자료:
FFmpeg 소스 코드 단순 분석: av register all ()
avdevice_register_all () 코드는 다음과 같습니다.
/*
 *    
 * http://blog.csdn.net/leixiaohua1020
 */

#include "config.h"
#include "avdevice.h"
//    
#define REGISTER_OUTDEV(X, x)                                           \
    {                                                                   \
        extern AVOutputFormat ff_##x##_muxer;                           \
        if (CONFIG_##X##_OUTDEV)                                        \
            av_register_output_format(&ff_##x##_muxer);                 \
    }
//    
#define REGISTER_INDEV(X, x)                                            \
    {                                                                   \
        extern AVInputFormat ff_##x##_demuxer;                          \
        if (CONFIG_##X##_INDEV)                                         \
            av_register_input_format(&ff_##x##_demuxer);                \
    }
//      
#define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x)

void avdevice_register_all(void)
{
    static int initialized;

    if (initialized)
        return;
    initialized = 1;

    /* devices */
    REGISTER_INOUTDEV(ALSA,             alsa);
    REGISTER_INDEV   (AVFOUNDATION,     avfoundation);
    REGISTER_INDEV   (BKTR,             bktr);
    REGISTER_OUTDEV  (CACA,             caca);
    REGISTER_OUTDEV  (DECKLINK,         decklink);
    REGISTER_INDEV   (DSHOW,            dshow);
    REGISTER_INDEV   (DV1394,           dv1394);
    REGISTER_INOUTDEV(FBDEV,            fbdev);
    REGISTER_INDEV   (GDIGRAB,          gdigrab);
    REGISTER_INDEV   (IEC61883,         iec61883);
    REGISTER_INDEV   (JACK,             jack);
    REGISTER_INDEV   (LAVFI,            lavfi);
    REGISTER_INDEV   (OPENAL,           openal);
    REGISTER_OUTDEV  (OPENGL,           opengl);
    REGISTER_INOUTDEV(OSS,              oss);
    REGISTER_INOUTDEV(PULSE,            pulse);
    REGISTER_INDEV   (QTKIT,            qtkit);
    REGISTER_OUTDEV  (SDL,              sdl);
    REGISTER_INOUTDEV(SNDIO,            sndio);
    REGISTER_INOUTDEV(V4L2,             v4l2);
//    REGISTER_INDEV   (V4L,              v4l
    REGISTER_INDEV   (VFWCAP,           vfwcap);
    REGISTER_INDEV   (X11GRAB,          x11grab);
    REGISTER_OUTDEV  (XV,               xv);

    /* external libraries */
    REGISTER_INDEV   (LIBCDIO,          libcdio);
    REGISTER_INDEV   (LIBDC1394,        libdc1394);
}

코드에서 보듯이 avdeviceregister_all () 장치 등록을 위해 3개의 함수를 호출합니다: REGISTERINDEV(),REGISTER_OUTDEV(),REGISTER_INOUTDEV().이러한 3개의 함수는 실제로 미리 정의된 3개의 매크로입니다.
REGISTER_INDEV(): 입력 장치를 등록합니다.실제로 av 를 호출했습니다register_input_format () 는 입력 장치를 AVInputFormat로 등록합니다.
REGISTER_OUTDEV(): 출력 장치를 등록합니다.실제로 av 를 호출했습니다register_output_format () 는 출력 장치를 AVOutputFormat로 등록합니다.
REGISTER_INOUTDEV(): 입력 및 출력 장치를 등록합니다.이러한 두 매크로 정의는 실제로 결합됩니다.
뇌소희[email protected]://blog.csdn.net/leixiaohua1020

좋은 웹페이지 즐겨찾기