逆向:CRI Sofdec数据流结构:修订间差异
(更新了一些信息。) |
(增加一些新发现) |
||
第2行: | 第2行: | ||
=CRI Sofdec简述= | =CRI Sofdec简述= | ||
CRI Sofdec格式(典型扩展名为SFD)为CRI | CRI Sofdec格式(典型扩展名为SFD)为CRI Middleware公司开发的视频中间件格式。当前CRI Middleware已停止支持该格式。 | ||
该格式的数据结构为一种MPEG- | 该格式的数据结构为一种MPEG-1系统层(定义于ISO/IEC 11172-1)的变体。其视频流必为为符合ISO/IEC 11172-2定义的MPEG-1视频。其音频流中必有一路使用CRI ADX ADPCM编码(CRI Midware私有音频ADPCM编码)的音频流(典型扩展名为SFA),可能包含有一路杜比数字(DD,典型扩展名为AC-3)音频流。需要专用的多路复用器进行复用。 | ||
目前已泄漏的SFD多路复用器有: | 目前已泄漏的SFD多路复用器有: | ||
第11行: | 第11行: | ||
! 原始应用名 !! 内部ID !! 出处 | ! 原始应用名 !! 内部ID !! 出处 | ||
|- | |- | ||
| | | Dreamcast Movie Creator || SFDMUX Ver.1.07 19990520 CRI || 为 SFD Tool Pack v1.0 by SWAT 的一部分。有抽出dll制作的的命令行版本sfdmux。 | ||
|- | |- | ||
| Sofdec Multiplexer Ver.0.25 || CRI_SFM Ver.2.17 2003-01-14 CRI || 为 CRI SDK by Xbox 的一部分。 | | Sofdec Multiplexer Ver.0.25 || CRI_SFM Ver.2.17 2003-01-14 CRI || 为 CRI SDK by Xbox 的一部分。 | ||
第26行: | 第26行: | ||
|} | |} | ||
=CRI | =CRI Sofdec结构= | ||
CRI | CRI Sofdec数据流(下简称SFD)内部有多个符合ISO/IEC 11172-1「2.4.3.2 包层」定义的包。每个包的大小均为0x800。 | ||
其中,第00- | 其中,第00-03个包标示了SFD的各种信息(较旧版本的SFD可能缺少第03个包),之后的包为经多路复用的音视频流。 | ||
== | ==信息包组(暂称)== | ||
信息包组即指SFD内部的第00- | 信息包组即指SFD内部的第00-03个包(较旧版本的SFD可能缺少第03个包)。 | ||
下面列出这些包的结构。 | 下面列出这些包的结构。 | ||
下表中的一些定性数据暂仅列AT1,即"SFM Ver.2.25 2004-07-21 CRI-MW"(有声SFD)或"Sofdec CRAFT/GUI Ver.1.74 "(无声SFD)的参数。 | |||
{| class="wikitable" | {| class="wikitable" | ||
第46行: | 第46行: | ||
pack_start_code = default ('00 00 01 BA'[hex]) | pack_start_code = default ('00 00 01 BA'[hex]) | ||
system_clock_refence = '000 00000000 0000000 00000000 0000000' | system_clock_refence = '000 00000000 0000000 00000000 0000000' | ||
mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] ( | mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声SFA音频流的SFD) / '88 20 97'[hex] (含一条无声SFA音频流的SFD) | ||
|- | |- | ||
| 0x000C || 系统头(长度15(含一条音频流的SFD) / 18(含两条音频流的SFD))。数据: | | 0x000C || 系统头(长度15(含一条音频流的SFD) / 18(含两条音频流的SFD))。数据: | ||
第59行: | 第59行: | ||
video_bound = '0 0000' | video_bound = '0 0000' | ||
reserved_byte = default ('1111 1111') | reserved_byte = default ('1111 1111') | ||
stream_id[ | stream_id = [default] ( 典型值:'C0'[hex], 对于SFA音频流; 'C1'[hex], 对于AC-3音频流. 可并列多个定义. ) | ||
STD_buffer_bound_scale = '0' | STD_buffer_bound_scale = '0' | ||
STD_buffer_size_bound = '0 0000 0000 0100' | STD_buffer_size_bound = '0 0000 0000 0100' | ||
第85行: | 第84行: | ||
pack_start_code = default ('00 00 01 BA'[hex]) | pack_start_code = default ('00 00 01 BA'[hex]) | ||
system_clock_refence = '000 00000000 0000000 00000000 0001110' | system_clock_refence = '000 00000000 0000000 00000000 0001110' | ||
mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] ( | mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声SFA音频流的SFD) / '88 20 97'[hex] (含一条无声SFA音频流的SFD) | ||
|- | |- | ||
| 0x000C || 系统头(长度15)。数据: | | 0x000C || 系统头(长度15)。数据: | ||
第121行: | 第120行: | ||
pack_start_code = default ('00 00 01 BA'[hex]) | pack_start_code = default ('00 00 01 BA'[hex]) | ||
system_clock_refence = '000 00000000 0000000 00000000 0011100' | system_clock_refence = '000 00000000 0000000 00000000 0011100' | ||
mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] ( | mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声SFA音频流的SFD) / '88 20 97'[hex] (含一条无声SFA音频流的SFD) | ||
|- | |- | ||
| 0x000C || 分组头(长度6)。 | | 0x000C || 分组头(长度6)。 | ||
第128行: | 第127行: | ||
packet_length = [default] ( 典型值:'07 EE'[hex] ) | packet_length = [default] ( 典型值:'07 EE'[hex] ) | ||
|- | |- | ||
| 0x0020 || | | 0x0020 || 流类型标记?长度24。恒定值。 | ||
'53 6F 66 64 65 63 53 74 72 65 61 6D 20 20 20 20 20 20 20 20 20 20 20 20'[hex] | '53 6F 66 64 65 63 53 74 72 65 61 6D 20 20 20 20 20 20 20 20 20 20 20 20'[hex] | ||
= [SofdecStream ] | = [SofdecStream ] | ||
第158行: | 第157行: | ||
|} | |} | ||
== | {| class="wikitable" | ||
|+ 第03个包(起始地址:0x00001800,源信息包(暂称)) | |||
|- | |||
| 这个包有或没有都不影响解复用器工作。先不管了。 | |||
|} | |||
==多路复用流包组== | |||
多路复用流包即指SFD内部信息包组以后的所有包。 | |||
下面列出这些包的结构。 | |||
下表中的一些定性数据暂仅列"SFM Ver.2.25 2004-07-21 CRI-MW"(AT1 有声SFD)的参数。 | |||
{| class="wikitable" | |||
|+ 音频流子包结构 | |||
|- | |||
! 偏址 !! 信息 | |||
|- | |||
| 0x0000 || 包头(长度12)。数据: | |||
pack_start_code = default ('00 00 01 BA'[hex]) | |||
system_clock_refence = '0001110' × 包序号(00开始) | |||
mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD) | |||
|- | |||
| 0x000C || 分组头(长度13)。 | |||
packet_start_codec_prefix = default ('00 00 01'[hex]) | |||
stream_id = [default] ( 典型值:'C0'[hex], 对于SFA音频流; 'C1'[hex], 对于AC-3音频流 ) | |||
packet_length = [default] ( 典型值:'07 E7'[hex] ) | |||
'01' | |||
STD_buffer_scale = default ( '0', 对于音频流 ) | |||
STD_buffer_size = '00000 00000100' | |||
'0010' | |||
presentation_time_stamp = 当前音频流包序号×当前音频流PTS常量 ( 典型值:'00011010 0100000', C0; '00011001 0101000', C1 ) | |||
|- | |||
| 0x0019 || 包数据。结束于0x07F8。 | |||
|- | |||
| 0x07F9 || 补偿填充流(长度7)。'00 00 01 BE 00 01 0F'[hex]。 | |||
|} | |||
{| class="wikitable" | |||
|+ 视频流子包结构 | |||
|- | |||
! 偏址 !! 信息 | |||
|- | |||
| 0x0000 || 包头(长度12)。数据: | |||
pack_start_code = default ('00 00 01 BA'[hex]) | |||
system_clock_refence = '0001110' × 包序号(00开始) | |||
mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD) | |||
|- | |||
| 0x000C || 分组头(长度13)。 | |||
可能组成1: | |||
packet_start_codec_prefix = default ('00 00 01'[hex]) | |||
stream_id = [default] ( 典型值:'E0'[hex] ) | |||
packet_length = [default] ( 典型值:'07 EE'[hex] ) | |||
'01' | |||
STD_buffer_scale = default ( '1', 对于视频流 ) | |||
STD_buffer_size = '00000 00101110' | |||
'0011' | |||
presentation_time_stamp = ? | |||
'0001' | |||
decoding_time_stamp = ? | |||
可能组成2: | |||
packet_start_codec_prefix = default ('00 00 01'[hex]) | |||
stream_id = [default] ( 典型值:'E0'[hex] ) | |||
packet_length = [default] ( 典型值:'07 EE'[hex] ) | |||
stuffing_byte ( '1111 1111' ) × 9 | |||
'01' | |||
STD_buffer_scale = default ( '1', 对于视频流 ) | |||
STD_buffer_size = '00000 00101110' | |||
'0000 1111' | |||
可能组成3: | |||
packet_start_codec_prefix = default ('00 00 01'[hex]) | |||
stream_id = [default] ( 典型值:'E0'[hex] ) | |||
packet_length = [default] ( 典型值:'07 EE'[hex] ) | |||
stuffing_byte ( '1111 1111' ) × 5 | |||
'01' | |||
STD_buffer_scale = default ( '1', 对于视频流 ) | |||
STD_buffer_size = '00000 00101110' | |||
'0010' | |||
presentation_time_stamp = ? | |||
|- | |||
| 0x0019 || 包数据。结束于0x07FF。 | |||
|} | |||
对于每个子流的最后一个子包,在这个包的后部应当添加一个填充流分组以保持各包0x800对齐。 | |||
对于SFD的最后一个包,在这个包的后部应当添加一个以 '00 00 01 B9'[hex] 开始且其他位均为 'FF'[hex] 的,长度为0x800的数据块。 | |||
=其他信息= | |||
AT3的SFD样本中存在一些无音轨的SFD流,其缺少第00个包,且第02个包的数据记述有变化。需要特别分析。 | |||
=参考标准= | =参考标准= |
2021年5月24日 (一) 22:05的版本
此处记录对CRI Sofdec格式的数据流之结构的分析结果。(进行中)
CRI Sofdec简述
CRI Sofdec格式(典型扩展名为SFD)为CRI Middleware公司开发的视频中间件格式。当前CRI Middleware已停止支持该格式。
该格式的数据结构为一种MPEG-1系统层(定义于ISO/IEC 11172-1)的变体。其视频流必为为符合ISO/IEC 11172-2定义的MPEG-1视频。其音频流中必有一路使用CRI ADX ADPCM编码(CRI Midware私有音频ADPCM编码)的音频流(典型扩展名为SFA),可能包含有一路杜比数字(DD,典型扩展名为AC-3)音频流。需要专用的多路复用器进行复用。
目前已泄漏的SFD多路复用器有:
原始应用名 | 内部ID | 出处 |
---|---|---|
Dreamcast Movie Creator | SFDMUX Ver.1.07 19990520 CRI | 为 SFD Tool Pack v1.0 by SWAT 的一部分。有抽出dll制作的的命令行版本sfdmux。 |
Sofdec Multiplexer Ver.0.25 | CRI_SFM Ver.2.17 2003-01-14 CRI | 为 CRI SDK by Xbox 的一部分。 |
目前已知但未泄漏的SFD多路复用器有:
内部ID | 注释 |
---|---|
SFM Ver.2.25 2004-07-21 CRI-MW | AT1 有声SFD所署明的内部ID |
Sofdec CRAFT/GUI Ver.1.74 | AT1 无声SFD所署明的内部ID |
CRI Sofdec结构
CRI Sofdec数据流(下简称SFD)内部有多个符合ISO/IEC 11172-1「2.4.3.2 包层」定义的包。每个包的大小均为0x800。
其中,第00-03个包标示了SFD的各种信息(较旧版本的SFD可能缺少第03个包),之后的包为经多路复用的音视频流。
信息包组(暂称)
信息包组即指SFD内部的第00-03个包(较旧版本的SFD可能缺少第03个包)。
下面列出这些包的结构。
下表中的一些定性数据暂仅列AT1,即"SFM Ver.2.25 2004-07-21 CRI-MW"(有声SFD)或"Sofdec CRAFT/GUI Ver.1.74 "(无声SFD)的参数。
偏址 | 信息 |
---|---|
0x0000 | 包头(长度12)。数据:
pack_start_code = default ('00 00 01 BA'[hex]) system_clock_refence = '000 00000000 0000000 00000000 0000000' mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声SFA音频流的SFD) / '88 20 97'[hex] (含一条无声SFA音频流的SFD) |
0x000C | 系统头(长度15(含一条音频流的SFD) / 18(含两条音频流的SFD))。数据:
system_header_start_code = default ('00 00 01 BB'[hex]) header_length = [default] rate_bound(with market_bit) = [mux_rate(with market_bit)] audio_bound = [default] flxed_flag = '1' CSPS_flag = '0' system_audio_lock_flag = '0' system_video_lock_flag = '0' video_bound = '0 0000' reserved_byte = default ('1111 1111') stream_id = [default] ( 典型值:'C0'[hex], 对于SFA音频流; 'C1'[hex], 对于AC-3音频流. 可并列多个定义. ) STD_buffer_bound_scale = '0' STD_buffer_size_bound = '0 0000 0000 0100' |
0x001B(含一条音频流的SFD)
0x001E(含两条音频流的SFD) |
分组头(长度7)。结构:
packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = 'BE'[hex] (填充流) packet_length = [default] ( 典型值:'07 DF'[hex](含一条音频流的SFD) / '07 DC'[hex](含两条音频流的SFD) ) '0000 1111' |
0x0022(含一条音频流的SFD)
0x0025(含两条音频流的SFD) |
填充流数据(长度[packet_length])。全为 'FF'[hex] 。结束于0x07FF。 |
偏址 | 信息 |
---|---|
0x0000 | 包头(长度12)。数据:
pack_start_code = default ('00 00 01 BA'[hex]) system_clock_refence = '000 00000000 0000000 00000000 0001110' mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声SFA音频流的SFD) / '88 20 97'[hex] (含一条无声SFA音频流的SFD) |
0x000C | 系统头(长度15)。数据:
system_header_start_code = default ('00 00 01 BB'[hex]) header_length = [default] rate_bound(with market_bit) = [mux_rate(with market_bit)] audio_bound = '0000 00' flxed_flag = '1' CSPS_flag = '0' system_audio_lock_flag = '0' system_video_lock_flag = '0' video_bound = [default] reserved_byte = default ('1111 1111') stream_id = 'E0'[hex] (视频流1) STD_buffer_bound_scale = '1' STD_buffer_size_bound = '0 0000 0010 1110' |
0x001B | 分组头(长度7)。结构:
packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = 'BE'[hex] (填充流) packet_length = [default] ( 典型值:'07 DF'[hex] ) '0000 1111' |
0x0022 | 填充流数据(长度[packet_length])。全为 'FF'[hex] 。结束于0x07FF。 |
偏址 | 信息 |
---|---|
未声明 | 填充字段。全为'00'[hex]。 |
0x0000 | 包头(长度12)。数据:
pack_start_code = default ('00 00 01 BA'[hex]) system_clock_refence = '000 00000000 0000000 00000000 0011100' mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声SFA音频流的SFD) / '88 20 97'[hex] (含一条无声SFA音频流的SFD) |
0x000C | 分组头(长度6)。
packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = 'BF'[hex] (private_stream_2, 私用流) packet_length = [default] ( 典型值:'07 EE'[hex] ) |
0x0020 | 流类型标记?长度24。恒定值。
'53 6F 66 64 65 63 53 74 72 65 61 6D 20 20 20 20 20 20 20 20 20 20 20 20'[hex] = [SofdecStream ] |
0x0038 | 兼容性标记?长度2。
[SFM Ver.2.25 2004-07-21 CRI-MW] = '02 19'[hex] [Sofdec CRAFT/GUI Ver.1.74] = '02 1A'[hex] |
0x0040 | SFD文件名及生成时间。
0x00:生成文件名。长度8。不足以空格('20'[hex])填充。 0x08:'2E 73 66 64'[hex] (".sfd") 0x0C:生成时间。长度12。YYYYMMDDhhmm。 |
0x0060 | 多路复用器内部ID。长度32。示例:
'53 46 4D 20 56 65 72 2E 32 2E 32 35 20 32 30 30 34 2D 30 37 2D 32 31 20 43 52 49 2D 4D 57 20 20'[hex] = [SFM Ver.2.25 2004-07-21 CRI-MW ] '53 6F 66 64 65 63 20 43 52 41 46 54 2F 47 55 49 20 56 65 72 2E 31 2E 37 34 00 00 00 00 00 00 00'[hex] = [Sofdec CRAFT/GUI Ver.1.74] |
0x0080 - 0x008F | 不明数据段。 |
0x00B0 - 0x00CF | 不明数据段。 |
0x0180 | 原始I/O记录。每长度64记述一条文件信息。
0x00:文件名。长度8。 0x08:后缀名。长度4。 0x0C:生成时间。长度12。YYYYMMDDhhmm。 0x18:不明数据段。 |
这个包有或没有都不影响解复用器工作。先不管了。 |
多路复用流包组
多路复用流包即指SFD内部信息包组以后的所有包。
下面列出这些包的结构。
下表中的一些定性数据暂仅列"SFM Ver.2.25 2004-07-21 CRI-MW"(AT1 有声SFD)的参数。
偏址 | 信息 |
---|---|
0x0000 | 包头(长度12)。数据:
pack_start_code = default ('00 00 01 BA'[hex]) system_clock_refence = '0001110' × 包序号(00开始) mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD) |
0x000C | 分组头(长度13)。
packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = [default] ( 典型值:'C0'[hex], 对于SFA音频流; 'C1'[hex], 对于AC-3音频流 ) packet_length = [default] ( 典型值:'07 E7'[hex] ) '01' STD_buffer_scale = default ( '0', 对于音频流 ) STD_buffer_size = '00000 00000100' '0010' presentation_time_stamp = 当前音频流包序号×当前音频流PTS常量 ( 典型值:'00011010 0100000', C0; '00011001 0101000', C1 ) |
0x0019 | 包数据。结束于0x07F8。 |
0x07F9 | 补偿填充流(长度7)。'00 00 01 BE 00 01 0F'[hex]。 |
偏址 | 信息 |
---|---|
0x0000 | 包头(长度12)。数据:
pack_start_code = default ('00 00 01 BA'[hex]) system_clock_refence = '0001110' × 包序号(00开始) mux_rate(with market_bit) = '88 2F E7'[hex] (含AC-3音频流的SFD) / '88 27 05'[hex] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD) |
0x000C | 分组头(长度13)。
可能组成1: packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = [default] ( 典型值:'E0'[hex] ) packet_length = [default] ( 典型值:'07 EE'[hex] ) '01' STD_buffer_scale = default ( '1', 对于视频流 ) STD_buffer_size = '00000 00101110' '0011' presentation_time_stamp = ? '0001' decoding_time_stamp = ? 可能组成2: packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = [default] ( 典型值:'E0'[hex] ) packet_length = [default] ( 典型值:'07 EE'[hex] ) stuffing_byte ( '1111 1111' ) × 9 '01' STD_buffer_scale = default ( '1', 对于视频流 ) STD_buffer_size = '00000 00101110' '0000 1111' 可能组成3: packet_start_codec_prefix = default ('00 00 01'[hex]) stream_id = [default] ( 典型值:'E0'[hex] ) packet_length = [default] ( 典型值:'07 EE'[hex] ) stuffing_byte ( '1111 1111' ) × 5 '01' STD_buffer_scale = default ( '1', 对于视频流 ) STD_buffer_size = '00000 00101110' '0010' presentation_time_stamp = ? |
0x0019 | 包数据。结束于0x07FF。 |
对于每个子流的最后一个子包,在这个包的后部应当添加一个填充流分组以保持各包0x800对齐。
对于SFD的最后一个包,在这个包的后部应当添加一个以 '00 00 01 B9'[hex] 开始且其他位均为 'FF'[hex] 的,长度为0x800的数据块。
其他信息
AT3的SFD样本中存在一些无音轨的SFD流,其缺少第00个包,且第02个包的数据记述有变化。需要特别分析。
参考标准
ISO/IEC 11172-1:1993
GB/T 17191.1-1997 (idt ISO/IEC 11172-1:1993)
ISO/IEC 11172-1:1993/Cor.1:1996
ISO/IEC 11172-1:1993/Cor.2:1999