PartitionMotionSearch()



Outline:

1、 CFG文件中有關多參考幀的相關選項

2、 多參考幀涉及到的數據結構和全局變量

3、 保存重建圖像為參考幀

4、 編碼一幀前,設置參考幀列表

5、 多參考幀的使用(即參考幀的選擇策略問題

6、 遺留問題

1、CFG文件中有關多參考幀的相關選項

############################################################################### #Encoder Control

###############################################################################

NumberReferenceFrames = 10 # Number of previous frames used for inter motion search (1-16)

解釋:

a、 首先通過Configure()轉換成input->num_reference_frames

b、 input->num_reference_frames再通過parset.c文件中的IdentifyNumRefFrames()返回給同一文件的FillParameterSetStructures()中的sps->num_ref_frames。

c、 FillParameterSetStructures()其實被parset.c文件中的GenerateParameterSets()函數調用,所以sps又被賦給了active_sps,active_sps是全局變量。

d、 active_sps->num_ref_frames又會在lencod.c中的init_img()函數中被賦給img->num_reference_frames。

PList0References????? = 0 # P slice List 0 reference override (0 disable, N <= NumberReferenceFrames)

解釋:

用于限制LIST0中參考幀的數目


###############################################################################

# B Frames

###############################################################################

BList0References????? = 0 # B slice List 0 reference override (0 disable, N <= NumberReferenceFrames)

BList1References????? = 0 # B slice List 1 reference override (0 disable, N <= NumberReferenceFrames)

2、 多參考幀涉及到的數據結構和全局變量

a、 概要

多參考幀相關的重要的數據結構都在mbuffer.h文件中。

其中重要的數據結構有:StorblePicture, FrameStore, DecodedPictureBuffer

重要的全局變量有:

extern DecodedPictureBuffer dpb;

extern StorablePicture **listX[6];

extern int listXsize[6];

b、 各數據結構的作用和相互之間的關系

StorblePicture存放的是一幀幀方式或場方式的重建圖像

FrameStore嵌套了StorblePicture,同時增加了一些標志信息,如是否已輸出到文件等,所以它可以用于通用的表示一幀的數據結構(不分場或幀)

DecodedPictureBuffer又嵌套了FrameStore,它用于保存所有的重建圖像(應該保存的),其中設置很多輔助的參數,如used_size用來表示已經保存的重建圖像數。

c、 各全局變量的作用

dpb的作用從上面對DecodedPictureBuffer的解釋中,已經可以看出是用來存儲所有的重建圖像。值的提醒的是它可能保存了非參考幀重建圖像。

listX[6]:該變量的作用是用來在每次編碼一幀圖像時,將所要用到的參考幀保存在其中。但真正所要用到的參考幀圖像數據是指向到dpb對應的結構元素中。

對于P幀,只要用到listX[0]。

對于B幀,要用到listX[0],listX[1]

對于Mbaff的編碼方式,可能還會用到listX[2-5]。

3、?? 保存重建圖像為參考幀

所用到的函數是:void store_picture_in_dpb(StorablePicture* p),mbuffer.c

該函數在image.c的encode_one_frame()的后段被調要到。

其中重要的程序段如下:

// first try to remove unused frames 當緩沖已滿時

if (dpb.used_size==dpb.size)

{

??? remove_unused_frame_from_dpb();//只刪除一幀。這種策略是否有效呢?懷疑???

}

// then output frames until one can be removed

while (dpb.used_size==dpb.size)
{
??? // non-reference frames may be output directly

??? if (!p->used_for_reference) //如果當前幀不作為參卡幀,可以直接輸出到重建序列文件
??? {
??????? get_smallest_poc(&poc, &pos);

??????? if ((-1==pos) || (p->poc < poc))

??????? {

??????????? direct_output(p, p_dec);

??????????? return
??????? }
??? }
??? // flush a frame
??? output_one_frame_from_dpb();//輸出一幀到文件

}

insert_picture_in_dpb(dpb.fs[dpb.used_size],p); //將當前解碼幀插入到dpb尾部

4、 編碼一幀前,設置參考幀列表

所用到的函數是:init_lists(), mbuffer.c

該函數在image.c中的code_a_picture()的開始部分被調用到。

其中重要的程序段如下:(只舉例分析幀模式的情況)

//將dpb中參考幀寫入ListX中去


if ((currSliceType == I_SLICE)||(currSliceType == SI_SLICE))
{
??? listXsize[0] = 0;
??? listXsize[1] = 0;
??? return;
}
if ((currSliceType == P_SLICE)||(currSliceType == SP_SLICE))
{
??? // Calculate FrameNumWrap and PicNum
??? if (currPicStructure == FRAME)
??? {
??????? for (i=0; i<dpb.ref_frames_in_buffer; i++)
??????? {
??????????? if (dpb.fs_ref[i]->is_used==3)
??????????? {
??????????????? if ((dpb.fs_ref[i]->frame->used_for_reference)&&(!dpb.fs_ref[i]->frame->is_long_term))
??????????????? {
??????????????????? listX[0][list0idx++] = dpb.fs_ref[i]->frame;
??????????????? }
??????????? }
??????? }
??????? // order list 0 by PicNum
??????? qsort((void *)listX[0], list0idx, sizeof(StorablePicture*), compare_pic_by_pic_num_desc);
??????? listXsize[0] = list0idx;

}
else//B_SLICE
{
??? …
}
5、 多參考幀的使用(即參考幀的選擇策略問題)

所用到的函數是:PartitionMotionSearch(), mv_search.c 該函數的作用是對各種尺寸的宏塊或亞宏塊尋找匹配塊。

其中涉及到多參考幀的程序段如下:

//===== LOOP OVER REFERENCE FRAMES =====
for (list=0; list<numlists;list++)
{
??? for (ref=0; ref < listXsize[list+list_offset]; ref++)//list_offset和場模式有關

??? {

NOTE:從上面的程序可以看出,JM8.5對多參考幀的選擇,是采用的是一種完全遍歷的方式,所以其計算復雜度會很高。

6、 遺留問題

a、 在init_lists()對于ListX[0]和ListX[1]中參考幀數相同時,會采用一種交換機制,不知其目的如何?

b、 dpb的參考幀有short_term或long_term這樣的屬性,這屬性會影響多參考幀機制的整個過程,但不知其具體作用和原理?


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhoujunming/archive/2008/07/31/2747316.aspx

?

PartitionMotionSearch()函數&&宏塊分割

encode_one_macroblock()函數中的運動估計分為兩大塊,對于宏塊級的三種模式,分塊后直接對patition依次調用PartitionMotionSearch()函數;而對于亞宏塊級的(含8x8, 8x4,4x8,4x4)模式,首先將宏塊拆分為4個8×8子宏塊,針對每個8×8子宏塊調用PartitionMotionSearch()函數。

void
PartitionMotionSearch (int??? blocktype, //塊模式
?????????????????? int??? block8x8, //當前partition在宏塊的序號
?????????????????? double lambda)?? // λ
{
static int bx0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,2,0,2}};
static int by0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,0,0,0}, {0,0,2,2}}; //參見注釋[1]
int?? **ref_array, ***mv_array; //參考幀列表和運動向量列表
int?? parttype = (blocktype<4?blocktype:4);
int?? step_h0?? = (input->blc_size[ parttype][0]>>2);
int?? step_v0?? = (input->blc_size[ parttype][1]>>2);
//partition的尺寸,用于決定block的邊界,對非P8×8模式無意義。
int?? step_h??? = (input->blc_size[blocktype][0]>>2); //子塊的尺寸
int?? step_v??? = (input->blc_size[blocktype][1]>>2);
int?? v, h; // BlockMotionSearch()函數要處理的子塊在當前宏塊中的相對塊坐標
//以上尺寸全部以4×4block為單位

numlists=bslice?2:1;
for (list=0; list
{
for (ref=0; ref < listXsize[list+list_offset]; ref++)
{
ref_array = enc_picture->ref_idx[list];
??? mv_array = enc_picture->mv[list];
//遍歷partition中的每一個
for (v=by0[parttype][block8x8]; v??????? {
????????? pic_block_y = img->block_y + v;// 當前子塊在圖像中的塊坐標=當前宏塊的塊坐標+當前子塊在宏塊中的相對塊坐標
????????? for (h=bx0[parttype][block8x8]; h????????? {
??????????? pic_block_x = img->block_x + h; // 當前子塊在圖像中的塊坐標=當前宏塊的塊坐標+當前子塊在宏塊中的相對塊坐標
??????????? mcost = BlockMotionSearch (ref, list, h<<2, v<<2, blocktype, search_range, lambda); //對當前子塊作運動向量搜索
??????????? motion_cost[blocktype][list][ref][block8x8] += mcost; //保存代價值
???????????
????????? for (j=0; j
???????????? for (i=0; i
???????????? {
???????? mv_array [pic_block_x+i][pic_block_y+j][0] = img->all_mv[h][v][list][ref][blocktype][0];
???????? mv_array [pic_block_x+i][pic_block_y+j][1] = img->all_mv[h][v][list][ref][blocktype][1];
//以4×4block為單位保存運動向量
???????? ref_array [pic_block_x+i][pic_block_y+j]??? = ref;
//保存參考幀序號
???????????? }
????????? }
?????? }
??? }
}
}
[1] static int bx0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,2,0,2}};
??? static int by0[5][4] = {{0,0,0,0}, {0,0,0,0}, {0,2,0,0}, {0,0,0,0}, {0,0,2,2}};
這里的bx0, by0兩個數組分別對應了SKIP模式,16×16,16×8,8×16,P8×8這四種模式的橫坐標和縱坐標。舉兩個例子
如圖所示的16×16宏塊,首先劃分為4個8×8子塊(因為PartitionMotionSearch()函數處理的最小塊的尺寸為8×8),以4×4block為單位設定坐標,圖上已標出4個8×8子塊左上角的塊坐標。SKIP模式實際上并不牽涉到這個函數,因此坐標全部置零;16×16模式只有第一個坐標起作用,后三個置零;16×8只有前兩個有意義,標出兩個partition的左上角坐標,如圖標出了(0,0),(0,2),對照bx0, by0可以看到相應坐標值;最多子塊情況為4個8×8,即最后一組坐標。

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhoujunming/archive/2008/09/11/2915084.aspx

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

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

相關文章

bat 發送post請求_get post 請求

HTTP是一個基于TCP/IP來傳遞數據的通信協議。1.GET和POST請求的區別&#xff1f;a: GET/POST本質上都是TCP鏈接&#xff0c;GET傳body和POST拼參數&#xff0c;理論上都是可行的。b: 實際上HTTP協議對URL長度是沒有限制的&#xff1b;限制URL長度大多數是瀏覽器或者服務器的配置…

Safengine Android so加密

公司讓我找一個可以對android&#xff0c;嵌入式和Linux x86平臺的so庫進行加密的工具&#xff0c;我看搞了兩天這個工具&#xff0c;反正也沒用上&#xff0c;就把教程發出來了 下載地址&#xff1a;http://www.safengine.com/mobile/download.html 使用方法&#xff1a; 我使…

boltdb 學習和實踐

golang boltdb的學習和實踐 1. 安裝 go get github.com/boltdb/bolt 2.創建和啟動數據庫 db, err : bolt.Open("my.db", 0600, nil) 其中open的第一個參數為路徑,如果數據庫不存在則會創建名為my.db的數據庫&#xff0c; 第二個為文件操作&#xff0c;第三個參數是可…

【django】使用django-crontab執行django自定義指令

django-crontab 部署 需求&#xff1a;再指定的時間內輸入django的自定義指令&#xff0c;來進行一些需求的操作。 使用流程: 1.安裝&#xff1a; pip install django-crontab 2.配置 settings.py文件: 再settings.py 文件中添加 django-crontab: INSTALLED_APPS (...django…

濾波問題匯總

1。A:JM86里面,GetStrength這個函數中下面這個數組有什么作用呢??byte BLK_NUM[2][4][4] {{{0,4,8,12},{1,5,9,13},{2,6,10,14},{3,7,11,15}},{{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}} ;blk_y (mb_y<<2) (blkQ >> 2) ;blk_x (mb_x<<2)…

redis基本類型和使用

redis存儲數據的基本類型有&#xff1a;string&#xff08;字符串類型&#xff09;、hash&#xff08;散列類型&#xff09;、list&#xff08;列表類型&#xff09;、set&#xff08;集合類型&#xff09;、zset&#xff08;有序集合類型&#xff09;。 依次做一些練習。redis…

Python與MySQL數據庫連接

Python3 MySQL 數據庫連接 MySQL 可應用于多種語言&#xff0c;包括 PERL, C, C, JAVA 和 PHP 什么是 PyMySQL&#xff1f; PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務器的一個庫&#xff0c;Python2中則使用mysqldb。 PyMySQL 遵循 Python 數據庫 API v2.0 規范&a…

mysql 日志_MySQL日志系統

MySQL日志系統MySQL有兩個重要的日志系統&#xff0c;分別是 redo log (重做日志) 和 bin log (歸檔日志) 。這兩種日志有以下三點不同。redo log 是 InnoDB 引擎特有的&#xff1b;binlog 是 MySQL 的 Server 層實現的&#xff0c;所有引擎都可以使用。redo log 是物理日志&am…

盛大游戲杯第十五屆上海大學程序設計聯賽暨上海金馬五校賽

編程1小時&#xff0c;提交4小時 做這種比賽一定要選一個好OJ啊 黑白圖像直方圖 發布時間: 2017年7月8日 21:00 最后更新: 2017年7月8日 22:38 時間限制: 1000ms 內存限制: 128M 描述 在一個矩形的灰度圖像上&#xff0c;每個像素點或者是黑色的或者是白色的。黑色像素點…

對幾個重要問題的闡述

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

【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…