文档章节

解析264SPS获取分辨率

xxdd
 xxdd
发布于 2017/05/23 15:30
字数 472
阅读 12
收藏 0
点赞 0
评论 0
#include <math.h>


UINT Ue(BYTE *pBuff, UINT nLen, UINT &nStartBit)
{
	//计算0bit的个数
	UINT nZeroNum = 0;
	while (nStartBit < nLen * 8)
	{
		if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8))) //&:按位与,%取余
		{
			break;
		}
		nZeroNum++;
		nStartBit++;
	}
	nStartBit ++;

	//计算结果
	DWORD dwRet = 0;
	for (UINT i=0; i<nZeroNum; i++)
	{
		dwRet <<= 1;
		if (pBuff[nStartBit / 8] & (0x80 >> (nStartBit % 8)))
		{
			dwRet += 1;
		}
		nStartBit++;
	}
	return (1 << nZeroNum) - 1 + dwRet;
}


int Se(BYTE *pBuff, UINT nLen, UINT &nStartBit)
{
	int UeVal=Ue(pBuff,nLen,nStartBit);
	double k=UeVal;
	int nValue=ceil(k/2);//ceil函数:ceil函数的作用是求不小于给定实数的最小整数。ceil(2)=ceil(1.2)=cei(1.5)=2.00
	if (UeVal % 2==0)
		nValue=-nValue;
	return nValue;


}

DWORD u(UINT BitCount,BYTE * buf,UINT &nStartBit)
{
	DWORD dwRet = 0;
	for (UINT i=0; i<BitCount; i++)
	{
		dwRet <<= 1;
		if (buf[nStartBit / 8] & (0x80 >> (nStartBit % 8)))
		{
			dwRet += 1;
		}
		nStartBit++;
	}
	return dwRet;
}


/************************************************************************/
/* 解析SPS获取分辨率
  buf:除去00 00 00 01之后的部分,从67开始                              */
/************************************************************************/
bool h264_decode_seq_parameter_set(BYTE * buf,UINT nLen,int &Width,int &Height)
{
	UINT StartBit=0; 
	int forbidden_zero_bit=u(1,buf,StartBit);
	int nal_ref_idc=u(2,buf,StartBit);
	int nal_unit_type=u(5,buf,StartBit);
	if(nal_unit_type==7)
	{
		int profile_idc=u(8,buf,StartBit);
		int constraint_set0_flag=u(1,buf,StartBit);//(buf[1] & 0x80)>>7;
		int constraint_set1_flag=u(1,buf,StartBit);//(buf[1] & 0x40)>>6;
		int constraint_set2_flag=u(1,buf,StartBit);//(buf[1] & 0x20)>>5;
		int constraint_set3_flag=u(1,buf,StartBit);//(buf[1] & 0x10)>>4;
		int reserved_zero_4bits=u(4,buf,StartBit);
		int level_idc=u(8,buf,StartBit);

		int seq_parameter_set_id=Ue(buf,nLen,StartBit);

		if( profile_idc == 100 || profile_idc == 110 ||
			profile_idc == 122 || profile_idc == 144 )
		{
			int chroma_format_idc=Ue(buf,nLen,StartBit);
			if( chroma_format_idc == 3 )
				int residual_colour_transform_flag=u(1,buf,StartBit);
			int bit_depth_luma_minus8=Ue(buf,nLen,StartBit);
			int bit_depth_chroma_minus8=Ue(buf,nLen,StartBit);
			int qpprime_y_zero_transform_bypass_flag=u(1,buf,StartBit);
			int seq_scaling_matrix_present_flag=u(1,buf,StartBit);

			int seq_scaling_list_present_flag[8];
			if( seq_scaling_matrix_present_flag )
			{
				for( int i = 0; i < 8; i++ ) {
					seq_scaling_list_present_flag[i]=u(1,buf,StartBit);
				}
			}
		}
		int log2_max_frame_num_minus4=Ue(buf,nLen,StartBit);
		int pic_order_cnt_type=Ue(buf,nLen,StartBit);
		if( pic_order_cnt_type == 0 )
			int log2_max_pic_order_cnt_lsb_minus4=Ue(buf,nLen,StartBit);
		else if( pic_order_cnt_type == 1 )
		{
			int delta_pic_order_always_zero_flag=u(1,buf,StartBit);
			int offset_for_non_ref_pic=Se(buf,nLen,StartBit);
			int offset_for_top_to_bottom_field=Se(buf,nLen,StartBit);
			int num_ref_frames_in_pic_order_cnt_cycle=Ue(buf,nLen,StartBit);

			int *offset_for_ref_frame=new int[num_ref_frames_in_pic_order_cnt_cycle];
			for( int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
				offset_for_ref_frame[i]=Se(buf,nLen,StartBit);
			delete [] offset_for_ref_frame;
		}
		int num_ref_frames=Ue(buf,nLen,StartBit);
		int gaps_in_frame_num_value_allowed_flag=u(1,buf,StartBit);
		int pic_width_in_mbs_minus1=Ue(buf,nLen,StartBit);
		int pic_height_in_map_units_minus1=Ue(buf,nLen,StartBit);

		Width=(pic_width_in_mbs_minus1+1)*16;
		Height=(pic_height_in_map_units_minus1+1)*16;

		return true;
	}
	else
		return false;
}

 

© 著作权归作者所有

共有 人打赏支持
xxdd
粉丝 3
博文 50
码字总数 12688
作品 0
海淀
程序员
如何下载YouTube 4K视频

从720P到1080P再到2K和4K,我们对分辨率的追求无止境!4K分辨率,即2160P,4096×2160像素,其中4096表示水平方向的像素数,2160表示垂直方向的像素数。4K分辨率拥有超精细的画面,可提供880...

zuokanni ⋅ 05/29 ⋅ 0

Android二维码扫描开发(一):实现思路与原理

Android二维码扫描开发(一):实现思路与原理 Android二维码扫描开发(二):YUV图像格式详解 Android二维码扫描开发(三):zxing库的使用及图像亮度信息提取 现在二维码已经非常普及了,那...

微笑的江豚 ⋅ 2016/08/24 ⋅ 0

Python抖音机器人,论如何在抖音上找到漂亮小姐姐?

最近沉迷于抖音无法自拔,常常花好几个小时在抖音漂亮小姐姐身上。 为了高效、直接地找到漂亮小姐姐,我用 Python + ADB 做了一个 Python 抖音机器人 Douyin-Bot。 特性 [x] 自动翻页 [x] 颜...

u012123989 ⋅ 05/28 ⋅ 0

手把手:用Python实现颜值识别,帮你在抖音找到漂亮小姐姐

     大数据文摘授权转载自舒林笑笑生   作者:王松   最近沉迷于抖音无法自拔,常常连续花好几个小时在抖音漂亮小姐姐身上。   手动寻找费时费力,为了高效、直接地找到漂亮小姐姐...

大数据文摘 ⋅ 05/30 ⋅ 0

BitmapFactory.Options学习笔记

1,android分辨率为240 × 320,densityDpi为120; 2,android分辨率为320 x 480,densityDpi为160; 3,android分辨率为480 x 800或者480 x 854,densityDpi为240; 4,android分辨率为720...

蚂蚁的世界 ⋅ 2015/07/01 ⋅ 0

「LYIconfont」快捷设置iconfont的工具类

在刚刚接触的时候,每次涉及到、等绘制工作时,都觉得无比繁琐。因为我们需要将尺寸合适的图片格式的素材加入到项目中,设置一系列冗杂的UIImageView相关设置。当然,如果需要在不同分辨率下...

halohily ⋅ 2017/08/04 ⋅ 0

手机影音第十七天,实现歌词同步

代码已托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 效果图: 有一个小的遗憾,就是该MP3文件和歌词文件要在同一路径下,才能读取到歌词,否则读...

老婆的宝宝 ⋅ 2017/07/31 ⋅ 0

datayy/doudouBot

如何在抖音上找到漂亮小姐姐----抖音机器人 最近沉迷于抖音无法自拔,常常花好几个小时在抖音漂亮小姐姐身上。 为了高效、直接地找到漂亮小姐姐,我用 Python + ADB 做了一个 Python 抖音机器...

datayy ⋅ 06/08 ⋅ 0

福利!用Python写一个抖音漂亮小姐姐发掘器(附代码教程)

最近沉迷于抖音无法自拔,常常连续花好几个小时在抖音漂亮小姐姐身上。 手动寻找费时费力,为了高效、直接地找到漂亮小姐姐,我用 Python + ADB 做了一个 Python 抖音机器人 Douyin-Bot。自动...

技术小能手 ⋅ 05/29 ⋅ 0

专栏 | 如何在抖音上找到漂亮小姐姐?这里有个Python抖音机器人

  转自舒林笑笑生   作者:神奇的战士      在这篇文章中,作者通过调用人脸识别 API 做了一个Python 抖音机器人 Douyin-Bot,能够高效、直接地在抖音上找到漂亮小姐姐。      最...

机器之心 ⋅ 05/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

压缩打包介绍 使用压缩工具的好处: 使用压缩文件,不仅可以节省磁盘空间,而且在传输时还能节省网络宽带。 我们通常讲的家用宽带和机房宽带100M是有区别的: 机房宽带的上行和下行都是100M,...

Linux_老吴 ⋅ 20分钟前 ⋅ 0

SpringBoot热部署加持

概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。所谓的热部署指的...

CodeSheep ⋅ 26分钟前 ⋅ 0

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 57分钟前 ⋅ 5

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部