對幾個重要問題的闡述

由于DPB中間的參考幀的MV都是以4X4塊為單位,現在以8X8塊作Direct mode模式所以必須對子塊的MV作合并
JM采用的東西是如下圖的方式:
x o | o x
o o | o o
- - - - -
o o | o o
x o | o x
每8X8塊取外角上的4X4塊的MV.
算法如下:

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
??
b8Mode是幀間預測中對8X8塊的再次細分,稱為亞宏塊級模式,劃分定在表格b8_mode_table中
const int?? b8_mode_table[6]?? = {0, 4, 5, 6, 7};
其中0是8X8 Direct模式,只對B幀,4,8X8,5,8X4,6,4X8,7,4X4,以上5中模式在宏塊級中統稱為P8X8模式,這個可以在碼流TRACE文件中可以應證。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

264標準中可以對宏塊級語法元素按照重要的等級進行分區,可以分為分區A,B,C, 這個數據分區可以根據數組映射獲得264時如何處理分區得.涉及到3個數組.
typedef enum??
{
?? SE_HEADER,
?? SE_PTYPE,
?? SE_MBTYPE,
?? SE_REFFRAME,
?? SE_INTRAPREDMODE,
?? SE_MVD,
?? SE_CBP_INTRA,
?? SE_LUM_DC_INTRA,
?? SE_CHR_DC_INTRA,
?? SE_LUM_AC_INTRA,
?? SE_CHR_AC_INTRA,
?? SE_CBP_INTER,
?? SE_LUM_DC_INTER,
?? SE_CHR_DC_INTER,
?? SE_LUM_AC_INTER,
?? SE_CHR_AC_INTER,
?? SE_DELTA_QUANT_INTER,
?? SE_DELTA_QUANT_INTRA,
?? SE_BFRAME,
?? SE_EOS,
?? SE_MAX_ELEMENTS?? //!< number of maximum syntax elements
} SE_type; ?? ?? // substituting the definitions in elements.h
以上定義了264宏塊級編碼要用到的語法元素,當然不是所有的宏塊編碼都有以上元素,根據幀內,幀間,實際編碼過程中,等有所不同
關于以上的元素具體含義,參考JM或標準可以獲得,不過有些元素似乎在JM中并沒有利用到,比如SE_EOS,不知道最新版如何?

int assignSE2partition_NoDP[SE_MAX_ELEMENTS] =
?? {?? 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int assignSE2partition_DP[SE_MAX_ELEMENTS] =
?? {?? 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 2, 2, 2, 2, 0, 0, 0, 0 } ;
上面元素0,代表DPA,1代表DPB,2代表DPC,可以看出來假如沒有定義數據分區得話:所有的語法元素都是DPA,定義了數據分區,那么幀內系數是分區B,幀間系數是分區C,其他的元素都是分區A.可以看得出來,遭遇信道丟包時,
光有DPB或DPC,沒有DPA是無法解出碼流的,假如沒有DPB,DPC的話,還可以根據DPA的元素獲得近似值。 那么JM是如何實現宏塊級數據分區管理的呢,這個由Slice里面的datapartition數組管理,第一個成員為DPA, 第二個為DPB,第三個為DPC,可以根據語法元素切換輸出到A,B,C中.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
??
把編碼方式切換到CAVLC,其實在foreman測試序列,個人覺得CABAC,CAVLC編碼壓縮效率差別不大
SNR更是差不多,但是CAVLC要簡單很多。
經過一個晚上的艱苦戰斗,初步得出結論,SKIP模式對B,P幀而言,DIRECT模式只對B而言,
個人覺得DIRECT模式,SKIP模式,這種說法有些讓人困惑。
下面講B幀的DIRECT,SKIP模式:
DIRECT,SKIP,模式相同的是,他們的宏塊類型都是0,運動向量殘差都為0,因為MVD可以通過臨塊預測方式得到
但是SKIP模式的cbp為0,也就是沒有殘差傳輸,它是雙向預測,參考幀在LIST0,LIST1中的
序號也是根據臨塊的參考幀情況獲得(注意不一定序號非的是0),所以連參考幀都不用傳輸.,
SKIP模式有更嚴格的要求,CBP為0,也就是沒有殘差系數,達到最大的壓縮效率。
再講P幀的SKIP模式,但前象預測,參考幀為LIST0中序號為0幀,無參考幀編碼,CBP為0,無殘差系數編碼.
她們的分塊模式為0,都是16X16.
但是在CAVLC中,SKIP模式,對SKIP宏塊沒有任何實際編碼碼流,解碼器是如何識別這個宏塊存在的,
大家打開TRACE文件,可以看到為一個SKIP或者連續幾個SKIP宏塊結束后,接著下一個非SKIP宏塊,
一開始就有一個語法元素,mb_skip_run有一個值,這個元素采用Exp-Golomb編碼,這個值的意思就是前面有多少個SKIP塊,這就是264碼流
巧妙的解決方案,當遇到這個元素非0的時候,就自動往前面做SKIP宏塊填充,.
@34679 mb_skip_run ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 1 (?? 0)??
@34680 mb_type (P_SLICE) ( 4, 1) = 2 ?? ?? ?? ?? ?? ?? ?? ?? ??? 010 (?? 1)??
@34683 mvd_l0 (0) =?? -6?? (org_mv -10 pred_mv?? -4) ?? ?? ?? ??? 0001101 ( -6)??
@34690 mvd_l0 (1) = 0?? (org_mv 0 pred_mv 0) ?? ?? ?? ?? ?? ??? 1 (?? 0)??
@34691 mvd_l0 (0) = -11?? (org_mv -20 pred_mv?? -9) ?? ?? ?? 000010111 (-11)??
@34700 mvd_l0 (1) = 7?? (org_mv 9 pred_mv 2) ?? ?? ?? ??? 0001110 (?? 7)??
@34707 CBP ( 4, 1) = 0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 1 (?? 0)??

*********** Pic: 2 (I/P) MB: 16 Slice: 0 **********


*********** Pic: 2 (I/P) MB: 17 Slice: 0 **********


*********** Pic: 2 (I/P) MB: 18 Slice: 0 **********

@34708 mb_skip_run ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 011 (?? 2)??
@34711 mb_type (P_SLICE) ( 7, 1) = 8 ?? ?? ?? ?? ?? ?? ?? ?? 00101 (?? 4)??
上面表示18號宏塊前面有2個SKIP宏塊,解碼器然后可以自動填充。
其實本來解決這個問題,可以用更少的時間來解決這個問題,但是,JM97對TRACE文件輸出,有一個bug,
導致,輸出的TRACE混亂錯誤,無法理解,浪費了大量的時間,花了幾個小時才找出解決這個bug,該bug位于
writeSyntaxElement2Buf_Fixed函數中,這個地方需要注釋掉TRACE輸出。
int writeSyntaxElement2Buf_Fixed(SyntaxElement *se, Bitstream* this_streamBuffer )
{

?? writeUVLC2buffer(se, this_streamBuffer );

#if TRACE
// if(se->type <= 1)
//?? trace2out (se);
#endif
?? return (se->len);
}
其實上面兩句是留給MBHEADER輸出的,因為它不用參加RDO rate計算
個人覺得JM對TRACE文件的輸出管理還有些問題,有待修改,不知道在新的JM版本中有沒有修正這個bug.
這個也算是解決這個問題的副產品.

另外CABAC對貸這個問題好像不一樣,有時間可以在研究這個問題

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
??
求象素的灰度.....
#define MAX_LEN (1000*3)
unsigned char RGB[MAX_LEN]={2,2,2,4,5,6,7,8,9,0};
unsigned int mulData[7] = {313524,615514,119538};
__int64 mask1 = 0xFFFFFFFF00000000;
__int64 mask2 = 0x00000000FFFF0000;
__int64 mask3 = 0x000000000000FFFF;

int main(int argc, char* argv[])
{
char gray = 0;
unsigned int Y=(((RGB[0]*mulData[0]))+((RGB[1]*mulData[1]))+((RGB[2]*mulData[2])))>>20;
_asm{
pxor mm7,mm7
pxor mm6,mm6
mov ecx,0
sloop: movd mm0,[mulData+ecx*4]
punpcklwd mm0,mm7
mov al,[RGB+ecx]
and eax,0X000000FF
movd mm1,eax
movd mm2,eax
;;;;;;;;;;;;;;;;;;;;;;;;;;;
punpckldq mm1,mm2
movq mm4,mm1
movq mm5,mm0
punpcklwd mm4,mm1
punpcklbw mm5,mm7
pmullw mm4,mm5
;;;;;;;;;;;;;;;;;;;;;;;;;;;
pmullw mm1,mm0
pand mm1,mask1
movq mm0,mm4
pand mm0,mask2
pand mm4,mask3
psrlq mm0,8
paddd mm1,mm0
paddd mm1,mm4
movq mm3,mm1
pand mm3,mask1
psrlq mm3,16
paddd mm1,mm3
paddd mm6,mm1
inc ecx
cmp ecx,3
jl sloop
psrld mm6,20
movd eax,mm6
mov gray,al
emms
}
return 0;
}

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
??
H.264對幀場編碼問題支持的比較完整,因為曾經有人問我,在h.264碼流中,是否有判別幀場編碼的元素。
我當時對H.264如果認定碼流幀場編碼不太了解,更別說是宏塊級幀場編碼了。其實H.264對幀場編碼有兩種級別,分為
幀級和宏塊級.幀級是對整個幀一開始就分為top field,bottom field.對兩個field分別進行ME,MC,mode decision等. 而宏塊級Field編碼,就不一樣了。曾經在流媒體網站H.264分塊看到有一牛人對宏塊級Field編碼的解釋,我感到疑惑,
但當時修行不夠,說不出所以然,現在把那段話貼在這里:
jamie80:
"
當 MbaffFrameFlag = 1 & currMb->mb_field 時,偶數行放在宏塊的上半部分(16x8)來編碼,而奇數行位于下半部分來編碼。
如果當前宏塊的mb_field為0(幀編碼)而左鄰居宏塊的mb_field為1(場編碼),這樣其左鄰居像素就可以屬于不同的4x4塊,
至少左鄰居奇數行的像素和偶數行的像素肯定不屬于同一個4x4塊,所以我們需要對它們區別對待。
(MB Adaptive Frame/Field給H.264帶來不少麻煩)
我的答案是一個宏塊級field編碼,是這樣子的,JM里面給出解釋的是Field MB pair,場宏塊對。也就是a couple of Field
沒有單獨存在的一個Field宏塊,只有Field MB pair.上面一個是Top field MB(兩個MB的偶數行),下面一個是Bottom MB
(兩個宏塊的奇數行),宏塊序號上下是連續的,這個和一般的編號方式不同,上面一個是偶數,下面一個是奇數.
而不是象上面那段話那樣,只有半個宏塊的問題.
對此,我們做出解釋,現在我們研究函數void dpb_split_field(FrameStore *fs),該函數完成的任務是對即將送入DPB的重建幀
進行幀場分解,解出top,bottom field,對頂底場進行1/4象素插值,復制場參數,分解運動向量,參考幀序號,參考幀id等。
宏塊級幀場自適應模式需要對宏塊對進行場模式和幀模式分別編碼,計算她們的RDCOST,選其中最少的RDCOST作為編碼方式,所以
自適應方式做最佳編碼是付出了計算復雜度大大增加的代價。同樣幀級幀場自適應方式需要幀編碼,和場編碼分別進行,
計算RDCOST最少值作為最佳編碼,同樣付出計算復雜度.
?? 回到文章開始時候提出的問題,碼流中是否有標志指示后面訪問單元(Access Unit)的幀場編碼方式,答案是肯定的,在一個
SPS(sequence parameter set)中能找到frame_mbs_only_flag標志,該標志顯示是否幀編碼,如果為0,那么還有一個參數
mb_adaptive_frame_field_flag,下面對配置參數和以上兩個元素的關系進行說明
PicInterlace代表幀級隔行掃描,MbInterlace代表宏塊級隔行掃描
PicInterlace ?? ?? ?? =?? 0 ??? # Picture AFF (0: frame coding, 1: field coding, 2:adaptive frame/field coding)
MbInterlace ?? ?? ?? ??? =?? 0 ??? # Macroblock AFF (0: frame coding, 1: field coding, 2:adaptive frame/field coding)
交叉位置(frame_mbs_only_flag, mb_adaptive_frame_field_flag),N/A為不需要該元素

?? ?? ?? \PicInterlace
MbInterlace \

0

1

2

0

(1,N/A)

(0,0)

(0,0)

1

(0,1)

(0,1)

(0,1)

2

(0,1)

(0,1)

(0,1)

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

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

相關文章

【MySQL】基于Docker的Mysql主從復制搭建

基于Docker的Mysql主從復制搭建 為什么基于Docker搭建&#xff1f; 資源有限 虛擬機搭建對機器配置有要求&#xff0c;并且安裝mysql步驟繁瑣 一臺機器上可以運行多個Docker容器 Docker容器之間相互獨立&#xff0c;有獨立ip&#xff0c;互不沖突 Docker使用步驟簡便&#xf…

Web開發介紹

Web開發介紹 一,認識一個網站 最早的軟件都是運行在大型機上的&#xff0c;軟件使用者通過“啞終端”登陸到大型機上去運行軟件。 后來隨著PC機的興起&#xff0c;軟件開始主要運行在桌面上&#xff0c;而數據庫這樣的軟件運行在服務器端&#xff0c;這種Client/Server模式簡…

python云端系統開發入門_Python云端系統開發入門

第01課 初識Django 課時1Django框架介紹 00 : 14 : 33 開始學習 課時2工程搭建1 00 : 28 : 50 開始學習 課時3工程搭建2 00 : 13 : 22 開始學習 第02課 請求和響應的處理 課時1獲取請求url的參數 00 : 07 : 57 開始學習 課時2獲取請求url的查詢字符串 00 : 12 : 01 開始學習 課…

IBM 安全部門 CTO:AI 必須被重新定義為“增強智能”

編者按&#xff1a;隨著人工智能的發展&#xff0c;人們對它逐漸有誤會、恐懼之心。如果能夠利用好人工智能&#xff0c;特別是在網絡安全領域&#xff0c;它將成為人類對抗網絡犯罪強有力的武器。IBM 安全部門的 CTO Sandy Bird 認為現在的人工智能應該被重新定義為“增強智能…

【Nginx】通過反向代理配置本地圖床功能

安裝nginx sudo apt-get install nginx配置nginx.conf sudo vim /etc/nginx/nginx.conf worker_processes auto; pid /run/nginx.pid;events {worker_connections 768;# multi_accept on; }http {sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash…

構建之法第二章

單元測試&#xff1a;一個開發人員要面對測試一個單元時只給出單元的代碼而沒有規格說明這樣吃力不討好的任務.你怎樣做才會有更多的收獲,而不僅僅是發現編譯器的Bug?第一步是理解這個單元原本要做什么, --- 不是它實際上做了什么. 比較有效的方法是倒推出一個概要的規格說明.…

幀內預測模式提取

if (input->rdopt) { int mb_available_up; int mb_available_left; int mb_available_up_left; min_rdcost max_rdcost; // precompute all new chroma intra prediction modes // 對色度進行幀內預測 IntraChromaPredict…

Django簡介以及安裝

Django簡介 1. 認識Django Django是一個高級的Python Web框架&#xff0c;它鼓勵快速開發和清潔&#xff0c;務實的設計。由經驗豐富的開發人員構建&#xff0c;它負責Web開發的許多麻煩&#xff0c;因此您可以專注于編寫應用程序&#xff0c;而無需重新創建輪子。它是免費的…

python基礎筆試面試題_python基礎面試常見題

Python是目前市面上&#xff0c;我個人認為是最簡潔、最優雅、最有前途、最全能的編程語言&#xff0c;沒有之一。 2、通過什么途徑學習的Python&#xff1f; 通過自學&#xff0c;包括網上查看一些視頻&#xff0c;購買一些相關專業的書籍。 3、Python和Java、PHP、C、C#、C等…

django-rest-swagger顯示接口備注內容

Swagger是一個API開發者的工具框架&#xff0c;用於生成、描述、調用和可視化RESTful風格的Web服務。總體目標是使客戶端和文件系統服務器以同樣的速度來更新&#xff0c;方法&#xff0c;參數和模型緊密集成到服務器端的代碼中&#xff0c;允許API始終保持同步。 在使用 djan…

安全和連接是IoT聯網設備2大挑戰

IoT正在推動500億個聯網設備在未來10年內從工業、零售、智能照明、智慧城市、汽車、農業、可穿戴設備、智能建筑、醫療市場涌現出來&#xff0c;ARM處理器部門市場營銷總監Ian Smythe表示&#xff1a;“到2020年&#xff0c;消費電子和健康、智慧城市和物流、汽車和運輸領域的I…

windows下部署免費ssl證書(letsencrypt)

隨著網絡的發展&#xff0c;網絡安全也越來越重要&#xff0c;對于網站來說&#xff0c;從Http升級到https也是我們要做的首要事情。要實現https&#xff0c;首先我們需要申請一張SSL證書&#xff0c;這篇文章我主要介紹下邊這幾個方面&#xff1a; 1. SSL簡單介紹 2. 免費Lete…

Django之URLconf路由

URLconf路由 一個干凈優雅的URL方案是高質量Web應用程序中的一個重要細節。 Django可以讓你設計URL&#xff0c;無論你想要什么&#xff0c;沒有框架限制。 要為應用程序設計URL&#xff0c;您可以非正式地創建一個名為URLconf&#xff08;URL配置&#xff09;的Python模塊。…

python中什么是關鍵字參數_如何使用python語言中函數的關鍵字參數的用法

一般情況下&#xff0c;在調用函數時&#xff0c;使用的是位置參數&#xff0c;即是按照參數的位置來傳值&#xff1b;關鍵字參數是按照定義函數傳入的參數名稱來傳值的。那么&#xff0c;關鍵字參數怎么使用&#xff1f;工具/原料 python pycharm 截圖工具 WPS 方法/步驟 1 打…

HTML塊級元素

在HTML5出現之前&#xff0c;人們一般把元素分為塊級、內聯和內聯塊元素。本文將詳細介紹HTML塊級元素h標題(Heading)元素有六個不同的級別&#xff0c;<h1>是最高級的&#xff0c;而<h6>則是最低的。一個標題元素能簡要描述該節的主題從<h1>到<h6>&am…

【SSL】HTTPS配置全過程

服務器配置https協議 HTTPS&#xff0c;是以安全為目標的HTTP通道&#xff0c;簡單講是HTTP的安全版。即HTTP下加入SSL層&#xff0c;HTTPS的安全基礎是SSL&#xff0c;因此加密的詳細內容就需要SSL。 配置HTTPS就需要證書&#xff0c;關于證書方面不做過多解釋&#xff0c;只…

iOS開發UI篇—懶載入

iOS開發UI篇—懶載入 1.懶載入基本 懶載入——也稱為延遲載入&#xff0c;即在須要的時候才載入&#xff08;效率低&#xff0c;占用內存小&#xff09;。所謂懶載入&#xff0c;寫的是其get方法. 注意&#xff1a;假設是懶載入的話則一定要注意先推斷是否已經有了。假設沒有那…

python之虛擬環境

Virtualenv(虛擬環境) VirtualEnv用于在一臺機器上創建多個獨立的Python虛擬運行環境&#xff0c;多個Python環境相互獨立&#xff0c;互不影響.這樣有很多優點,寶寶們要記住哦,比如: 在沒有權限的情況下安裝新套件 不同應用可以使用不同的套件版本 套件升級不影響其他應用 …

【解決】subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 127

pip list 報錯 Traceback (most recent call last):File "/home/sensetime/.pyenv/versions/3.6.5/bin/pip", line 11, in <module>sys.exit(main())File "/home/sensetime/.pyenv/versions/3.6.5/lib/python3.6/site-packages/pip/_internal/cli/main.p…

輸出四位完全平方數_完全平方數中的規律

PS&#xff1a;很近之前自己收集的資料一個正整數如果是另一個整數的完全平方&#xff0c;那么我們就稱這個數為完全平方數&#xff0c;也叫做平方數。如&#xff1a;0&#xff0c;1&#xff0c;4&#xff0c;9&#xff0c;16&#xff0c;25&#xff0c;36&#xff0c;49&#…