264中 POC的計算方法

作者:jogh.264?? 參考代碼 JM86
一·參數說明
這一節闡述的是encoder.cfg 中的參數對編碼過程的影響
要注意的是encoder.cfg 中的參數跟input 結構體中的變量是一一對應的
?
?? StartFrame:從視頻流的第幾幀開始編碼
?? FramesToBeEncoded:指明了除去 B幀后將要被編碼的幀數
input->no_frames = FramesToBeEncoded
?? FrameSkip:指明了編碼過程中跳過的幀數,中間有 B 幀也算跳過一幀。
?? NumberBFrames:相鄰 I、P幀或相鄰的 P幀之間的 B 幀個數,必須有
???????????????????????? NumberBFrames< FrameSkip
input->successive_Bframe = NumberBFrames
?? IntraPeriod:I 幀出現的頻率。若 IntraPeriod="3",則每 3 幀(不含 B 幀)中有一 I 幀;
?????????? IntraPeriod="0" 時只有第一幀是 I 幀。
?? IDRIntraEnable:此值為1時每個 I幀都是 IDR,否則只有第一個 I幀是 IDR。
?
舉例:在 StartFrame="0"
???????? FramesToBeEncoded="5"
???????? FrameSkip="3"
???????? NumberBFrames="2"
???????? IntraPeriod="3"
???????? IDRIntraEnable="1"
?????? 的情況下編碼情況如下,其中紅色代表 IDR 幀?
表 1
視頻流? 0? 1? 2? 3? 4? 5 6 7 8 9 10 11 12 13 14? 15? 16? 17
編碼流? I? B? B??? P? B B?? P B B?? I B B??? P??
編碼順序? 0? 2? 3??? 1? 5 6?? 4 8 9?? 7 11 12??? 10??
二·pic_order_cnt_type 為 0 的情況
這種情況下顯式的計算 POC
(1)? 編碼端 I 幀或 P 幀 toppoc 的計算
這個過程在 main()函數的組循環
??? “for (img->number=0; img->number < input->no_frames; img->number++){ }”
中實現
z? IntraPeriod或 IDRIntraEnable 為零時
這種情況下只有第一個 I 幀是 IDR 幀,比較簡單。對于 I幀或 P 幀,其頂場的 POC 為
????????? (img->number) * (2*(input->successive_Bframe+1)) z? IntraPeriod和 IDRIntraEnable 都不為零時
這種情況下每個 I 幀都是 IDR 幀,其 POC 必須設置為零, I幀出現的頻率為 IntraPeriod,
故其 toppoc為
??? (img->number % input->intra_period) * (2*(input->successive_Bframe+1))
z? 說明:
原程序中使用了宏定義 IMG_NUMBER
??? “#define IMG_NUMBER (img->number - start_frame_no_in_this_IGOP)”
通過搜start_frame_no_in_this_IGOP可知這個變量在NumberOfFrameInSecondIGOP為0
(encoder_main.cfg 中就是這樣設置的)時恒為 0,故有
?????????? IMG_NUMBER = img->number
(2)? 編碼端 B幀 POC 的計算
由表一可知,在編完一 I 幀或 P 幀之后才開始對它前面的 B幀進行編碼
?
? for (img->number=0; img->number < input->no_frames; img->number++)
? {
? ……I,P 幀編碼……
? if ((input->successive_Bframe != 0) && (IMG_NUMBER > 0))??
{
??? ……
??? for(img->b_frame_to_code=1; img->b_frame_to_code<=input->successive_Bframe;???
????????????????????????????????????????????????? img->b_frame_to_code++)
?? {
?? }
?
z? IntraPeriod或 IDRIntraEnable 為零時toppoc 等于
???? 2+(img->number-1) * (2*(input->successive_Bframe+1))?
?????? +2* (img->b_frame_to_code-1)
a)? 第一個 2 指得是 IDR 的兩個場;
b)? img->number要減一是因為要對當前幀(img->number)前面的 B幀進行編碼;
?
z? IntraPeriod和 IDRIntraEnable 都不為零時 toppoc等于
??? 2+(img->number % input->intra_period-1) * (2*(input->successive_Bframe+1))
??? +2* (img->b_frame_to_code-1)
IDR 幀前面
(3)? toppoc 到 pic_order_cnt_lsb 的轉化
??????? img->pic_order_cnt_lsb
?????? =img->toppoc &
??????? ~((((unsigned int)( –1)) << (log2_max_pic_order_cnt_lsb_minus4+4)))
?
z? (unsigned int)(-1)的十六進制形式是 0xffffffff,即它的每一位都是 1;
z? log2_max_pic_order_cnt_lsb_minus4+4是圖象數目(包括 B 幀)最大值的位數 z? 當 toppoc >0時,img->pic_order_cnt_lsb=img->toppoc
當 toppoc <0時,img->pic_order_cnt_lsb= max_pic_order_cnt+ img->toppoc
其中 max_pic_order_cnt=1<<( log2_max_pic_order_cnt_lsb_minus4+4)
z? 疑問:
不知道 toppoc 到 pic_order_cnt_lsb 這個過程有什么意義;
POC 的值會從 0 變到很大,為什么不對它進行熵編碼;
(4)? 解碼端 toppoc 的恢復
? 此過程在函數 decode_poc 中執行。其思想是對于 IDR 前的 B 幀
??????????? Toppoc = pic_order_cnt_lsb - max_pic_order_cnt
否則?
?????????????? Toppoc = pic_order_cnt_lsb
是否減去 max_pic_order_cnt 由變量 PicOrderCntMsb 決定,對于 IDR 前的 B 幀
?????????? PicOrderCntMsb = (– max_pic_order_cnt)
否則
?????????? PicOrderCntMsb = 0
到這就不難理解 PicOrderCntMsb 的含義了, PicOrderCntMsb 反映了 toppoc的值是否小于 0。
至于另外兩個參數:PrevPicOrderCntMsb 總是為 0;PrevPicOrderCntLsb 在當前圖象是 IDR
或 IDR 前(視頻流中)的 B 幀時為0,否則等于前一圖象(編碼序列中)的 PicOrderCntLsb。?
三·pic_order_cnt_type 為 1 的情況
這種情況下通過 frame_num來計算 POC
(1)frame_num 簡介
參考《畢厚杰》7.3.4 節中 frame_num 條款的解釋,對于表 1 中的圖象序列,其 frame_num?????
的值參考如下:
?
表 2
視頻流? 0? 1? 2? 4? 5 6 8 9 10 12 13 14? 16
編碼流? I? B? B? P? B B P B B I B B P
編碼順序? 0? 2? 3? 1? 5 6 4 8 9? 7 11 12? 10
frame_num? 0? 2? 2? 1? 3 3 2 1 1? 0 2 2 1
poc? 0? 2? 4? 6? 8 10 12 -4 -2 0 2 4 6
?
(2)算法思想以及其解碼端的實現
z? 對于 IDR 幀,poc = 0;
z? 對于 I 幀或P 幀
????? poc = frame_num*2*(input->successive_Bframe+1)
或??
????? poc = 2*(input->successive_Bframe+1)
?????????? + (frame_num – 1)*2*(input->successive_Bframe+1) 解碼端實現
????? poc = img->ExpectedPicOrderCnt
?????????? + img->delta_pic_order_cnt[0]?? (在 I,P 幀下為 0)
z? 對于 I 幀或P 幀之前的 B 幀(視頻流中)
??????????? poc = (frame_num – 1)*2*(input->successive_Bframe+1)
?????????? – 2*(input->successive_Bframe+1 – img->b_frame_to_code)

????? poc = 2*(input->successive_Bframe+1)
?????????? + (frame_num – 1 – 1)*2*(input->successive_Bframe+1)
?????????? + 2*( img->b_frame_to_code – 1)
?????????? – 2*input->successive_Bframe
解碼端的實現
????? poc = img->ExpectedPicOrderCnt
?????????? + img->delta_pic_order_cnt[0]
?????????? + active_sps->offset_for_non_ref_pic
z? 變量說明
a)? 其中 img->b_frame_to_code請參見標題一·(2)
b)? img->disposable_flag = (nalu->nal_reference_idc = = 0),而 nal_reference_idc 只在 B 幀時
為0,即img->disposable_flag只在B幀時為1。這也是在B幀情況下img->AbsFrameNum
要比 I 幀或P 幀多減去一個 1 的原因。
c)? 其它變量參見下面小題;
(3)編碼端參數設置
a)? img->num_ref_frames_in_pic_order_cnt_cycle:
??? 這個參數在 init_poc( )函數中設置為 1 后就再沒改動過;
b)? img->offset_for_ref_frame[0]? :
?? 在 StoredBPictures為0 時等于 2*(input->successive_Bframe+1);
c)? img->offset_for_ref_frame[1]? :
?? 沒什么用,264 頭文件中不會保存此變量;
d)? img->delta_pic_order_cnt[0]? :
?? 這個變量只對 B 幀有用,等于 2*(img->b_frame_to_code –1);? 對于 I 幀或 P 幀,??
???????? 其值為 0;
e)? active_sps->offset_for_non_ref_pic:
?? 只對 B 幀有用,在 StoredBPictures 為0 時等于–2*input->successive_Bframe,?

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

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

相關文章

c++ 測試串口速率_納米軟件案例之電流控制測試系統

項目背景西安某機電研究所電流控制測試系統軟件需要用記錄儀設置采樣速率對電流數據進行采集&#xff0c;并能夠進行數據實時顯示、保存。為更好的分析實驗現象&#xff0c;需要歷史測試數據可查詢并顯示。目前采用的傳統的手動測試&#xff0c;測試操作繁雜。數據保存困難&…

【Sublime】使用 Sublime 工具時運行python文件

使用 Sublime 工具時報Decode error - output not utf-8解決辦法 在菜單中tools中第四項編譯系統 內最后一項增添新的編譯系統 自動新建 Python.sublime-build文件,并添加"encoding":"cp936"這一行,保存即可 使用python2 則注釋encoding改為utf-8 {&quo…

智慧城市這份試卷 國外城市怎么答題?

在近五年&#xff0c;國內智慧城市建設的熱潮一直增無減。據媒體梳理&#xff0c;透過各地政府工作報告和“十三五”規劃發現&#xff0c;我國95%的副省級城市、76%的地級城市&#xff0c;總計超過500個城市&#xff0c;均在政府工作報告或“十三五”規劃中明確提出&#xff0c…

HTML段落,換行,字符實體

HTML段落,換行,字符實體 html段落 <p>標簽定義一個文本段落&#xff0c;一個段落含有默認的上下間距&#xff0c;段落之間會用這種默認間距隔開&#xff0c;代碼如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"&g…

【python】有意思的python小項目GitHub地址匯總

Licence_plate_recognize 車牌識別 Djang-Stu 基于python的Django框架學生信息管理系統 sklearn-machine-learning 數據分析-機器學習-深度學習【個人學習筆記】 movie_analysis 對電影影評分析生成詞云 spider_doubanTOP 爬取豆瓣電影top250/爬取豆瓣圖書top250 yuyin_re…

CBP詳解

cbp一共6bit&#xff0c;高2bit表示cbpc(2&#xff1a;cb、cr中至少一個4x4塊的AC系數不全為0&#xff1b;1&#xff1a;cb、cr中至少一個2x2的DC系數不全為0&#xff1b;0&#xff1a;所有色度系數全0&#xff09; 低4bit分別表示4個8x8亮度塊&#xff0c;其中從最低一位開始的…

R 包的安裝,使用,更新

R包的使用方法 包就是提供了種類繁多的函數&#xff0c;當然還有它的一些數據集&#xff0c;可以使用這些函數來操作這些數據集&#xff0c;來學習使用。 library()&#xff0c;當前的工作環境里&#xff0c;可以使用的包 包的幫助文檔&#xff1a;help(package"包名"…

nginx 電子書_13本免費的電子書,拿走,不謝

傻白甜程序員13本電子書的清單01《PyTorch官方教程中文版》傻白甜程序員中&#xff0c;后臺回復“pytorch”獲取02《Think Python》傻白甜程序員中&#xff0c;后臺回復“ThinkPython”獲取03《走向分布式》傻白甜程序員中&#xff0c;后臺回復“分布式”獲取04《Nginx教程&…

Redis數據類型:字符串

2019獨角獸企業重金招聘Python工程師標準>>> 概要 字符串類型是Redis最基本的數據類型&#xff0c;能夠存儲任何形式的字符串&#xff0c;單個健值最大能夠存放512兆的數據&#xff0c;據傳將來會放開512M的限制。 命令 設置值&#xff1a;set foo bar 獲取值&#…

HTML塊,含樣式的標簽

HTML塊,含樣式的標簽 html塊 div標簽 塊元素&#xff0c;表示一塊內容&#xff0c;沒有具體的語義。span標簽 行內元素&#xff0c;表示一行中的一小段內容&#xff0c;沒有具體的語義。 含樣式和語義的標簽 em標簽 行內元素&#xff0c;表示語氣中的強調詞i標簽 行內元素…

【docker】docker虛擬容器的使用大全

Docker容器詳解 Docker是基于Go語言開發的開源應用容器引擎&#xff0c;遵從Apache Licence 2.0協議&#xff0c;可以讓開發者打包應用以及應用的依賴包到一個可移植的容器中&#xff0c;然后發布到各種發行版本的Linux系統上。 Docker簡介 軟件開發中最為麻煩的事情可能就是…

【樹莓派】修改樹莓派盒子MAC地址

用樹莓派盒子&#xff0c;在某些客戶方實施過程中&#xff0c;不同客戶的網絡環境對樹莓派盒子的要求不同&#xff0c;網絡管理配置要求MAC地址和IP綁定。 一種情況下&#xff0c;查詢盒子的MAC地址&#xff0c;添加到網絡管理的路由規則中即可&#xff1b; 另一種情況下&#…

編程隨想 關系圖_IT什么崗位比較好找工作?一張金字塔圖就能明白

IT(Internet Technology)互聯網技術是指在計算機技術的基礎上開發建立的一種信息技術。IT行業這些年一直很火爆&#xff0c; 對于IT就業崗位的選擇一直也都是熱門話題。一、IT人才總體供需金字塔型人才需求和市場供應關系圖&#xff1a;人才供需圖一般IT 行業供需關系可以比喻為…

諾基亞收購了阿朗:那與 TCL 的“阿爾卡特”品牌授權協議到期后咱辦?

在被諾基亞收購之后&#xff0c;“阿爾卡特-朗訊”的牌子算是被這家芬蘭公司收入囊中。尷尬的是&#xff0c;TCL 很早就獲得了“阿爾卡特”這個智能手機品牌的授權。當然&#xff0c;對于因為錯抱了微軟 Windows Phone 這條大腿、以致于多年后再借著 HMD Global 重返 Android 智…

【Django】django使用原生SQL的方法(附加說說為什么ORM上不了大臺面)

執行自定義SQL語言&#xff1a; from django.db import connection ? cursorconnection.cursor() ? # 插入操作 cursor.execute("insert into hello_author(name) values(傳說中的申小五)") ? # 更新操作 cursor.execute("update hello_author set nameabc w…

[熵編碼] 指數哥倫布編碼

規定語法元素的編解碼模式的描述符如下&#xff1a;比特串&#xff1a;b(8):任意形式的8比特字節&#xff08;就是為了說明語法元素是為8個比特&#xff0c;沒有語法上的含義&#xff09;f(n):n位固定模式比特串&#xff08;其值固定&#xff0c;如forbidden_zero_bit的值恒為0…

python學習筆記 - lambda 與 函數嵌套

# 函數嵌套 #函數內包含函數 def fun1(a):def funa(a):return a **2def funb(a):return a **3return funa(a) funb(a)print(函數嵌套:{}:.format(fun1(3)))# lambda表達式代替嵌套函數 #lambda表達式替代嵌套函數 def fun2(a):f1 lambda a : a ** 2f2 lambda a : a ** 3re…

python編輯器_沒有人比它更懂少兒編程,慧編程Python'吮指編輯器'

咳咳&#xff01;大家好&#xff0c;我是偶爾寫文章的康康老師。今天跟大家介紹的是慧編程家的&#xff0c;睡在Scratch上鋪的兄弟——慧編程Python編輯器。這是一款集才華和顏值為一體的吮指編輯器&#xff01;忘記肯德基&#xff0c;你的手指應該為編程而生&#xff01;話不多…

微軟Scott CIO也要代表公司拜訪客戶

作為全球IT巨頭的CIO&#xff0c;微軟公司副總裁兼首席信息官Tony Scott的工作與眾不同。除了要擔任普通CIO需要擔任的角色以外&#xff0c;他還要與客戶保持溝通&#xff0c;同時還與微軟產品和研發團隊緊密聯系。正因為如此&#xff0c;Tony Scott對CIO的職責有著更深刻的理解…

HTML中的圖片

HTML圖片 html圖片 <img>標簽可以在網頁上插入一張圖片&#xff0c;它是獨立使用的標簽&#xff0c;通過“src”屬性定義圖片的地址&#xff0c;通過“alt”屬性定義圖片加載失敗時顯示的文字&#xff0c;以及對搜索引擎和盲人讀屏軟件的支持。 <img src"ima…