Jm 18.4 MVC 报告一
JM18.4 支持双目视差结构的立体视频,ProfileIDC = 128为Stereo High Profile。 两视点的.yuv文件经JM18.4编码生成的是一个.264文件。
提到High Profile H.264解码许多人并不了解,那么到底什么是High Profile H.264解码?其应用效果又是如何呢?
作为行业标准,H.264编码体系定义了4种不同的Profile(类):Baseline(基线类), Main(主要类), Extended(扩展类)和High Profile(高端类)(它们各自下分成许多个层):
Baseline Profile 提供I/P帧,仅支持progressive(逐行扫描)和CAVLC;
MVC报告一
视频ballroom的帧数为250帧,这里只对每个YUV视频的前13帧编码压缩的具有26帧的264文件进行解码。
264文件大小:97.3KB 解码成两个5.71M的YUV文件
一、MVC解码配置文件
首先,配置文件.cfg 的选择,为bin 目录下的decoder_stereo.cfg文件
在工程中配置如下:属性-》调试-》命令参数和工作目录:
打开decoder_stereo.cfg 文件看看参数的设置
InputFile = "ballroom.264" # H.264/AVC coded bitstream
OutputFile = "ballroom_dec.yuv" # Output file, YUV/RGB
RefFile = “ballroom_rec.yuv” # Ref sequence (for SNR)
Decode.cfg中: 2D
DecodeAllLayers = 0 # Decode all views (-mpr)
decoder_stereo.cfg中:MVC 3D
DecodeAllLayers = 1 # Decode all views (-mpr)
这里的1是指解码所有的视点
这里的视点只有viewId0 和 viewId1 两个视点
JM只能对双视点视频进行编码,因此在JM对264文件进行解码的时候,解码出来的也是两个YUV文件。
二、JM代码
这里我是单步跟踪,对代码中不明白的地方进行百度,然后注释,所以看的比较慢。截止到昨天晚上我看到的地方是parset.c 文件中InterpretSPS 函数。在跟踪的过程中对MVC有关的地方都挑了出来。
暂时对预测模式等部分代码还没有看到,还不熟。
进入decoder_test.c 文件,单步到iRet = OpenDecoder(&InputParams);进入:
在int OpenDecoder(InputParameters *p_Inp)中
if (p_Inp->DecodeAllLayers == 1)
//DecodeAllLayers == 1表示输入的视频是MVC多视点视频
{
OpenOutputFiles(p_Vid, 0, 1);//MVC
}
注意这里传递的参数:0,1 分别表示:视点0 和 视点1
这里是进行MVC输出设置
单步进入:OpenOutputFiles(p_Vid, 0, 1)
在ldecod.c文件中:
#if (MVC_EXTENSION_ENABLE)
//#define MVC_EXTENSION_ENABLE 1 //defines.h(49):# enable support for the Multiview High Profile 支持多视点高端类
void OpenOutputFiles(VideoParameters *p_Vid, int view0_id, int view1_id)
//JM18.4中MVC两路视频view0,view1
{
char out_ViewFileName[2][FILE_NAME_SIZE],
//输出视点文件名
sprintf(out_ViewFileName[0], "%s_ViewId%04d.yuv", chBuf, view0_id);
//视点 0 %04d :表示view0_id的值占四位:不足四位用填充。
sprintf(out_ViewFileName[1], "%s_ViewId%04d.yuv", chBuf, view1_id);
//视点1
}
#endif
然后就是回到decoder_test.c 文件,开始解码:
DecodeOneFrame(&pDecPicList);
do
{
iRet = Dec
decodeOneFrame(&pDecPicList);
}
int decode_one_frame(DecoderParams *pDecoder)
{
current_header = read_new_slice(currSlice);
}
int read_new_slice(Slice *currSlice)
{
for (;;)
{
if (0 == read_next_nalu(p_Vid, nalu))
return EOS;
{
int read_next_nalu(VideoParameters *p_Vid, NALU_t *nalu)
{
switch( p_Inp->FileFormat {
case PAR_OF_ANNEXB:
ret = get_annex_b_NALU(p_Vid, nalu, p_Vid->annex_b);
break;
{
int get_annex_b_NALU (VideoParameters *p_Vid, NALU_t *nalu, ANNEXB_t *annex_b)
{//此函数的主要作用是:从一个NAL单元中识别出startcodeprefix,通过去除这些信息从而剥离出NAL单元中真正有用的码流部分,并存储,最后返回整个NAL码流文件的长度。
nalu->len = pos - LeadingZero8BitsCount;//10=14-4
fast_memcpy (nalu->buf, annex_b->Buf + LeadingZero8BitsCount, nalu->len);
//00 00 00 01 _g _d _ _ _ _ _ _ _ _
nalu->forbidden_bit = (*(nalu->buf) >> 7) & 1;//*(nalu->buf) =‘g’=01100111
nalu->nal_unit_type = (NaluType) ((*(nalu->buf)) & 0x1f);
//nalucommon.h NALU_TYPE_SPS = 7,
结论:因此:解码比特流时,首先需要解码的SPS中的句法元素。
process_nalu:
switch (nalu->nal_unit_type)
{/*
switch 语句中包括对一般slice 的处理对IDR 的处理对DP1、DPB、DPC 的处理包括对SPS、PPS 的处理
解码器现在遇到的第一个NALU 是SPS 因此解码器经过解析之后的nal_unit_type 的值必然为7 解码器就会跳转到case NALU_TYPE_SPS
case NALU_TYPE_SPS:
ProcessSPS(p_Vid, nalu);
//该函数中最重要的函数是InterpretSPS
{
void ProcessSPS (VideoParameters *p_Vid, NALU_t *nalu)
{
InterpretSPS (p_Vid, dp, sps);
{
int InterpretSPS (VideoParameters *p_Vid, DataPartition *p, seq_parameter_set_rbsp_t *sps)
{
sps->profile_idc = read_u_v (8, "SPS: profile_idc" , s, &p_Dec->UsedBits);//序列参数集的语义:profile_idc指明所用的profile
// sps->profile_idc = 100 = FREXT_HP :HP:high profile 高端类
按照规定的顺序挨着解码每个语法元素
sps->constrained_set0_flag = read_u_1 ( "SPS: constrained_set0_flag" , s, &p_Dec->UsedBits);//UsedBits=8
sps->constrained_set1_flag = read_u_1 ( "SPS: constrained_set1_flag" , s, &p_Dec->UsedBits);//UsedBits=9
}
这个过程就和解码普通的AVC视频差不多了。这周由于边看边注释,所以只能搞到这了。下周再接再厉。。。
Jm 18.4 MVC 报告一相关推荐
- 《Spring 5 官方文档》18. Web MVC 框架(五)
自定义WebDataBinder初始化 要通过Spring定制与PropertyEditor的请求参数绑定 WebDataBinder,可以使用@InitBinder控制器中的-annotated @ ...
- NO.18 使用MVC实现的hello world!
为什么80%的码农都做不了架构师?>>> 在上一篇博文中,我们实现了hello world的输出,在这一 篇 里面,我们将向你展示如何利用mvc的结构来实现hello worl ...
- [JZOJ 5911] [NOIP2018模拟10.18] Travel 解题报告 (期望+树形DP)
题目链接: http://172.16.0.132/senior/#contest/show/2530/1 题目: EZ同学家里非常富有,但又极其的谦虚,说话又好听,是个不可多得的人才. ...
- DLNU weekly(May 18,2013)解题报告
找到了草稿箱里,我大学写的博客,但是我发现已经看不懂了,大坑.自从工作后,我已经好长时间没有A题了.依稀记得我大学寝室的标语是 ,"今天你AC了吗?".看到"川神兽&qu ...
- scrum立会报告+燃尽图(第三周第七次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2286 项目地址:https://coding.net/u/wuyy694 ...
- scrum立会报告+燃尽图(第二周第六次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2251 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公冶 ...
- 可以跟风不看好瑞幸,但真该相信浑水这份方法论偏差的报告吗?
文|曾响铃 来源|科技向令说(xiangling0815) 能在疫情的信息海洋中冒出头,一度成为业界关注焦点的东西不多,浑水做空瑞幸咖啡算是其中之一. 专门盯住中概股搞事情的浑水公司,以一份报告搅得瑞 ...
- scrum立会报告+燃尽图(第三周第二次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://coding.net/u/wuyy694 ...
- scrum立会报告+燃尽图(第三周第三次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2286 项目地址:https://coding.net/u/wuyy694 ...
最新文章
- word2013 blog test
- eclipse安装maven插件
- 区块链浏览器_欧科云链OKLink区块链浏览器,如何挖掘数据背后的价值?
- 群组密钥交换的新方法研究与分析【会议】
- cxgrid限定行数
- pku3670 Eating Together
- java 校验的接口中的字符必须是半角的_初识Java,笔记1
- 【ExtJs】获取grid选中的records
- [通用]汉字按照拼音字母排序
- dnmp一键部署搞定的php开发环境基于Docker的LNMP一键安装程序
- 1.2 XML 的基本语法
- ant design中Button与button点击事件
- win10安装的虚拟机无法连接网络
- 苹果手机相机九宫格怎么设置_瞧不起iPhone相机?苹果手机5个逆天拍照功能,效果惊艳堪比单反...
- nginx 开机启动报错An error occurred.
- aix 查询db2客户端版本_怎么看DB2的版本啊?
- vue3 不推荐使用index作为v-for遍历的key
- IDEA快捷键大全,各类IDEA快捷键
- 苹果画画软件_iPad Pro绘画软件Procreate零基础教程
- ubuntu关机命令合集
热门文章
- 小米NFC手机 手环 复制加密IC门禁卡
- 单用户MIMO系统(二):信道信息在发端未知
- 你又知不知道,日有所思,夜有所梦。
- CAN总线的EMC设计方案
- 树莓派linux led字符设备驱动(原子操作)
- css svg做动图,用svg动态绘制图形
- 集成百度ORC 识别报 Fatal signal 11 (SIGSEGV) (RenderThread) 错误(已解决)
- 电脑出现All boot options are trled.黑屏不能开机解决方法
- php x.509,php – 解析X509证书
- 基于CNONIX国家标准的出版社ERP系统建设分享