1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     jpeg_MpTypes.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd.  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   $Rev: 26510 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_JPEG_JPEGMPTYPES_H_
17 #define NN_JPEG_JPEGMPTYPES_H_
18 
19 #include <nn/types.h>
20 #include <nn/assert.h>
21 
22 #ifdef __cplusplus
23 
24 namespace nn {
25 namespace jpeg {
26 namespace CTR {
27 
28 const u32 DEFAULT_THUMBNAIL_WIDTH  = 160;       //!< デフォルトのサムネイル画像横幅(pixel)です。
29 const u32 DEFAULT_THUMBNAIL_HEIGHT = 120;       //!< デフォルトのサムネイル画像縦幅(pixel)です。
30 
31 const size_t DATE_TIME_SIZE = 20;       //!< 日時情報を格納するバッファのバイト数です。フォーマットは「YYYY:MM:DD HH:MM:DD」+0x00 の 20 文字になります。
32 const size_t IMAGE_UID_SIZE = 33;       //!< JPEGの画像ユニークIDのバイト数。MPフォーマットの個別画像ユニークIDリストの、1要素のバイト数。
33 
34 const size_t MPF_VERSION_SIZE  = 4;
35 const size_t MP_ENTRY_SIZE = 16;        //!< MPフォーマットのMPエントリの、1要素のバイト数。@ref MpEntry 構造体のバイト数ではありません。
36 
37 const size_t GPS_VERSION_ID_SIZE = 4;
38 const size_t GPS_REF_SIZE = 2;
39 const size_t GPS_DATE_STAMP_SIZE = 11;
40 
41 const u32 NUM_GPS_LATITUDE_RATIONALS  = 3;
42 const u32 NUM_GPS_LONGITUDE_RATIONALS = 3;
43 const u32 NUM_GPS_TIME_STAMP_RATIONALS = 3;
44 
45 const u32 NUM_RATIONAL_WORDS  = 2;
46 const u32 NUM_SRATIONAL_WORDS = 2;
47 
48 const u32 MIN_DECODER_SHRINK_LEVEL = 1;   //!< 縮小デコード時の縮小レベルに指定できる最小値。
49 const u32 MAX_DECODER_SHRINK_LEVEL = 4;   //!< 縮小デコード時の縮小レベルに指定できる最大値。
50 
51 const size_t TWL_PHOTO_MAKER_NOTE_SIZE = 8;  //!< 「ニンテンドーDSiカメラ」用メーカーノートのバイト数です。
52 
53 const u32 MAX_DECODER_OUTPUT_BUFFER_WIDTH = 65536;  //!< デコード時の出力画像バッファ横幅に指定できる最大値(pixel)です。
54 const u32 MAX_ENCODER_INPUT_BUFFER_WIDTH  = 65536;  //!< エンコード時の入力画像バッファ横幅に指定できる最大値(pixel)です。
55 
56 /*!
57    @brief   エンコード時の出力形式を示す列挙体です。
58 */
59 enum PixelSampling
60 {
61     PIXEL_SAMPLING_YUV444 = 1,    //!< YUV444 形式
62     PIXEL_SAMPLING_YUV420 = 2,    //!< YUV420 形式
63     PIXEL_SAMPLING_YUV422 = 3,    //!< YUV422 形式
64 
65     NUM_PIXEL_SAMPLINGS  // これはAPI引数として指定できません。
66 };
67 
68 const PixelSampling DEFAULT_THUMBNAIL_PIXEL_SAMPLING = PIXEL_SAMPLING_YUV422; //!< デフォルトのサムネイル出力形式です。
69 
70 // ピクセルフォーマット(PixelFormat)について
71 // PIXEL_FORMAT_YUYV8: d7-d0: YYYYYYYY(left), UUUUUUUU, YYYYYYYY(right), VVVVVVVV
72 //   カメラデバイスがキャプチャした画像のピクセルフォーマットです。
73 //
74 // PIXEL_FORMAT_CTR_RGB565: d15-d0: RRRRR GGGGGG BBBBB
75 //   GPUテクスチャフォーマット GL_RGB, GL_UNSIGNED_SHORT_5_6_5 に相当するものです。
76 //   画像の最上ラインがメモリの先頭になっているため、
77 //   デコーダ出力をGXライブラリがPICAネイティブフォーマットへ変換する際、画像はVフリップされます。
78 //   また変換処理に伴い、GXライブラリのCPU処理時間が増えます。
79 //
80 // PIXEL_FORMAT_CTR_RGB565_BLOCK8: RGB565 PICAネイティブフォーマット(ブロック8)
81 //   GPUテクスチャフォーマット GL_RGB_NATIVE_DMP, GL_UNSIGNED_SHORT_5_6_5 に相当するものです。
82 //   デコード関数の出力バッファを直接GPUから参照する場合、128バイトアラインメントにしてください。
83 //   本ライブラリでは4バイトアラインメントのチェックのみ行います。
84 //
85 // PIXEL_FORMAT_RGB8: d7-d0: RRRRRRRR, GGGGGGGG, BBBBBBBB
86 //   GPUテクスチャフォーマット GL_RGB, GL_UNSIGNED_BYTE に相当するものです。
87 //   PIXEL_FORMAT_CTR_RGB565と同様に、画像の最上ラインがメモリの先頭です。
88 //
89 // PIXEL_FORMAT_CTR_RGB8_BLOCK8: RGB8 PICAネイティブフォーマット(ブロック8)
90 //   GPUテクスチャフォーマット GL_RGB_NATIVE_DMP, GL_UNSIGNED_BYTE に相当するものです。
91 //   アラインメントについてはPIXEL_FORMAT_CTR_RGB565_BLOCK8と同じです。
92 //
93 // PIXEL_FORMAT_RGBA8: d7-d0: RRRRRRRR, GGGGGGGG, BBBBBBBB, AAAAAAAA
94 //   GPUテクスチャフォーマット GL_RGBA, GL_UNSIGNED_BYTE に相当するものです。
95 //   アルファ成分はエンコーダ入力時には無視され、デコーダ出力時には0xFFになります。
96 //   PIXEL_FORMAT_CTR_RGB565と同様に、画像の最上ラインがメモリの先頭です。
97 //
98 // PIXEL_FORMAT_CTR_RGBA8_BLOCK8: RGBA8 PICAネイティブフォーマット(ブロック8)
99 //   GPUテクスチャフォーマット GL_RGBA_NATIVE_DMP, GL_UNSIGNED_BYTE に相当するものです。
100 //   アラインメントについてはPIXEL_FORMAT_CTR_RGB565_BLOCK8と同じです。
101 //
102 // PIXEL_FORMAT_BGR8: d7-d0: BBBBBBBB, GGGGGGGG, RRRRRRRR
103 //   LCDディスプレイバッファフォーマット GL_RGB8_OES に相当するものです。
104 //   色成分の並び順が @ref PIXEL_FORMAT_RGB8 の逆になっています。
105 //
106 // PIXEL_FORMAT_ABGR8: d7-d0: AAAAAAAA, BBBBBBBB, GGGGGGGG, RRRRRRRR
107 //   LCDディスプレイバッファフォーマット GL_RGBA8_OES に相当するものです。
108 //   色成分の並び順が @ref PIXEL_FORMAT_RGBA8 の逆になっています。
109 //   アルファ成分の扱いは @ref PIXEL_FORMAT_RGBA8 と同じです。
110 
111 /*!
112   @brief   ピクセルフォーマットを示す列挙体です。
113 
114            エンコーダ入力、デコーダ出力共に対応しています。
115 
116 */
117 enum PixelFormat
118 {
119     PIXEL_FORMAT_YUYV8             = 0,   //!< カメラデバイスがキャプチャした画像のピクセルフォーマットです。
120     PIXEL_FORMAT_CTR_RGB565        = 1,   //!< GPUテクスチャフォーマット GL_RGB,             GL_UNSIGNED_SHORT_5_6_5 に相当するものです。
121     PIXEL_FORMAT_CTR_RGB565_BLOCK8 = 2,   //!< GPUテクスチャフォーマット GL_RGB_NATIVE_DMP,  GL_UNSIGNED_SHORT_5_6_5 に相当するものです。
122     PIXEL_FORMAT_RGB8              = 3,   //!< GPUテクスチャフォーマット GL_RGB,             GL_UNSIGNED_BYTE に相当するものです。
123     PIXEL_FORMAT_CTR_RGB8_BLOCK8   = 4,   //!< GPUテクスチャフォーマット GL_RGB_NATIVE_DMP,  GL_UNSIGNED_BYTE に相当するものです。
124     PIXEL_FORMAT_RGBA8             = 5,   //!< GPUテクスチャフォーマット GL_RGBA,            GL_UNSIGNED_BYTE に相当するものです。
125     PIXEL_FORMAT_CTR_RGBA8_BLOCK8  = 6,   //!< GPUテクスチャフォーマット GL_RGBA_NATIVE_DMP, GL_UNSIGNED_BYTE に相当するものです。
126     PIXEL_FORMAT_BGR8              = 7,   //!< LCDディスプレイバッファフォーマット GL_RGB8_OES  に相当するものです。
127     PIXEL_FORMAT_ABGR8             = 8,   //!< LCDディスプレイバッファフォーマット GL_RGBA8_OES に相当するものです。
128 
129     NUM_PIXEL_FORMATS  // これはAPI引数として指定できません。
130 };
131 
132 /*!
133    @brief  MP種別情報に含まれるフラグです。
134 */
135 enum MpTypeFlag
136 {
137     MP_TYPE_FLAG_DEPENDENT_IMAGE_PARENT = 0x80000000,       //!< 従属親画像です。従属画像 (dependent image) を持ちます。
138     MP_TYPE_FLAG_DEPENDENT_IMAGE_CHILD  = 0x40000000,       //!< 従属子画像です。他の個別画像の従属画像です。
139     MP_TYPE_FLAG_REPRESENTATIVE_IMAGE   = 0x20000000        //!< 代表画像 (representative image)。
140 };
141 
142 /*!
143    @brief  MP種別情報に含まれるデータ形式です。
144 */
145 enum MpTypeDataFormat
146 {
147     MP_TYPE_DATA_FORMAT_JPEG = 0x00000000,                  //!< データ形式はJPEGです。
148 
149     MP_TYPE_DATA_FORMAT_MASK = 0x07000000                   //!< データ形式のビットマスクです。
150 };
151 
152 /*!
153    @brief  MP種別情報に含まれる種別コードです。
154 */
155 enum MpTypeCode
156 {
157     MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE     = 0x030000,  //!< Baseline MP 主画像 (primary image)。
158 
159     MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 = 0x010001,  //!< モニタ表示用画像 (large thumbnail image)、クラス1 (VGA相当)。
160     MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 = 0x010002,  //!< モニタ表示用画像 (large thumbnail image)、クラス2 (Full HD相当)。
161 
162     MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE     = 0x020001,  //!< マルチビュー (multi-view)、パノラマ画像 (panorama image)。
163     MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE    = 0x020002,  //!< マルチビュー (multi-view)、立体視用画像 (disparity image)。
164     MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE  = 0x020003,  //!< マルチビュー (multi-view)、マルチアングル画像 (multi-angle image)。
165 
166     MP_TYPE_CODE_UNDEFINED                     = 0x000000,  //!< 未定義種別。
167 
168     MP_TYPE_CODE_MASK                          = 0xffffff   //!< 種別コードのビットマスクです。
169 };
170 
171 
172 /*!
173    @brief  MPフォーマットで格納されたデータに含まれる、MPインデックスIFDを、
174            ライブラリで処理しやすい形式で保持する構造体です。
175 
176            初期化(情報取得)は @ref JpegMpDecoder::GetMpIndex で行います。
177 
178            取得した情報は @ref JpegMpDecoder::GetMpEntry や @ref JpegMpDecoder::GetMpAttribute 等で参照されます。
179 */
180 struct MpIndex
181 {
182     const u8*   src;
183     size_t      srcSize;
184     size_t      mpEntrySize;
185     size_t      imageUidListSize;
186     size_t      offsetToMpEntry;
187     size_t      offsetToImageUidList;
188     size_t      offsetToMpIndexIfd;
189     size_t      offsetToBase;
190 
191     bool        isLittleEndian;
192     bool        isMpfVersionValid;
193     bool        isNumberOfImagesValid;
194     bool        isTotalFramesValid;
195 
196     u8          mpfVersion[MPF_VERSION_SIZE];
197     u32         numberOfImages;
198     u32         totalFrames;
199 };
200 
201 /*!
202    @brief  MPフォーマットで格納されたデータに含まれる、MPエントリを、
203            ライブラリで処理しやすい形式で保持する構造体です。
204 
205            初期化(情報取得)は @ref JpegMpDecoder::GetMpEntry で行います。
206 */
207 struct MpEntry
208 {
209     u32         type;                           //!< 個別画像種別管理情報。
210     size_t      imageDataSize;                  //!< 個別画像サイズ(バイト数)。
211     size_t      offsetToImageData;              //!< 個別画像データオフセット。先頭画像データからのものであり、MPフォーマットの「オフセットアドレスの基点」を処理済みです。
212     u16         dependentImage1EntryNum;        //!< 従属画像1エントリ番号。
213     u16         dependentImage2EntryNum;        //!< 従属画像2エントリ番号。
214     const u8*   pFirstImageData;                //!< 先頭画像データへのポインタ。
215 };
216 
217 
218 /*!
219    @brief  MP個別情報IFDおよびGPS IFDのメンバに使われる、RATIONAL (符号無し有理数)のデータ型です。
220 
221            [0]が分子、[1]が分母です。
222 */
223 struct Rational
224 {
225     u32         value[NUM_RATIONAL_WORDS];
226 };
227 
228 /*!
229    @brief  MP個別情報IFDおよびGPS IFDのメンバに使われる、SRATIONAL (符号付き有理数)のデータ型です。
230 
231            [0]が分子、[1]が分母です。
232 */
233 struct Srational
234 {
235     s32         value[NUM_SRATIONAL_WORDS];
236 };
237 
238 
239 /*!
240    @brief  MPフォーマットで格納されたデータに含まれる、MP個別情報IFDを、
241            ライブラリで処理しやすい形式で保持する構造体です。
242 
243            初期化(情報取得)は @ref JpegMpDecoder::GetMpAttribute で行います。
244 */
245 struct MpAttribute
246 {
247     bool        isMpfVersionValid;              //!< MPフォーマットバージョンが有効かどうか。
248     bool        isMpIndividualNumValid;         //!< 個別画像番号が有効かどうか。
249     bool        isPanOrientationValid;          //!< パノラマ画像配置が有効かどうか。
250     bool        isPanOverlapHValid;             //!< 水平オーバーラップが有効かどうか。
251 
252     bool        isPanOverlapVValid;             //!< 垂直オーバーラップが有効かどうか。
253     bool        isBaseViewpointNumValid;        //!< 基準視点番号が有効かどうか。
254     bool        isConvergenceAngleValid;        //!< 輻輳角が有効かどうか。
255     bool        isBaselineLengthValid;          //!< 基線長が有効かどうか。
256 
257     bool        isVerticalDivergenceValid;      //!< 水平からのずれが有効かどうか。
258     bool        isAxisDistanceXValid;           //!< 水平軸方向の距離(X)が有効かどうか。
259     bool        isAxisDistanceYValid;           //!< 水平軸方向の距離(Y)が有効かどうか。
260     bool        isAxisDistanceZValid;           //!< 水平軸方向の距離(Z)が有効かどうか。
261 
262     bool        isYawAngleValid;                //!< ヨー角が有効かどうか。
263     bool        isPitchAngleValid;              //!< ピッチ角が有効かどうか。
264     bool        isRollAngleValid;               //!< ロール角が有効かどうか。
265     u8          reserved[1];                    //!< 予約。(無視されます)
266 
267     u8          mpfVersion[MPF_VERSION_SIZE];   //!< MPフォーマットバージョン。
268     u32         mpIndividualNum;                //!< 個別画像番号。
269     u32         panOrientation;                 //!< パノラマ画像配置。
270     Rational    panOverlapH;                    //!< 水平オーバーラップ。
271     Rational    panOverlapV;                    //!< 垂直オーバーラップ。
272     u32         baseViewpointNum;               //!< 基準視点番号。
273     Srational   convergenceAngle;               //!< 輻輳角。
274     Rational    baselineLength;                 //!< 基線長。
275     Srational   verticalDivergence;             //!< 水平からのずれ。
276     Srational   axisDistanceX;                  //!< 水平軸方向の距離(X)。
277     Srational   axisDistanceY;                  //!< 水平軸方向の距離(Y)。
278     Srational   axisDistanceZ;                  //!< 水平軸方向の距離(Z)。
279     Srational   yawAngle;                       //!< ヨー角。
280     Srational   pitchAngle;                     //!< ピッチ角。
281     Srational   rollAngle;                      //!< ロール角。
282 };
283 
284 /*!
285    @brief  JPEGデータを再構成するための領域情報(ポインタとバイト数)を保持する構造体です。
286 
287            @ref JpegMpEncoder::StartMpEncoderFirst 、@ref JpegMpEncoder::StartMpEncoderNext あるいは @ref JpegMpEncoder::StartMpEncoderLR
288            によるエンコード結果から領域情報を取得する場合、@ref JpegMpEncoder::GetMpRegionsToBuildJpegData を使ってください。
289 
290            MPフォーマットで格納された個別画像データから領域情報を取得する場合、@ref JpegMpDecoder::GetMpRegionsToBuildJpegData を使ってください。
291 */
292 struct MpRegionsToBuildJpegData
293 {
294     const u8*   pSrc1;      //!< 前半領域へのポインタ。
295     size_t      size1;      //!< 前半領域のバイト数。
296     const u8*   pSrc2;      //!< 後半領域へのポインタ
297     size_t      size2;      //!< 後半領域のバイト数。
298 };
299 
300 struct GpsData
301 {
302     bool        isVersionIdValid;                               //!< versionIdが有効かどうか。
303     bool        isLatitudeValid;                                //!< latitudeが有効かどうか。
304     bool        isLongitudeValid;                               //!< longitudeが有効かどうか。
305     bool        isAltitudeRefValid;                             //!< altitudeRefが有効かどうか。
306 
307     bool        isAltitudeValid;                                //!< altitudeが有効かどうか。
308     bool        isTimeStampValid;                               //!< timeStampが有効かどうか。
309     bool        isDopValid;                                     //!< dopが有効かどうか。
310     bool        isSpeedValid;                                   //!< speedが有効かどうか。
311 
312     bool        isTrackValid;                                   //!< trackが有効かどうか。
313     bool        isImgDirectionValid;                            //!< imgDirectionが有効かどうか。
314     bool        isDestLatitudeValid;                            //!< destLatitudeが有効かどうか。
315     bool        isDestLongitudeValid;                           //!< destLongitudeが有効かどうか。
316 
317     bool        isDestBearingValid;                             //!< destBearingが有効かどうか。
318     bool        isDestDistanceValid;                            //!< destDistanceが有効かどうか。
319     bool        isDifferentialValid;                            //!< differentialが有効かどうか。
320 
321     u8          altitudeRef;                                    //!< 高度の基準。
322 
323     u8          versionId[GPS_VERSION_ID_SIZE];                 //!< GPSタグのバージョン。
324 
325     char        latitudeRef[GPS_REF_SIZE];                      //!< 北緯(N) or 南緯(S)。[0]が0でなければ有効。[1]は常に0。
326     char        longitudeRef[GPS_REF_SIZE];                     //!< 東経(E) or 西経(W)。[0]が0でなければ有効。[1]は常に0。
327 
328     char        status[GPS_REF_SIZE];                           //!< GPS受信機の状態。[0]が0でなければ有効。[1]は常に0。
329     char        measureMode[GPS_REF_SIZE];                      //!< GPSの測位方法。[0]が0でなければ有効。[1]は常に0。
330 
331     char        speedRef[GPS_REF_SIZE];                         //!< 速度の単位。[0]が0でなければ有効。[1]は常に0。
332     char        trackRef[GPS_REF_SIZE];                         //!< 進行方向の単位。[0]が0でなければ有効。[1]は常に0。
333 
334     char        imgDirectionRef[GPS_REF_SIZE];                  //!< 撮影した画像の方向の単位。[0]が0でなければ有効。[1]は常に0。
335     char        destLatitudeRef[GPS_REF_SIZE];                  //!< 目的地の北緯(N) or 南緯(S)。[0]が0でなければ有効。[1]は常に0。
336 
337     char        destLongitudeRef[GPS_REF_SIZE];                 //!< 目的地の東経(E) or 西経(W)。[0]が0でなければ有効。[1]は常に0。
338     char        destBearingRef[GPS_REF_SIZE];                   //!< 目的地の方角の単位。[0]が0でなければ有効。[1]は常に0。
339 
340     char        destDistanceRef[GPS_REF_SIZE];                  //!< 目的地までの距離の単位。[0]が0でなければ有効。[1]は常に0。
341     u16         differential;                                   //!< GPS補正測位。
342 
343     Rational    latitude[NUM_GPS_LATITUDE_RATIONALS];           //!< 緯度(数値)。
344     Rational    longitude[NUM_GPS_LONGITUDE_RATIONALS];         //!< 経度(数値)。
345     Rational    altitude;                                       //!< 高度(数値)。
346     Rational    timeStamp[NUM_GPS_TIME_STAMP_RATIONALS];        //!< GPS時間(原子時計の時間)。
347     const char* pSatellites;                                    //!< 測位に使った衛星信号。NULLでなければ有効。
348     Rational    dop;                                            //!< 測位の信頼性。
349     Rational    speed;                                          //!< 速度(数値)。
350     Rational    track;                                          //!< 進行方向(数値)。
351     Rational    imgDirection;                                   //!< 撮影した画像の方向(数値)。
352     const char* pMapDatum;                                      //!< 測位に用いた地図データ。NULLでなければ有効。
353     Rational    destLatitude[NUM_GPS_LATITUDE_RATIONALS];       //!< 目的地の緯度(数値)。
354     Rational    destLongitude[NUM_GPS_LONGITUDE_RATIONALS];     //!< 目的地の経度(数値)。
355     Rational    destBearing;                                    //!< 目的の方角(数値)。
356     Rational    destDistance;                                   //!< 目的地までの距離(数値)。
357     const u8*   pProcessingMethod;                              //!< 測位方式の名称。NULLでなければ有効。
358     size_t      processingMethodSize;                           //!< pProcessingMethodのデータバイト数。0でなければ有効。
359     const u8*   pAreaInformation;                               //!< 測位地点の名称。NULLでなければ有効。
360     size_t      areaInformationSize;                            //!< pAreaInformationのデータバイト数。0でなければ有効。
361     const char* pDateStamp;                                     //!< GPS日付。NULLでなければ有効。
362 };
363 
364 enum
365 {
366     JPEG_ENCODER_ERROR_NONE                         = 0,
367     JPEG_ENCODER_ERROR_NOT_INITIALIZED              = -1,
368     JPEG_ENCODER_ERROR_INVALID_ARGUMENT             = -2,
369     JPEG_ENCODER_ERROR_SRC_ALIGNMENT                = -3,
370     JPEG_ENCODER_ERROR_APP1                         = -4,
371     JPEG_ENCODER_ERROR_APP2_MP                      = -5,
372     JPEG_ENCODER_ERROR_INVALID_MP_NUM_IMAGES        = -6,
373     JPEG_ENCODER_ERROR_INVALID_MP_TYPE_CODE         = -7,
374     JPEG_ENCODER_ERROR_INVALID_MP_SEQUENCE          = -8,
375     JPEG_ENCODER_ERROR_INSUFFICIENT_OUTPUT_BUFFER   = -9,
376 
377     JPEG_ENCODER_ERROR_INTERNAL                     = -127
378 };
379 
380 enum
381 {
382     JPEG_DECODER_ERROR_NONE                         = 0,
383     JPEG_DECODER_ERROR_NOT_INITIALIZED              = -1,
384     JPEG_DECODER_ERROR_INVALID_ARGUMENT             = -2,
385     JPEG_DECODER_ERROR_DST_ALIGNMENT                = -3,
386     JPEG_DECODER_ERROR_DST_BUFFER_SIZE              = -4,
387 
388     JPEG_DECODER_ERROR_STOPPED                      = -10,
389 
390     JPEG_DECODER_ERROR_WIDTH_HEIGHT =  -20,  // 幅か高さが、0あるいは最大値を超えています。
391     JPEG_DECODER_ERROR_WIDTH_HEIGHT_DIFFERENT = -21,  // 2枚の画像の幅か高さが、一致していません。
392 
393     JPEG_DECODER_ERROR_EXIF =        -30,  // Exif情報を処理できませんでした。
394     JPEG_DECODER_ERROR_THUMBNAIL = -31,  // サムネイルが見つからなかったか、サムネイルをデコードできませんでした。
395 // サムネイルが見つからなかった場合、他のエラーコードが返る可能性があります。
396 // サムネイルがデコードできなかった場合、非圧縮データの可能性があります。
397     JPEG_DECODER_ERROR_MP             =  -32,  // MPフォーマット付属情報(MPインデックスIFDあるいはMP個別情報IFD)を処理できませんでした。
398     JPEG_DECODER_ERROR_MP_NOT_FOUND   =  -33,  // MPフォーマット付属情報が見つかりませんでした。
399 
400     JPEG_DECODER_ERROR_MARKER_COMBINATION = -50,   // データを処理できませんでした。
401 // マーカの組み合わせが正しくありません。
402 // 例えば、SOFマーカに対応するSOSマーカが見つからなかった場合や、
403 // サムネイル中のマーカが処理できなかった場合、
404 // このエラーコードが返る可能性があります。
405 
406     JPEG_DECODER_ERROR_SOI = -60,   // データ(マーカ)を処理できませんでした。
407     JPEG_DECODER_ERROR_SOF = -61,
408     JPEG_DECODER_ERROR_SOF_BLOCK_ID = -62,
409     JPEG_DECODER_ERROR_DHT = -63,
410     JPEG_DECODER_ERROR_SOS = -64,
411     JPEG_DECODER_ERROR_DQT = -65,
412     JPEG_DECODER_ERROR_DRI = -66,
413     JPEG_DECODER_ERROR_SOS_NOT_FOUND = -67,  // SOSマーカが見つかりませんでした。
414     JPEG_DECODER_ERROR_SOF_NOT_FOUND = -68,  // SOFマーカが見つかりませんでした。
415     JPEG_DECODER_ERROR_DQT_NOT_FOUND = -69,  // DQTマーカが見つかりませんでした。
416     JPEG_DECODER_ERROR_DHT_NOT_FOUND = -70,  // DHTマーカが見つかりませんでした。
417 
418     JPEG_DECODER_ERROR_UNDERRUN_0 = -90,   // データを処理できませんでした。
419     JPEG_DECODER_ERROR_UNDERRUN_1 = -91,
420     JPEG_DECODER_ERROR_UNDERRUN_2 = -92,
421     JPEG_DECODER_ERROR_UNDERRUN_3 = -93,
422     JPEG_DECODER_ERROR_UNDERRUN_4 = -94,
423     JPEG_DECODER_ERROR_UNDERRUN_5 = -95,
424     JPEG_DECODER_ERROR_UNDERRUN_6 = -96,
425 
426     JPEG_DECODER_ERROR_RANGE_0 = -110,  // データを処理できませんでした。
427     JPEG_DECODER_ERROR_RANGE_1 = -111,
428     JPEG_DECODER_ERROR_RANGE_2 = -112,
429     JPEG_DECODER_ERROR_RANGE_3 = -113,
430     JPEG_DECODER_ERROR_RANGE_4 = -114,
431     JPEG_DECODER_ERROR_RANGE_5 = -115,
432 
433     JPEG_DECODER_ERROR_HLB_0 = -120,  // データを処理できませんでした。
434 
435     JPEG_DECODER_ERROR_INTERNAL = -127
436 };
437 
438 enum
439 {
440     JPEG_DECODER_OPTION_ENABLE_DEFAULT_DHT = 0x00000001
441 };
442 
443 namespace detail {
444 const size_t TWL_PRIVATE_DATA_SIZE = 28;
445 const size_t MAX_TWL_PHOTO_DATA_SIZE = (200 * 1024 - 1);
446 
447     enum
448     {
449         MAKER_NOTE_INDEX_USER = 0,
450         MAKER_NOTE_INDEX_SYS_1,
451         MAKER_NOTE_INDEX_SYS_2,
452         MAKER_NOTE_INDEX_SYS_3,
453 
454         NUM_MAKER_NOTES  // これはインデックスとして指定できません。
455     };
456 
457     struct JpegMpEncoderTemporarySettingObj
458     {
459         u16             dependentImage1EntryNum;
460         u16             dependentImage2EntryNum;
461         u16             orientation;
462         bool            isOrientationSet;
463         bool            padding[1];
464         u32             thumbnailWidth;
465         u32             thumbnailHeight;
466         u32             inputBufferWidth;
467         struct
468         {
469             const u8*   pData;
470             size_t      size;
471         } makerNotes[NUM_MAKER_NOTES];
472         const u8*       pTwlPhotoMakerNoteData;
473         const char*     pSoftware;
474         const GpsData*  pGpsData;
475         char            dateTimeBuffer[DATE_TIME_SIZE];
476         char            imageUidBuffer[IMAGE_UID_SIZE];
477         bool            isImageUidSet;
478         bool            isDateTimeSet;
479         PixelSampling   thumbnailSampling;
480 
481         bool            isDependentParent;
482         bool            isDependentChild;
483         bool            isRepresentativeSet;
484         bool            isRepresentative;
485         MpAttribute     mpAttribute;
486     };
487 
488     struct JpegMpDecoderTemporarySettingObj
489     {
490         u32     outputBufferWidth;
491         u32     option;
492     };
493 }
494 
495 } // namespace CTR {
496 } // namespace jpeg {
497 } // namespace nn {
498 
499 #endif // __cplusplus
500 
501 #endif // NN_JPEG_JPEGMPTYPES_H_
502