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