FFmpeg队列之add_to_pktbuf入队函数浅显分析



俺觉得ffmpeg最牛逼的地方就在于只用两个指针来维护一个FIFO的队列就好了。

比如这个入队函数的功能就是入队,功能及其简化,其实也是限制队列大小的,比如说

raw buffer的总共大小(就是pkt的size大小的和),最共最多有raw_packet_buffer_remaining_size的初始值这么大,

当取走一个节点,那么raw_packet_buffer_remaining_size 的当前值会加大pkt.size;

当为raw buffer存入一个新的节点,raw_packet_buffer_remaining_size的当前值就就减小了pkt.size。


入队的时候,会判断队列是否空,当空的时候,会改变对头指针,

不管队列是否空,队尾指针,始终会被改变。

因此,add_to_pktbuf 传入的是对头指针的地址和队尾指针的地址,进行修改。

当然,新加入的pkt在入队后的内存地址会被函数返回。

static AVPacket *add_to_pktbuf(AVPacketList **packet_buffer, AVPacket *pkt,
                               AVPacketList **plast_pktl){

                               printf("### IN add_to_pktbuf  BEGIN \n");
    AVPacketList *pktl = av_mallocz(sizeof(AVPacketList)); //临时创建的一个新结点变量(分配内存)
    if (!pktl)
        return NULL;

    if (*packet_buffer)  //如果队列非空
        (*plast_pktl)->next = pktl; //加入传入的链表的最后一个结点的后面
    else
        *packet_buffer = pktl;  //空队列
    /* add the packet in the buffered packet list */
    *plast_pktl = pktl; //始终指向队列的入队位置的前面(也就是指向最后一个节点,在其next处入队)
    pktl->pkt= *pkt; //pkt存入新结点中

    printf("### IN add_to_pktbuf  END \n");
    return &pktl->pkt; //返回这个新创建的结点的pkt的内存地址。
}


你可能感兴趣的:(FFmpeg/Libav基础库)