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

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

pandas使用apply函数给表格同时添加多列

《pandas使用apply函数给表格同时添加多列》本文介绍了利用Pandas的apply函数在DataFrame中同时添加多列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、Pandas使用apply函数给表格同时添加多列二、应用示例一、Pandas使用apply函

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java多种文件复制方式以及效率对比分析

《Java多种文件复制方式以及效率对比分析》本文总结了Java复制文件的多种方式,包括传统的字节流、字符流、NIO系列、第三方包中的FileUtils等,并提供了不同方式的效率比较,同时,还介绍了遍历... 目录1 背景2 概述3 遍历3.1listFiles()3.2list()3.3org.codeha

Python中Namespace()函数详解

《Python中Namespace()函数详解》Namespace是argparse模块提供的一个类,用于创建命名空间对象,它允许通过点操作符访问数据,比字典更易读,在深度学习项目中常用于加载配置、命... 目录1. 为什么使用 Namespace?2. Namespace 的本质是什么?3. Namesp

MySQL中如何求平均值常见实例(AVG函数详解)

《MySQL中如何求平均值常见实例(AVG函数详解)》MySQLavg()是一个聚合函数,用于返回各种记录中表达式的平均值,:本文主要介绍MySQL中用AVG函数如何求平均值的相关资料,文中通过代... 目录前言一、基本语法二、示例讲解1. 计算全表平均分2. 计算某门课程的平均分(例如:Math)三、结合

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse