当前位置: 首页 > news >正文

h.264 SODB RBSP EBSP的区别

SODB 数据比特串-->最原始的编码数据

RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐。

EBSP 扩展字节序列载荷-->在RBSP基础上填加了仿校验字节(0X03)它的原因是: 在NALU加到Annexb上时,需要填加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,ox00000001,否则用3位字节表示ox000001.为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。

 


网上查询的区别:

在对整帧图像的数据比特串(SODB)添加原始字节序列载荷(RBSP)结尾比特(RBSP trailing bits,添加一比特的“1”和若干比特“0”,以便字节对齐)后,再检查RBSP 中是否存在连续的三字节“00000000 00000000 000000xx”;若存在这种连续的三字节码,在第三字节前插入一字节的“0×03”,以免与起始码竞争,形成EBSP码流,这需要将近两倍的整帧图像码流大小。为了减小存储器需求,在每个宏块编码结束后即检查该宏块SODB中的起始码竞争问题,并保留SODB最后两字节的零字节个数,以便与下一宏块的SODB的开始字节形成连续的起始码竞争检测;对一帧图像的最后一个宏块,先添加结尾停止比特,再检测起始码竞争。

 

程序:

 

typedef struct

{

  int             byte_pos;           //!< current position in bitstream;

  int             bits_to_go;         //!< current bitcounter

  byte            byte_buf;           //!< current buffer for last written byte

  int             stored_byte_pos;    //!< storage for position in bitstream;

  int             stored_bits_to_go;  //!< storage for bitcounter

  byte            stored_byte_buf;    //!< storage for buffer of last written byte

 

  byte            byte_buf_skip;      //!< current buffer for last written byte

  int             byte_pos_skip;      //!< storage for position in bitstream;

  int             bits_to_go_skip;    //!< storage for bitcounter

 

  byte            *streamBuffer;      //!< actual buffer for written bytes

  int             write_flag;         //!< Bitstream contains data and needs to be written

 

} Bitstream; 定义比特流结构

 

 

static byte *NAL_Payload_buffer;

void SODBtoRBSP(Bitstream *currStream)
{
  currStream->byte_buf <<= 1;  //左移1bit
  currStream->byte_buf |= 1;   //在尾部填一个“1”占1bit
  currStream->bits_to_go--;
  currStream->byte_buf <<= currStream->bits_to_go;
  currStream->streamBuffer[currStream->byte_pos++] = currStream->byte_buf;
  currStream->bits_to_go = 8;
  currStream->byte_buf = 0;
}

 

 

int RBSPtoEBSP(byte *streamBuffer, int begin_bytepos, int end_bytepos, int min_num_bytes)
{
 
  int i, j, count;

  for(i = begin_bytepos; i < end_bytepos; i++)
    NAL_Payload_buffer[i] = streamBuffer[i];

  count = 0;
  j = begin_bytepos;
  for(i = begin_bytepos; i < end_bytepos; i++)
  {
    if(count == ZEROBYTES_SHORTSTARTCODE && !(NAL_Payload_buffer[i] & 0xFC))
    {
      streamBuffer[j] = 0x03;
      j++;
      count = 0;  
    }
    streamBuffer[j] = NAL_Payload_buffer[i];
    if(NAL_Payload_buffer[i] == 0x00)     
      count++;
    else
      count = 0;
    j++;
  }
  while (j < begin_bytepos+min_num_bytes) {
    streamBuffer[j] = 0x00; // cabac stuffing word
    streamBuffer[j+1] = 0x00;
    streamBuffer[j+2] = 0x03;
    j += 3;
    stat->bit_use_stuffingBits[img->type]+=16;
  }
  return j;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/threewells_14/archive/2007/02/12/1508657.aspx

转载于:https://www.cnblogs.com/dairongle97/archive/2010/10/19/2401875.html

相关文章:

  • 安装打印机失败.错误:提示 另一个程序正在使用此文件,进程无法访问
  • Jquery中的$(document).ready(function(){});的浏览器不兼容性
  • 左偏树详解 ( 转载 )
  • 转:Discuz!NT前台模型架构(MVC)
  • [VSX.001]深入VS SDK
  • 提供第三种代码生成方式——通过自定义BuildProvider为ASP.NET提供代码生成
  • 一个很简单的Win32汇编程序
  • Silverlight如何跨域访问没有策略文件的服务
  • Linux内核代码学习笔记(2.6.21.7 ARM) -- 内核启动函数start_kernel
  • 将DataTable转换成类的方法
  • NOKIA C5-00怎么连接电脑??
  • 2010 支付宝DevDiv移动开发者大会[上海]
  • Java王者归来 6月Tiobe编程语言排行榜公布
  • 关于 在JQuery dialog里的服务器控件 事件失效问题
  • jquery的uploadify在 firefox 上传出问题,怎么解决啊
  • 2017届校招提前批面试回顾
  • Android优雅地处理按钮重复点击
  • ECMAScript入门(七)--Module语法
  • express.js的介绍及使用
  • Java-详解HashMap
  • JAVA之继承和多态
  • js正则,这点儿就够用了
  • React-生命周期杂记
  • swift基础之_对象 实例方法 对象方法。
  • vuex 笔记整理
  • Vue官网教程学习过程中值得记录的一些事情
  • 百度小程序遇到的问题
  • 和 || 运算
  • 看域名解析域名安全对SEO的影响
  • 坑!为什么View.startAnimation不起作用?
  • 如何使用 JavaScript 解析 URL
  • 微信小程序--------语音识别(前端自己也能玩)
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • %@ page import=%的用法
  • (13)Hive调优——动态分区导致的小文件问题
  • (39)STM32——FLASH闪存
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十六)一篇文章学会Java的常用API
  • (一)Java算法:二分查找
  • (译)2019年前端性能优化清单 — 下篇
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .naturalWidth 和naturalHeight属性,
  • .net 4.0发布后不能正常显示图片问题
  • .net 发送邮件
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net的DataSet直接与SQL2005交互
  • /proc/stat文件详解(翻译)