1.根据打开的流名称,找到相匹配的解码器结构.
从全局的AVInputFormat链表中遍历查找.
RTSP --> rtspdec.c 里面的AVInputFormat定义.
2.调用AVInputFormat结构的接口read_header获取流信息.
AVInputFormat定义了读取,播放,暂停等抽象接口.
在上层调用read_header,会根据解码器结构的类型,回调其read_header的定义。
以RTSP为例,调用的是rtspdec.c里的rtsp_read_header
3.调用ff_rtsp_connect
连接的过程,会对私有数据结构RTSPState进行填充.
这里的私有数据结构设计的很巧妙,不同的协议,处理的方式不太相同。
把这些不同封装在私有结构里,分化到具体协议层里去实现,在上层调用时,不用考虑这些不同。
调用ffurl_open创建协议为TCP的URLContext,主要进行信令协议控制.句柄存储在RTSPState中.
URLProtocol定义了底层读取数据的抽象接口.
创建URLContext句柄
调用ff_rtsp_setup_input_streams发送DESCRIBE,获取SDP包,解析流的个数。
调用ff_rtsp_make_setup_request发送Setup. 设置参数.
调用ffurl_open创建协议为RTP的URLContext,主要进行流控制.句柄存储在RTSPStream中.
ffmpeg把协议封装成IO操作,以供上层调用
上层调用read_packet回调到rtspdec.c中的rtsp_read_packet函数读取包数据.
read_frame_internal调用ff_read_packet读取包数据.