網頁

2016年3月16日 星期三

VLC 追蹤之五 VoutCreate

載入 avcodec, 並登記 pf_vout_format_update
src/input/decoder.c
input_DecoderNew -> decoder_New -> CreateDecoder
    p_dec->pf_vout_format_update = vout_update_format;
input_DecoderNew -> decoder_New -> CreateDecoder -> LoadDecoder
p_dec->p_module = module_need( p_dec, "decoder", "$codec", false );

載入 avcodec 時, 登記 pf_decode_video, get_format
modules/codec/avcodec/avcodec.c
    set_capability( "decoder", 70 )
    set_callbacks( OpenDecoder, CloseDecoder )

OpenDecoder
    ret = InitVideoDec( p_dec, avctx, p_codec );

modules/codec/avcodec/video.c
InitVideoDec
    p_context->get_format = ffmpeg_GetFormat;
    p_dec->pf_decode_video = DecodeVideo;

透過 pf_decode_video 執行 DecodeVideo
src/input/es_out.c
input_DecoderNew -> decoder_New -> vlc_clone(DecoderThread)
src/input/decoder.c
DecoderThread -> DecoderProcess -> DecoderProcessVideo -> DecoderDecodeVideo
    while( (p_pic = p_dec->pf_decode_video( p_dec, pp_block ) ) )

modules/codec/avcodec/video.c
DecodeVideo -> lavc_UpdateVideoFormat
    return decoder_UpdateVideoFormat(dec);

透過 pf_vout_format_update 執行 vout_update_format
include/vlc_codec.h
decoder_UpdateVideoFormat
    return dec->pf_vout_format_update( dec );

src/input/decoder.c
vout_update_format
    p_vout = input_resource_RequestVout( p_owner->p_resource,

src/input/resource.c
input_resource_RequestVout -> RequestVout
    p_vout = vout_Request( p_resource->p_parent, &cfg );

src/video_output/video_output.c
vout_Request -> VoutCreate
    vout->p->spu = spu_Create(vout);

src/video_output/vout_subpictures.c
spu_Create -> sys->text = SpuRenderCreateAndLoadText
    text->p_module = module_need(text, "text renderer", "$text-renderer", false);
在此載入 freetype
spu_Create -> sys->scale = SpuRenderCreateAndLoadScale
    scale->p_module = module_need(scale, "video filter2", NULL, false);
在此載入 swscale
spu_Create -> sys->scale_yuvp = SpuRenderCreateAndLoadScale
    scale->p_module = module_need(scale, "video filter2", NULL, false);
在此載入 yuvp

src/video_output/video_output.c
vout_Request -> VoutCreate -> vout_display_window_New
src/video_output/window.c
vout_display_window_New -> vout_window_New -> vlc_module_load(vout window)
在此載入 qt4

src/video_output/video_output.c
vout_Request -> VoutCreate -> vlc_clone(Thread)
Thread -> ThreadControl -> ThreadStart -> vout_OpenWrapper
src/video_output/vout_wrapper.c
vout_OpenWrapper -> vout_NewDisplay
src/video_output/display.c
vout_NewDisplay -> DisplayNew -> vout_display_New -> module_need(vout display)
在此載入 direct3d9

src/video_output/video_output.c
vout_Request -> VoutCreate -> spu_Attach
src/video_output/vout_subpictures.c
spu_Attach -> spu->p->text = SpuRenderCreateAndLoadText
    text->p_module = module_need(text, "text renderer", "$text-renderer", false);
在此載入 freetype


2016年3月15日 星期二

VLC 追蹤之四 aout stream

src/playlist/engine.c -> playlist_Create -> input_resource_GetAout
src/input/resource.c -> input_resource_GetAout -> aout_New
src/audio_output_output.c -> aout_New -> module_need(audio output)

載入 mmdevice 時登記了 start
modules/audio_output/mmdevice.c
    set_capability("audio output", 150)
    set_callbacks(Open, Close)
static int Open(vlc_object_t *obj)
    aout->start = Start;

src/input/decoder.c
input_DecoderNew -> decoder_New -> CreateDecoder
    p_dec->pf_aout_format_update = aout_update_format;
    p_dec->pf_vout_format_update = vout_update_format;
input_DecoderNew -> decoder_New -> CreateDecoder -> LoadDecoder
    p_dec->p_module = module_need( p_dec, "decoder", "$codec", false );
此時載入了 avcodec, 並登記了 pf_vout_format_update

載入 g711 時登記了 pf_decode_audio
modules/codec/g711.c
    set_capability( "decoder", 100 )
    set_callbacks( DecoderOpen, DecoderClose )
static int DecoderOpen( vlc_object_t *p_this )
    p_dec->pf_decode_audio = DecodeBlock;

透過 pf_decode_audio 執行 DecodeBlock
src/input/es_out.c
input_DecoderNew -> decoder_New -> vlc_clone(DecoderThread)
src/input/decoder.c
DecoderThread -> DecoderProcess -> DecoderProcessAudio -> DecoderDecodeAudio
static void DecoderDecodeAudio( decoder_t *p_dec, block_t *p_block )
    while( (p_aout_buf = p_dec->pf_decode_audio( p_dec, pp_block ) ) )

透過 pf_aout_format_update 執行 aout_update_format
modules/codec/g711.c -> DecodeBlock -> decoder_NewAudioBuffer
include/vlc_codec.h -> decoder_UpdateAudioFormat
    return dec->pf_aout_format_update( dec );

透過 start 執行 Start
src/input/decoder.c -> aout_update_format -> aout_DecNew
src/audio_output/dec.c -> aout_DecNew -> aout_OutputNew
src/audio_output/output.c -> aout_OutputNew
    aout->start (aout, fmt)

最後載入 aout stream
modules/audio_output/mmdevice.c -> Start ->vlc_module_load(aout stream)

順便一提,之後載入 audio volume
src/audio_output/dec.c -> aout_DecNew -> aout_volume_SetFormat
src/audio_output/volume.c -> aout_volume_SetFormat -> module_need(audio volume)

載入 audio filter
src/audio_output/dec.c -> aout_DecNew -> aout_FiltersNew
src/audio_output/filters.c -> aout_FiltersNew -> AppendFilter(audio filter) -> CreateFilter(audio filter) -> module_need(audio filter)


載入 audio converter(audio_format)
src/audio_output/filters.c -> AppendFilter -> aout_FiltersPipelineCreate (Format) -> TryFormat -> FindConvert -> CreateFilter(audio converter) -> module_need(audio converter) -> audio_format

載入 audio converter(trivial)
src/audio_output/filters.c -> aout_FiltersNew -> aout_FiltersPipelineCreate (Remix channels) -> TryFormat -> FindConvert -> CreateFilter(audio converter) -> module_need(audio converter) -> trivial

載入 audio resampler(samplerate)
src/audio_output/filters.c -> aout_FiltersNew -> FindResampler -> CreateFilter(audio resampler) -> module_need(audio resampler) -> samplerate





2016年3月14日 星期一

VLC 追蹤之三 packetizer

設定 p_es_out_display->pf_control = EsOutControl
../src/input/input.c -> Create -> input_EsOutNew
    p_input->p->p_es_out_display = input_EsOutNew( p_input, p_input->p->i_rate );

../src/input/es_out.c
es_out_t *input_EsOutNew( input_thread_t *p_input, int i_rate )
    out->pf_control = EsOutControl;

設定 
    p_es_out->pf_control = Control
    p_es_out->p_out = p_es_out_display
../src/input/input.c -> Init
    p_input->p->p_es_out = input_EsOutTimeshiftNew( p_input, p_input->p->p_es_out_display, p_input->p->i_rate );

../src/input/es_out_timeshift.c
es_out_t *input_EsOutTimeshiftNew( input_thread_t *p_input, es_out_t *p_next_out, int i_rate )
    p_out->pf_control = Control;
    p_out->p_sys      = p_sys;
    p_sys->p_out = p_next_out;

觸發 pf_control, 此時是 es_out_timeshift.c 內的 Control
../src/input/input.c
Init -> InitPrograms -> es_out_SetMode
    es_out_SetMode( p_input->p->p_es_out, i_es_out_mode );
../src/input/es_out.h
static inline void es_out_SetMode( es_out_t *p_out, int i_mode )
{
    int i_ret = es_out_Control( p_out, ES_OUT_SET_MODE, i_mode );
    assert( !i_ret );
}
../include/vlc_es_out.h
es_out_Control -> es_out_vaControl( out, i_query, args );
static inline int es_out_vaControl( es_out_t *out, int i_query, va_list args )
{
    return out->pf_control( out, i_query, args );
}


一樣透過 es_out_Control 觸發 pf_control, 此時是 es_out.c 內的 EsOutControl
../src/input/es_out_timeshift.c
static int Control( es_out_t *p_out, int i_query, va_list args )
    i_ret = ControlLocked( p_out, i_query, args );
static int ControlLocked( es_out_t *p_out, int i_query, va_list args )
    es_out_sys_t *p_sys = p_out->p_sys;
    int rt =  CmdExecuteControl( p_sys->p_out, &cmd );
static int CmdExecuteControl( es_out_t *p_out, ts_cmd_t *p_cmd )
    int rt = es_out_Control( p_out, i_query, p_cmd->u.control.u.i_int );

../src/input/es_out.c
EsOutControl -> EsOutControlLocked -> EsSelect -> EsCreateDecoder -> input_DecoderNew
../src/input/decoder.c
input_DecoderNew -> decoder_New -> CreateDecoder -> LoadDecoder
    p_dec->p_module = module_need( p_dec, "packetizer", "$packetizer", false );

最後帶入 packetizer

2016年3月12日 星期六

惱人的ASUS 小黑點

打開 工作排程器
左邊選擇 工作排程器程式庫/ASUS
在中間找到 ASUS AISuiteIII, 按右鍵選擇停用
即可關閉惱人的 Asus Power Bar

2016年3月10日 星期四

VLC 追蹤之二 modules

src/input/demux.c -> demux_NewAdvanced
            module_need( p_demux, "demux", psz_module, !strcmp( psz_module, p_demux->psz_demux ) );

modules/demux/playlist/playlist.c
    add_submodule ()
        set_description( N_("XSPF playlist import") )
        add_shortcut( "playlist", "xspf-open" )
        set_capability( "demux", 10 )
        set_callbacks( Import_xspf, Close_xspf )

modules/demux/playlist/xspf.c
int Import_xspf(vlc_object_t *p_this)
{
    STANDARD_DEMUX_INIT_MSG("using XSPF playlist reader");
}

modules/demux/playlist/playlist.h
#define STANDARD_DEMUX_INIT_MSG( msg ) do { \
    DEMUX_INIT_COMMON();                    \
    msg_Dbg( p_demux, "%s", msg ); } while(0)

include/vlc_demux.h
#define DEMUX_INIT_COMMON() do {            \
    p_demux->pf_control = Control;          \
    p_demux->pf_demux = Demux;              \
    p_demux->p_sys = calloc( 1, sizeof( demux_sys_t ) ); \
    if( !p_demux->p_sys ) return VLC_ENOMEM;\
    } while(0)
以上定義了 p_demux->pf_demux

之後執行時
src/input/input.c -> input_Read -> MainLoop -> MainLoopDemux -> demux_Demux

include/vlc_demux.h -> demux_Demux
VLC_USED static inline int demux_Demux( demux_t *p_demux )
{
    if( !p_demux->pf_demux )
        return 1;

    return p_demux->pf_demux( p_demux );
}

以下又載入了 xml reader module
modules/demux/playlist/xspf.c -> Demux -> xml_ReaderCreate
src/misc/xml.c -> xml_ReaderCreate -> module_need(xml reader)


2016年3月3日 星期四

系統風扇 機殼風扇 連接主機板

各種風扇接頭
2Pin: GND, 12V
3Pin: GND, 12V, 轉速輸出
4Pin(PWM風扇): GND, 12V, 轉速輸出, 轉速控制(PWM)
 主機板提供4Pin公頭,可以直接連接3Pin DC風扇或4Pin PWM風扇