1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     cx_SecureUncompression.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 27173 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_CX_SECURE_UNCOMPRESSION_H_
17 #define NN_CX_SECURE_UNCOMPRESSION_H_
18 
19 #include <nn/types.h>
20 #include <nn/cx/cx_Uncompression.h>
21 
22 namespace nn {
23 namespace cx {
24 
25 enum
26 {
27     CX_ERR_SUCCESS           =  0,
28     CX_ERR_UNSUPPORTED       = -1,
29     CX_ERR_SRC_SHORTAGE      = -2,
30     CX_ERR_SRC_REMAINDER     = -3,
31     CX_ERR_DEST_OVERRUN      = -4,
32     CX_ERR_ILLEGAL_TABLE     = -5
33 };
34 
35 /*!
36     @brief      データヘッダから圧縮タイプを判別して、適当な展開処理を
37                 エラーチェックしながら実行します。
38 
39                 すべての圧縮種類の展開処理がリンクされますので、
40                 特定の圧縮フォーマット以外使用していない場合には
41                 圧縮種別毎の関数を実行した方がよいかもしれません。
42 
43     @param[in]  srcp        圧縮データアドレス
44     @param[in]  srcSize     圧縮データサイズ
45     @param[out] destp       展開データアドレス
46     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
47  */
48 s32 SecureUncompressAny( const void* srcp, u32 srcSize, void* destp );
49 
50 
51 /*!
52     @brief      ランレングス圧縮データをエラーチェックしながら展開します。
53 
54                 ランレングス圧縮データを展開し、8bit 単位で書き込みます。
55                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
56 
57     @param[in]  srcp        圧縮データアドレス
58     @param[in]  srcSize     圧縮データサイズ
59     @param[out] destp       展開データアドレス
60     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
61  */
62 s32 SecureUncompressRL( const void *srcp, u32 srcSize, void *destp );
63 
64 
65 /*!
66     @brief      LZ77 圧縮データをエラーチェックしながら展開します。
67 
68                 本 API は LZ 圧縮(旧互換)、LZ 拡張圧縮の両方に対応しています。
69 
70                 LZ77 圧縮データを展開し、8bit 単位で書き込みます。
71                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
72 
73     @param[in]  srcp        圧縮データアドレス
74     @param[in]  srcSize     圧縮データサイズ
75     @param[out] destp       展開データアドレス
76     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
77  */
78 s32 SecureUncompressLZ( const void *srcp, u32 srcSize, void *destp );
79 
80 
81 /*!
82     @brief      ハフマン圧縮データをエラーチェックしながら展開します。
83 
84                 ハフマン圧縮データを展開し、8bit 単位で書き込みます。
85                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
86                 展開データアドレスは 4Byte 境界に合わせ、さらに 4Byte の倍数分だけ
87                 準備する必要があります。
88 
89     @param[in]  srcp        圧縮データアドレス
90     @param[in]  srcSize     圧縮データサイズ
91     @param[out] destp       展開データアドレス
92     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
93  */
94 s32 SecureUncompressHuffman( const void *srcp, u32 srcSize, void *destp );
95 
96 
97 /*!
98     @brief      LZ-ハフマン複合圧縮データを展開します。
99     @param[in]  srcp        圧縮データアドレス
100     @param[in]  srcSize     圧縮データサイズ
101     @param[out] destp       展開データアドレス
102     @param[in]  work        作業領域(nn::cx::UNCOMPRESS_LH_WORK_SIZE (= 2176) バイト必要です)
103     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
104  */
105 s32 SecureUncompressLH( const u8* srcp, u32 srcSize, u8* destp, void* work );
106 
107 
108 /*!
109     @brief      LZ-RangeCoder 複合圧縮データを展開します。
110     @param[in]  srcp        圧縮データアドレス
111     @param[in]  srcSize     圧縮データサイズ
112     @param[out] destp       展開データアドレス
113     @param[in]  work        作業領域(nn::cx::UNCOMPRESS_LRC_WORK_SIZE (= 36864) バイト必要です)
114     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
115  */
116 s32 SecureUncompressLRC( const u8* srcp, u32 srcSize, u8* destp, void* work );
117 
118 
119 /*!
120     @brief      差分フィルタ変換データを復元します。
121 
122                 差分フィルタ変換データを復元し、8bit 単位で書き込みます。
123                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
124 
125     @param[in]  srcp        圧縮データアドレス
126     @param[in]  srcSize     圧縮データサイズ
127     @param[out] destp       展開データアドレス
128     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
129  */
130 s32 SecureUnfilterDiff( register const void *srcp, u32 srcSize, register void *destp );
131 
132 namespace internal {
133 
134 bool VerifyHuffmanTable( const void* pTable, u8 bit );
135 bool LHVerifyTable( const void* pTable, u8 bit );
136 
137 }   // namespace internal
138 
139 }   // namespace cx
140 }   // namespace nn
141 
142 /* NN_CX_SECURE_UNCOMPRESSION_H_ */
143 #endif
144