文档章节

OggFile's CRC checksum

UMU
 UMU
发布于 2017/08/02 22:31
字数 479
阅读 32
收藏 0
点赞 0
评论 0

这几天研究 live555,然而蛋疼滴发现它流化的 opus 文件,VLC 居然无法播放,于是想了解一下 opus 文件,看了 live555 的 OggFileParser 代码,发现 checksum 都被无视了,本来 UMU 也应该无视这个细节的,然而随便用自己以前写的 CRC32 代码验证了一下,居然不一样!而这份代码之前是测试过的,和 7-Zip 的 CRC-32 算出来是一致的。

因为 opus 文件是基于 ogg 文件格式的,所以阅读了一下 Ogg Documentation,发现确实不一样,它用的其实是 CRC32_IEEE,于是参考了 libogg 的 framing.c 和 ffmpeg\libavutil\crc.c 把自己的代码库给更新了,使用模版增强功能:

#pragma region "CRC"
// CRC_8_ATM        <false,  8,       0x07, 0>
// CRC_16_ANSI      <false, 16,     0x8005, 0>
// CRC_16_CCITT     <false, 16,     0x1021, 0>
// CRC_24_IEEE      <false, 24,   0x864CFB, 0>
// CRC_32_IEEE      <false, 32, 0x04C11DB7, 0>  -> OggFile's Checksum
// CRC_32_IEEE_LE   <true,  32, 0xEDB88320, 0>
// CRC_16_ANSI_LE   <true,  16,     0xA001, 0>
// defualt          <true,  32, 0xEDB88320, 0xFFFFFFFF>, 7 - Zip's CRC-32
template <bool kIsLE = true, uint8_t kBits = 32, uint32_t kPolynomial = 0xEDB88320, uint32_t kXorOut = 0xFFFFFFFF>
class CRC
{
public:
    CRC()
    {
        static_assert (kBits >= 8 && kBits <= 32 && kPolynomial < (1LL << kBits), "invalid bits");

        for (int i = 0; i < 256; ++i) {
            if (kIsLE) {
                register uint32_t crc = i;
                for (int j = 8; j > 0; --j) {
                    crc = (crc >> 1) ^ (kPolynomial & (-static_cast<int32_t>(crc & 1)));
                }
                crc32_table_[i] = crc;
            } else {
                register uint32_t crc = i << 24;
                for (int j = 8; j > 0; --j) {
                    crc = (crc << 1) ^ ((kPolynomial << (32 - kBits)) & (static_cast<int32_t>(crc) >> 31));
                }
                crc32_table_[i] = be2me_32(crc);
            }
        }
    }

    uint32_t GetCRC(uint32_t crcinit, const uint8_t* data, size_t data_size)
    {
        register uint32_t crc = crcinit ^ kXorOut;

        /* process not aligned message head */
        for (; (3 & (data - (uint8_t*)0)) && data_size > 0; ++data, --data_size) {
            crc = crc32_table_[static_cast<uint8_t>(crc) ^ *data] ^ (crc >> 8);
        }

        /* fast CRC32 calculation of a DWORD-aligned message */
        for (const uint8_t* e = data + (data_size & ~15); data < e; data += 4) {
            crc ^= le2me_32(*reinterpret_cast<const uint32_t *>(data));
            crc = crc32_table_[crc & 0xFF] ^ (crc >> 8);
            crc = crc32_table_[crc & 0xFF] ^ (crc >> 8);
            crc = crc32_table_[crc & 0xFF] ^ (crc >> 8);
            crc = crc32_table_[crc & 0xFF] ^ (crc >> 8);
        }

        /* process not aligned message tail */
        for (const uint8_t* e = data + (data_size & 15); data < e; ++data) {
            crc = crc32_table_[static_cast<uint8_t>(crc) ^ *data] ^ (crc >> 8);
        }
        return crc ^ kXorOut;
    }

private:
    uint32_t crc32_table_[256];
};
#pragma endregion

© 著作权归作者所有

共有 人打赏支持
UMU

UMU

粉丝 117
博文 111
码字总数 44043
作品 0
厦门
程序员
批量替换目录中的文件内容

将目录下所有以0开头的文件中的英文逗号替换为中文逗号,再将$替换为英文逗号,注意这里要将.000开头,.crc结尾的文件排除在外,因为这些是校验文件,修改后,再次往hive中导入文件的时候,会...

sucre ⋅ 2016/07/11 ⋅ 0

mysql主从一致性检测和修复

一、 简介 pt-table-checksum是著名的 percona-toolkit 工具集的工具之一。它通过在主库执行基于statement的sql语句来生成主库数据块的checksum,把相同的sql语句传递到从库,并在从库上计算...

stone_ ⋅ 2016/07/28 ⋅ 0

MySQL主从的一致性校验及修复

主从的一致性校验 场景: 有人会问道:如何验证主从的一致性 又或者问:一个库里有几十张表 主从结构数据是否一致? 简单来讲可以在低峰期主从上分别使用select count(*)来看一下,这种方式...

zuzhou ⋅ 2015/01/21 ⋅ 0

TCP Protocol Layers Explained

Now that we've examined what is contained in a Layer 3 (IP) header, let's move on to the Layer 4 header. A Layer 4 header occurs at the very beginning of the IP data field and c......

小小鸟你妈 ⋅ 2014/07/11 ⋅ 0

android ndk里编译inline函数总是失败

比如函数: static inline u32 sctpcrc32c(_u32 crc, u8 *buffer, u16 length) { return crc32c(crc, buffer, length); } 编译返回错误: checksum.h:49: error: expected '=', ',', ';', 'a......

yuyulvxian ⋅ 2014/08/14 ⋅ 0

PHP pack的用法

PHP pack函数把其它进制数字转化为ASCII码字符串。 如下代码 那打印出来是什么呢? 用winhex打开

大灰狼wow ⋅ 2016/10/27 ⋅ 0

CRC32 hash algorithm function

Generates the cyclic redundancy checksum polynomial of 32-bit lengths of the str. This is usually used to validate the integrity of data being transmitted. Javascript CRC32 func......

匿名 ⋅ 2008/09/19 ⋅ 0

触摸屏 驱动

俺是刚刚接触驱动,看了好几天也不知道,也不是很理解。大侠来帮忙解释一下,各个结构体代表什么?函数是什么功能? static int mXT224probe(struct i2cclient client, const struct i2cdevi...

parry ⋅ 2010/10/25 ⋅ 5

hadoop深入研究:(六)——HDFS数据完整性

转载请注明出处:hadoop深入研究:(六)——HDFS数据完整性 数据完整性 IO操作过程中难免会出现数据丢失或脏数据,数据传输得量越大出错得几率越高。校验错误最常用得办法就是传输前计算一个校...

lastsweetop ⋅ 2013/06/24 ⋅ 0

省广电出口规划及F5调整

> 涉及到客户信息,部分详细资料没有公布 概述 在 2017 年 8 月份以前省广电的有三条出口网络,一条名为襄阳联通,另一条为上海富亚,还有一条为湖北和数,出口网络由第三方的 ISP 运营商提供...

YANGCHAO1987 ⋅ 2017/12/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 7分钟前 ⋅ 0

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 45分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 47分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 58分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 今天 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 今天 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 今天 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部