文档章节

OggFile's CRC checksum

UMU
 UMU
发布于 2017/08/02 22:31
字数 479
阅读 87
收藏 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

粉丝 120
博文 113
码字总数 44317
作品 0
厦门
程序员
私信 提问
加载中
请先登录后再评论。
Redis 分片实现--Redis Shard

redis-shard 是 Redis 分区的 Python API ,基于对 key 和 key tag 进行 CRC32 checksum 计算,可参考文章 http://antirez.com/post/redis-presharding.html . 该项目由知乎网开发。 使用限制...

匿名
2012/10/24
5.7K
0
增量更新模型的讨论

客户端和服务端的数据同步过程中,客户端有缓存,不需要每次都是全量刷新,所以可以采用增量的方式更新。 每次在客户端进行刷新的时候,服务端会将最新的增删改操作推送到客户端,客户端对其...

xh4n3
2015/09/16
1.6K
7
开题报告问题

文字识别 图像预处理 单字切割 文字特征抽取 对比数据库 1,图像预处理 手机屏幕的每一个像素都是由计算机中24位数表示的,每个像素都包含红(R) 绿(G)蓝(B)三种色彩分量,可表示为RGB C X, ...

761218914
2016/01/18
1
0
LET'S DJ:web.py无缝迁移到django

DO: 前提是必须要配置好django使用jinja2模版,保持与老项目模版引擎一致。 Django通用视图最基础的类是View,其他如TemplateView、RedirectView等都继承自它,具体用法参见:Django 通用视...

cwalet
2016/04/29
283
0
理解 Python 中s可变参数的 *args 和 **kwargs

使用默认参数的可变参数 Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2):print 'Required argument: ', oneprint 'Optional argument: '......

cloud-coder
2016/03/09
506
0

没有更多内容

加载失败,请刷新页面

加载更多

Hacker News 简讯 2020-08-15

最后更新时间: 2020-08-15 04:01 Welders set off Beirut blast while securing explosives - (maritime-executive.com) 焊工在固定炸药的同时引爆了贝鲁特爆炸 得分:215 | 评论:209 Factor......

FalconChen
今天
24
0
OSChina 周六乱弹 —— 老椅小猫秋乡梦 梦里石台堆小鱼

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @小小编辑 :《MOM》- 蜡笔小心 《MOM》- 蜡笔小心 手机党少年们想听歌,请使劲儿戳(这里) @狄工 :腾讯又在裁员了,35岁以上清退,抖音看到...

小小编辑
今天
61
1
构建高性能队列,你不得不知道的底层知识!

前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识。 你好,我是彤哥。 上一节,我们一起学习了如何将递归改写为非递归,其中,用到的数据结构主要是栈。 栈和队列...

彤哥读源码
今天
17
0
Anaconda下安装keras和tensorflow

Anaconda下安装keras和tensorflow 一、下载并安装Anaconda: Anaconda下载 安装步骤: 如果是多用户操作系统选择All Users,单用户选择Just Me 选择合适的安装路径 然后勾选这个,自动配置环境...

Atlantis-Brook
今天
15
0
滴滴ElasticSearch千万级TPS写入性能翻倍技术剖析

桔妹导读:滴滴ElasticSearch平台承接了公司内部所有使用ElasticSearch的业务,包括核心搜索、RDS从库、日志检索、安全数据分析、指标数据分析等等。平台规模达到了3000+节点,5PB 的数据存储...

滴滴技术
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部