NAL聚合包(STAP-A)
2017-03-07 11:24
120 查看
下面贴出安卓N版本AAVCAssembler::addSingleTimeAggregationPacket对聚合的NAL包(STAP-A)的处理:
bool AAVCAssembler::addSingleTimeAggregationPacket(const sp<ABuffer> &buffer) { const uint8_t *data = buffer->data(); size_t size = buffer->size(); if (size < 3) { //对于聚合的NAL单元包(STAP-A)来说,数据最小的长度位3个字节,其中data[0]表明是聚合的 //NAL单元包(STAP-A)即,nalType = data[0] & 0x1f == 28 //data[1]和data[2]用16个bit位表示的一个16位整数的值表示紧跟着第一个NAL单元的长度 ALOGV("Discarding too small STAP-A packet."); return false; } //跳过data[0],data[0]表明是聚合的NAL单元包(STAP-A) ++data; --size; //因为紧跟着data[0]后续会有多个NAL单元,所以需要循环处理这些NAL单元 while (size >= 2) { //前两个字节表示的16位整数的值表示的是该NAL单元的长度,不包括这两个字节 size_t nalSize = (data[0] << 8) | data[1]; if (size < nalSize + 2) { //标识一个NAL单元的范围位是2+nalSize,2表示的是该NAL单元的长度,nalSize //是实际一个NAL单元的长度 ALOGV("Discarding malformed STAP-A packet."); return false; } //创建一个buffer将该解析得到的单个的NAL单元拷贝到该buffer中 sp<ABuffer> unit = new ABuffer(nalSize); memcpy(unit->data(), &data[2], nalSize); //对该单个的NAL单元添加时间戳信息 CopyTimes(unit, buffer); //调用addSingleNALUnit(unit)方法处理单个的NAL单元 addSingleNALUnit(unit); //迭代进行处理下一个NAL单元 data += 2 + nalSize; size -= 2 + nalSize; } if (size != 0) { ALOGV("Unexpected padding at end of STAP-A packet."); } return true; }
相关文章推荐
- 实现横向聚合(转邹建的贴子)
- centos7root密码破解及聚合链路
- 使用合成还是聚合
- python项目练习四:新闻聚合
- 用MFC写的COM如何实现包容或聚合?
- es聚合
- ATL对聚合的支持
- 依赖、关联、聚合和组合之间区别的理解
- 林客 a489 聚合网络电视 link bt
- Mongodb中数据聚合之聚合管道aggregate
- Discuz!NT 聚合功能页面程序架构(重构到Facade与Observer模式)
- 解决百度地图点聚合缩放Lable消失 亲测有效 javascript API
- 国外java开源网站聚合
- 理解JMeter聚合报告(Aggregate Report)
- 国外java开源网站聚合
- UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
- 【新媒体】现阶段新闻聚合的玩法
- 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)
- UML类图中"聚合"与"组合"的区别
- 合并、联合、融合和聚合之间的区别