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;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254450.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 控件置于最顶层、最底层、隐藏、显示

控件置于最顶层、最底层 pictureBox1.BringToFront();//将控件放置所有控件最前端 pictureBox1.SendToBack();//将控件放置所有控件最底端 控件隐藏、显示 pictureBox1.Visible true;//显示 pictureBox1.Visible false;//隐藏

习题8.3.(1)

1 #include <iostream>2 #include <iomanip>3 #include <cstdlib>4 using namespace std;5 6 #define OK 17 #define ERROR 08 #define OVERFLOW -29 typedef int Status; //Status 是函数返回值类型&#xff0c;其值是函数结果状态代码。 10 11 typedef in…

python:实例化configparser模块读写配置文件

之前的博客介绍过利用python的configparser模块读写配置文件的基础用法&#xff0c;这篇博客&#xff0c;介绍下如何实例化&#xff0c;方便作为公共类调用。 实例化的好处有很多&#xff0c;既方便调用&#xff0c;又降低了脚本的维护成本&#xff0c;而且提高了代码的可读性。…

halcon 圆环类缺陷检测的一种方法(极坐标变换法)

目录简介极坐标变换定义原理Halcon中的极坐标变换1、polar_trans_image_ext算子用法与参数剖析2、polar_trans_region_inv算子用法与参数剖析圆环类缺陷检测思路与步骤Halcon实例实例简介程序解读思路剖析应用实例1项目介绍处理程序处理效果应用实例2项目介绍处理程序处理效果简…

linux的mount命令详解

linux下挂载&#xff08;mount&#xff09;光盘镜像文件、移动硬盘、U盘、Windows和NFS网络共享 linux是一个优秀的开放源码的操作系统&#xff0c;可以运行在大到巨型小到掌上型各类计算机系统上&#xff0c;随着 linux系统的日渐成熟和稳定以及它开放源代码特有的优越性&…

cat命令

$ cat file 显示文件中的内容$ cat -n file 可以显示文件的内容和行号$ cat -b file -b与-n类似&#xff0c;但只标识非空白行的行号$ cat -e file 在每一行的末尾显示“$”字符&#xff0c;在需要将多行内容转换成一行时非常有用。$ cat 只是接收标准输入的内容并显示&#xf…

生成验证码的流程分析.

浏览器解析页面, 携带uuid向服务器发送请求获取图片, 服务器生成图片验证码, 返回图片本身给浏览器, 客户端根据图片输入验证码内容, 把输入的内容发送给服务器, 服务器对比输入的验证码是否正确.根据前端传入的uuid从redis中获取唯一图片验证码名称. 服务器: 图片, 图片内容…

Halcon图像增强方法与原理概述

目录简介Halcon算子与算法原理1.灰度线性变换a、scale_imageb、scale_image_maxc、invert_image2.灰度非线性变换a、log_imageb、exp_image3.图像增强对比度与照明度a、emphasizeb、illuminate4.直方图均衡化a、equ_histo_image5.灰度图像形态学a、 gray_openingb、gray_closin…

指针类型转换(转)

当我们初始化一个指针或给一个指针赋值时&#xff0c;赋值号的左边是一个指针&#xff0c;赋值号的右边是一个指针表达式。在我们前面所举的例子中&#xff0c;绝大多数情况下&#xff0c;指针的类型和指针表达式的类型是一样的&#xff0c;指针所指向的类型和指针表达式所指向…

143. Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes values. For example,Given {1,2,3,4}, reorder it to {1,4,2,3}. public void ReorderList(ListNode head) {if(h…

Halcon图像滤波方法与原理概述

目录简介Halcon算子与算法原理基础滤波a、均值滤波b、中值滤波c、高斯滤波d、导向滤波简介 图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和…

碎片化学习不是学习碎片,看这篇了解碎片化学习的真相

高效学习的定义&#xff1a;找到最适合自己的学习手法&#xff0c;在相对短的时间内集中注意力&#xff0c;以解决一个工作生活当中的难题为目的着手学习&#xff0c;你需要勤加练习&#xff0c;有时候还需要向名师求助。——许岑为什么会出现碎片化学习&#xff1f; 随着科技的…

一篇能加深理解linux 虚拟文件系统的博文

URL: http://asionius.com/article/9 https://www.ibm.com/developerworks/cn/linux/l-vfs/转载于:https://www.cnblogs.com/rocklee25/p/6926267.html

如何强制ffmpeg编码时输出一个关键帧

原文地址&#xff1a;http://www.ffmpeg.com.cn/index.php/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6ffmpeg%E7%BC%96%E7%A0%81%E6%97%B6%E8%BE%93%E5%87%BA%E4%B8%80%E4%B8%AA%E5%85%B3%E9%94%AE%E5%B8%A7 如何强制ffmpeg编码时输出一个关键帧 AVCodecContext *c //编码器环境句…

Halcon深度学习环境搭建(win下)全网最全教程

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/cashmood/article/details/105042928 文章目录halcon深度学习介绍系统与环境搭建1、对电脑系统与硬件…

第二周进度及工作量统计

项目&#xff1a;词频统计修改 项目类型&#xff1a;个人项目 项目完成情况&#xff1a;已完成 项目改进&#xff1a;第二次改进 项目日期&#xff1a;2016.9.14----2.16.9.14 CCSEIT分析需求&#xff0c;设计15:2015:30010编码实现15:3016:20050文档程序说明&#xff0c;随笔2…

p1484 种树

传送门 题目 cyrcyr今天在种树&#xff0c;他在一条直线上挖了n个坑。这n个坑都可以种树&#xff0c;但为了保证每一棵树都有充足的养料&#xff0c;cyrcyr不会在相邻的两个坑中种树。而且由于cyrcyr的树种不够&#xff0c;他至多会种k棵树。假设cyrcyr有某种神能力&#xff0c…

Dalsa线扫相机SDK开发-小试牛刀(1)

拿到了dalsa相机&#xff0c;可以用Sapera软件配置相机&#xff0c;进行图像采集。但是自己开发的话就得撸起袖子写代码了&#xff0c;查了两篇不错的博文&#xff0c;作为指导。 Sapera帮助文档 - 《好好先生》专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liubing8609/a…

用FFMPEG SDK进行视频转码压缩时解决音视频不同步问题的方法(转) PTS DTS

用FFMPEG SDK进行视频转码压缩的时候&#xff0c;转码成功后去看视频的内容&#xff0c;发现音视频是不同步的。这个的确是一个恼火的事情。我在用FFMPEG SDK做h264格式的FLV文件编码Filter的时候就碰到了这个问题。经过研究发现&#xff0c;FFMPEG SDK写入视频的时候有两个地方…

深度学习环境搭建(GPU)CUDA安装(完全版)

文章目录1、查询电脑硬件2、环境搭建与软件安装1、安装CUDA运算平台软件2、安装cuDNN支持包3、配置环境变量3、验证CUDA与cuDNN安装前几天在看深度学习。因为对深度学习不是很了解&#xff0c;在配置环境时走了许多弯路&#xff0c;也总是战战兢兢的。现在对深度学习的环境搭建…