OBS关于媒体源的处理在obs-ffmpeg模块中;
在ffmpeg_source_start中,初始化解复用器,在解复用器中调用ff_demuxer_set_callbacks设置音频及视频包读取后的回调为video_frame和audio_frame;
然后调用ff_demuxer_open,在这里创建demux_thread解复用,该线程中调用av_read_frame读取帧,并使用ff_decoder_accept将音视频帧放入对应的音频或者视频解码器的队列中;
在ff_decoder_init中,创建定时器ff_timer_init,该定时器使用线程来实现,线程函数为timer_thread,最后调用timer->callback(timer->opaque);来具体处理定时器的具体处理过程;
目前看到,该定时器回调被设置到ff_decoder_refresh这个函数中,调用ff_circular_queue_peek_read读取解码队列中的一个包,然后又很多同步的操作,同步过后,调用ff_callbacks_frame,里面调用decoder->callbacks->frame,也就是之前通过ff_demuxer_set_callbacks注册的video_frame或者audio_frame处理;
在obs-ffmpeg-source.c中定义了video_frame:其中一般调用video_frame_scale对视频包进行转换,转换出的视频格式是RGBA格式的,然后也是调用obs_source_output_video将包丢到source的async_frames队列中,下面的处理就交由obs_video_thread处理了;obs_video_thread在(四)中有比较详细的描述。
audio_frame 处理中,对采集到的数据进行一些初始化计算及拷贝,然后调用obs_source_output_audio,source_output_audio_data将数据