zoukankan      html  css  js  c++  java
  • ffmpeg开发 av_init_packet()和av_new_packet()

    说明几点:

    1. AVPacket中的buf, 是AVBufferBuf结构体,这个结构体是个单链表, 只有data和size两个元素, 分别指向的是AVPacket中的data和size

    void av_init_packet(AVPacket *pkt)
    {
        pkt->pts                  = AV_NOPTS_VALUE;
        pkt->dts                  = AV_NOPTS_VALUE;
        pkt->pos                  = -1;
        pkt->duration             = 0;
        pkt->convergence_duration = 0;
        pkt->flags                = 0;
        pkt->stream_index         = 0;
    #if FF_API_DESTRUCT_PACKET
        pkt->destruct             = NULL;
    #endif
        pkt->buf                  = NULL; // 数据域没有, 为空
        pkt->side_data            = NULL;
        pkt->side_data_elems      = 0;
    }
    
    int av_new_packet(AVPacket *pkt, int size)
    {
        AVBufferRef *buf = NULL;
    //判断size是否正确
        if ((unsigned)size >= (unsigned)size + FF_INPUT_BUFFER_PADDING_SIZE)
            return AVERROR(EINVAL);
    //分配size大小
        av_buffer_realloc(&buf, size + FF_INPUT_BUFFER_PADDING_SIZE);
        if (!buf)
            return AVERROR(ENOMEM);
    
        memset(buf->data + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
    
        av_init_packet(pkt);
        pkt->buf      = buf;
        pkt->data     = buf->data; //data域大小
        pkt->size     = size;
    #if FF_API_DESTRUCT_PACKET
        pkt->destruct = dummy_destruct_packet;
    #endif
    
        return 0;
    }
    


    /* Makes duplicates of data, side_data, but does not copy any other fields */
    //只复制数据域
    static int copy_packet_data(AVPacket *pkt, AVPacket *src, int dup)
    {
        pkt->data      = NULL;
        pkt->side_data = NULL;
        if (pkt->buf) {
            AVBufferRef *ref = av_buffer_ref(src->buf);
            if (!ref)
                return AVERROR(ENOMEM);
            pkt->buf  = ref;
            pkt->data = ref->data;
        } else {
            DUP_DATA(pkt->data, src->data, pkt->size, 1, ALLOC_BUF);
        }
    #if FF_API_DESTRUCT_PACKET
        pkt->destruct = dummy_destruct_packet;
    #endif
        if (pkt->side_data_elems && dup)
            pkt->side_data = src->side_data;
        if (pkt->side_data_elems && !dup) {
            return av_copy_packet_side_data(pkt, src);
        }
        return 0;
    
    failed_alloc:
        av_destruct_packet(pkt);
        return AVERROR(ENOMEM);
    }
    
    int av_copy_packet_side_data(AVPacket *pkt, AVPacket *src);
    
    源代码中还有一系列不常用的packet操作


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    C#校验算法列举
    SuperSocket1.6电子书离线版
    C#检测系统是否激活[转自StackOverFlow]
    WSMBT Modbus & WSMBS Modbus 控件及注册机
    AU3获取系统激活信息
    JavaScript跨浏览器事件处理
    OAuth2的学习小结
    R学习日记——分解时间序列(季节性数据)
    R学习日记——分解时间序列(非季节性数据)
    Java内存分配原理
  • 原文地址:https://www.cnblogs.com/vintion/p/4116951.html
Copyright © 2011-2022 走看看