x264源码分析三:x264_slices_write和x264_slice_write函数分析

2024-08-21 16:18

本文主要是介绍x264源码分析三:x264_slices_write和x264_slice_write函数分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面将分析x264编码的核心算法部分:

首先先了解一下x264中比特流的层次结构:每个比特都隶属于某个句法元素,句法元素被组织成有层次的结构,分别描述各个层次的信息。如下图所示:


x264分层结构由五层组成,分别是序列参数集、图像参数集、片(Slice)、和宏块和子块。参数集是一个独立的数据单位,不依赖于参数集外的其它句法元素。下图描述了参数集与参数集外的句法元素之间的关系。


而本文所要分析的就是对应的片编码。下面看源代码:

static void *x264_slices_write( x264_t *h )
{int i_slice_num = 0;int last_thread_mb = h->sh.i_last_mb;/* init stats *///初始化一些状态memset( &h->stat.frame, 0, sizeof(h->stat.frame) );h->mb.b_reencode_mb = 0;//循环每一个slicewhile( h->sh.i_first_mb + SLICE_MBAFF*h->mb.i_mb_stride <= last_thread_mb ){h->sh.i_last_mb = last_thread_mb;if( !i_slice_num || !x264_frame_new_slice( h, h->fdec ) ){if( h->param.i_slice_max_mbs ){if( SLICE_MBAFF ){// convert first to mbaff form, add slice-max-mbs, then convert back to normal formint last_mbaff = 2*(h->sh.i_first_mb % h->mb.i_mb_width)+ h->mb.i_mb_width*(h->sh.i_first_mb / h->mb.i_mb_width)+ h->param.i_slice_max_mbs - 1;int last_x = (last_mbaff % (2*h->mb.i_mb_width))/2;int last_y = (last_mbaff / (2*h->mb.i_mb_width))*2 + 1;h->sh.i_last_mb = last_x + h->mb.i_mb_stride*last_y;}else{h->sh.i_last_mb = h->sh.i_first_mb + h->param.i_slice_max_mbs - 1;if( h->sh.i_last_mb < last_thread_mb && last_thread_mb - h->sh.i_last_mb < h->param.i_slice_min_mbs )h->sh.i_last_mb = last_thread_mb - h->param.i_slice_min_mbs;}i_slice_num++;}else if( h->param.i_slice_count && !h->param.b_sliced_threads ){int height = h->mb.i_mb_height >> PARAM_INTERLACED;int width = h->mb.i_mb_width << PARAM_INTERLACED;i_slice_num++;h->sh.i_last_mb = (height * i_slice_num + h->param.i_slice_count/2) / h->param.i_slice_count * width - 1;}}h->sh.i_last_mb = X264_MIN( h->sh.i_last_mb, last_thread_mb );//利用函数指针进行具体的块编码操作if( x264_stack_align( x264_slice_write, h ) )goto fail;h->sh.i_first_mb = h->sh.i_last_mb + 1;// if i_first_mb is not the last mb in a row then go to the next mb in MBAFF orderif( SLICE_MBAFF && h->sh.i_first_mb % h->mb.i_mb_width )h->sh.i_first_mb -= h->mb.i_mb_stride;}return (void *)0;fail:/* Tell other threads we're done, so they wouldn't wait for it */if( h->param.b_sliced_threads )x264_threadslice_cond_broadcast( h, 2 );return (void *)-1;
}

下面分析具体的块编码函数源代码:

static intptr_t x264_slice_write( x264_t *h )
{int i_skip;int mb_xy, i_mb_x, i_mb_y;/* NALUs other than the first use a 3-byte startcode.* Add one extra byte for the rbsp, and one more for the final CABAC putbyt

这篇关于x264源码分析三:x264_slices_write和x264_slice_write函数分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093657

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数