原创 FFmpeg 新舊版本編碼 API 的區別

前言 FFmpeg 3.x 之前,視頻編碼函數爲 avcodec_encode_video2,3.x 及之後的版本,avcodec_encode_video2 被棄用,取而代之的是 avcodec_send_frame() 和 avc

原创 FFmpeg 源碼分析 - avcodec_send_packet 和 avcodec_receive_frame

使用 從 FFmpeg 3.x 開始,avcodec_decode_video2 就被廢棄了,取而代之的是 avcodec_send_packet 和 avcodec_receive_frame。使用方法很簡單,可以查看 ffmpeg

原创 FFmpeg 是如何實現多態的?

前言 衆所周知,FFmpeg 在解碼的時候,無論輸入文件是 MP4 文件還是 FLV 文件,或者其它文件格式,都能正確解封裝、解碼,而代碼不需要針對不同的格式做出任何改變,這是面向對象中很常見的多態特性,但 FFmpeg 是用 C 語

原创 原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的協變、逆變

相信大多學習過 Java 的都對 extends 和 super 產生過疑惑,特別是坑爹的 PECS 原則,又是英文縮寫,又是消費者生產者的,如此抽象的結論,是正常人應該記的嗎? 吐槽完畢,迴歸正題,網上有許多文章對 extends

原创 深入理解 Java 虛擬機(十二)Java 內存模型與線程

概述 多任務處理是現在計算機操作系統必備的功能,在許多情況下,讓計算機同時做幾件事,不僅是因爲計算機的運算能力強大了,更重要的是計算機的運算速度與它的存儲和通信子系統速度的差距太大,大量的時間都花費在磁盤 I/O、網絡通信或者數據庫訪

原创 深入理解 Java 虛擬機(十三)線程安全與鎖優化

線程安全 Java 語言中的線程安全 根據線程安全的強度排序,Java 語言中各種操作共享的數據可以分爲 5 類:不可變、絕對線程安全、相對線程安全、線程兼容、線程對立。 不可變 不可變的對象一定是線程安全的,如果共享數據是一個基本數

原创 Android 虛擬機簡單介紹——ART、Dalvik、啓動流程分析

Android 虛擬機方面的知識,我是通過《深入理解 Android 內核設計思想》來學習的,內容特別多(只有一章,但有 160 頁),感覺和 Android 開發有些偏,因此很多內容都沒有認真去看,比如 EFL 格式等,這裏只是選取

原创 深入理解 Java 虛擬機(十一)程序編譯與代碼優化

編譯期優化 Java 語言的編譯期其實是一段不確定的過程,可以是前端編譯器 (Javac) 把 java 文件編譯爲 class 文件的過程,也可能值虛擬機的後端運行期編譯器 (JIT 編譯器,Just In Time Compile

原创 深入理解 Java 虛擬機(九)方法調用

方法調用 方法調用不等同於方法執行,方法調用階段唯一任務就是確定被調用方法的版本(即調用哪一個方法),暫時還不涉及方法內部的具體運行過程。一切方法調用在 Class 文件裏面存儲的都只是符號引用,需要在類加載期間,甚至到運行期間才能確

原创 深入理解 Java 虛擬機(八)運行時棧幀結構

虛擬機是一個相對於“物理機”的概念,這兩種機器都有代碼執行能力,區別是物理機的執行引擎是直接建立在處理器、硬件、指令集和操作系統層面上的,而虛擬機的執行引擎則是由自己實現的,因此可以自行制定指令集與執行引擎的結構體系,並且能夠執行不被

原创 深入理解 Java 虛擬機(十)基於棧的字節碼解釋執行引擎

基於棧的字節碼解釋執行引擎 許多 Java 虛擬機的執行引擎在執行 Java 代碼的時候都有解釋執行和編譯執行兩種選擇。 解釋執行 Java 語言經常被人們定位爲“解釋執行”的語言,JDK 1.0 時代,這種定義還是比較準確的,但當主

原创 深入理解 Java 虛擬機(七)類加載器

類加載器 虛擬機設計團隊把類加載階段中的“通過一個類的全限定名來獲取此類的二進制字節流”的動作放到 Java 虛擬機外部實現,以便讓應用程序自己決定如何去獲取所需的類。實現這個動作的模塊稱爲“類加載器”。 類加載器最初是爲了滿足 Ap

原创 深入理解 Java 虛擬機(六)類加載的過程

類加載的過程 加載 在加載階段,虛擬機主要完成 3 件事: 1) 通過一個類的全限定名來獲取此類的二進制字節流 2) 將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構 3) 在內存中生成一個代表這個類的 java.lang

原创 深入理解 Java 虛擬機(五)類加載的時機

概述 虛擬機把描述類的數據從 Class 文件加載到內存,並對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型,這就是虛擬機的類加載機制。 與 C++ 等需要進行鏈接工作的語言不同,在 Java 裏面,類

原创 深入理解 Java 虛擬機(三)垃圾收集器與內存分配策略

垃圾收集器 這裏基於 JDK 1.7 Update 14 之後的 HotSpot 虛擬機進行討論,這個虛擬機包含的所有收集器如圖所示: 連線代表兩個收集器可以配合使用 Serial 收集器 Serial 是最基本、歷史最悠久的收集器