x264源代碼分析1。fread()

?

?

?

相關說明:
1. 使用版本: x264-cvs-2004-05-11

2. 這次的分析基本上已經將代碼中最難理解的部分做了闡釋,對代碼的主線也做了剖析,如果這個主線理解了,就容易設置幾個區間,進行分工閱讀,將各個區間擊破了.

3. 需要學習的知識:
a) 編碼器的工作流程.
b) H.264的碼流結構,像x264_sps_t,x264_pps_t等參數的定義基本上都完全符合標準文檔中參數集的定義,抓住主要參數,次要參數也應該有所了解.
c) 數學知識,對dct變換等與數學相關的知識的編程實現要有較好理解.
d) C語言的知識.涉及到c語言的較多不經常用的特性,如函數指針數組,移位運算,結構體的嵌套定義等.
e) 耐心,對h.264的復雜性要有清醒的認識.

1. 進入x264.c中的main函數.

剛開始是讀取默認參數,如果你設置了參數的話會修改param的.

i_ret = Encode( &param, fin, fout );

這條語句使過程進入x264.c中的Encode函數.

2. X.264的encode函數.

A. i_frame_total = 0;

if( !fseek( fyuv, 0, SEEK_END ) )

???? {

??????? int64_t i_size = ftell( fyuv );

??????? fseek( fyuv, 0, SEEK_SET );

??????? i_frame_total = i_size / ( param->i_width * param->i_height * 3 / 2 )

}上面這段計算出輸入文件的總幀數.

B.????? h = x264_encoder_open( param )這個函數是對不正確的參數進行修改,并對各結構體參數和cabac編碼,預測等需要的參數進行初始化.

C.???? pic = x264_picture_new( h );

該函數定義在/CORE/common.c.首先分給能容納sizeof(x264_picture_t)字節數的空間,然后進行初始化.

????? 這里看一下x264_picture_tx264_frame_t的區別.前者是說明一個視頻序列中每幀的特點.后者存放每幀實際的象素值.注意區分.

D.???? for( i_frame = 0, i_file = 0; i_ctrl_c == 0 ; i_frame++ )

??? {

??????? int???????? i_nal;

??????? x264_nal_t *nal;

int ????????i;

/* read a frame */

??????? if( fread( pic->plane[0], 1, param->i_width * param->i_height, fyuv ) <= 0 ||

??????????? fread( pic->plane[1], 1, param->i_width * param->i_height / 4, fyuv ) <= 0 ||

??????????? fread( pic->plane[2], 1, param->i_width * param->i_height / 4, fyuv ) <= 0 )

??????? {

??????????? break;

??????? }

??? //文件位置指示器自己變化了.

??????? if( x264_encoder_encode( h, &nal, &i_nal, pic ) < 0 )

??????? {

??????????? fprintf( stderr, "x264_encoder_encode failed/n" );

??????? }

??????? ……

}

凡是出現for循環的地方都應該認真對待,這是我的一個體會,也是進入分層結構認真分析的好方法.

fread()函數一次讀入一幀,分亮度和色度分別讀取.這里要看到c語言中的File文件有一個文件位置指示器,調用fread()函數會使文件指示器自動移位,這就是一幀一幀讀取的實現過程.

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

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

相關文章

在centos下安裝pycrypto報錯 RuntimeError: autoconf error

解決&#xff1a;yum -y install gcc File "/usr/lib64/python3.6/distutils/dist.py", line 974, in run_command cmd_obj.run() File "/usr/lib64/python3.6/distutils/command/build.py", line 135, in run self.run_command(cm…

Java多線程實現異步調用

在Java平臺,實現異步調用的角色有如下三個角色&#xff1a;調用者、 提貨單 、真實數據&#xff0c;一個調用者在調用耗時操作,不能立即返回數據時,先返回一個提貨單 .然后在過一斷時間后憑提貨單來獲取真正的數據.去蛋糕店買蛋糕&#xff0c;不需要等蛋糕做出來(假設現做要很長…

sql server 2008 r2卸載重裝_免費下載:Intouch軟件、Windows操作系統、SQL數據庫,VB6.0、C#...

為大家整理了常用的Windows操作系統和安裝軟件&#xff0c;基本上都是經過我們項目測試OK的版本&#xff0c;以后項目調試就齊全了&#xff0c;不用再“東奔西走”&#xff0c;“小鹿亂撞”了。整理不易&#xff0c;若對您有幫助請關注并轉發&#xff0c;以便幫助到更多的人。I…

Android ToolBar 使用完全解析

ToolBar簡介 ToolBar是Android 5.0推出的一個新的導航控件用于取代之前的ActionBar&#xff0c;由于其高度的可定制性、靈活性、具有Material Design風格等優點&#xff0c;越來越多的應用也用上了ToolBar&#xff0c;比如常用的知乎軟件其頂部導航欄正是使用ToolBar。官方考慮…

【零散積累】傳輸文件(sz/rz/scp命令)

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 01> 傳輸文件&#xff08;sz/rz/scp命令&#xff09; 工作中的傳輸文件會出現在linux之間&#xff0c;或者linux與windows之間。 一、怎么實現linux與windows之間的文件傳輸&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成將已編碼數據參數和待編碼數據裝入到h->mb.cache中,下圖是BUF中存儲的數據在以MB為單位的時候的存儲順序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把當前宏塊的up宏塊和left宏塊的intra4x4_pred_mode&#xff0c;non_zero_count加載進來&#xff0c…

U(優)盤安裝FreeBSD-9.0+GNOME_lite桌面

貼圖在我的主頁&#xff1a;http://hi.baidu.com/daodej/item/26313f4fc3db51ef1f19bcc6 修訂于&#xff1a;2012/07/04 標題&#xff1a;U(優)盤安裝FreeBSD-9.0GNOME_lite桌面&#xff0c;boot0啟動XP(Windows)、FreeBSD、Ubuntu(Linux)三系統 【黑括號表示說明&#xff0c;中…

【零散積累】 vim常用操作

類型 操作 含義 刪除 dd 刪除游標所在的一整行(常用) ndd n為數字。刪除光標所在的向下n行&#xff0c;例如20dd則是刪除光標所在的向下20行 d1G 刪除光標所在到第一行的所有數據 dG 刪除光標所在到最后一行的所有數據 d$ 刪除光標所在處&#xff0c;到該…

生活中常見物聯網實例_物聯網網關常見問題解答(一)

1.為什么物聯網解決方案需要網關&#xff1f;物聯網網關彌合了設備&#xff0c;傳感器&#xff0c;設備&#xff0c;系統和云之間的通信鴻溝。通過系統地連接云&#xff0c;物聯網網關提供了本地處理和存儲&#xff0c;并具有基于傳感器輸入的數據自主控制現場設備的功能。物聯…

predict_16x16[i_mode]( p_dst, i_stride )lowres

h->predict_16x16[i_mode]( p_dst, i_stride ); 計算對應預測模式時的預測采樣值。輸出放到dst指向的數組中。Pred0ct_16x16是7個元素指向的數組&#xff0c;數組的每個元素是一個指向函數的指針變量&#xff0c;在x264_predict_16x16_init函數初始這個指針數組。7個元素分…

【零散積累】shell腳本學習

來自wiki遷移頁面路徑&#xff1a;劉旺的主頁 / 個人零散積累 / 03> shell腳本學習 case Shell case語句&#xff08;多分支條件判斷&#xff09; $( ) Linux—shell中$(( ))、$( )、與${ }的區別 - chengd - 博客園 在bash中&#xff0c;$( )與 &#xff08;反引號&…

mysql 表鎖-解鎖

遇到問題“”用工具navicat打開一張表的時候&#xff0c;有的時候會發現這張表怎么打不開&#xff0c;關了navicat工具&#xff0c;再打開&#xff0c;也是同樣的狀態。查看表鎖&#xff1a;show OPEN TABLES where In_use > 0;查看是否是表鎖住了。-- 查看進程號 show proc…

alsa 測試 linux_Electron 構建步驟 (Linux)

遵循下面的引導&#xff0c;在 Linux 上構建 Electron .PrerequisitesPython 2.7.x. 一些發行版如 CentOS 仍然使用 Python 2.6.x &#xff0c;所以或許需要 check 你的 Python 版本&#xff0c;使用 python -V.Node.js v0.12.x. 有很多方法來安裝 Node. 可以從 Node.js下載原文…

JavaScript中的數學對象Math

js數學對象Math //四舍五入 var res Math.round(5.921);//獲取最大值 var res Math.max(10,23,523,43,65,46,32,32);//獲取最小值 var res Math.min(12312,324,32,42,3,23,412,4332,21,3,-1);//獲取絕對值 var res Math.abs(-100);//退一取整 var res Math.floor(1.9);//…

centos7-安裝mysql5.6.36

本地安裝了mysql5.7, 但和springboot整合jpa時會出現 hibernateException, 不知道為什么, 換個mysql5.6版本的mysql, 源碼安裝, cmake一直過不去, 后來改成rpm安裝 1, 獲取mysql5.6 ftp://ftp.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.6/ 下載: 解壓: 其中…

mad的問題匯總

Q&#xff1a;我想將I幀的預測圖像和原始圖像的平均絕對誤差給輸出來&#xff0c;請問這個在JM86中需要在哪一點改動呢&#xff1f;謝謝 A&#xff1a; 差值保存在diffy中&#xff1a; diffy[j][i] imgY_org[img->opix_yj][img->opix_xi] - pred[j][i]; 分析MAD不知道程…

迷之騷縮寫

搜集一些 GitHub 常見騷縮寫&#xff0c;以備查詢使用。 原文鏈接&#xff1a;LGTM? 那些迷之縮寫 PR: Pull Request. 拉取請求&#xff0c;給其他項目提交代碼LGTM: Looks Good To Me. 朕知道了 代碼已經過 review&#xff0c;可以合并SGTM: Sounds Good To Me. 和上面那句意…

github設置中文_靜態博客托管圖片至 GitHub

從 MWeb 切換到靜態博客 Jekyll 之后&#xff0c;我就面臨一個問題&#xff0c;這在很久之前使用 Hexo 同樣遇過的&#xff1a;圖片托管在何處。MWeb 的解決方式很棒&#xff0c;直接插入圖片&#xff0c;推送到 Github 后亦能正常引用并顯示&#xff0c;無需圖床或者借助第三方…

JavaScript中的正則

js正則 正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串, 正則表達式通常被用來檢索、替換那些符合某個模式的文本 聲明方式 普通字符 new RegExp();/hehe/轉義字符 \w \W \d \D \s \S var reg /\w/;//單個的字母數字下劃線 var reg /\W/;…

SQL注入【sqli靶場第23-28關】(七)

★★免責聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性&#xff0c;僅供安全研究與學習之用&#xff0c;讀者將信息做其他用途&#xff0c;由Ta承擔全部法律及連帶責任&#xff0c;文章作者不承擔任何法律及連帶責任。 0、總體思路 先確認是否可以SQL注入&#xff0c;使用單…