博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
x265-1.7版本-common/bitstream.h注释
阅读量:2189 次
发布时间:2019-05-02

本文共 6403 字,大约阅读时间需要 21 分钟。

注:问号以及未注释部分 会在x265-1.8版本内更新
/***************************************************************************** * Copyright (C) 2013 x265 project * * Author: Steve Borho 
* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. * * This program is also available under a commercial proprietary license. * For more information, contact us at license @ x265.com. *****************************************************************************/#ifndef X265_BITSTREAM_H#define X265_BITSTREAM_H 1namespace x265 {// private namespaceclass BitInterface{public: virtual void write(uint32_t val, uint32_t numBits) = 0; virtual void writeByte(uint32_t val) = 0; virtual void resetBits() = 0; virtual uint32_t getNumberOfWrittenBits() const = 0; virtual void writeAlignOne() = 0; virtual void writeAlignZero() = 0; virtual ~BitInterface() {}};class BitCounter : public BitInterface{protected: uint32_t m_bitCounter;public: BitCounter() : m_bitCounter(0) {} void write(uint32_t, uint32_t num) { m_bitCounter += num; } void writeByte(uint32_t) { m_bitCounter += 8; } void resetBits() { m_bitCounter = 0; } uint32_t getNumberOfWrittenBits() const { return m_bitCounter; } void writeAlignOne() { } void writeAlignZero() { }};class Bitstream : public BitInterface{public: Bitstream(); ~Bitstream() { X265_FREE(m_fifo); } void resetBits() { m_partialByteBits = m_byteOccupancy = 0; m_partialByte = 0; } uint32_t getNumberOfWrittenBytes() const { return m_byteOccupancy; } uint32_t getNumberOfWrittenBits() const { return m_byteOccupancy * 8 + m_partialByteBits; } const uint8_t* getFIFO() const { return m_fifo; } void write(uint32_t val, uint32_t numBits); void writeByte(uint32_t val); void writeAlignOne(); // insert one bits until the bitstream is byte-aligned void writeAlignZero(); // insert zero bits until the bitstream is byte-aligned void writeByteAlignment(); // insert 1 bit, then pad to byte-align with zeroprivate: uint8_t *m_fifo; uint32_t m_byteAlloc; uint32_t m_byteOccupancy; uint32_t m_partialByteBits; uint8_t m_partialByte; void push_back(uint8_t val);};/*无符号指数哥伦布码占用的位数 (注意:实际编码中需要对原有数字加一 再获得指数哥伦布码,所以必须加一才是实际占用的位数)指数哥伦布编码分为:无符号和有符号:无符号哥伦布编码:有前缀和后缀的概念:1 先将要编码的数值写成二进制:0x6 ==> 0b1102 以最高位为界(左边第一个1的位置),后面的就是后缀(就是二进制10了),总共两位,所以前缀也是两位,而且必须是0,3 得出数值6编码后的二进制表示为:00110解码就是反过程:从高位开始统计0的个数直至非零位, 假设0的个数是k, 那后面k+1位就是要找的数值了**/static const uint8_t bitSize[256] ={ 1, 1, 3, 3, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,};/** 函数功能 : 获取无符号指数哥伦布码占用的位数* \参数 val : 当前待编码的值* \返回 : 无符号指数哥伦布码占用的位数 * */static inline int bs_size_ue(unsigned int val){ return bitSize[val + 1];//因为实际编码中需要先加一,固加一获得时间占用的位数}static inline int bs_size_ue_big(unsigned int val){ if (val < 255) return bitSize[val + 1]; else return bitSize[(val + 1) >> 8] + 16;}/*无符号指数哥伦布码先将编码系数映射为整数-10 --> 20-9 --> 18-8 --> 16-7 --> 14-6 --> 12-5 --> 10-4 --> 8-3 --> 6-2 --> 4-1 --> 20 --> 01 --> 12 --> 33 --> 54 --> 75 --> 96 --> 117 --> 138 --> 159 --> 1710 --> 19再调用无符号指数哥伦布码**//** 函数功能 : 获取有符号指数哥伦布码占用的位数* \参数 val : 当前待编码的值* \返回 : 有符号指数哥伦布码占用的位数 * */static inline int bs_size_se(int val){ int tmp = 1 - val * 2;//这里:正数变负 负数变正 如果是负数 刚好就是对应val值+1 if (tmp < 0) tmp = val * 2;//说明当前是正数 直接乘以2 刚好是对应val值+1 如10 对应为19 19+1=20 if (tmp < 256) return bitSize[tmp];//获取bits (也是加一后数字) else return bitSize[tmp >> 8] + 16;//大于256情况}class SyntaxElementWriter{public: BitInterface* m_bitIf; SyntaxElementWriter() : m_bitIf(NULL) {} /* silently discard the name of the syntax element */ inline void WRITE_CODE(uint32_t code, uint32_t length, const char *) { writeCode(code, length); } inline void WRITE_UVLC(uint32_t code, const char *) { writeUvlc(code); } inline void WRITE_SVLC(int32_t code, const char *) { writeSvlc(code); } inline void WRITE_FLAG(bool flag, const char *) { writeFlag(flag); } void writeCode(uint32_t code, uint32_t length) { m_bitIf->write(code, length); } void writeUvlc(uint32_t code); void writeSvlc(int32_t code) { uint32_t ucode = (code <= 0) ? -code << 1 : (code << 1) - 1; writeUvlc(ucode); } void writeFlag(bool code) { m_bitIf->write(code, 1); }};}#endif // ifndef X265_BITSTREAM_H
x265-1.7版本-common/bitstream.h注释

转载地址:http://pauub.baihongyu.com/

你可能感兴趣的文章
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>