JM8.6中NALU(此处指VCL式的NALU)是如何写进码流的?

2024-02-06 16:38
文章标签 此处 vcl nalu jm8.6 进码

本文主要是介绍JM8.6中NALU(此处指VCL式的NALU)是如何写进码流的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在lencod.c的main函数中调用了encode_one_slice函数,在encode_one_slice函数中调用了frame_picture函数,调用了frame_picture函数后(frame_picture还会继续调用其他重要函数) 就实现了对第一帧的编码,这样全局变量frame_pic就发生了变化,得到了它想得到的码流,现在要写码流,怎么写呢?

      在encode_one_frame中接着就调用到了writeout_picture函数,调用形式是:

writeout_picture (frame_pic);

      可见,把代码码流信息的frame_pic穿进去了,进入writeout_picture函数看看:

static int writeout_picture(Picture *pic)
{Bitstream *currStream;int partition, slice;Slice *currSlice;img->currentPicture=pic;// 遍历slice,通常,一个frame对应一个slicefor (slice=0; slice<pic->no_slices; slice++){currSlice = pic->slices[slice];// 目前都发现currSlice->max_part_nr为1for (partition=0; partition<currSlice->max_part_nr; partition++){currStream = (currSlice->partArr[partition]).bitstream;// currStream->bits_to_go相当于标记,必须为8assert (currStream->bits_to_go == 8);    //! should always be the case, the //! byte alignment is done in terminate_slice// writeUnit函数的第一参数类型是Bitstream*writeUnit (currSlice->partArr[partition].bitstream,partition);}           // partition loop}           // slice loopreturn 0;   
}

      可以看到,把一个picture对应的码流分成slice和数据分块来传给writeUnit的形参(一般认为:一个slice对应一个数据分块),进入到writeUnit函数看看:

static void writeUnit(Bitstream* currStream,int partition)
{NALU_t *nalu;// 实际上currStream->bits_to_go就是一个标记// 如果不为8, 则表明往下继续执行会有错误assert (currStream->bits_to_go == 8);// 分配堆空间, *4是为了安全起见nalu = AllocNALU(img->width*img->height*4);nalu->startcodeprefix_len = 2+(img->current_mb_nr == 0?ZEROBYTES_SHORTSTARTCODE+1:ZEROBYTES_SHORTSTARTCODE);
//printf ("nalu->startcodeprefix_len %d\n", nalu->startcodeprefix_len);nalu->len = currStream->byte_pos +1;            // add one for the first byte of the NALU
//printf ("nalu->len %d\n", nalu->len);// 内存数据复制,这个是最重要的.memcpy (&nalu->buf[1], currStream->streamBuffer, nalu->len-1);// 下面对nalu的一些参数进行赋值// 其实就是对nalu header的8个比特赋值if (img->currentPicture->idr_flag){nalu->nal_unit_type = NALU_TYPE_IDR;nalu->nal_reference_idc = NALU_PRIORITY_HIGHEST;}else if (img->type == B_SLICE){//different nal header for different partitionsif(input->partition_mode == 0){nalu->nal_unit_type = NALU_TYPE_SLICE;}else{nalu->nal_unit_type = NALU_TYPE_DPA +  partition;}if (img->nal_reference_idc !=0){nalu->nal_reference_idc = NALU_PRIORITY_HIGH;}else{nalu->nal_reference_idc = NALU_PRIORITY_DISPOSABLE;}}else   // non-b frame, non IDR slice{//different nal header for different partitionsif(input->partition_mode == 0){nalu->nal_unit_type = NALU_TYPE_SLICE;}else{nalu->nal_unit_type = NALU_TYPE_DPA +  partition;}if (img->nal_reference_idc !=0){nalu->nal_reference_idc = NALU_PRIORITY_HIGH;}else{nalu->nal_reference_idc = NALU_PRIORITY_DISPOSABLE;}}nalu->forbidden_bit = 0; // 必须为0// WriteNALU是指向函数的全局指针(提前赋值了),// 所以要想用鼠标进入WriteNALU“函数”是不可能的// 真正调用到的函数是:WriteAnnexbNALU// 而WriteAnnexbNALU函数就是写码流函数stat->bit_ctr += WriteNALU (nalu); // 写码流FreeNALU(nalu);
}


       不用再进入WriteAnnexbNALU函数了,因为,对这个函数太熟悉了.

这篇关于JM8.6中NALU(此处指VCL式的NALU)是如何写进码流的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

LintCode 778 给定一个m×n的非负矩阵代表一个大洲,矩阵的每个单元格的值代表此处的地形高度,矩阵的左边缘和上边缘是“太平洋”,下边缘和右边缘是“大西洋”。

一、遍历每个点,每个点来一次dfs,结果超时 class Solution {public:/*** @param matrix: the given matrix* @return: The list of grid coordinates*/vector<vector<int>> globalans;vector<vector<int>> pacificAtlantic(vector<ve

JM8.6 的核心编码函数研究

原文转自:http://www.cnblogs.com/xkfz007/articles/2612755.html 摘 要: H.264 编解码软件JM 通常被作为算法研究或者实际应用的平台。理解JM 的程序结构是在其基础上进行进一步研究工作的前提。JM 中的编码函数encode_one_macroblock在程序实现编码算法的过程中起到核心的作用。这篇文章通过对程序中开销计算,关键全局变

JM8.6中的encode_one_macroblock注释

原文转自:http://www.cnblogs.com/xkfz007/archive/2011/04/04/2005286.html 下面是在阅读JM8.6的过程中,对encode_one_macroblock的注释。 /*!  ******************************************************************************

“...”是字段,但此处被当作类型来使用

解决办法很简单,写一个方法,把出问题的语句放到里面就行了

VCL界面组件DevExpress VCL v23.2 - 图表控件增强

DevExpress VCL是DevExpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。 DevExpress VCL v23.2已于日前正式发布,新版本重点增强了图表组件功能等,欢迎下载官方正式版体验! DevExpress VCL

一种快速H.264 NALU快速搜索算法

1. 引言   在播放H.264码流的时候,进行NALU的搜索的效率高低影响着系统的性能。有采用普通逐字节搜索的算法,有利用cpu的simd的单指令多数据操作的并行功能进行搜索的算法,今天要介绍的是一个非常简单而且高效的快速搜索算法,而且不需要利用simd指令,搜索的速度甚至快于我之前开发的simd版本的搜索算法, simd版本可以参考[H264/H265 NALU 起始码搜索性能优化(2)](

笔记:VCL的诞生和设计原理

回顧第一章: 回到從前(framework的產生背景) 第二章 VCL的诞生和设计原理 2.1誕生 chuck jazdzewski,anders heislberg 目標: 16/32混合 單繼承 PME模型 運行/設計期行為 面向對象 開 放 的組件模型 消息分派   采用類/繼承的

卷积通用模型的剪枝、蒸馏---剪枝篇(此处以deeplabv3+为例,可根据模型自行定制剪枝层)

之后的两篇文章是对前段时间工作的一个总结。 一、环境配置 1.1、文章以b导的代码为模板,环境配置比较简单(第二篇蒸馏篇结束后会放置剪枝蒸馏配置好的百度网盘链接),其他算法自行配置,在剪枝之前,需要保证算法能够在本地跑通。 B导链接: https://github.com/bubbliiiing/deeplabv3-plus-pytorch 1.2、安装torch_pruning 在利用剪枝功能前

h264 图像、帧、片、NALU

图像、帧、片、NALU 是学习 H.264的人常常感到困惑的一些概念,我在这里对自己的理解做一些阐述,欢迎大家讨论: H.264 是一次概念的革新,它打破常规, 完全没有 I 帧、P帧、B 帧的概念,也没有 IDR帧的概念。对于 H.264中出现的一些概念从大到小排序依次是: 序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。这里有几点值得说明: (1)、在 H.264协议中 图

H264实时编码及NALU,RTP传输(续)(ZZ)

http://wmnmtm.blog.163.com/blog/static/382457142011920102618122/ H264实时编码及NALU,RTP传输(续)(ZZ)   2011-10-20 10:26:18|  分类:RTP |字号 订阅 对h.264压缩视频码流中i帧的提取(firstime) 2010-06-30 09:15 转载自  f