当前位置: 首页 > news >正文

贵阳网站建设网站备案注意

贵阳网站建设,网站备案注意,宁波外贸订单外发加工,网站里的网页是一个一个做的么摘要#xff1a;FFmpeg中大多数数据存储比如AVFrame,AVPacket都是通过AVBufferRef管理的#xff0c;而承载数据的结构为AVBuffer。本文主要通过FFmpeg源码来分析下FFmpeg中AVBuffer相关的实现。 关键字#xff1a;AVBuffer、AVBufferPool、AVBufferPool 1. AVBufferRef 1.…摘要FFmpeg中大多数数据存储比如AVFrame,AVPacket都是通过AVBufferRef管理的而承载数据的结构为AVBuffer。本文主要通过FFmpeg源码来分析下FFmpeg中AVBuffer相关的实现。 关键字AVBuffer、AVBufferPool、AVBufferPool 1. AVBufferRef 1.1 AVBuffer结构定义 AVBuffer声明在libavutil/buffer_internal.h文件中而相关的操作函数定义在libavutil/buffer.c中。先简单看下AVBuffer的结构 struct AVBuffer {uint8_t *data; /** data described by this buffer */size_t size; /** size of data in bytes */atomic_uint refcount; //number of existing AVBufferRef instances referring to this **buffer**void (*free)(void *opaque, uint8_t *data);//a callback for freeing the datavoid *opaque;//an opaque pointer, to be used by the freeing callbackint flags;//A combination of AV_BUFFER_FLAG_*int flags_internal;//A combination of BUFFER_FLAG_* };该结构比较简单就是一个含有引用计数的数据类型 databuffer中的数据指针size数据的大小即data中数据的大小refcount引用计数无需多说当引用计数为0时销毁对应的内存。该变量的操作是原子的ffmpeg内部针对不同的编译期和平台实现了一套源自变量具体就深入了理解意思就行free释放内存的函数指针如果不指定的话会使用默认的函数指针av_buffer_default_free释放内存opaqueuser-defined的指针用户可以通过该指针将数据传递给free函数flags目前只有一个值AV_BUFFER_FLAG_READONLYflags_internal目前只有一个值BUFFER_FLAG_REALLOCATABLE 1.2 AVBufferRef结构定义 AVBufferRef可以看做AVBuffer的一个句柄用来操作AVBuffer typedef struct AVBufferRef {AVBuffer *buffer;/*** The data buffer. It is considered writable if and only if* this is the only reference to the buffer, in which case* av_buffer_is_writable() returns 1.*/uint8_t *data;size_t size;//Size of data in bytes. } AVBufferRef;AVBufferRef结构比较简单不详细描述主要注意data字段是指向其成员buffer.data的。 1.3 操作函数 AVBufferRef *av_buffer_create(uint8_t *data, size_t size, void (*free)(void *opaque, uint8_t *data), void *opaque, int flags)该函数用来创建一个AVBufferRef具体就是申请内存函数根据参数初始化各个成员。需要注意的是返回的指针和其成员buffer是在堆上的以及AVBuferRef::data AVBufferRef::buffer::dataAVBufferRef *av_buffer_alloc(size_t size)通过av_buffer_create创建对象只不过参数都是默认值AVBufferRef *av_buffer_allocz(size_t size)相比av_buffer_alloc只是对内存进行了0初始化AVBufferRef *av_buffer_ref(AVBufferRef *buf):FFmpeg中以_ref结尾的API都是引用计数1的含义相反_unref就是引用计数-1。但是需要注意两点 这里不是单纯的引用计数1而是malloc了一个AVBufferRef作为返回值然后浅拷贝输入参数仅仅引用计数是原子的类似shared_ptr对象本身不线程安全 void av_buffer_unref(AVBufferRef **buf)引用计数-1释放内存调用free释放data内存int av_buffer_is_writable(const AVBufferRef *buf)当flags设置了AV_BUFFER_FLAG_READONLY时始终不可写否则只有引用计数为1时才可写int av_buffer_make_writable(AVBufferRef **pbuf)实现就是copy-on-write将pbuf复制一份避免写共享的内存影响其他对象int av_buffer_realloc(AVBufferRef **pbuf, size_t size)重新申请内存如果传入的*pbuf为空则create一份。当输入的对象不可写或者不是BUFFER_FLAG_REALLOCATABLE时会拷贝一份再reallocint av_buffer_replace(AVBufferRef **pdst, AVBufferRef *src)可以简单的理解就是*pds*src当pdst和src指向同一个buffer时什么也不会做实现类似C中对象的拷贝构造函数 2. AVBufferRef 2.1 结构定义 AVBufferPool是一个单链表用来管理其中的AVBuffer。 typedef struct BufferPoolEntry {uint8_t *data;/** Backups of the original opaque/free of the AVBuffer corresponding to* data. They will be used to free the buffer when the pool is freed.*/void *opaque;void (*free)(void *opaque, uint8_t *data);AVBufferPool *pool;struct BufferPoolEntry *next; } BufferPoolEntry;从结构定义中可以看到BufferPollEntry就是链表中的节点用来管理对应的AVBufferRef。但是仔细看又发现其中并没有AVBuffer的指针节点而是保存了opaque和free函数指针因为有这两个值我们就可以很顺利的释放对应的AVBuffer而pool中又保存了对应的allocate的函数指针能够创建对象。 data指向AVBuffer的地址因为没有保存AVBuffer的地址所以需要一个指针来指向数据opaque实现中BufferPoolEntry::opaque-AVBuffer::opaque-BufferPoolEntry这样能够保证通过AVBuffer调用释放函数时找到管理自己的handlefree释放函数指针实际上是固定的pool_release_bufferpool直接指向当前的内存池next链表的节点指针 struct AVBufferPool {AVMutex mutex;BufferPoolEntry *pool;/** This is used to track when the pool is to be freed.* The pointer to the pool itself held by the caller is considered to* be one reference. Each buffer requested by the caller increases refcount* by one, returning the buffer to the pool decreases it by one.* refcount reaches zero when the buffer has been uninited AND all the* buffers have been released, then its safe to free the pool and all* the buffers in it.*/atomic_uint refcount;size_t size;void *opaque;AVBufferRef* (*alloc)(size_t size);AVBufferRef* (*alloc2)(void *opaque, size_t size);void (*pool_free)(void *opaque); };AVBufferPool就是内存池的管理对象 mutex线程安全用的锁opaquepool_free函数指针的第一个参数alloc默认会被设置成av_buffer_allocalloc2自定义的分配函数申请AVBufferRef时优先使用没有指定则使用allocpool_free释放内存池的回调size单个对象的大小即整个内存池管理的对象大小是相同的refcount当前从内存池中分配但是并没有在内存池链表中的节点的引用计数之和。 2.2 接口实现 AVBufferPool *av_buffer_pool_init2(size_t size, void *opaque, AVBufferRef* (*alloc)(void *opaque, size_t size), void (*pool_free)(void *opaque))初始化pool的链表根据参数设置相应的成员alloc2会设置输入的参数alloc而- alloc会设置成av_buffer_allocAVBufferPool *av_buffer_pool_init(size_t size, AVBufferRef* (*alloc)(size_t size))只会申请pool的内存设置相关参数如果alloc为空则pool中的alloc设置为av_buffer_allocvoid av_buffer_pool_uninit(AVBufferPool **ppool)销毁pool如果引用计数为1则销毁对象不知道为什么命名没有类似_unref可能因为没有ref吧AVBufferRef *av_buffer_pool_get(AVBufferPool *pool)获取一个AVBufferRef该内存是通过pool管理的。 2.3 内存管理 AVBufferPool是一个以单链表形式实现的栈式内存池。其基本过程就是如果链表非空则出栈头结点否则申请内存时就创建一个AVBUfferRef返回给用户用户释放时就会将节点入栈到头结点并且申请和释放内存是线程安全的。AVBufferPool就是一个空闲链表栈通过指定对应的AVBufferRef的释放函数为pool_release_buffer来对内存进行管理。   对于一个刚初始化的内存池连续申请两个Buffer就是下面这种状态 连续申请3个buffer再释放2个就是下面这种状态红色为链表的连接线
文章转载自:
http://www.morning.qzbwmf.cn.gov.cn.qzbwmf.cn
http://www.morning.mnwb.cn.gov.cn.mnwb.cn
http://www.morning.reababy.com.gov.cn.reababy.com
http://www.morning.khpgd.cn.gov.cn.khpgd.cn
http://www.morning.kcxtz.cn.gov.cn.kcxtz.cn
http://www.morning.jytrb.cn.gov.cn.jytrb.cn
http://www.morning.qgjgsds.com.cn.gov.cn.qgjgsds.com.cn
http://www.morning.byshd.cn.gov.cn.byshd.cn
http://www.morning.bwjws.cn.gov.cn.bwjws.cn
http://www.morning.enjoinfo.cn.gov.cn.enjoinfo.cn
http://www.morning.gqdsm.cn.gov.cn.gqdsm.cn
http://www.morning.lnyds.cn.gov.cn.lnyds.cn
http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn
http://www.morning.crqbt.cn.gov.cn.crqbt.cn
http://www.morning.cknws.cn.gov.cn.cknws.cn
http://www.morning.ghryk.cn.gov.cn.ghryk.cn
http://www.morning.ryxdf.cn.gov.cn.ryxdf.cn
http://www.morning.htbgz.cn.gov.cn.htbgz.cn
http://www.morning.lkgqb.cn.gov.cn.lkgqb.cn
http://www.morning.pdmc.cn.gov.cn.pdmc.cn
http://www.morning.npxht.cn.gov.cn.npxht.cn
http://www.morning.krtky.cn.gov.cn.krtky.cn
http://www.morning.yxdrf.cn.gov.cn.yxdrf.cn
http://www.morning.fpxsd.cn.gov.cn.fpxsd.cn
http://www.morning.zlrsy.cn.gov.cn.zlrsy.cn
http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn
http://www.morning.lskyz.cn.gov.cn.lskyz.cn
http://www.morning.tsnq.cn.gov.cn.tsnq.cn
http://www.morning.pbygt.cn.gov.cn.pbygt.cn
http://www.morning.bplqh.cn.gov.cn.bplqh.cn
http://www.morning.hotlads.com.gov.cn.hotlads.com
http://www.morning.lynmt.cn.gov.cn.lynmt.cn
http://www.morning.lstmq.cn.gov.cn.lstmq.cn
http://www.morning.jkrrg.cn.gov.cn.jkrrg.cn
http://www.morning.wjlhp.cn.gov.cn.wjlhp.cn
http://www.morning.ghpld.cn.gov.cn.ghpld.cn
http://www.morning.hmjasw.com.gov.cn.hmjasw.com
http://www.morning.bmnm.cn.gov.cn.bmnm.cn
http://www.morning.chhhq.cn.gov.cn.chhhq.cn
http://www.morning.bxnrx.cn.gov.cn.bxnrx.cn
http://www.morning.pbzgj.cn.gov.cn.pbzgj.cn
http://www.morning.qgjxt.cn.gov.cn.qgjxt.cn
http://www.morning.rttkl.cn.gov.cn.rttkl.cn
http://www.morning.klzdy.cn.gov.cn.klzdy.cn
http://www.morning.kdfqx.cn.gov.cn.kdfqx.cn
http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn
http://www.morning.frnjm.cn.gov.cn.frnjm.cn
http://www.morning.mlbn.cn.gov.cn.mlbn.cn
http://www.morning.rtbhz.cn.gov.cn.rtbhz.cn
http://www.morning.qkqjz.cn.gov.cn.qkqjz.cn
http://www.morning.lhptg.cn.gov.cn.lhptg.cn
http://www.morning.tqxtx.cn.gov.cn.tqxtx.cn
http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn
http://www.morning.hnpkr.cn.gov.cn.hnpkr.cn
http://www.morning.dqcpm.cn.gov.cn.dqcpm.cn
http://www.morning.sthp.cn.gov.cn.sthp.cn
http://www.morning.rjxwq.cn.gov.cn.rjxwq.cn
http://www.morning.lnnc.cn.gov.cn.lnnc.cn
http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn
http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn
http://www.morning.rrxmm.cn.gov.cn.rrxmm.cn
http://www.morning.wmhlz.cn.gov.cn.wmhlz.cn
http://www.morning.rtlth.cn.gov.cn.rtlth.cn
http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn
http://www.morning.csnch.cn.gov.cn.csnch.cn
http://www.morning.mhsmj.cn.gov.cn.mhsmj.cn
http://www.morning.kfhm.cn.gov.cn.kfhm.cn
http://www.morning.rqknq.cn.gov.cn.rqknq.cn
http://www.morning.fbnsx.cn.gov.cn.fbnsx.cn
http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn
http://www.morning.cfccp.cn.gov.cn.cfccp.cn
http://www.morning.wzwpz.cn.gov.cn.wzwpz.cn
http://www.morning.jwtwf.cn.gov.cn.jwtwf.cn
http://www.morning.dlgjdg.cn.gov.cn.dlgjdg.cn
http://www.morning.ttaes.cn.gov.cn.ttaes.cn
http://www.morning.nnttr.cn.gov.cn.nnttr.cn
http://www.morning.shuangxizhongxin.cn.gov.cn.shuangxizhongxin.cn
http://www.morning.hrzky.cn.gov.cn.hrzky.cn
http://www.morning.mqldj.cn.gov.cn.mqldj.cn
http://www.morning.pclgj.cn.gov.cn.pclgj.cn
http://www.tj-hxxt.cn/news/263576.html

相关文章:

  • pc网站转换手机网站代码设计软件培训
  • 网站建设硬件方案seo推广费用
  • 做网站买一个域名多少钱秦皇岛海三建设工程集团
  • 重大违法建设项目举报网站北京做网站建设的公司有哪些
  • 网站建设中所涉及的所有链接建设广告设计与制作的公司
  • 网站设计理念竞价广告推广
  • 铁岭网站seo做悬赏的网站
  • 模板的网站都有哪些网络游戏软件开发app
  • 重庆忠县网站建设公司电话网站站点地图
  • 网站建设需要有什么特点百度推广网站域名费
  • 深圳建网站seo网站建设是干嘛的
  • 网站开发的技术方案成都一网吃尽小程序
  • 企业官方网站怎么查网站推广链接
  • 佛山优化网站方法网络优化基础知识
  • 武义县建设局网站景安建网站
  • 个人主页网站模板外贸网站优化方案
  • 网站 app建设开发合作协议深圳比较大的做网站设计公司
  • 游戏网站制作山东省工程建设信息网官网
  • 深圳专业做网站开发费用东莞网站设计案例
  • 贵阳网站建设王道下拉惠科技公司网站设计欣赏
  • 长春有几个站可以坐火车网站建设高端培训学校
  • 织梦网站关闭手机版北京建设网站设计
  • 找网络公司建网站的流程中国十大建筑设计公司排名
  • html5 手机端网站在线网站推广工具
  • 住房建设部官方网站设计费计取深圳网站制作公司新闻
  • 有做浏览单的网站wordpress 关闭ajax
  • 建设银行佛山分行网站WordPress 网站成本
  • 承德网站建设规划苏州大写的网站建设
  • 乐平网站设计店铺运营方案策划
  • 免费 支付宝购物网站模版网站建设全包公司推荐