1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     jpeg_MpTypes.h
4 
5   Copyright (C)2009-2012 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: 46347 $
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;       //
29 const size_t IMAGE_UID_SIZE = 33;       //
30 
31 const size_t MPF_VERSION_SIZE  = 4;     //
32 const size_t MP_ENTRY_SIZE = 16;        //
33 
34 const size_t GPS_VERSION_ID_SIZE = 4;   //
35 const size_t GPS_REF_SIZE = 2;
36 const size_t GPS_DATE_STAMP_SIZE = 11;  //
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;  //
49 
50 const u32 MAX_DECODER_OUTPUT_BUFFER_WIDTH = 65536;  //
51 const u32 MAX_ENCODER_INPUT_BUFFER_WIDTH  = 65536;  //
52 
53 /* Please see man pages for details
54 
55 */
56 enum PixelSampling
57 {
58     PIXEL_SAMPLING_YUV444 = 1,    //
59     PIXEL_SAMPLING_YUV420 = 2,    //
60     PIXEL_SAMPLING_YUV422 = 3,    //
61 
62     NUM_PIXEL_SAMPLINGS  // This cannot be specified as a function argument.
63 };
64 
65 const PixelSampling DEFAULT_THUMBNAIL_PIXEL_SAMPLING = PIXEL_SAMPLING_YUV422; //
66 
67 const u32 DEFAULT_THUMBNAIL_WIDTH  = 160;       //
68 const u32 DEFAULT_THUMBNAIL_HEIGHT = 120;       //
69 
70 /* Please see man pages for details
71 
72 
73 
74 
75 */
76 enum PixelFormat
77 {
78     PIXEL_FORMAT_YUYV8             = 0,   //
79     PIXEL_FORMAT_CTR_RGB565        = 1,   //
80     PIXEL_FORMAT_CTR_RGB565_BLOCK8 = 2,   //
81     PIXEL_FORMAT_RGB8              = 3,   //
82     PIXEL_FORMAT_CTR_RGB8_BLOCK8   = 4,   //
83     PIXEL_FORMAT_RGBA8             = 5,   //
84     PIXEL_FORMAT_CTR_RGBA8_BLOCK8  = 6,   //
85     PIXEL_FORMAT_BGR8              = 7,   //
86     PIXEL_FORMAT_ABGR8             = 8,   //
87 
88     NUM_PIXEL_FORMATS  // This cannot be specified as a function argument.
89 };
90 
91 /* Please see man pages for details
92 
93 */
94 enum MpTypeFlag
95 {
96     MP_TYPE_FLAG_DEPENDENT_IMAGE_PARENT = 0x80000000,       //
97     MP_TYPE_FLAG_DEPENDENT_IMAGE_CHILD  = 0x40000000,       //
98     MP_TYPE_FLAG_REPRESENTATIVE_IMAGE   = 0x20000000        //
99 };
100 
101 /* Please see man pages for details
102 
103 */
104 enum MpTypeDataFormat
105 {
106     MP_TYPE_DATA_FORMAT_JPEG = 0x00000000,                  //
107 
108     MP_TYPE_DATA_FORMAT_MASK = 0x07000000                   //
109 };
110 
111 /* Please see man pages for details
112 
113 */
114 enum MpTypeCode
115 {
116     MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE     = 0x030000,  //
117 
118     MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 = 0x010001,  //
119     MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 = 0x010002,  //
120 
121     MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE     = 0x020001,  //
122     MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE    = 0x020002,  //
123     MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE  = 0x020003,  //
124 
125     MP_TYPE_CODE_UNDEFINED                     = 0x000000,  //
126 
127     MP_TYPE_CODE_MASK                          = 0xffffff   //
128 };
129 
130 
131 /* Please see man pages for details
132 
133 
134 
135 
136 
137 
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 /* Please see man pages for details
161 
162 
163 
164 
165 */
166 struct MpEntry
167 {
168     u32         type;                           //
169     size_t      imageDataSize;                  //
170     size_t      offsetToImageData;              //
171     u16         dependentImage1EntryNum;        //
172     u16         dependentImage2EntryNum;        //
173     const u8*   pFirstImageData;                //
174 };
175 
176 
177 /* Please see man pages for details
178 
179 
180 
181 */
182 struct Rational
183 {
184     u32         value[NUM_RATIONAL_WORDS];
185 };
186 
187 /* Please see man pages for details
188 
189 
190 
191 */
192 struct Srational
193 {
194     s32         value[NUM_SRATIONAL_WORDS];
195 };
196 
197 
198 /* Please see man pages for details
199 
200 
201 
202 
203 */
204 struct MpAttribute
205 {
206     bool        isMpfVersionValid;              //
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;           //
218     bool        isAxisDistanceYValid;           //
219     bool        isAxisDistanceZValid;           //
220 
221     bool        isYawAngleValid;                //
222     bool        isPitchAngleValid;              //
223     bool        isRollAngleValid;               //
224     u8          reserved[1];                    //
225 
226     u8          mpfVersion[MPF_VERSION_SIZE];   //
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;                  //
236     Srational   axisDistanceY;                  //
237     Srational   axisDistanceZ;                  //
238     Srational   yawAngle;                       //
239     Srational   pitchAngle;                     //
240     Srational   rollAngle;                      //
241 };
242 
243 /* Please see man pages for details
244 
245 
246 
247 
248 
249 
250 */
251 struct MpRegionsToBuildJpegData
252 {
253     const u8*   pSrc1;      //
254     size_t      size1;      //
255     const u8*   pSrc2;      //
256     size_t      size2;      //
257 };
258 
259 /* Please see man pages for details
260 
261 
262 
263 
264 */
265 struct GpsData
266 {
267     bool        isVersionIdValid;                               //
268     bool        isLatitudeValid;                                //
269     bool        isLongitudeValid;                               //
270     bool        isAltitudeRefValid;                             //
271 
272     bool        isAltitudeValid;                                //
273     bool        isTimeStampValid;                               //
274     bool        isDopValid;                                     //
275     bool        isSpeedValid;                                   //
276 
277     bool        isTrackValid;                                   //
278     bool        isImgDirectionValid;                            //
279     bool        isDestLatitudeValid;                            //
280     bool        isDestLongitudeValid;                           //
281 
282     bool        isDestBearingValid;                             //
283     bool        isDestDistanceValid;                            //
284     bool        isDifferentialValid;                            //
285 
286     u8          altitudeRef;                                    //
287 
288     u8          versionId[GPS_VERSION_ID_SIZE];                 //
289 
290     char        latitudeRef[GPS_REF_SIZE];                      //
291     char        longitudeRef[GPS_REF_SIZE];                     //
292 
293     char        status[GPS_REF_SIZE];                           //
294     char        measureMode[GPS_REF_SIZE];                      //
295 
296     char        speedRef[GPS_REF_SIZE];                         //
297     char        trackRef[GPS_REF_SIZE];                         //
298 
299     char        imgDirectionRef[GPS_REF_SIZE];                  //
300     char        destLatitudeRef[GPS_REF_SIZE];                  //
301 
302     char        destLongitudeRef[GPS_REF_SIZE];                 //
303     char        destBearingRef[GPS_REF_SIZE];                   //
304 
305     char        destDistanceRef[GPS_REF_SIZE];                  //
306     u16         differential;                                   //
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];        //
312     const char* pSatellites;                                    //
313     Rational    dop;                                            //
314     Rational    speed;                                          //
315     Rational    track;                                          //
316     Rational    imgDirection;                                   //
317     const char* pMapDatum;                                      //
318     Rational    destLatitude[NUM_GPS_LATITUDE_RATIONALS];       //
319     Rational    destLongitude[NUM_GPS_LONGITUDE_RATIONALS];     //
320     Rational    destBearing;                                    //
321     Rational    destDistance;                                   //
322     const u8*   pProcessingMethod;                              //
323     size_t      processingMethodSize;                           //
324     const u8*   pAreaInformation;                               //
325     size_t      areaInformationSize;                            //
326     const char* pDateStamp;                                     //
327 };
328 
329 /* Please see man pages for details
330 
331 
332 
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,   //
340     JPEG_ENCODER_ERROR_APP1                         = -4,   //
341     JPEG_ENCODER_ERROR_APP2_MP                      = -5,   //
342     JPEG_ENCODER_ERROR_INVALID_MP_NUM_IMAGES        = -6,   //
343     JPEG_ENCODER_ERROR_INVALID_MP_TYPE_CODE         = -7,   //
344     JPEG_ENCODER_ERROR_INVALID_MP_SEQUENCE          = -8,   //
345     JPEG_ENCODER_ERROR_INSUFFICIENT_OUTPUT_BUFFER   = -9,   //
346 
347     JPEG_ENCODER_ERROR_INTERNAL                     = -127  //
348 };
349 
350 /* Please see man pages for details
351 
352 
353 
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,         //
361     JPEG_DECODER_ERROR_DST_BUFFER_SIZE        = -4,         //
362 
363     JPEG_DECODER_ERROR_STOPPED                = -10,        //
364 
365     JPEG_DECODER_ERROR_WIDTH_HEIGHT           = -20,        //
366     JPEG_DECODER_ERROR_WIDTH_HEIGHT_DIFFERENT = -21,        //
367 
368     JPEG_DECODER_ERROR_EXIF                   = -30,        //
369     JPEG_DECODER_ERROR_THUMBNAIL              = -31,        //
370 
371     JPEG_DECODER_ERROR_MP                     = -32,        //
372     JPEG_DECODER_ERROR_MP_NOT_FOUND           = -33,        //
373 
374     JPEG_DECODER_ERROR_MARKER_COMBINATION     = -50,        //
375 
376     JPEG_DECODER_ERROR_SOI = -60,               //
377     JPEG_DECODER_ERROR_SOF = -61,               //
378     JPEG_DECODER_ERROR_SOF_BLOCK_ID = -62,      //
379     JPEG_DECODER_ERROR_DHT = -63,               //
380     JPEG_DECODER_ERROR_SOS = -64,               //
381     JPEG_DECODER_ERROR_DQT = -65,               //
382     JPEG_DECODER_ERROR_DRI = -66,               //
383     JPEG_DECODER_ERROR_SOS_NOT_FOUND = -67,     //
384     JPEG_DECODER_ERROR_SOF_NOT_FOUND = -68,     //
385     JPEG_DECODER_ERROR_DQT_NOT_FOUND = -69,     //
386     JPEG_DECODER_ERROR_DHT_NOT_FOUND = -70,     //
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 /* Please see man pages for details
409 
410 
411 
412 
413 
414 
415 
416 
417 
418 
419 
420 
421 
422 
423 
424 
425 
426 
427 
428 
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 /* Please see man pages for details
438 
439 
440 
441 
442 
443 
444 
445 
446 
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457 
458 
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  // This cannot be specified as an index.
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