av_read_frame的过程



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读取包数据.

你可能感兴趣的:(av_read_frame的过程)