av_read_frame 主要执行函数

1. av_read_frame

2. -> read_frame_internal

3. -> ff_read_packet

4. -> (s->iformat->read_packet) ,相当于调用flv_read_packet,AVInputFormat,这一步完成了AVFormatContext到AVIOContext格式
5. -> av_get_packet ,(AVIOContext *s, AVPacket *pkt, int size)

6. -> append_packet_chunked

7. -> avio_read

其中,第4步中,(s->iformat->read_packet)是对应的demuxer,比如对于mp4文件用的是mov_read_packet. demuxer会解析出下一帧需要多少byte, av_get_packet负责把需要的数据读出来,放到AVPacket中.

第7步,avio_read中,在libavformat/aviobuf.c中

  1. 如果AVIOContext中的数据够,AVPacket从AVIOContext中拷贝数据
    1、read_packet_wrapper
    2、 →read_packet ,(void *opaque, uint8_t *buf, int buf_size)
    3、 →memcpy ,memcpy指的是c和c++使用的内存拷贝函数,(void *dest, const void *src, size_t n)memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

  2. 如果不够,则调用fill_buffer把buffer填满
    1、read_packet_wrapper
    2、→ len = s->read_packet(s->opaque, buf, size);
    http://blog.csdn.net/xiruanliuwei/article/details/27376697,这一步完成了AVIOContext到URLContext的格式转化。每一次格式转换都会经历一次方法的muxer或demuxer。

实际会调用ffurl_read函数
3、retry_transfer_wrapper
4、rtmp_read或http_read 或file_read

1、http://blog.csdn.net/tomorrow_opal/article/details/54670153

2、https://my.oschina.net/u/2326611/blog/800675

你可能感兴趣的:(av_read_frame 主要执行函数)