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