从现有的
Packet
拷贝一个新
Packet
的时候,有两种情况:
•
①两个
Packet
的
buf
引用的是
同一数据缓存空间
,这时 候要注意数据缓存空间的释放问题;
•
②两个
Packet
的
buf
引用不同的数据缓存空间
,每个 Packet都有数据缓存空间的
copy
;
FFmpeg 是通过数据共享的形式 拷贝数据的,也就是通过浅拷贝完成数据的copy,
那么浅拷贝是有问题的,FFmpeg是如何解决这一问题的呢?
通过引用计数的方式来fix这个问题
更加精确的说明:
对于多个
AVPacket
共享同一个缓存空间,
FFmpeg
使用的
引 用计数的机制(reference-count
)
:
◼
初始化引用
计数为
0
,只有真正分配
AVBuffer
的时候, 引用计数初始化为1
;
◼
当有新的
Packet
引用共享的缓存空间时,
就将引用计数 +1;
◼
当释放了引用共享空间的
Packet
,就将引用计数
-1
;引 用计数为0
时,就释放掉引用的缓存空间
AVBuffer
。
◼
AVFrame
也是采用同样的机制。