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.mzph.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…