逆向:CRI Sofdec数据流结构:修订间差异

添加3,303字节 、​ 2021年5月24日 (星期一)
增加一些新发现
(更新了一些信息。)
(增加一些新发现)
第2行: 第2行:


=CRI Sofdec简述=
=CRI Sofdec简述=
CRI Sofdec格式(典型扩展名为SFD)为CRI Midware公司开发的游戏用视频中间件格式。当前,CRI Midware已停止支持该格式。
CRI Sofdec格式(典型扩展名为SFD)为CRI Middleware公司开发的视频中间件格式。当前CRI Middleware已停止支持该格式。


该格式的数据结构为一种MPEG-1系统层(于ISO/IEC 11172-1中定义)的变体。其视频流为符合标准的MPEG-1视频(于ISO/IEC 11172-2中定义)。已知其音频流中必有一路使用用CRI ADX编码(CRI Midware私有音频压缩编码)的音频流(典型扩展名为SFA),可能包含有一路杜比数字(DD,典型扩展名为AC-3)音频流。需要专用的多路复用器进行复用。
该格式的数据结构为一种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 !! 出处
|-
|-
| DreamcastMovieCreator || SFDMUX Ver.1.07 19990520 CRI || 为 SFD Tool Pack v1.0 by SWAT 的一部分。有抽出dll制作的的命令行版本sfdmux。
| 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 Sofdec 结构=
=CRI Sofdec结构=
CRI Sofdec数据流(下简称SFD)内部有多个符合「ISO/IEC 11172-1 2.4.3.2 包层」定义的包。一般而言,每个包的大小均为0x800。
CRI Sofdec数据流(下简称SFD)内部有多个符合ISO/IEC 11172-1「2.4.3.2 包层」定义的包。每个包的大小均为0x800。


其中,第00-03个包(对于较旧版本的SFD复用器,可能为第00-02个包)标示了SFD的各种信息,而这之后的包为经多路复用的数据流(也许可以直接作为MPEG-1多路复用流解读?)。
其中,第00-03个包标示了SFD的各种信息(较旧版本的SFD可能缺少第03个包),之后的包为经多路复用的音视频流。


==信息包组(暂名)==
==信息包组(暂称)==
信息包组即指SFD内部的第00-03个包(对于较旧版本的SFD复用器,可能为第00-02个包)。
信息包组即指SFD内部的第00-03个包(较旧版本的SFD可能缺少第03个包)。


下面列出这些包的结构。
下面列出这些包的结构。


这些包中,一些定性数据暂为AT1,即"SFM Ver.2.25 2004-07-21 CRI-MW"(有声SFD)或"Sofdec CRAFT/GUI Ver.1.74 "(无声SFD)的参数。
下表中的一些定性数据暂仅列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] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD)  
   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[#1] = 'C0'[hex] (音频流1)
   stream_id = [default] ( 典型值:'C0'[hex], 对于SFA音频流; 'C1'[hex], 对于AC-3音频流. 可并列多个定义. )  
  stream_id[#2] = 'C1'[hex] (音频流2)
   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] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD)  
   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] (含一条有声ADX音频流的SFD) / '88 20 97'[hex] (含一条无声ADX音频流的SFD)  
   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 || 流标记?长度24。恒定值。
| 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个包的数据记述有变化。需要特别分析。


=参考标准=
=参考标准=
2,123

个编辑