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: 25056 $
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                 LZ77 圧縮データを展開し、8bit 単位で書き込みます。
69                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
70 
71     @param[in]  srcp        圧縮データアドレス
72     @param[in]  srcSize     圧縮データサイズ
73     @param[out] destp       展開データアドレス
74     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
75  */
76 s32 SecureUncompressLZ( const void *srcp, u32 srcSize, void *destp );
77 
78 
79 /*!
80     @brief      ハフマン圧縮データをエラーチェックしながら展開します。
81 
82                 ハフマン圧縮データを展開し、8bit 単位で書き込みます。
83                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
84                 展開データアドレスは 4Byte 境界に合わせ、さらに 4Byte の倍数分だけ
85                 準備する必要があります。
86 
87     @param[in]  srcp        圧縮データアドレス
88     @param[in]  srcSize     圧縮データサイズ
89     @param[out] destp       展開データアドレス
90     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
91  */
92 s32 SecureUncompressHuffman( const void *srcp, u32 srcSize, void *destp );
93 
94 
95 /*!
96     @brief      LZ-ハフマン複合圧縮データを展開します。
97     @param[in]  srcp        圧縮データアドレス
98     @param[in]  srcSize     圧縮データサイズ
99     @param[out] destp       展開データアドレス
100     @param[in]  work        作業領域(nn::cx::UNCOMPRESS_LH_WORK_SIZE (= 2176) バイト必要です)
101     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
102  */
103 s32 SecureUncompressLH( const u8* srcp, u32 srcSize, u8* dstp, void* work );
104 
105 
106 /*!
107     @brief      LZ-RangeCoder 複合圧縮データを展開します。
108     @param[in]  srcp        圧縮データアドレス
109     @param[in]  srcSize     圧縮データサイズ
110     @param[out] destp       展開データアドレス
111     @param[in]  work        作業領域(nn::cx::UNCOMPRESS_LRC_WORK_SIZE (= 36864) バイト必要です)
112     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
113  */
114 s32 SecureUncompressLRC( const u8* srcp, u32 srcSize, u8* dstp, void* work );
115 
116 
117 /*!
118     @brief      差分フィルタ変換データを復元します。
119 
120                 差分フィルタ変換データを復元し、8bit 単位で書き込みます。
121                 圧縮データアドレスは 4Byte 境界に合わせる必要があります。
122 
123     @param[in]  srcp        圧縮データアドレス
124     @param[in]  srcSize     圧縮データサイズ
125     @param[out] destp       展開データアドレス
126     @return     変換に成功した場合は 0 を、失敗した場合には負のエラーコードを返します。
127  */
128 s32 SecureUnfilterDiff( register const void *srcp, u32 srcSize, register void *destp );
129 
130 namespace internal {
131 
132 bool VerifyHuffmanTable( const void* pTable, u8 bit );
133 bool LHVerifyTable( const void* pTable, u8 bit );
134 
135 }   // namespace internal
136 
137 }   // namespace cx
138 }   // namespace nn
139 
140 /* NN_CX_SECURE_UNCOMPRESSION_H_ */
141 #endif
142