x264_sps_init

x264_sps_init此函數為序列量化集的初始化。主要對結構體x264_sps_t中參數的初始化。

void x264_sps_init( x264_sps_t *sps, int i_id, x264_param_t *param )

{

??? sps->i_id = i_id;首先設置序列參數集的ID

b_qpprime_y_zero_transform_bypass判斷碼率控制方法是否是恒定質量方法并且量化值初始為0.

??? sps->b_qpprime_y_zero_transform_bypass = param->rc.i_rc_method == X264_RC_CQP && param->rc.i_qp_constant == 0;

??? if( sps->b_qpprime_y_zero_transform_bypass )

??????? sps->i_profile_idc? = PROFILE_HIGH444_PREDICTIVE;

??? else if( param->analyse.b_transform_8x8 || param->i_cqm_preset != X264_CQM_FLAT )

??????? sps->i_profile_idc? = PROFILE_HIGH;

??? else if( param->b_cabac || param->i_bframe > 0 || param->b_interlaced )

??????? sps->i_profile_idc? = PROFILE_MAIN;

??? else

??????? sps->i_profile_idc? = PROFILE_BASELINE;

baseline:(1)b_qpprime_y_zero_transform_bypass不等于0(2)analyse.b_transform_8x8等于0并且param->i_cqm_preset = X264_CQM_FLAT(3)b_cabac等于0并且i_bframe小于等于0,并且interlaced=0

??? sps->i_level_idc = param->i_level_idc;

定義本序列參數集的level值

??? sps->b_constraint_set0? = sps->i_profile_idc == PROFILE_BASELINE;

??? /* x264 doesn't support the features that are in Baseline and not in Main,

???? * namely arbitrary_slice_order and slice_groups. */

??? sps->b_constraint_set1? = sps->i_profile_idc <= PROFILE_MAIN;

??? /* Never set constraint_set2, it is not necessary and not used in real world. */

??? sps->b_constraint_set2? = 0;?????? ?附錄A2.1

然后設置IDR幀之間的最大的幀數,這個幀數是以2的多少次冪計數的,它由參數的i_keyint_max(默認初始化為250)決定。

??? sps->i_log2_max_frame_num = 4;? /* at least 4這個句法元素是為讀取frame_num服務的 */

??? while( (1 << sps->i_log2_max_frame_num) <= param->i_keyint_max )

??? {

??????? sps->i_log2_max_frame_num++;

??? }

??? sps->i_log2_max_frame_num++;??? /* just in case */

然后設置i_poc_type為0,POC類型指明了POC的編碼方法,POC標識圖象的播放順序。由于H.264使用了B幀,使得圖象的解碼順序并不一定等于播放順序,但她們存在一定的映射關系。POC類型可以有Frame_num通過映射關系計算得來,也可以索性以編碼器顯示傳送的方式傳達給解碼器. POC類型有3種方案.

?? 然后設置i_log2_max_poc_lsb,最大POC的什么東西,也搞不明白。

?? POC是一個播放順序,接受到一個IDR偵,POC會被清0

??? sps->i_poc_type = 0;

??? if( sps->i_poc_type == 0 )此處不懂?

??? {

??????? sps->i_log2_max_poc_lsb = sps->i_log2_max_frame_num + 1;??? /* max poc = 2*frame_num */

??? }

??? else if( sps->i_poc_type == 1 )

??? {

?? ?????int i;

?

??????? /* FIXME */

??????? sps->b_delta_pic_order_always_zero = 1;

??????? sps->i_offset_for_non_ref_pic = 0;

??????? sps->i_offset_for_top_to_bottom_field = 0;

??????? sps->i_num_ref_frames_in_poc_cycle = 0;

?

??????? for( i = 0; i < sps->i_num_ref_frames_in_poc_cycle; i++ )

??????? {

??????????? sps->i_offset_for_ref_frame[i] = 0;

??????? }

??? }

??? sps->b_vui = 1; 指明vui子結構是否出現在碼流中(video usability information)

??? sps->b_gaps_in_frame_num_value_allowed = 0; 這個句法元素等于時,表示允許句法元素frame_num可以不連續;當傳輸信道堵塞時,允許丟棄若干幀

??? sps->i_mb_width = ( param->i_width + 15 ) / 16;

??? sps->i_mb_height= ( param->i_height + 15 ) / 16;

??? if( param->b_interlaced )

??????? sps->i_mb_height = ( sps->i_mb_height + 1 ) & ~1;

??? sps->b_frame_mbs_only = ! param->b_interlaced;

??? sps->b_mb_adaptive_frame_field = param->b_interlaced;

??? sps->b_direct8x8_inference = 1; 指明b片的直接和skip模式下運動矢量的預測方法

??? sps->crop.i_left?? = 0;

??? sps->crop.i_top??? = 0;

??? sps->crop.i_right? = sps->i_mb_width*16 - param->i_width;

??? sps->crop.i_bottom = (sps->i_mb_height*16 - param->i_height) >> param->b_interlaced;

??? sps->b_crop = sps->crop.i_left? || sps->crop.i_top ||

????????????????? sps->crop.i_right || sps->crop.i_bottom;

指明解碼器是否要將圖像裁剪后輸出,如果是的話,后面緊跟的四個句法元素分別指出左、右、上、下裁剪的寬度。此處不支持將圖像剪裁后輸出。

?

??? sps->vui.b_aspect_ratio_info_present = 0;是否有目前長寬比信息。?

??? if( param->vui.i_sar_width > 0 && param->vui.i_sar_height > 0 )

??? {

??????? sps->vui.b_aspect_ratio_info_present = 1;

?????? ?sps->vui.i_sar_width = param->vui.i_sar_width;

??????? sps->vui.i_sar_height= param->vui.i_sar_height;

??? }

?

??? sps->vui.b_overscan_info_present = ( param->vui.i_overscan ? 1 : 0 );i_overscan類型 0=undef, 1=no overscan, 2=overscan

??? if( sps->vui.b_overscan_info_present )

??????? sps->vui.b_overscan_info = ( param->vui.i_overscan == 2 ? 1 : 0 );

?

??? sps->vui.b_signal_type_present = 0;

??? sps->vui.i_vidformat = ( param->vui.i_vidformat <= 5 ? param->vui.i_vidformat : 5 );

??? sps->vui.b_fullrange = ( param->vui.b_fullrange ? 1 : 0 );

??? sps->vui.b_color_description_present = 0;

?

??? sps->vui.i_colorprim = ( param->vui.i_colorprim <=? 9 ? param->vui.i_colorprim : 2 ); /* undef原始色度格式*/

??? sps->vui.i_transfer? = ( param->vui.i_transfer? <= 11 ? param->vui.i_transfer? : 2 ); /* undef 轉換方式*/

??? sps->vui.i_colmatrix = ( param->vui.i_colmatrix <=? 9 ? param->vui.i_colmatrix : 2 ); /* undef 色度矩陣設置*/

??? if( sps->vui.i_colorprim != 2 ||

??????? sps->vui.i_transfer? != 2 ||

??????? sps->vui.i_colmatrix != 2 )

?? ?{

??????? sps->vui.b_color_description_present = 1;

??? }

?

??? if( sps->vui.i_vidformat != 5 ||

??????? sps->vui.b_fullrange ||

??????? sps->vui.b_color_description_present )

??? {

??????? sps->vui.b_signal_type_present = 1;

??? }

?

??? /* FIXME: not sufficient for interlaced video */解釋:對隔行掃描的視頻是沒有效。

??? sps->vui.b_chroma_loc_info_present = ( param->vui.i_chroma_loc ? 1 : 0 );

??? if( sps->vui.b_chroma_loc_info_present )判斷是否有當前色度樣本指定的信息。

??? {

??????? sps->vui.i_chroma_loc_top = param->vui.i_chroma_loc;

?? ?????sps->vui.i_chroma_loc_bottom = param->vui.i_chroma_loc;

??? }

?

??? sps->vui.b_timing_info_present = 0; 264碼流中時間相關信息是在vui中,x264生成的碼流是有vui信息的,但jm等編碼器默認情況下是不生成vui信息。這表示,其播放時間是不能給出的

??? if( param->i_fps_num > 0 && param->i_fps_den > 0)

??? {

??????? sps->vui.b_timing_info_present = 1;是否有目前的時間信息。

??????? sps->vui.i_num_units_in_tick = param->i_fps_den;在一個時間點的數量單位。

??????? sps->vui.i_time_scale = param->i_fps_num * 2;時間規模?

??????? sps->vui.b_fixed_frame_rate = 1;是否有恒定的幀率。/

??? }

?

??? sps->vui.i_num_reorder_frames = param->b_bframe_pyramid ? 2 : param->i_bframe ? 1 : 0; b_bframe_pyrami為允許部分B為參考幀。i_num_reorder_frames為重新排序的幀的數目。

??? /* extra slot with pyramid so that we don't have to override the

l??????? order of forgetting old pictures */

l??????? 額外的插入參考幀,以使得我們不用重寫忘記的老的圖像。

?? ?sps->vui.i_max_dec_frame_buffering =

??? sps->i_num_ref_frames = X264_MIN(16, X264_MAX(param->i_frame_reference, 1 + sps->vui.i_num_reorder_frames));

i_max_dec_frame_buffering最大的解碼幀的緩沖區。

??? sps->vui.b_bitstream_restriction = 1;是否比特流受限

??? if( sps->vui.b_bitstream_restriction )

??? {

??????? sps->vui.b_motion_vectors_over_pic_boundaries = 1; 是否有圖像邊界的運動矢量。

??????? sps->vui.i_max_bytes_per_pic_denom = 0; ?

??????? sps->vui.i_max_bits_per_mb_denom = 0;? ?

??????? sps->vui.i_log2_max_mv_length_horizontal =??? 宏塊水平長度的最大值。

??????? sps->vui.i_log2_max_mv_length_vertical =???? ?宏塊垂直長度的最大值。(int)(log(param->analyse.i_mv_range*4-1)/log(2)) + 1;

??? }

}


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

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

相關文章

HALCON相機標定相機內參相機外參

目錄相機標定1.相機標定是什么2.怎么使用halcon進行相機內外參標定&#xff1f;&#xff08;1&#xff09;搭建硬件1.**相機連好電腦&#xff0c;用相機廠家軟件打開相機&#xff0c;檢查一下相機是否正常。**2.**接下來使用halcon連接相機**&#xff08;2&#xff09;開始標定…

ionic更改端口號

ionic serve -p 8888 —— 重新指定端口號為8888 serve [options] ............................... 啟動本地服務器進行開發測試 dev/testing   [--consolelogs|-c] ..................... 輸入app的控制臺到ionic的控制臺顯示   [--serverlogs|-s] .....................…

angular change the url , prevent reloading

http://stackoverflow.com/questions/14974271/can-you-change-a-path-without-reloading-the-controller-in-angularjs $location.search({vln: $scope.vln_id}, false);會改變url中 &#xff1f; 后面的 搜索參數&#xff0c;但是controller不會重新實例化。angular 官方文檔…

Ubuntu apt-get 更新/查看軟件

ubuntu 升級軟件&#xff1a; sudo apt-get update 更新源  sudo apt-get upgrade 更新已安裝的包  sudo apt-get dist-upgrade 升級系統 ubuntu升級特定軟件&#xff1a; 可以用 sudo apt-get install pkgname 看軟件安裝位置:dpkg -L xxxx 查看軟件是否安裝&#xff1…

X264設定

--aq-mode <integer> AQ method [1]- 0: Disabled- 1: Variance AQ (complexity mask)說明&#xff1a;自適應量化方法&#xff0c;可以改善某些場景過于模糊等問題&#xff0c;默認開啟- 0: 關閉- 1: 可變AQ推薦值&#xff1a;默認范例&#xff1a;--aq-mode 1--aq-stre…

C#圓形卡尺測量程序基于halcon

廢話不多說上源碼 覺得帖子有用給點個贊哈 先來個效果圖 下邊的是源碼&#xff0c;自己新建一個文件粘貼進去&#xff0c;包含到您現在的項目 中。這串源碼后邊是使用方法。 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin…

MySQL松散索引掃描與緊湊索引掃描

什么是松散索引&#xff1f; 答&#xff1a;實際上就是當MySQL 完全利用索引掃描來實現GROUP BY 的時候&#xff0c;并不需要掃描所有滿足條件的索引鍵即可完成操作得出結果。 要利用到松散索引掃描實現GROUP BY&#xff0c;需要至少滿足以下幾個條件&#xff1a;◆ GROUP BY 條…

算法馬拉松24

算法馬拉松24 A 小C的多邊形 題意&#xff1a;n1個點的多邊形。給外圈的邊標記上1~n&#xff0c;里圈的邊也標記上1~n&#xff0c;使得對于一個外圈相鄰點與中間點構成的三角形的邊權之和都相等。\(n \le 10^6\) 題解&#xff1a;顯然每個三角形權值和為\(\frac{3(n1)}{2}\) 一…

HUD2795 線段樹(單點更新)

題目中給出的h和w范圍均大&#xff0c;其實n的最大范圍才200000&#xff0c;所以我們建立的線段樹大小為min(h,n),線段樹的每一個節點包含一個變量c&#xff0c;記錄當前區間內還剩下的可以put on的最大長度。插入一個數時&#xff0c;如果該數大于該區間最大值&#xff0c;則返…

科維PLC運行時系統ProConOS embedded CLR 2.2 特定應用

ProConOS embedded CLR是新型的開放式標準化PLC運行時系統&#xff0c;符合IEC 61131標準&#xff0c;可執行不同的自動化任務&#xff08;PLC、PAC、運動控制、CNC、機器人和傳感器&#xff09;。   通過采用國際標準的微軟中間語言&#xff08;依據IEC/ISO 23271標準為MSIL…

linux下vi命令大全

進入vi的命令 vi filename :打開或新建文件&#xff0c;并將光標置于第一行首 vi n filename &#xff1a;打開文件&#xff0c;并將光標置于第n行首 vi filename &#xff1a;打開文件&#xff0c;并將光標置于最后一行首 vi /pattern filename&#xff1a;打開文件&…

set()與get()詳細解答(C#)

這幾天在搬磚時候用到了set()與get()&#xff0c;同事問了我一些問題&#xff0c;我打算在博客中總結一下。 覺得幫助到了您&#xff0c;幫我點個贊哦。 屬性訪問器 其實說白了就是操作一個屬性&#xff0c;更通俗一點說就是對一個變量的取值與賦值。 先來看get() get 訪問…

IM應用中如何計算富文本的高度

背景 在開發IM的項目過程中&#xff0c;經常會有出現一些需要計算DOM高度&#xff0c;然后超出若干行隱藏等需求。很多時候&#xff0c;需要計算高度的DOM元素都是動態生成的&#xff0c;我們無法在數據渲染前獲取到它的高度。 如果沒有任何交互&#xff0c;我們可以通過CSS來實…

G代碼 機器人的CNC實現

&#xfeff;  控制銑削工作臺和工件的NC程序&#xff0c;通過CAD軟件創建&#xff0c;這些NC程序與特定的機器類型相關。 NC程序在笛卡爾坐標系中動作的描述&#xff0c;對于需要確保一個明確的變換軸位置的關節型的機器人來說&#xff0c;缺少附加的狀態和旋轉信息。傳…

IScroll5中文API整理,用法與參考

IScroll是移動頁面上被使用的一款仿系統滾動插件。IScroll5相對于之前的IScroll4改進了許多&#xff0c;使得大家可以更方便的定制所需的功能了。 做項目的時候正好用到了這個插件&#xff0c;自己做了一下總結&#xff0c;發在這里方便大家學習IScroll5。 官網&#xff1a;htt…

Linux?安裝USB攝像頭

sudo apt-get updatesudo apt-get install fswebcamsudo apt-get install mplayersudo apt-get install alsamixer安裝完畢ls /dev查找設備是否有video0這個設備sudo mplayer tv:// 可以看到攝像內容轉載于:https://www.cnblogs.com/smartkeke/p/6820426.html

struct x264_t 維護著CODEC的諸多重要信息

//x264_t結構體維護著CODEC的諸多重要信息struct x264_t{/* encoder parameters ( 編碼器參數 )*/x264_param_t param;x264_t *thread[X264_SLICE_MAX];/* bitstream output ( 字節流輸出 ) */struct{int i_nal;x264_nal_t nal[X264_NAL_MAX];int i_bitstr…

如何判斷一條曲線是否自己相交?

今天看到群里有人在問這個問題&#xff0c;想了一個解決辦法。 我們首先作假設&#xff0c;如果一條曲線有交點&#xff0c;那么它就是相交的對吧。可能大家想的都是這樣&#xff0c;就開始找各種方法去識別交點。 我們換個角度想一下&#xff1a;是不是我們判斷這條曲線是否帶…

XML 與網絡的數據傳輸

&#xfeff;&#xfeff;XML 與網絡的數據傳輸