ffmpeg av_buffer_unref的邏輯實現; av_freep 和 av_freep函數的區別

av_buffer_unref 是 FFmpeg 中用于管理引用計數和內存釋放的核心函數,其內部實現機制如下:

?一、核心流程?

  1. ?引用計數遞減?
    函數首先對?AVBufferRef?的?buffer->refcount?進行原子遞減操作(通過?atomic_fetch_add_explicit?等機制保證線程安全)。

  2. ?引用計數檢查?

    • 若遞減后?refcount > 0:僅釋放當前?AVBufferRef?結構體,保留底層?AVBuffer?和數據內存。
    • 若遞減后?refcount == 0:觸發內存釋放流程(包括?AVBuffer?自身及其數據)。
  3. ?內存釋放邏輯?

    • 調用?buffer->free?回調函數(如默認的?av_buffer_default_free?或用戶自定義的釋放函數),釋放?buffer->data?指向的數據內存。
    • 若?AVBuffer?屬于內存池(AVBufferPool),則通過?buffer_pool_release_buffer?將內存塊返回池中以供復用。
  4. ?資源清理?

    • 置空?AVBufferRef->buffer?指針,避免懸垂引用。
    • 釋放?AVBufferRef?結構體本身的內存。

?二、關鍵設計細節?

  1. ?線程安全?
    引用計數的增減操作通過原子指令實現,確保多線程環境下數據一致性26。

  2. ?內存池優化?
    若?AVBuffer?來自內存池,釋放時不會立即歸還給系統,而是通過鏈表管理復用,減少頻繁內存分配開銷。

  3. ?回調擴展性?
    buffer->free?允許注冊自定義釋放邏輯(如 GPU 內存釋放需調用特定驅動 API),支持異構硬件資源管理。


?三、代碼邏輯簡化示例?

 
void av_buffer_unref(AVBufferRef **ref) {if (!*ref)return;AVBuffer *buf = (*ref)->buffer;// 原子操作減少引用計數int refcount = atomic_fetch_sub_explicit(&buf->refcount, 1, memory_order_acq_rel);if (refcount == 1) { // 引用歸零if (buf->free)   // 調用釋放回調buf->free(buf->opaque, buf->data);if (buf->pool)   // 內存池回收邏輯buffer_pool_release_buffer(buf->pool, buf);av_free(buf);    // 釋放AVBuffer結構體}av_freep(ref);       // 釋放AVBufferRef并置空指針
}

?四、關聯機制?

  1. ?與?av_buffer_ref?的關系?
    av_buffer_ref?增加引用計數并復制?AVBufferRef,而?av_buffer_unref?負責遞減計數和釋放,兩者共同維護引用生命周期。

  2. ?與?AVPacket/AVFrame?的交互?
    當?AVPacket?或?AVFrame?調用?av_packet_unref?或?av_frame_unref?時,內部最終通過?av_buffer_unref?釋放底層數據內存。


通過上述機制,av_buffer_unref?實現了高效且安全的內存管理,成為 FFmpeg 多模塊資源共享和生命周期控制的基礎。

av_freep ?和 av_freep函數的區別

  1. ?av_free(void * p)?

    • ?參數類型?:接受?void *?類型的指針13。
    • ?作用?:僅釋放指針指向的內存塊,?不修改指針本身的值?,釋放后指針仍指向原地址(即懸垂指針)

????????????????

uint8_t *data = av_malloc(100); 
av_free(data); // 釋放內存,但 data 仍指向已釋放的地址

  1. ?av_freep(void ** p)?

    • ?參數類型?:接受?void **?類型的指針地址12。
    • ?作用?:
      1. 釋放指針指向的內存塊;
      2. ?將原指針置為?NULL?,避免懸垂指針問題12。
       
      uint8_t *data = av_malloc(100); 
      av_freep(&data); // 釋放內存,并將 data 置為 NULL

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902419.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902419.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902419.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從 GPS 數據中捕捉城市休閑熱點:空間異質性視角下的新框架

從 GPS 數據中捕捉城市休閑熱點:空間異質性視角下的新框架 原文:Capturing urban recreational hotspots from GPS data: A new framework in the lens of spatial heterogeneity 1. 背景與意義 城市娛樂活動的重要性: 娛樂活動是城市生活…

rk3568main.cc解析

rk3568main.cc解析 前言解析前言 正點原子rk3568學習,rk官方RKNN_MODEL_ZOO文件中 rknn_model_zoo-main/examples/mobilenet/cpp/main.cc 從執行命令:./build-linux.sh -t rk3568 -a aarch64 -d mobilenet 到: cmake ../../examples/mobilenet/cpp \-DTARGET_SOC=rk356x\…

【實驗數據處理matlab程序】程序1:繪制figure文件中曲線的RMS值

立意 在本課題所涉及的實驗中,需要將2個拉線式位移傳感器中的數據收集并處理,在此基礎上求解相應的速度 主要功能 針對一個figure文件中僅包含一個plot,且該plot中包含指定數目的曲線,求這些曲線的RMS值;針對一個fi…

kotlin的kmp編程中遇到Unresolved reference ‘java‘問題

解決辦法 打開 File → Project Structure → Project 確保 Project SDK 是 與你的 jvmToolchain 保持一致 如果沒有,點擊右上角 Add SDK 添加 JDK 路徑 同步Sync 然后就正常了。 package org.example.projectimport androidx.compose.animation.AnimatedVi…

靜電放電測試中垂直和水平耦合板的作用

在靜電放電(ESD,Electrostatic Discharge)測試中,垂直耦合板(Vertical Coupling Plane, VCP)和水平耦合板(Horizontal Coupling Plane, HCP)是模擬設備在實際環境中因靜電放電產生的…

Web開發-JavaEE應用JNDI注入RMI服務LDAP服務DNS服務高版本限制繞過

知識點: 1、安全開發-JavaEE-JNDI注入-LADP&RMI&DNS等 2、安全開發-JavaEE-JNDI注入-項目工具&手工原理等 演示案例-WEB開發-JavaEE-JNDI注入&LDAP&RMI服務&DNS服務&高版本限制繞過 JNDI全稱為 Java Naming and DirectoryInterface&am…

基于Transformer與隨機森林的多變量時間序列預測

哈嘍,我不是小upper,今天和大家聊聊基于Transformer與隨機森林的多變量時間序列預測。 不懂Transformer的小伙伴可以看我上篇文章:一文帶你徹底搞懂!Transformer !!https://blog.csdn.net/qq_70350287/article/detail…

初識網絡原理

文章目錄 1.IP地址2.端口號3.網絡中的五元組4.協議分層5.封裝和分用6.客戶端與服務器 1.IP地址 IP地址 (IP Address): 用于在網絡中唯一標識一臺設備(主機、路由器等)。IP地址分為IPv4和IPv6兩種版本。IPv4是32位地址,通常表示為四個用點分隔…

健康養生之道

健康養生是一種積極的生活態度,是對自己和家人的關愛。從生活的細微之處做起,便能為健康打下堅實的基礎。 在生活習慣方面,要注重細節。保持居住環境的整潔與通風,讓生活空間舒適宜人。勤洗手、勤換洗衣物,養成良好的衛…

幾種電氣絕緣類型

1. 基本絕緣 1.1 絕緣等級 1.2 I類設備 2. 附加絕緣 3. 雙重絕緣 4. 加強絕緣 5. 功能性絕緣 1. 基本絕緣 用于防止觸及帶電部件的初級保護,該防護是由絕緣材料完成的 基本絕緣的目的在于為防電擊提供一個基本的保護,以避免觸電的危險,不過此類絕緣只能保證正常狀態下…

01.瀏覽器自動化webdriver源碼分析之啟動函數

日后,網絡爬蟲也好,數據采集也好,自動化必然是主流。因此,筆者未雨綢繆,在此研究各類自動化源碼,希望能夠趕上時代,做出一套實用的自動化框架。 這里先研究傳統的webdriver中轉來進行瀏覽器自動…

PLOG安裝

Plog可以通過以下命令安裝 cd ~ && git clone https://github.com/SergiusTheBest/plog.gitcd plog && mkdir buildcd build && cmake ..make && sudo make installcd ~ && sudo rm -rf ./plog若無法科學上網,可使用git cl…

Cyber SpaceGuidance網安學習指南見解

免責聲明 如有異議請在評論區友好交流,或者私信 內容純屬個人見解,僅供學習參考 如若從事非法行業請勿食用 如有雷同純屬巧合 版權問題請直接聯系本人進行刪改 前言 提示:這里可以添加本文要記錄的大概內容: 提示:以…

第十五屆藍橋杯 2024 C/C++組 下一次相遇

目錄 題目: 題目描述: 題目鏈接: 思路: 自己的思路詳解: 更好的思路詳解: 代碼: 自己的思路代碼詳解: 更好的思路代碼詳解: 題目: 題目描述&#xf…

Vue3中provide和inject數據修改規則

在 Vue3 中,通過 inject 接收到的數據是否可以直接修改,取決于 provide 提供的值的類型和響應式處理方式: 1. 若提供的是普通值(非響應式數據) javascript 復制 // 父組件 provide(staticValue, 123); 子組件修改行…

今日CSS筆記

原手寫筆記 ------------------------------------------------------------------------------------------------------- css選擇器的種類有很多種。這里只介紹幾種常用的選擇器。 1. 標簽選擇器標簽選擇器是最基本的選擇器,它可以選擇所有的標簽。例如&#xff…

健康生活新指南

在 “朋克養生” 與 “躺平焦慮” 并存的時代,真正的健康生活無需刻意 “內卷”。這幾個簡單又實用的養生妙招,能讓你在忙碌日常中悄悄升級健康狀態,輕松擁抱活力人生。? 一、飲食:吃對食物,給身體 “加 Buff”? 別…

輕量級景好鼠標錄制器

景好鼠標錄制器(詳情請戳 官網)是一款免費無廣的鍵鼠動作錄制/循環回放工具,輕松自動化應對一些重復繁瑣的操作任務,如來回切換窗口、文檔同一相對位置的復制粘貼等場景,兼容Win XP - 11 。畢竟此款本身主打簡約類型&a…

結構體與共用體-------C語言經典題目(3)

結構體 1.如何定義和使用結構體指針? 1.結構體指針的定義 首先需要定義結構體類型,例如表示學生信息的結構體: struct Student {char name[50];int age;float score; };接著,使用struct 關鍵字和指針符號* 聲明結構體指針&#x…

未來教育風向標 | 教育學頂流985高校,華東師范大學《AIGC技術賦能教育數字化轉型的機遇與挑戰》,13所大學deepseek

今天大師兄給大家推薦的是華東師范大學祝智庭教授的《AIGC技術賦能教育數字化轉型的機遇與挑戰》。華東師范大學是一所985學校,在最新的國家學科測評中,軟件工程為A級,教育學為A級。 可以說在AI和教育的結合上是國內top級別的存在。 此講義探…