1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: jpeg_MpDecoder.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 /*! @file 17 @brief JpegMpDecoder に関するAPIの宣言 18 19 :include nn/jpeg.h 20 */ 21 22 #ifndef NN_JPEG_JPEGMPDECODER_H_ 23 #define NN_JPEG_JPEGMPDECODER_H_ 24 25 #include <nn/util/util_NonCopyable.h> 26 #include <nn/jpeg/CTR/jpeg_MpTypes.h> 27 28 #ifdef __cplusplus 29 30 namespace nn { 31 namespace jpeg { 32 namespace CTR { 33 34 namespace detail { 35 struct JpegMpDecoderWorkObj; 36 } 37 38 /*! 39 @brief JPEGデコードを行うクラスです。 40 */ 41 class JpegMpDecoder : private nn::util::NonCopyable<JpegMpDecoder> 42 { 43 public: 44 /*! 45 @name 初期化・終了 46 47 @{ 48 */ 49 50 /*! 51 @brief デコーダオブジェクト用ワークバッファのバイト数を計算します。 52 53 バッファの確保と解放はアプリケーションで行ってください。 54 55 @return バッファのバイト数を返します。 56 */ 57 static size_t GetWorkBufferSize(); 58 59 /*! 60 @brief デコーダオブジェクトを構築します。 61 62 初期化しません。 63 */ JpegMpDecoder()64 JpegMpDecoder() : m_Initialized(false) {} 65 66 /*! 67 @brief デコーダオブジェクトを初期化します。 68 69 デコーダオブジェクト用ワークバッファも初期化します。 70 71 初期化を一度行えば、終了するまで再初期化不要です。 72 再初期化してもかまいません。 73 74 @param[out] workBuffer デコーダオブジェクト用ワークバッファを指定します。 75 4バイトアラインメントが必要です。<BR> 76 バッファサイズは @ref GetWorkBufferSize で計算します。<BR> 77 ワークバッファはデコーダオブジェクト毎に必要です。 78 79 @param[in] workBufferSize バッファのバイト数を指定します。 80 @ref GetWorkBufferSize の返り値を指定してください。 81 82 @return 成功した場合、trueを返します。 83 失敗した場合、falseを返します。<BR> 84 workBufferのアラインメントと、workBufferSizeを確認してください。 85 */ 86 bool Initialize(void* workBuffer, size_t workBufferSize); 87 88 /*! 89 @brief デコーダオブジェクトの終了処理を行います。 90 91 @return なし。 92 */ Finalize()93 void Finalize() { m_Initialized = false; } 94 95 /*! 96 @brief デストラクタです。 97 内部で Finalize() を呼びます。 98 */ ~JpegMpDecoder()99 ~JpegMpDecoder() { Finalize(); } 100 101 /*! 102 @} 103 104 @name デコード前の設定 105 106 @{ 107 */ 108 109 /*! 110 @brief JPEGデコード結果(画像1枚分)を格納するバッファのバイト数を計算します。 111 112 バッファの確保と解放はアプリケーションで行ってください。 113 114 格納するピクセルフォーマット(引数 dstPixelFormat)により、 115 バッファの画像サイズはデコードを許す画像サイズ(引数 maxWidth、maxHeight)より大きくなる(切り上げられる)場合があります。 116 117 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します(65536未満)。<BR> 118 縮小デコード (@ref StartJpegDecoderShrink) を行う場合は、デコード結果(縮小後)の最大横幅を指定します。<BR> 119 @ref SetOutputBufferWidth で出力画像バッファの横幅を指定する場合は、 120 本関数では大きい方の値を指定してください。<BR> 121 それより大きい値でもかまいません。 122 123 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します(65536未満)。<BR> 124 縮小デコードを行う場合は、デコード結果(縮小後)の最大縦幅を指定します。<BR> 125 それより大きい値でもかまいません。 126 127 @param[in] dstPixelFormat 格納するピクセルフォーマットを指定します。<BR> 128 @ref PIXEL_FORMAT_CTR_RGB565_BLOCK8 、@ref PIXEL_FORMAT_CTR_RGB8_BLOCK8 、あるいは @ref PIXEL_FORMAT_CTR_RGBA8_BLOCK8 を指定した場合、 129 引数 maxWidthおよびmaxHeightを8の倍数へ切り上げてバッファのバイト数を計算します。<BR> 130 @ref PIXEL_FORMAT_YUYV8 の場合、 131 引数 maxWidthを2の倍数へ切り上げて計算します。 132 133 @return デコード結果を格納するバッファのバイト数を返します。<BR> 134 引数が不正か、バイト数がsize_t型の範囲を超えた場合は、エラーとして0を返します。 135 */ GetDstBufferSize(u32 maxWidth,u32 maxHeight,PixelFormat dstPixelFormat)136 static size_t GetDstBufferSize(u32 maxWidth, 137 u32 maxHeight, 138 PixelFormat dstPixelFormat) 139 { 140 size_t size = 0; 141 u64 size64; 142 143 switch (dstPixelFormat) 144 { 145 case PIXEL_FORMAT_YUYV8: 146 // 横幅を2の倍数へ切り上げます。 147 maxWidth = (maxWidth + 1) & ~1; 148 size = 2; 149 break; 150 151 case PIXEL_FORMAT_CTR_RGB565: 152 size = 2; 153 break; 154 155 case PIXEL_FORMAT_CTR_RGB565_BLOCK8: 156 // 横幅および縦幅を8の倍数へ切り上げます。 157 maxWidth = (maxWidth + 7) & ~7; 158 maxHeight = (maxHeight + 7) & ~7; 159 size = 2; 160 break; 161 162 case PIXEL_FORMAT_RGB8: 163 case PIXEL_FORMAT_BGR8: 164 size = 3; 165 break; 166 167 case PIXEL_FORMAT_CTR_RGB8_BLOCK8: 168 maxWidth = (maxWidth + 7) & ~7; 169 maxHeight = (maxHeight + 7) & ~7; 170 size = 3; 171 break; 172 173 case PIXEL_FORMAT_RGBA8: 174 case PIXEL_FORMAT_ABGR8: 175 size = 4; 176 break; 177 178 case PIXEL_FORMAT_CTR_RGBA8_BLOCK8: 179 maxWidth = (maxWidth + 7) & ~7; 180 maxHeight = (maxHeight + 7) & ~7; 181 size = 4; 182 break; 183 184 default: 185 // unexpected format 186 size = 0; 187 break; 188 } 189 190 size64 = static_cast<u64>(size) * maxWidth * maxHeight; 191 size = static_cast<size_t>(size64); 192 193 if (size != size64) 194 { 195 size = 0; 196 } 197 198 return size; 199 } 200 201 /*! 202 @brief 出力画像バッファの横幅を指定します。 203 204 本関数は、デコードしたい画像横幅より、デコード結果を出力する画像バッファ(例えばGPUテクスチャバッファ) 205 の画像横幅が大きい場合に使います。 206 207 出力画像バッファの画像横幅を指定することにより、 208 デコード関数( @ref StartJpegDecoder 、@ref StartJpegDecoderShrink 、@ref StartMpDecoderLR )が出力画像バッファから左詰めで出力します。 209 出力されない余白部分のバッファ内容は変更しません。 210 211 本関数は、デコード関数を呼ぶ前に呼んでください。 212 デコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。 213 複数回デコードする場合は、それぞれのデコード前に本関数を呼ぶ必要があります。 214 他にも、引数 width に0を指定するか、 215 @ref Initialize でデコーダオブジェクトを再初期化すると指定はクリアされます。 216 217 本関数で指定した画像横幅が、デコード結果を出力するために必要な横幅より小さい場合は、 218 デコード関数が出力画像バッファの横幅を切り上げます。 219 切り上げた結果、デコード関数に指定された出力画像バッファのバイト数を超える場合はデコードに失敗します。 220 221 デコード関数で指定する出力ピクセルフォーマット (@ref PixelFormat) が @ref PIXEL_FORMAT_CTR_RGB565_BLOCK8 、@ref PIXEL_FORMAT_CTR_RGB8_BLOCK8 、あるいは @ref PIXEL_FORMAT_CTR_RGBA8_BLOCK8 の場合、 222 引数 width が8の倍数でないと正しく動作しません(8の倍数へ切り下げられます)。<BR> 223 @ref PIXEL_FORMAT_YUYV8 の場合、引数 width が2の倍数でないと正しく動作しません(2の倍数へ切り下げられます)。 224 225 @param[in] width 出力画像バッファの横幅(pixel)を指定します。<BR> 226 0を指定すると、デコード関数が画像サイズに応じた横幅に自動設定します。<BR> 227 @ref MAX_DECODER_OUTPUT_BUFFER_WIDTH (65536) を超える値の指定は無視されます。 228 229 @return なし。 230 */ SetOutputBufferWidth(u32 width)231 void SetOutputBufferWidth(u32 width) 232 { 233 if (m_Initialized) 234 { 235 if (width <= MAX_DECODER_OUTPUT_BUFFER_WIDTH) 236 { 237 m_TemporarySetting.outputBufferWidth = width; 238 } 239 } 240 } 241 242 /*! 243 @brief JPEGデコード時のオプションを指定します。 244 245 オプションを指定することにより、デコード関数( @ref StartJpegDecoder 、@ref StartJpegDecoderShrink 、@ref StartMpDecoderLR )の動作を変更できます。 246 247 @ref StartMpDecoderLR でデコードする場合、オプションは2枚の主画像に対して有効です。 248 249 本関数は、デコード関数を呼ぶ前に呼んでください。 250 デコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。 251 複数回デコードする場合は、それぞれのデコード前に本関数を呼ぶ必要があります。 252 @ref Initialize でデコーダオブジェクトを再初期化すると指定はクリアされます。 253 254 デコード関数を呼ぶ前に本関数を繰り返し呼んだ場合、最後の指定が有効になります。 255 256 @param[in] option オプションを指定します。<BR> 257 指定できる値は、@ref DecoderOption をビット論理和したものです。<BR> 258 @ref JPEG_DECODER_OPTION_NONE (0) を指定すると、デコード関数の動作はデフォルトに戻ります。 259 260 @return なし。 261 */ SetOption(u32 option)262 void SetOption(u32 option) 263 { 264 if (m_Initialized) 265 { 266 m_TemporarySetting.option = option; 267 } 268 } 269 270 /*! 271 @brief 指定済みのデコードオプションを取得します。 272 273 @return デコードオプション (@ref DecoderOption) を返します。 274 */ GetOption()275 u32 GetOption() 276 { 277 if (m_Initialized) 278 { 279 return m_TemporarySetting.option; 280 } 281 282 return JPEG_DECODER_OPTION_NONE; 283 } 284 285 /*! 286 @} 287 288 @name デコード・Exif情報抽出 289 290 @{ 291 */ 292 293 /*! 294 :private 295 本関数を呼ばないでください。 296 関数リファレンス作成の都合により、ここにstaticのダミー関数を定義しています。 297 */ DoNotCallMe1()298 static void DoNotCallMe1() {} 299 300 /*! 301 @brief JPEGデコードを実行します。 302 303 画像サイズが8あるいは16ピクセルの倍数でない場合は、処理時間が長くなります。<BR> 304 高速にデコードできる画像サイズの条件は、画素サンプリング形式により、以下のようになります。 305 306 <UL> 307 <LI> @ref PIXEL_SAMPLING_YUV444 の場合は、縦横サイズがそれぞれ8の倍数であること。 308 <LI> @ref PIXEL_SAMPLING_YUV420 の場合は、縦横サイズがそれぞれ16の倍数であること。 309 <LI> @ref PIXEL_SAMPLING_YUV422 の場合は、縦サイズが8の倍数、横サイズが16の倍数であること。 310 </LI></UL> 311 312 @ref SetOption で @ref JPEG_DECODER_OPTION_MATCH_WIDTH_HEIGHT を指定した場合、 313 引数 maxWidth および maxHeight の指定は最大値ではなく一致値となり、一致しなければデコードに失敗します。 314 315 @param[out] dst デコード結果を格納するバッファを指定します。<BR> 316 4バイトアラインメントが必要です。<BR> 317 出力バッファを直接GPUのテクスチャとして参照する場合は、 318 128バイトアラインメントにする必要があります(本関数ではこのチェックは行いません)。 319 320 @param[in] dstSize dstのバイト数を指定します。<BR> 321 @ref GetDstBufferSize の返り値を指定してください。 322 323 @param[in] src デコードするJPEGデータを指定します。 324 325 @param[in] srcSize srcのバイト数を指定します。 326 327 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します(65536未満)。<BR> 328 デコード成功後は、@ref GetLastWidth で実際の画像横幅を、 329 @ref GetLastOutputBufferWidth でバッファの横幅を取得できます。 330 331 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します(65536未満)。<BR> 332 デコード成功後は、@ref GetLastHeight で実際の画像縦幅を、 333 @ref GetLastOutputBufferHeight でバッファの縦幅を取得できます。 334 335 @param[in] dstPixelFormat 出力ピクセルフォーマットを指定します。 336 337 @param[in] decodeThumbnail サムネイルをデコードする場合はtrueを指定します。<BR> 338 主画像をデコードする場合はfalseを指定します。 339 340 @return 成功した場合、デコード結果を格納したバイト数を返します。<BR> 341 失敗した場合、0を返します。<BR> 342 失敗の原因は @ref GetLastError で取得できます。 343 */ 344 size_t StartJpegDecoder(void* dst, 345 size_t dstSize, 346 const u8* src, 347 size_t srcSize, 348 u32 maxWidth, 349 u32 maxHeight, 350 PixelFormat dstPixelFormat, 351 bool decodeThumbnail); 352 353 /*! 354 @brief JPEGデコードを実行し、画像を縮小して出力します。 355 356 縮小レベル(引数 shrinkLevel)の指定により、 357 元画像の横幅および縦幅を同時に 1/2、1/4、1/8、あるいは 1/16 に縮小します(端数切り上げ)。 358 359 引数 dst のアラインメントは、@ref StartJpegDecoder と同じです。 360 361 デコードを許す最大画像サイズ(引数 maxWidth および maxHeight)には、縮小レベルに応じて (1 << shrinkLevel) の倍数を指定する必要があります。<BR> 362 具体的には以下の条件を満たしてください。 363 364 <UL> 365 <LI> shrinkLevelに1を指定する場合、2の倍数であること。 366 <LI> shrinkLevelに2を指定する場合、4の倍数であること。 367 <LI> shrinkLevelに3を指定する場合、8の倍数であること。 368 <LI> shrinkLevelに4を指定する場合、16の倍数であること。 369 </LI></UL> 370 371 実際の画像サイズは、(1 << shrinkLevel) の倍数でなくてもかまいません。<BR> 372 ただし、@ref SetOption で @ref JPEG_DECODER_OPTION_MATCH_WIDTH_HEIGHT を指定した場合、 373 引数 maxWidth および maxHeight の指定は最大値ではなく一致値となり、一致しなければデコードに失敗します。 374 375 本関数成功後に @ref GetLastWidth および @ref GetLastHeight を呼び出すと、 376 元画像(縮小前)の画像サイズを返します。 377 @ref GetLastOutputBufferWidth および @ref GetLastOutputBufferHeight は、 378 デコード結果(縮小後)の出力画像バッファの画像サイズを返します。 379 380 処理時間は、元画像サイズが8あるいは16ピクセルの倍数であるかに関係なく、 381 元画像およびデコード結果の画像サイズが大きいほど長くなります。 382 383 @param[out] dst デコード結果を格納するバッファを指定します。<BR> 384 出力ピクセルフォーマット(引数 dstPixelFormat)に応じたアラインメントが必要です。 385 386 @param[in] dstSize dstのバイト数を指定します。<BR> 387 @ref GetDstBufferSize の返り値を指定してください。<BR> 388 @ref GetDstBufferSize に指定する引数 maxWidth および maxHeightは、デコード結果(縮小後)の最大画像サイズです。<BR> 389 本関数の引数 maxWidth 、maxHeight 、dstPixelFormat および shrinkLevel を利用すると、以下の例のように指定できます。<BR> 390 @ref GetDstBufferSize ( maxWidth >> shrinkLevel, maxHeight >> shrinkLevel, dstPixelFormat )<BR> 391 ただし、@ref SetOutputBufferWidth を使う場合、その指定横幅と (maxWidth >> shrinkLevel) のうち大きい方の値を指定してください。 392 393 @param[in] src デコードするJPEGデータを指定します。 394 395 @param[in] srcSize srcのバイト数を指定します。 396 397 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します(65536未満)。<BR> 398 (1 << shrinkLevel) の倍数である必要があります。<BR> 399 デコード成功後は、@ref GetLastWidth で元画像(縮小前)の画像横幅を、 400 @ref GetLastOutputBufferWidth でデコード結果(縮小後)の画像バッファの横幅を取得できます。 401 402 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します(65536未満)。<BR> 403 (1 << shrinkLevel) の倍数である必要があります。<BR> 404 デコード成功後は、@ref GetLastHeight で元画像(縮小前)の画像縦幅を、 405 @ref GetLastOutputBufferHeight でデコード結果(縮小後)の画像バッファの縦幅を取得できます。 406 407 @param[in] dstPixelFormat 出力ピクセルフォーマットを指定します。 408 409 @param[in] decodeThumbnail サムネイルをデコードする場合はtrueを指定します。<BR> 410 主画像をデコードする場合はfalseを指定します。 411 412 @param[in] shrinkLevel 縮小レベルを指定します。指定できる値は1から4までです。<BR> 413 1を指定すると、元画像の横幅および縦幅を同時に1/2に縮小します。<BR> 414 2、3、4を指定すると、それぞれ1/4、1/8、1/16に縮小します。 415 416 @return 成功した場合、デコード結果を格納したバイト数を返します。<BR> 417 失敗した場合、0を返します。<BR> 418 失敗の原因は @ref GetLastError で取得できます。 419 */ 420 size_t StartJpegDecoderShrink(void* dst, 421 size_t dstSize, 422 const u8* src, 423 size_t srcSize, 424 u32 maxWidth, 425 u32 maxHeight, 426 PixelFormat dstPixelFormat, 427 bool decodeThumbnail, 428 u32 shrinkLevel); 429 430 /*! 431 @brief MPフォーマットで格納された2枚の画像に対してJPEGデコードを実行します。 432 433 @ref StartJpegDecoder と同じで、 434 画像サイズが8あるいは16ピクセルの倍数でない場合は、処理時間が長くなります。 435 引数 dst のアラインメントについても同じです。 436 437 MPフォーマットで格納された画像データのMP種別 (@ref MpTypeCode) を、MPエントリの格納順に調べ、立体視用画像のみを2枚デコードします。 438 ただし、最初に見つかった立体視用画像が左目用画像であることや、その次のものが右目用画像であることは調べていません。 439 440 本関数では、2枚の主画像サイズは一致している必要があります。 441 本関数成功後に @ref GetLastWidth および @ref GetLastHeight を呼び出すと、主画像のサイズを取得できます。 442 一致していない場合、デコードに失敗します。 443 デコードできた主画像が2枚未満の場合も失敗します。 444 サムネイルはデコードしません。 445 446 @ref SetOption で @ref JPEG_DECODER_OPTION_MATCH_WIDTH_HEIGHT を指定した場合、 447 引数 maxWidth および maxHeight の指定は最大値ではなく一致値となり、一致しなければデコードに失敗します。 448 このオプションを指定しなくても、上記のように2枚の主画像サイズは一致している必要があります。 449 450 デコード成功後に取得できるExif情報について<BR> 451 本関数は、MPエントリの格納順に2枚の立体視用画像をデコードします。<BR> 452 以下の関数で取得できるExif情報は、最後にデコードした(MPエントリの2番目に格納されている)画像のものになります。 453 454 <UL> 455 <LI> @ref GetLastDateTime 456 <LI> @ref GetLastSoftwarePointer 457 <LI> @ref GetLastSoftwareLength 458 <LI> @ref GetLastUserMakerNotePointer 459 <LI> @ref GetLastUserMakerNoteSize 460 <LI> @ref GetLastImageUid 461 <LI> @ref GetLastOrientation 462 <LI> @ref GetLastGpsData 463 </LI></UL> 464 465 なお、以下の関数を呼び出しても問題ありませんが、推奨しません。 466 467 <UL> 468 <LI> @ref GetLastTwlPhotoMakerNote 469 <LI> @ref GetLastTwlUserMakerNotePointer 470 <LI> @ref GetLastTwlUserMakerNoteSize 471 </LI></UL> 472 473 画像毎にExif情報を取得する場合は、本関数を使わずに1枚ずつデコードするか、@ref ExtractExif を使ってください。 474 475 @param[out] dstL 先頭画像のデコード結果を格納するバッファを指定します。<BR> 476 出力ピクセルフォーマット(引数 dstPixelFormat)に応じたアラインメントが必要です。 477 478 @param[out] dstR 次の個別画像のデコード結果を格納するバッファを指定します。<BR> 479 出力ピクセルフォーマット(引数 dstPixelFormat)に応じたアラインメントが必要です。 480 481 @param[in] dstSize dstLおよびdstRのバイト数を指定します。<BR> 482 この値は画像1枚分のものであり、2枚分の和ではありません。<BR> 483 @ref GetDstBufferSize の返り値を指定してください。 484 485 @param[in] src デコードするMPフォーマットデータを指定します。 486 487 @param[in] srcSize srcのバイト数を指定します。 488 489 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します(65536未満)。<BR> 490 デコード成功後は、@ref GetLastWidth で実際の画像横幅を、 491 @ref GetLastOutputBufferWidth でバッファの横幅(画像1枚分)を取得できます。 492 493 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します(65536未満)。<BR> 494 デコード成功後は、@ref GetLastHeight で実際の画像縦幅を、 495 @ref GetLastOutputBufferHeight でバッファの縦幅(画像1枚分)を取得できます。 496 497 @param[in] dstPixelFormat 出力ピクセルフォーマットを指定します。 498 499 @return 成功した場合、デコード結果を格納したバイト数を返します。<BR> 500 この値は画像1枚分のものであり、2枚分の和ではありません。<BR> 501 失敗した場合、0を返します。<BR> 502 失敗の原因は @ref GetLastError で取得できます。 503 */ 504 size_t StartMpDecoderLR(void* dstL, 505 void* dstR, 506 size_t dstSize, 507 const u8* src, 508 size_t srcSize, 509 u32 maxWidth, 510 u32 maxHeight, 511 PixelFormat dstPixelFormat); 512 513 /*! 514 @brief 別スレッドから、デコード処理中止を要求します。 515 516 本関数は、デコーダオブジェクト内部へ「中止要求(フラグ)」をセットします。 517 デコード関数( @ref StartJpegDecoder 、@ref StartJpegDecoderShrink 、@ref StartMpDecoderLR )が、 518 このフラグを監視してデコード処理を中止します。 519 520 基本的に、デコーダオブジェクトはスレッドセーフではないため、複数スレッドから同一デコーダオブジェクトへはアクセスできません。 521 522 ただし、デコーダオブジェクトが有効である(初期化済み、かつ終了していない)ことをアプリケーションで確認できる期間中は、 523 別スレッドから同一デコーダオブジェクトの本関数を呼ぶことができます。 524 525 一般的に、JPEG画像のデコードには時間がかかります。 526 アプリケーションはメインスレッドの応答速度を維持するため、デコード用に別スレッドを使うことがあります。 527 528 例えば複数の画像を一覧するような場面で、一旦着手した画像のデコードを中止したい場合に、 529 デコード用スレッドよりも優先度の高い別スレッド(メインスレッドやアラームハンドラ)から、 530 本関数を呼ぶことができます。 531 532 中止要求は、デコード関数が内部主処理の直前にクリアします。 533 以下の制限により、本関数を一度呼んだだけでは、確実にデコード処理を中止できるとは限りません。 534 535 1. デコード用スレッドがデコード関数を呼ぶ前、およびデコード内部主処理に達する前は、中止できません。<BR> 536 2. デコード内部主処理が完了した後は、中止できません(他にエラーが発生していなければ、デコードに成功します)。<BR> 537 3. @ref StartMpDecoderLR は、2枚の画像デコード毎にフラグをクリアします。 538 1枚目のデコード完了直後から2枚目のデコード開始直前の期間は、中止できません。 539 540 上記 1. および 3. に対応するため、デコードが中止できたこと、あるいは成功失敗にかかわらず終了したことが確認できるまで、 541 本関数を繰り返し(例えばゲームフレーム毎に)呼んでください。 542 543 デコード関数が中止要求を受け付けた場合、デコード失敗時と同じ値 (0) を返します (@ref GetLastError が返すエラーコードは、他のエラーが発生していなければ @ref JPEG_DECODER_ERROR_STOPPED です)。 544 545 中止要求は取り消しできません。また、中止時点からのデコード再開はできません。 546 547 @return なし。 548 */ 549 void StopDecoder(); 550 551 /*! 552 @brief Exif情報を抽出します。 553 554 デコード処理は行わないため @ref StartJpegDecoder を呼び出した場合よりも早く取得できます。 555 556 実際に Exif に含まれていた情報を取得するには、本関数が成功した後に、以下の GetLast 関数を使用してください。 557 558 <UL> 559 <LI> @ref GetLastDateTime 560 <LI> @ref GetLastSoftwarePointer 561 <LI> @ref GetLastSoftwareLength 562 <LI> @ref GetLastUserMakerNotePointer 563 <LI> @ref GetLastUserMakerNoteSize 564 <LI> @ref GetLastTwlPhotoMakerNote 565 <LI> @ref GetLastTwlUserMakerNotePointer 566 <LI> @ref GetLastTwlUserMakerNoteSize 567 <LI> @ref GetLastImageUid 568 <LI> @ref GetLastOrientation 569 <LI> @ref GetLastGpsData 570 </LI></UL> 571 572 さらに、主画像あるいはサムネイルの画像サイズを、@ref GetLastWidth および @ref GetLastHeight で取得できます。 573 574 本関数が成功しても、画像のデコードが成功するとは限りません。 575 576 @param[in] src デコードするJPEGデータを指定します。 577 578 @param[in] srcSize srcのバイト数を指定します。 579 580 @param[in] extractThumbnail サムネイルの画像サイズを抽出する場合はtrueを指定します。<BR> 581 主画像の画像サイズを抽出する場合はfalseを指定します。<BR> 582 trueを指定した場合、サムネイルが見つからなければ失敗します。 583 584 @return 成功した場合、trueを返します。 585 Exif情報が存在しなくても、画像サイズを取得できる可能性がある場合はtrueを返します。<BR> 586 失敗した場合、falseを返します。 587 失敗の原因は @ref GetLastError で取得できます。 588 */ 589 bool ExtractExif(const u8* src, size_t srcSize, bool extractThumbnail); 590 591 /*! 592 @brief MPフォーマットで格納された個別画像データから、JPEGデータを再構成するための領域情報を取得します。 593 594 MPフォーマットの個別画像データ構造は、簡単には「(JPEGヘッダ) + (APP2) + (JPEGデータ)」のようになっており、 595 APP2はMPフォーマット付属情報を含んでいます。<BR> 596 APP2を切り詰めれば、「(JPEGヘッダ) + (JPEGデータ)」となり、MPフォーマットではないJPEG形式のデータが得られます。<BR> 597 本関数は、「(JPEGヘッダ)」と「(JPEGデータ)」の領域情報(ポインタとバイト数)を取得します。 598 599 通常は、引数srcには (先頭画像へのポインタ + @ref GetMpImageOffset の返り値) を、 600 srcSizeには @ref GetMpImageSize の返り値を指定します。<BR> 601 あらかじめ、srcとsrcSizeで指定する領域が正当であることを確認してください。 602 603 個別画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 あるいは @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像) 604 の場合、MPフォーマット付属情報を含まないため、本関数は失敗します。 605 モニタ表示用画像はExif情報が省略されている可能性があるため、JPEGデータを再構成するためのデータとしては適しません。 606 607 本関数は、デコード処理と共通の処理を部分的に実行するため、 608 本関数呼び出し直後の @ref GetLastWidth 、@ref GetLastHeight 、 609 @ref GetLastOutputBufferWidth 、および @ref GetLastOutputBufferHeight 呼び出しや、 610 @ref GetLastDateTime 等のExif情報取得関数の呼び出しはできません(返り値は不定です)。 611 612 @param[out] pBuffer 領域情報を格納するバッファを指定します。 613 614 @param[in] src 個別画像データの先頭を指定します。 615 616 @param[in] srcSize srcのバイト数を指定します。 617 618 @return 成功した場合、trueを返します。 619 失敗した場合、falseを返します。<BR> 620 失敗の原因は @ref GetLastError で取得できます。 621 */ 622 bool GetMpRegionsToBuildJpegData(MpRegionsToBuildJpegData* pBuffer, const u8* src, size_t srcSize); 623 624 /*! 625 @brief 直前に行ったデコード等の、失敗原因を取得します。 626 627 以下の関数呼び出し後に失敗原因が更新されます(成功した場合は0になります)。 628 629 <UL> 630 <LI> @ref StartJpegDecoder 631 <LI> @ref StartJpegDecoderShrink 632 <LI> @ref StartMpDecoderLR 633 <LI> @ref ExtractExif 634 <LI> @ref GetMpRegionsToBuildJpegData 635 <LI> @ref GetMpIndex 636 <LI> @ref GetMpAttribute 637 </LI></UL> 638 639 @return 直前の処理が成功した場合、@ref JPEG_DECODER_ERROR_NONE (0) を返します。<BR> 640 デコーダオブジェクトの初期化直後および再初期化直後も0を返します。<BR> 641 失敗した場合、0以外の値 (@ref DecoderErrorCode) を返します。 642 */ 643 s32 GetLastError() const; 644 645 /*! 646 @} 647 648 @name 情報取得 649 650 @{ 651 */ 652 653 /*! 654 :private 655 本関数を呼ばないでください。 656 関数リファレンス作成の都合により、ここにstaticのダミー関数を定義しています。 657 */ DoNotCallMe2()658 static void DoNotCallMe2() {} 659 660 /*! 661 @brief 直前にデコードあるいはExif情報の抽出を行った画像の横幅を取得します。 662 663 それらの処理が失敗した場合は0を返します。 664 665 @return 画像の横幅(pixel)。 666 */ 667 u32 GetLastWidth() const; 668 669 /*! 670 @brief 直前にデコードあるいはExif情報の抽出を行った画像の縦幅を取得します。 671 672 それらの処理が失敗した場合は0を返します。 673 674 @return 画像の縦幅(pixel)。 675 */ 676 u32 GetLastHeight() const; 677 678 /*! 679 @brief 直前にデコードを行った出力画像バッファの横幅を取得します。 680 681 直前にデコードを行わずExif情報の抽出のみを行った場合は、本関数の呼び出しはできません(返り値は不定です)。 682 683 @return 出力画像バッファの横幅(pixel)。<BR> 684 デコード前に @ref SetOutputBufferWidth で出力画像バッファの横幅を指定していた場合、 685 その値(をピクセルフォーマット @ref PixelFormat に応じて切り下げたもの)と、 686 画像横幅(をピクセルフォーマットに応じて切り上げたもの)のうち、大きい方を返します。<BR> 687 失敗した場合は0を返します。 688 */ 689 u32 GetLastOutputBufferWidth() const; 690 691 /*! 692 @brief 直前にデコードを行った出力画像バッファの縦幅を取得します。 693 694 直前にデコードを行わずExif情報の抽出のみを行った場合は、本関数の呼び出しはできません(返り値は不定です)。 695 696 @return 出力画像バッファの縦幅(pixel)。<BR> 697 画像縦幅をピクセルフォーマット (@ref PixelFormat) に応じて切り上げたものです。<BR> 698 失敗した場合は0を返します。 699 */ 700 u32 GetLastOutputBufferHeight() const; 701 702 /*! 703 @brief 直前にデコードあるいはExif情報の抽出を行った画像の撮影日時を取得します。 704 705 それらの処理が失敗した場合は、本関数も失敗します。<BR> 706 取得には画像データが必要です。破棄しないでください。<BR> 707 この情報は、IFD0 の DateTime タグに登録されていたものです。 708 709 @param[out] pBuffer 日時情報を格納するバッファです。 710 バッファのバイト数は @ref DATE_TIME_SIZE (20) です。<BR> 711 取得できる日時情報フォーマットは「YYYY:MM:DD HH:MM:DD」+0x00 の 20 文字になります。 712 713 @return 成功した場合、@ref DATE_TIME_SIZE (20) を返します。 714 失敗した場合、0を返します。 715 */ 716 size_t GetLastDateTime(char* pBuffer) const; 717 718 /*! 719 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、ソフトウェア名への文字列ポインタを取得します。 720 721 それらの処理が失敗した場合は、本関数も失敗します。<BR> 722 取得には画像データが必要です。破棄しないでください。<BR> 723 この情報は、IFD0 の Software タグに登録されていたものです。 724 725 文字列がゼロ終了していない場合は失敗します。 726 文字数は @ref GetLastSoftwareLength で取得できます。 727 728 @return 成功した場合、ソフトウェア名への文字列ポインタを返します。 729 ただし、成功しても文字数(末尾の 0x00 を除く)が0の場合、NULLを返します。<BR> 730 失敗した場合、NULLを返します。 731 */ 732 const char* GetLastSoftwarePointer() const; 733 734 /*! 735 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、ソフトウェア名の文字数を取得します。 736 737 それらの処理が失敗した場合は、本関数も失敗します。<BR> 738 取得には画像データが必要です。破棄しないでください。<BR> 739 この情報は、IFD0 の Software タグに登録されていたものです。 740 741 文字列がゼロ終了していない場合は失敗します。 742 文字列ポインタは @ref GetLastSoftwarePointer で取得できます。 743 744 @return 成功した場合、文字列の文字数(末尾の 0x00 を除く)を返します。 745 従って、成功しても0を返す場合があります。<BR> 746 失敗した場合、0を返します。 747 */ 748 size_t GetLastSoftwareLength() const; 749 750 /*! 751 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 752 CTRアプリケーション用メーカーノートへのポインタを取得します。 753 754 それらの処理が失敗した場合は、本関数も失敗します。<BR> 755 取得には画像データが必要です。破棄しないでください。 756 757 データのバイト数は @ref GetLastUserMakerNoteSize で取得できます。<BR> 758 データのバイト数が0の場合は本関数も失敗します。 759 760 本関数が成功しても、その画像がCTRアプリケーションで撮影されたものであるとは限りません。 761 762 @return 成功した場合、メーカーノートへのポインタを返します。 763 失敗した場合、NULLを返します。 764 */ 765 const u8* GetLastUserMakerNotePointer() const; 766 767 /*! 768 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 769 CTRアプリケーション用メーカーノートのバイト数を取得します。 770 771 それらの処理が失敗した場合は、本関数も失敗します。<BR> 772 取得には画像データが必要です。破棄しないでください。 773 774 データへのポインタは @ref GetLastUserMakerNotePointer で取得できます。<BR> 775 データへのポインタがNULLの場合は本関数も失敗します。 776 777 本関数が成功しても、その画像がCTRアプリケーションで撮影されたものであるとは限りません。 778 779 @return 成功した場合、メーカーノートのバイト数を返します。 780 失敗した場合、0を返します。 781 */ 782 size_t GetLastUserMakerNoteSize() const; 783 784 /*! 785 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、「ニンテンドーDSiカメラ」(ニンテンドーDSi本体内蔵のアプリケーション名) 786 用メーカーノートを取得します。 787 788 それらの処理が失敗した場合は、本関数も失敗します。<BR> 789 取得には画像データが必要です。破棄しないでください。 790 791 本関数が成功しても、その画像がニンテンドーDSiカメラで撮影されたものであるとは限りません。 792 793 @param[out] pBuffer メーカーノートを格納するバッファです。 794 バッファのバイト数は @ref TWL_PHOTO_MAKER_NOTE_SIZE (8) です。 795 796 @return 成功した場合、trueを返します。 797 失敗した場合、falseを返します。 798 */ 799 bool GetLastTwlPhotoMakerNote(u8* pBuffer) const; 800 801 /*! 802 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 803 ニンテンドーDSiアプリケーション用メーカーノートへのポインタを取得します。 804 805 それらの処理が失敗した場合は、本関数も失敗します。<BR> 806 取得には画像データが必要です。破棄しないでください。 807 808 データのバイト数は @ref GetLastTwlUserMakerNoteSize で取得できます。<BR> 809 データのバイト数が0の場合は本関数も失敗します。 810 811 本関数が成功しても、その画像がニンテンドーDSiアプリケーションで撮影されたものであるとは限りません。 812 813 CTRアプリケーション用メーカーノートの取得は、 814 @ref GetLastUserMakerNotePointer および @ref GetLastUserMakerNoteSize を使ってください。 815 816 @return 成功した場合、メーカーノートへのポインタを返します。 817 失敗した場合、NULLを返します。 818 */ 819 const u8* GetLastTwlUserMakerNotePointer() const; 820 821 /*! 822 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 823 ニンテンドーDSiアプリケーション用メーカーノートのバイト数を取得します。 824 825 それらの処理が失敗した場合は、本関数も失敗します。<BR> 826 取得には画像データが必要です。破棄しないでください。 827 828 データへのポインタは @ref GetLastTwlUserMakerNotePointer で取得できます。 829 830 本関数が成功しても、その画像がニンテンドーDSiアプリケーションで撮影されたものであるとは限りません。 831 832 CTRアプリケーション用メーカーノートの取得は、 833 @ref GetLastUserMakerNotePointer および @ref GetLastUserMakerNoteSize を使ってください。 834 835 @return 成功した場合、メーカーノートのバイト数を返します。 836 失敗した場合、0を返します。 837 */ 838 size_t GetLastTwlUserMakerNoteSize() const; 839 840 /*! 841 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、Exif IFDの画像ユニークIDを取得します。 842 843 それらの処理が失敗した場合は、本関数も失敗します。<BR> 844 取得には画像データが必要です。破棄しないでください。<BR> 845 この情報は、Exif IFDの ImageUniqueID タグに登録されていたものです。 846 847 MPインデックスIFDに含まれる、個別画像ユニークIDリストの取得は、 848 @ref GetMpImageUidListOffset および @ref GetMpImageUidListSize を使ってください。 849 850 @param[out] pBuffer 画像ユニークIDを格納するバッファです。<BR> 851 文字列は128ビットの整数値を16進数表記したASCII文字列(32文字)で、 852 バイト数は末尾の 0x00 を含み @ref IMAGE_UID_SIZE (33) バイトです。 853 854 @return 成功した場合、@ref IMAGE_UID_SIZE (33) を返します。 855 失敗した場合、0を返します。 856 */ 857 size_t GetLastImageUid(char* pBuffer); 858 859 /*! 860 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、Exif IFDの画像方向を取得します。 861 862 それらの処理が失敗した場合は、本関数も失敗します。<BR> 863 取得には画像データが必要です。破棄しないでください。<BR> 864 この情報は、IFD0の Orientation タグに登録されていたものです。 865 866 @param[out] pBuffer 画像方向を格納するバッファです。 867 868 @return 成功した場合、trueを返します。 869 失敗した場合、falseを返します。 870 */ 871 bool GetLastOrientation(u16* pBuffer); 872 873 /*! 874 @} 875 876 @name MPインデックスIFD 情報取得 877 878 @{ 879 */ 880 881 /*! 882 @brief MPフォーマットで格納されたデータに含まれる、MPインデックスIFDを取得します。 883 884 取得したMPインデックスIFDは、@ref GetMpEntry や @ref GetMpAttribute 等で参照されます。<BR> 885 引数srcとsrcSizeで指定した領域は、取得したMPインデックスIFDが不要になるまで保持しておく必要があります。 886 887 本関数は、デコード処理と共通の処理を部分的に実行するため、 888 本関数呼び出し直後の @ref GetLastWidth 、@ref GetLastHeight 、 889 @ref GetLastOutputBufferWidth 、および @ref GetLastOutputBufferHeight 呼び出しや、 890 @ref GetLastDateTime 等のExif情報取得関数の呼び出しはできません(返り値は不定です)。 891 892 @param[out] pIndex MPインデックスIFDを格納するバッファを指定します。<BR> 893 格納されるデータ形式は、元データのMPインデックスIFDをライブラリで処理しやすい形式へ変換したものであり、 894 元データのバイナリ列とは異なります。 895 896 @param[in] src MPフォーマットデータの先頭を指定します。<BR> 897 MPインデックスIFDは先頭画像にのみ存在しますので、先頭画像を指定してください。 898 899 @param[in] srcSize srcのバイト数を指定します。 900 901 @return 成功した場合、trueを返します。 902 失敗した場合、falseを返します。<BR> 903 失敗の原因は @ref GetLastError で取得できます。 904 */ 905 bool GetMpIndex(MpIndex* pIndex, const u8* src, size_t srcSize); 906 907 /*! 908 @brief MPインデックスIFDに含まれる、記録画像数を取得します。 909 910 @param[out] pNumber 記録画像数を格納するバッファを指定します。 911 912 @param[in] pIndex MPインデックスIFDを指定します。 913 あらかじめ、@ref GetMpIndex で取得しておいてください。 914 915 @return 成功した場合、trueを返します。 916 失敗した場合、falseを返します。 917 */ GetMpNumberOfImages(u32 * pNumber,const MpIndex * pIndex)918 static bool GetMpNumberOfImages(u32* pNumber, const MpIndex* pIndex) 919 { 920 NN_ASSERT(pNumber); 921 NN_ASSERT(pIndex); 922 923 if (pIndex->isNumberOfImagesValid) 924 { 925 *pNumber = pIndex->numberOfImages; 926 return true; 927 } 928 929 return false; 930 } 931 932 /*! 933 @brief MPインデックスIFDに含まれる、個別画像ユニークIDリストのバイト数を取得します。 934 935 個別画像ユニークIDリストはMPフォーマットのオプションタグであり、どの画像でも取得できるとは限りません。 936 リストの1要素あたりのバイト数は、@ref IMAGE_UID_SIZE (33) です。 937 リストへのバイトオフセットは、@ref GetMpImageUidListOffset で取得してください。 938 939 @param[in] pIndex MPインデックスIFDを指定します。 940 あらかじめ、@ref GetMpIndex で取得しておいてください。 941 942 @return 成功した場合、個別画像ユニークIDリストのバイト数を返します。<BR> 943 失敗した場合、0を返します。 944 */ GetMpImageUidListSize(const MpIndex * pIndex)945 static size_t GetMpImageUidListSize(const MpIndex* pIndex) 946 { 947 NN_ASSERT(pIndex); 948 949 if (pIndex->imageUidListSize && pIndex->offsetToImageUidList) 950 { 951 return pIndex->imageUidListSize; 952 } 953 954 return 0; 955 } 956 957 /*! 958 @brief MPインデックスIFDに含まれる、先頭画像から個別画像ユニークIDリストへのバイトオフセットを取得します。 959 960 個別画像ユニークIDリストはMPフォーマットのオプションタグであり、どの画像でも取得できるとは限りません。 961 リストのバイト数は、@ref GetMpImageUidListSize で取得してください。 962 963 取得したバイトオフセットと、@ref GetMpImageUidListSize で取得したバイト数で示される領域が正当かどうかは、 964 アプリケーションで確認する必要があります。 965 966 @param[in] pIndex MPインデックスIFDを指定します。 967 あらかじめ、@ref GetMpIndex で取得しておいてください。 968 969 @return 成功した場合、個別画像ユニークIDリストへのバイトオフセットを返します。<BR> 970 失敗した場合、0を返します。 971 */ GetMpImageUidListOffset(const MpIndex * pIndex)972 static size_t GetMpImageUidListOffset(const MpIndex* pIndex) 973 { 974 NN_ASSERT(pIndex); 975 976 if (pIndex->imageUidListSize && pIndex->offsetToImageUidList) 977 { 978 return pIndex->offsetToImageUidList; 979 } 980 981 return 0; 982 } 983 984 /*! 985 @brief MPインデックスIFDに含まれる、撮影時総コマ数を取得します。 986 987 撮影時総コマ数はMPフォーマットのオプションタグであり、どの画像でも取得できるとは限りません。 988 989 @param[out] pFrames 撮影時総コマ数を格納するバッファを指定します。 990 991 @param[in] pIndex MPインデックスIFDを指定します。 992 あらかじめ、@ref GetMpIndex で取得しておいてください。 993 994 @return 成功した場合、trueを返します。 995 失敗した場合、falseを返します。 996 */ GetMpTotalFrames(u32 * pFrames,const MpIndex * pIndex)997 static bool GetMpTotalFrames(u32* pFrames, const MpIndex* pIndex) 998 { 999 NN_ASSERT(pFrames); 1000 NN_ASSERT(pIndex); 1001 1002 if (pIndex->isTotalFramesValid) 1003 { 1004 *pFrames = pIndex->totalFrames; 1005 return true; 1006 } 1007 1008 return false; 1009 } 1010 1011 /*! 1012 @} 1013 1014 @name MPエントリ 情報取得 1015 1016 @{ 1017 */ 1018 1019 /*! 1020 @brief MPフォーマットで格納されたデータに含まれる、MPエントリを取得します。 1021 1022 MPエントリ全体のうち、指定された1個を取得します。<BR> 1023 指定方法は、MPエントリ全体内の格納順です。0から始まります。<BR> 1024 格納順は、MPフォーマットの個別画像番号とは異なります。<BR> 1025 個別画像番号は通常1から始まりますが、番号が連続しない場合や番号が付けられていない場合があります。 1026 1027 取得したMPエントリは、@ref GetMpImageOffset や @ref GetMpImageSize 等で参照されます。 1028 1029 @param[out] pEntry MPエントリを格納するバッファを指定します。<BR> 1030 格納されるデータ形式は、元データのMPエントリをライブラリで処理しやすい形式へ変換したものであり、 1031 元データのバイナリ列とは異なります。 1032 1033 @param[in] pIndex MPインデックスIFDを指定します。 1034 あらかじめ、@ref GetMpIndex で取得しておいてください。 1035 1036 @param[in] index MPエントリ内の格納順を指定します。 1037 1038 @return 成功した場合、trueを返します。 1039 失敗した場合、falseを返します。<BR> 1040 失敗の原因は、引数が不正か、MPエントリが不正であると本関数が判断したためです。 1041 */ 1042 static bool GetMpEntry(MpEntry* pEntry, const MpIndex* pIndex, u32 index); 1043 1044 /*! 1045 @brief MPエントリに含まれる、個別画像種別管理情報を取得します。 1046 1047 @param[in] pEntry MPエントリを指定します。 1048 あらかじめ、@ref GetMpEntry で取得しておいてください。 1049 1050 @return 個別画像種別管理情報を返します。<BR> 1051 値は @ref MpTypeFlag 、@ref MpTypeDataFormat 、@ref MpTypeCode のビット論理和です。 1052 */ GetMpImageType(const MpEntry * pEntry)1053 static u32 GetMpImageType(const MpEntry* pEntry) 1054 { 1055 NN_ASSERT(pEntry); 1056 return pEntry->type; 1057 } 1058 1059 /*! 1060 @brief MPエントリに含まれる、個別画像データのバイト数を取得します。 1061 1062 取得したバイト数と、(先頭画像へのポインタ + @ref GetMpImageOffset で取得したバイトオフセット) で示される領域が正当かどうかは、 1063 アプリケーションで確認する必要があります。 1064 1065 @param[in] pEntry MPエントリを指定します。 1066 あらかじめ、@ref GetMpEntry で取得しておいてください。 1067 1068 @return 個別画像データのバイト数を返します。 1069 */ GetMpImageSize(const MpEntry * pEntry)1070 static size_t GetMpImageSize(const MpEntry* pEntry) 1071 { 1072 NN_ASSERT(pEntry); 1073 return pEntry->imageDataSize; 1074 } 1075 1076 /*! 1077 @brief MPエントリに含まれる、先頭画像から個別画像データへのバイトオフセットを取得します。 1078 1079 取得したバイトオフセットと、@ref GetMpImageSize で取得したバイト数で示される領域が正当かどうかは、 1080 アプリケーションで確認する必要があります。 1081 1082 @param[in] pEntry MPエントリを指定します。 1083 あらかじめ、@ref GetMpEntry で取得しておいてください。 1084 1085 @return 個別画像データへのバイトオフセットを返します。<BR> 1086 このオフセットは先頭画像データからのものであり、 1087 MPフォーマットの「オフセットアドレスの基点」を処理済みです。 1088 */ GetMpImageOffset(const MpEntry * pEntry)1089 static size_t GetMpImageOffset(const MpEntry* pEntry) 1090 { 1091 NN_ASSERT(pEntry); 1092 return pEntry->offsetToImageData; 1093 } 1094 1095 /*! 1096 @brief MPエントリに含まれる、従属画像1エントリ番号を取得します。 1097 1098 @param[in] pEntry MPエントリを指定します。 1099 あらかじめ、@ref GetMpEntry で取得しておいてください。 1100 1101 @return 従属画像1エントリ番号を返します。 1102 */ GetMpDependentImage1EntryNum(const MpEntry * pEntry)1103 static u16 GetMpDependentImage1EntryNum(const MpEntry* pEntry) 1104 { 1105 NN_ASSERT(pEntry); 1106 return pEntry->dependentImage1EntryNum; 1107 } 1108 1109 /*! 1110 @brief MPエントリに含まれる、従属画像2エントリ番号を取得します。 1111 1112 @param[in] pEntry MPエントリを指定します。 1113 あらかじめ、@ref GetMpEntry で取得しておいてください。 1114 1115 @return 従属画像2エントリ番号を返します。 1116 */ GetMpDependentImage2EntryNum(const MpEntry * pEntry)1117 static u16 GetMpDependentImage2EntryNum(const MpEntry* pEntry) 1118 { 1119 NN_ASSERT(pEntry); 1120 return pEntry->dependentImage2EntryNum; 1121 } 1122 1123 /*! 1124 @} 1125 1126 @name MP個別情報IFD 情報取得 1127 1128 @{ 1129 */ 1130 1131 /*! 1132 @brief MPフォーマットで格納された個別画像データに含まれる、MP個別情報IFDを取得します。 1133 1134 MP個別情報IFDは、個別画像データに含まれます。<BR> 1135 通常は、引数srcには (先頭画像へのポインタ + @ref GetMpImageOffset の返り値) を、 1136 srcSizeには @ref GetMpImageSize の返り値を指定します。<BR> 1137 あらかじめ、srcとsrcSizeで指定する領域が正当であることを確認してください。 1138 1139 個別画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 あるいは @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像) 1140 の場合、MPフォーマット付属情報 (およびMP個別情報IFD)を含まないため、本関数は失敗します。 1141 1142 本関数は、デコード処理と共通の処理を部分的に実行するため、 1143 本関数呼び出し直後の @ref GetLastWidth 、@ref GetLastHeight 、 1144 @ref GetLastOutputBufferWidth 、および @ref GetLastOutputBufferHeight 呼び出しや、 1145 @ref GetLastDateTime 等のExif情報取得関数の呼び出しはできません(返り値は不定です)。 1146 1147 @param[out] pAttr MP個別情報IFDを格納するバッファを指定します。<BR> 1148 格納されるデータ形式は、元データのMP個別情報IFDをライブラリで処理しやすい形式へ変換したものであり、 1149 元データのバイナリ列とは異なります。 1150 1151 @param[in] src 個別画像データの先頭を指定します。 1152 1153 @param[in] srcSize srcのバイト数を指定します。 1154 1155 @return 成功した場合、trueを返します。 1156 失敗した場合、falseを返します。<BR> 1157 失敗の原因は @ref GetLastError で取得できます。 1158 */ 1159 bool GetMpAttribute(MpAttribute* pAttr, const u8* src, size_t srcSize); 1160 1161 /*! 1162 @brief MP個別情報IFDに含まれる、個別画像番号を取得します。 1163 1164 @param[out] pBuffer 個別画像番号を格納するバッファを指定します。 1165 1166 @param[in] pAttr MP個別情報IFDを指定します。 1167 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1168 1169 @return 成功した場合、trueを返します。 1170 失敗した場合、falseを返します。 1171 */ GetMpIndividualNum(u32 * pBuffer,const MpAttribute * pAttr)1172 static bool GetMpIndividualNum(u32* pBuffer, const MpAttribute* pAttr) 1173 { 1174 NN_ASSERT(pBuffer); 1175 NN_ASSERT(pAttr); 1176 1177 if (pAttr->isMpIndividualNumValid) 1178 { 1179 *pBuffer = pAttr->mpIndividualNum; 1180 return true; 1181 } 1182 1183 return false; 1184 } 1185 1186 /*! 1187 @brief MP個別情報IFDに含まれる、画像配置を取得します。 1188 1189 @param[out] pBuffer 画像配置を格納するバッファを指定します。 1190 1191 @param[in] pAttr MP個別情報IFDを指定します。 1192 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1193 1194 @return 成功した場合、trueを返します。 1195 失敗した場合、falseを返します。 1196 */ GetMpPanOrientation(u32 * pBuffer,const MpAttribute * pAttr)1197 static bool GetMpPanOrientation(u32* pBuffer, const MpAttribute* pAttr) 1198 { 1199 NN_ASSERT(pBuffer); 1200 NN_ASSERT(pAttr); 1201 1202 if (pAttr->isPanOrientationValid) 1203 { 1204 *pBuffer = pAttr->panOrientation; 1205 return true; 1206 } 1207 1208 return false; 1209 } 1210 1211 /*! 1212 @brief MP個別情報IFDに含まれる、水平オーバーラップを取得します。 1213 1214 @param[out] pBuffer 水平オーバーラップを格納するバッファを指定します。 1215 1216 @param[in] pAttr MP個別情報IFDを指定します。 1217 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1218 1219 @return 成功した場合、trueを返します。 1220 失敗した場合、falseを返します。 1221 */ GetMpPanOverlapH(Rational * pBuffer,const MpAttribute * pAttr)1222 static bool GetMpPanOverlapH(Rational* pBuffer, const MpAttribute* pAttr) 1223 { 1224 NN_ASSERT(pBuffer); 1225 NN_ASSERT(pAttr); 1226 1227 if (pAttr->isPanOverlapHValid) 1228 { 1229 *pBuffer = pAttr->panOverlapH; 1230 return true; 1231 } 1232 1233 return false; 1234 } 1235 1236 /*! 1237 @brief MP個別情報IFDに含まれる、垂直オーバーラップを取得します。 1238 1239 @param[out] pBuffer 垂直オーバーラップを格納するバッファを指定します。 1240 1241 @param[in] pAttr MP個別情報IFDを指定します。 1242 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1243 1244 @return 成功した場合、trueを返します。 1245 失敗した場合、falseを返します。 1246 */ GetMpPanOverlapV(Rational * pBuffer,const MpAttribute * pAttr)1247 static bool GetMpPanOverlapV(Rational* pBuffer, const MpAttribute* pAttr) 1248 { 1249 NN_ASSERT(pBuffer); 1250 NN_ASSERT(pAttr); 1251 1252 if (pAttr->isPanOverlapVValid) 1253 { 1254 *pBuffer = pAttr->panOverlapV; 1255 return true; 1256 } 1257 1258 return false; 1259 } 1260 1261 /*! 1262 @brief MP個別情報IFDに含まれる、基準視点番号を取得します。 1263 1264 @param[out] pBuffer 基準視点番号を格納するバッファを指定します。 1265 1266 @param[in] pAttr MP個別情報IFDを指定します。 1267 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1268 1269 @return 成功した場合、trueを返します。 1270 失敗した場合、falseを返します。 1271 */ GetMpBaseViewpointNum(u32 * pBuffer,const MpAttribute * pAttr)1272 static bool GetMpBaseViewpointNum(u32* pBuffer, const MpAttribute* pAttr) 1273 { 1274 NN_ASSERT(pBuffer); 1275 NN_ASSERT(pAttr); 1276 1277 if (pAttr->isBaseViewpointNumValid) 1278 { 1279 *pBuffer = pAttr->baseViewpointNum; 1280 return true; 1281 } 1282 1283 return false; 1284 } 1285 1286 /*! 1287 @brief MP個別情報IFDに含まれる、輻輳角を取得します。 1288 1289 @param[out] pBuffer 輻輳角を格納するバッファを指定します。 1290 1291 @param[in] pAttr MP個別情報IFDを指定します。 1292 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1293 1294 @return 成功した場合、trueを返します。 1295 失敗した場合、falseを返します。 1296 */ GetMpConvergenceAngle(Srational * pBuffer,const MpAttribute * pAttr)1297 static bool GetMpConvergenceAngle(Srational* pBuffer, const MpAttribute* pAttr) 1298 { 1299 NN_ASSERT(pBuffer); 1300 NN_ASSERT(pAttr); 1301 1302 if (pAttr->isConvergenceAngleValid) 1303 { 1304 *pBuffer = pAttr->convergenceAngle; 1305 return true; 1306 } 1307 1308 return false; 1309 } 1310 1311 /*! 1312 @brief MP個別情報IFDに含まれる、基線長を取得します。 1313 1314 @param[out] pBuffer 基線長を格納するバッファを指定します。 1315 1316 @param[in] pAttr MP個別情報IFDを指定します。 1317 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1318 1319 @return 成功した場合、trueを返します。 1320 失敗した場合、falseを返します。 1321 */ GetMpBaselineLength(Rational * pBuffer,const MpAttribute * pAttr)1322 static bool GetMpBaselineLength(Rational* pBuffer, const MpAttribute* pAttr) 1323 { 1324 NN_ASSERT(pBuffer); 1325 NN_ASSERT(pAttr); 1326 1327 if (pAttr->isBaselineLengthValid) 1328 { 1329 *pBuffer = pAttr->baselineLength; 1330 return true; 1331 } 1332 1333 return false; 1334 } 1335 1336 /*! 1337 @brief MP個別情報IFDに含まれる、水平からのずれを取得します。 1338 1339 @param[out] pBuffer 水平からのずれを格納するバッファを指定します。 1340 1341 @param[in] pAttr MP個別情報IFDを指定します。 1342 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1343 1344 @return 成功した場合、trueを返します。 1345 失敗した場合、falseを返します。 1346 */ GetMpVerticalDivergence(Srational * pBuffer,const MpAttribute * pAttr)1347 static bool GetMpVerticalDivergence(Srational* pBuffer, const MpAttribute* pAttr) 1348 { 1349 NN_ASSERT(pBuffer); 1350 NN_ASSERT(pAttr); 1351 1352 if (pAttr->isVerticalDivergenceValid) 1353 { 1354 *pBuffer = pAttr->verticalDivergence; 1355 return true; 1356 } 1357 1358 return false; 1359 } 1360 1361 /*! 1362 @brief MP個別情報IFDに含まれる、水平軸方向の距離(X)を取得します。 1363 1364 @param[out] pBuffer 水平軸方向の距離(X)を格納するバッファを指定します。 1365 1366 @param[in] pAttr MP個別情報IFDを指定します。 1367 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1368 1369 @return 成功した場合、trueを返します。 1370 失敗した場合、falseを返します。 1371 */ GetMpAxisDistanceX(Srational * pBuffer,const MpAttribute * pAttr)1372 static bool GetMpAxisDistanceX(Srational* pBuffer, const MpAttribute* pAttr) 1373 { 1374 NN_ASSERT(pBuffer); 1375 NN_ASSERT(pAttr); 1376 1377 if (pAttr->isAxisDistanceXValid) 1378 { 1379 *pBuffer = pAttr->axisDistanceX; 1380 return true; 1381 } 1382 1383 return false; 1384 } 1385 1386 /*! 1387 @brief MP個別情報IFDに含まれる、鉛直軸方向の距離(Y)を取得します。 1388 1389 @param[out] pBuffer 鉛直軸方向の距離(Y)を格納するバッファを指定します。 1390 1391 @param[in] pAttr MP個別情報IFDを指定します。 1392 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1393 1394 @return 成功した場合、trueを返します。 1395 失敗した場合、falseを返します。 1396 */ GetMpAxisDistanceY(Srational * pBuffer,const MpAttribute * pAttr)1397 static bool GetMpAxisDistanceY(Srational* pBuffer, const MpAttribute* pAttr) 1398 { 1399 NN_ASSERT(pBuffer); 1400 NN_ASSERT(pAttr); 1401 1402 if (pAttr->isAxisDistanceYValid) 1403 { 1404 *pBuffer = pAttr->axisDistanceY; 1405 return true; 1406 } 1407 1408 return false; 1409 } 1410 1411 /*! 1412 @brief MP個別情報IFDに含まれる、視準軸方向の距離(Z)を取得します。 1413 1414 @param[out] pBuffer 視準軸方向の距離(Z)を格納するバッファを指定します。 1415 1416 @param[in] pAttr MP個別情報IFDを指定します。 1417 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1418 1419 @return 成功した場合、trueを返します。 1420 失敗した場合、falseを返します。 1421 */ GetMpAxisDistanceZ(Srational * pBuffer,const MpAttribute * pAttr)1422 static bool GetMpAxisDistanceZ(Srational* pBuffer, const MpAttribute* pAttr) 1423 { 1424 NN_ASSERT(pBuffer); 1425 NN_ASSERT(pAttr); 1426 1427 if (pAttr->isAxisDistanceZValid) 1428 { 1429 *pBuffer = pAttr->axisDistanceZ; 1430 return true; 1431 } 1432 1433 return false; 1434 } 1435 1436 /*! 1437 @brief MP個別情報IFDに含まれる、ヨー角を取得します。 1438 1439 @param[out] pBuffer ヨー角を格納するバッファを指定します。 1440 1441 @param[in] pAttr MP個別情報IFDを指定します。 1442 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1443 1444 @return 成功した場合、trueを返します。 1445 失敗した場合、falseを返します。 1446 */ GetMpYawAngle(Srational * pBuffer,const MpAttribute * pAttr)1447 static bool GetMpYawAngle(Srational* pBuffer, const MpAttribute* pAttr) 1448 { 1449 NN_ASSERT(pBuffer); 1450 NN_ASSERT(pAttr); 1451 1452 if (pAttr->isYawAngleValid) 1453 { 1454 *pBuffer = pAttr->yawAngle; 1455 return true; 1456 } 1457 1458 return false; 1459 } 1460 1461 /*! 1462 @brief MP個別情報IFDに含まれる、ピッチ角を取得します。 1463 1464 @param[out] pBuffer ピッチ角を格納するバッファを指定します。 1465 1466 @param[in] pAttr MP個別情報IFDを指定します。 1467 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1468 1469 @return 成功した場合、trueを返します。 1470 失敗した場合、falseを返します。 1471 */ GetMpPitchAngle(Srational * pBuffer,const MpAttribute * pAttr)1472 static bool GetMpPitchAngle(Srational* pBuffer, const MpAttribute* pAttr) 1473 { 1474 NN_ASSERT(pBuffer); 1475 NN_ASSERT(pAttr); 1476 1477 if (pAttr->isPitchAngleValid) 1478 { 1479 *pBuffer = pAttr->pitchAngle; 1480 return true; 1481 } 1482 1483 return false; 1484 } 1485 1486 /*! 1487 @brief MP個別情報IFDに含まれる、ロール角を取得します。 1488 1489 @param[out] pBuffer ロール角を格納するバッファを指定します。 1490 1491 @param[in] pAttr MP個別情報IFDを指定します。 1492 あらかじめ、@ref GetMpAttribute で取得しておいてください。 1493 1494 @return 成功した場合、trueを返します。 1495 失敗した場合、falseを返します。 1496 */ GetMpRollAngle(Srational * pBuffer,const MpAttribute * pAttr)1497 static bool GetMpRollAngle(Srational* pBuffer, const MpAttribute* pAttr) 1498 { 1499 NN_ASSERT(pBuffer); 1500 NN_ASSERT(pAttr); 1501 1502 if (pAttr->isRollAngleValid) 1503 { 1504 *pBuffer = pAttr->rollAngle; 1505 return true; 1506 } 1507 1508 return false; 1509 } 1510 1511 /*! 1512 @} 1513 1514 @name GPS IFD情報取得 1515 1516 @{ 1517 */ 1518 1519 /*! 1520 @brief 直前にデコードあるいはExif情報の抽出を行った画像の、GPS IFDを取得します。 1521 1522 それらの処理が失敗した場合は、本関数も失敗します。<BR> 1523 取得には画像データが必要です。破棄しないでください。 1524 1525 @param[out] pBuffer GPS IFDを格納するバッファです。 1526 格納されるデータ形式は、元データのGPS IFDをライブラリで処理しやすい形式へ変換したものであり、 1527 元データのバイナリ列とは異なります。 1528 1529 @return 成功した場合、trueを返します。 1530 失敗した場合、falseを返します。 1531 */ 1532 bool GetLastGpsData(GpsData* pBuffer); 1533 1534 /*! 1535 @brief GPS IFDに含まれる、GPSタグのバージョンを取得します。 1536 1537 @param[in] pGps GPS IFDを指定します。 1538 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1539 1540 @return 成功した場合、GPSタグのバージョンへのポインタを返します。<BR> 1541 このデータは文字列ではなくバイナリ列であり、ゼロ終了していません。<BR> 1542 データのバイト数は @ref GPS_VERSION_ID_SIZE (4) です。<BR> 1543 失敗した場合、NULLを返します。 1544 */ GetGpsVersionId(const GpsData * pGps)1545 static const u8* GetGpsVersionId(const GpsData* pGps) 1546 { 1547 NN_ASSERT(pGps); 1548 1549 return pGps->isVersionIdValid ? pGps->versionId : NULL; 1550 } 1551 1552 /*! 1553 @brief GPS IFDに含まれる、北緯(N) or 南緯(S)を取得します。 1554 1555 @param[in] pGps GPS IFDを指定します。 1556 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1557 1558 @return 成功した場合、北緯('N') or 南緯('S')を返します。 1559 失敗した場合、0x00 を返します。 1560 */ GetGpsLatitudeRef(const GpsData * pGps)1561 static char GetGpsLatitudeRef(const GpsData* pGps) 1562 { 1563 NN_ASSERT(pGps); 1564 1565 return pGps->latitudeRef[0]; 1566 } 1567 1568 /*! 1569 @brief GPS IFDに含まれる、緯度(数値)を取得します。 1570 1571 @param[in] pGps GPS IFDを指定します。 1572 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1573 1574 @return 成功した場合、緯度(数値)へのポインタを返します。 1575 失敗した場合、NULLを返します。 1576 */ GetGpsLatitude(const GpsData * pGps)1577 static const Rational* GetGpsLatitude(const GpsData* pGps) 1578 { 1579 NN_ASSERT(pGps); 1580 1581 return pGps->isLatitudeValid ? pGps->latitude : NULL; 1582 } 1583 1584 /*! 1585 @brief GPS IFDに含まれる、東経(E) or 西経(W)を取得します。 1586 1587 @param[in] pGps GPS IFDを指定します。 1588 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1589 1590 @return 成功した場合、東経('E') or 西経('W')を返します。 1591 失敗した場合、0x00 を返します。 1592 */ GetGpsLongitudeRef(const GpsData * pGps)1593 static char GetGpsLongitudeRef(const GpsData* pGps) 1594 { 1595 NN_ASSERT(pGps); 1596 1597 return pGps->longitudeRef[0]; 1598 } 1599 1600 /*! 1601 @brief GPS IFDに含まれる、経度(数値)を取得します。 1602 1603 @param[in] pGps GPS IFDを指定します。 1604 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1605 1606 @return 成功した場合、経度(数値)へのポインタを返します。 1607 失敗した場合、NULLを返します。 1608 */ GetGpsLongitude(const GpsData * pGps)1609 static const Rational* GetGpsLongitude(const GpsData* pGps) 1610 { 1611 NN_ASSERT(pGps); 1612 1613 return pGps->isLongitudeValid ? pGps->longitude : NULL; 1614 } 1615 1616 /*! 1617 @brief GPS IFDに含まれる、高度の基準を取得します。 1618 1619 @param[out] pBuffer 高度の基準を格納するバッファを指定します。 1620 1621 @param[in] pGps GPS IFDを指定します。 1622 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1623 1624 @return 成功した場合、trueを返します。 1625 失敗した場合、falseを返します。 1626 */ GetGpsAltitudeRef(u8 * pBuffer,const GpsData * pGps)1627 static bool GetGpsAltitudeRef(u8* pBuffer, const GpsData* pGps) 1628 { 1629 NN_ASSERT(pBuffer); 1630 NN_ASSERT(pGps); 1631 1632 if (pGps->isAltitudeRefValid) 1633 { 1634 *pBuffer = pGps->altitudeRef; 1635 } 1636 1637 return pGps->isAltitudeRefValid; 1638 } 1639 1640 /*! 1641 @brief GPS IFDに含まれる、高度(数値)を取得します。 1642 1643 @param[in] pGps GPS IFDを指定します。 1644 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1645 1646 @return 成功した場合、高度(数値)へのポインタを返します。 1647 失敗した場合、NULLを返します。 1648 */ GetGpsAltitude(const GpsData * pGps)1649 static const Rational* GetGpsAltitude(const GpsData* pGps) 1650 { 1651 NN_ASSERT(pGps); 1652 1653 return pGps->isAltitudeValid ? (&pGps->altitude) : NULL; 1654 } 1655 1656 /*! 1657 @brief GPS IFDに含まれる、GPS時間(原子時計の時間)を取得します。 1658 1659 @param[in] pGps GPS IFDを指定します。 1660 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1661 1662 @return 成功した場合、GPS時間(原子時計の時間)を返します。 1663 失敗した場合、NULLを返します。 1664 */ GetGpsTimeStamp(const GpsData * pGps)1665 static const Rational* GetGpsTimeStamp(const GpsData* pGps) 1666 { 1667 NN_ASSERT(pGps); 1668 1669 return pGps->isTimeStampValid ? pGps->timeStamp : NULL; 1670 } 1671 1672 /*! 1673 @brief GPS IFDに含まれる、測位に使った衛星信号を取得します。 1674 1675 取得には画像データが必要です。破棄しないでください。 1676 1677 文字列がゼロ終了していない場合は失敗します。 1678 1679 @param[in] pGps GPS IFDを指定します。 1680 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1681 1682 @return 成功した場合、測位に使った衛星信号へのポインタを返します。 1683 失敗した場合、NULLを返します。 1684 */ GetGpsSatellites(const GpsData * pGps)1685 static const char* GetGpsSatellites(const GpsData* pGps) 1686 { 1687 NN_ASSERT(pGps); 1688 1689 return pGps->pSatellites; 1690 } 1691 1692 /*! 1693 @brief GPS IFDに含まれる、GPS受信機の状態を取得します。 1694 1695 @param[in] pGps GPS IFDを指定します。 1696 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1697 1698 @return 成功した場合、GPS受信機の状態を返します。 1699 失敗した場合、0x00 を返します。 1700 */ GetGpsStatus(const GpsData * pGps)1701 static char GetGpsStatus(const GpsData* pGps) 1702 { 1703 NN_ASSERT(pGps); 1704 1705 return pGps->status[0]; 1706 } 1707 1708 /*! 1709 @brief GPS IFDに含まれる、GPSの測位方法を取得します。 1710 1711 @param[in] pGps GPS IFDを指定します。 1712 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1713 1714 @return 成功した場合、GPSの測位方法を返します。 1715 失敗した場合、0x00 を返します。 1716 */ GetGpsMeasureMode(const GpsData * pGps)1717 static char GetGpsMeasureMode(const GpsData* pGps) 1718 { 1719 NN_ASSERT(pGps); 1720 1721 return pGps->measureMode[0]; 1722 } 1723 1724 /*! 1725 @brief GPS IFDに含まれる、測位の信頼性を取得します。 1726 1727 @param[in] pGps GPS IFDを指定します。 1728 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1729 1730 @return 成功した場合、測位の信頼性へのポインタを返します。 1731 失敗した場合、NULLを返します。 1732 */ GetGpsDop(const GpsData * pGps)1733 static const Rational* GetGpsDop(const GpsData* pGps) 1734 { 1735 NN_ASSERT(pGps); 1736 1737 return pGps->isDopValid ? (&pGps->dop) : NULL; 1738 } 1739 1740 /*! 1741 @brief GPS IFDに含まれる、速度の単位を取得します。 1742 1743 @param[in] pGps GPS IFDを指定します。 1744 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1745 1746 @return 成功した場合、速度の単位を返します。 1747 失敗した場合、0x00 を返します。 1748 */ GetGpsSpeedRef(const GpsData * pGps)1749 static char GetGpsSpeedRef(const GpsData* pGps) 1750 { 1751 NN_ASSERT(pGps); 1752 1753 return pGps->speedRef[0]; 1754 } 1755 1756 /*! 1757 @brief GPS IFDに含まれる、速度(数値)を取得します。 1758 1759 @param[in] pGps GPS IFDを指定します。 1760 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1761 1762 @return 成功した場合、速度(数値)へのポインタを返します。 1763 失敗した場合、NULLを返します。 1764 */ GetGpsSpeed(const GpsData * pGps)1765 static const Rational* GetGpsSpeed(const GpsData* pGps) 1766 { 1767 NN_ASSERT(pGps); 1768 1769 return pGps->isSpeedValid ? (&pGps->speed) : NULL; 1770 } 1771 1772 /*! 1773 @brief GPS IFDに含まれる、進行方向の単位を取得します。 1774 1775 @param[in] pGps GPS IFDを指定します。 1776 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1777 1778 @return 成功した場合、進行方向の単位を返します。 1779 失敗した場合、0x00 を返します。 1780 */ GetGpsTrackRef(const GpsData * pGps)1781 static char GetGpsTrackRef(const GpsData* pGps) 1782 { 1783 NN_ASSERT(pGps); 1784 1785 return pGps->trackRef[0]; 1786 } 1787 1788 /*! 1789 @brief GPS IFDに含まれる、進行方向(数値)を取得します。 1790 1791 @param[in] pGps GPS IFDを指定します。 1792 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1793 1794 @return 成功した場合、進行方向(数値)へのポインタを返します。 1795 失敗した場合、NULLを返します。 1796 */ GetGpsTrack(const GpsData * pGps)1797 static const Rational* GetGpsTrack(const GpsData* pGps) 1798 { 1799 NN_ASSERT(pGps); 1800 1801 return pGps->isTrackValid ? (&pGps->track) : NULL; 1802 } 1803 1804 /*! 1805 @brief GPS IFDに含まれる、撮影した画像の方向の単位を取得します。 1806 1807 @param[in] pGps GPS IFDを指定します。 1808 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1809 1810 @return 成功した場合、撮影した画像の方向の単位を返します。 1811 失敗した場合、0x00 を返します。 1812 */ GetGpsImgDirectionRef(const GpsData * pGps)1813 static char GetGpsImgDirectionRef(const GpsData* pGps) 1814 { 1815 NN_ASSERT(pGps); 1816 1817 return pGps->imgDirectionRef[0]; 1818 } 1819 1820 /*! 1821 @brief GPS IFDに含まれる、撮影した画像の方向(数値)を取得します。 1822 1823 @param[in] pGps GPS IFDを指定します。 1824 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1825 1826 @return 成功した場合、撮影した画像の方向(数値)へのポインタを返します。 1827 失敗した場合、NULLを返します。 1828 */ GetGpsImgDirection(const GpsData * pGps)1829 static const Rational* GetGpsImgDirection(const GpsData* pGps) 1830 { 1831 NN_ASSERT(pGps); 1832 1833 return pGps->isImgDirectionValid ? (&pGps->imgDirection) : NULL; 1834 } 1835 1836 /*! 1837 @brief GPS IFDに含まれる、測位に用いた地図データを取得します。 1838 1839 取得には画像データが必要です。破棄しないでください。 1840 1841 文字列がゼロ終了していない場合は失敗します。 1842 1843 @param[in] pGps GPS IFDを指定します。 1844 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1845 1846 @return 成功した場合、測位に用いた地図データへのポインタを返します。 1847 失敗した場合、NULLを返します。 1848 */ GetGpsMapDatum(const GpsData * pGps)1849 static const char* GetGpsMapDatum(const GpsData* pGps) 1850 { 1851 NN_ASSERT(pGps); 1852 1853 return pGps->pMapDatum; 1854 } 1855 1856 /*! 1857 @brief GPS IFDに含まれる、目的地の北緯(N) or 南緯(S)を取得します。 1858 1859 @param[in] pGps GPS IFDを指定します。 1860 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1861 1862 @return 成功した場合、目的地の北緯('N') or 南緯('S')を返します。 1863 失敗した場合、0x00 を返します。 1864 */ GetGpsDestLatitudeRef(const GpsData * pGps)1865 static char GetGpsDestLatitudeRef(const GpsData* pGps) 1866 { 1867 NN_ASSERT(pGps); 1868 1869 return pGps->destLatitudeRef[0]; 1870 } 1871 1872 /*! 1873 @brief GPS IFDに含まれる、目的地の緯度(数値)を取得します。 1874 1875 @param[in] pGps GPS IFDを指定します。 1876 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1877 1878 @return 成功した場合、目的地の緯度(数値)へのポインタを返します。 1879 失敗した場合、NULLを返します。 1880 */ GetGpsDestLatitude(const GpsData * pGps)1881 static const Rational* GetGpsDestLatitude(const GpsData* pGps) 1882 { 1883 NN_ASSERT(pGps); 1884 1885 return pGps->isDestLatitudeValid ? pGps->destLatitude : NULL; 1886 } 1887 1888 /*! 1889 @brief GPS IFDに含まれる、目的地の東経(E) or 西経(W)を取得します。 1890 1891 @param[in] pGps GPS IFDを指定します。 1892 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1893 1894 @return 成功した場合、目的地の東経('E') or 西経('W')を返します。 1895 失敗した場合、0x00 を返します。 1896 */ GetGpsDestLongitudeRef(const GpsData * pGps)1897 static char GetGpsDestLongitudeRef(const GpsData* pGps) 1898 { 1899 NN_ASSERT(pGps); 1900 1901 return pGps->destLongitudeRef[0]; 1902 } 1903 1904 /*! 1905 @brief GPS IFDに含まれる、目的地の経度(数値)を取得します。 1906 1907 @param[in] pGps GPS IFDを指定します。 1908 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1909 1910 @return 成功した場合、目的地の経度(数値)へのポインタを返します。 1911 失敗した場合、NULLを返します。 1912 */ GetGpsDestLongitude(const GpsData * pGps)1913 static const Rational* GetGpsDestLongitude(const GpsData* pGps) 1914 { 1915 NN_ASSERT(pGps); 1916 1917 return pGps->isDestLongitudeValid ? pGps->destLongitude : NULL; 1918 } 1919 1920 /*! 1921 @brief GPS IFDに含まれる、目的地の方角の単位を取得します。 1922 1923 @param[in] pGps GPS IFDを指定します。 1924 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1925 1926 @return 成功した場合、目的地の方角の単位を返します。 1927 失敗した場合、0x00 を返します。 1928 */ GetGpsDestBearingRef(const GpsData * pGps)1929 static char GetGpsDestBearingRef(const GpsData* pGps) 1930 { 1931 NN_ASSERT(pGps); 1932 1933 return pGps->destBearingRef[0]; 1934 } 1935 1936 /*! 1937 @brief GPS IFDに含まれる、目的の方角(数値)を取得します。 1938 1939 @param[in] pGps GPS IFDを指定します。 1940 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1941 1942 @return 成功した場合、目的の方角(数値)へのポインタを返します。 1943 失敗した場合、NULLを返します。 1944 */ GetGpsDestBearing(const GpsData * pGps)1945 static const Rational* GetGpsDestBearing(const GpsData* pGps) 1946 { 1947 NN_ASSERT(pGps); 1948 1949 return pGps->isDestBearingValid ? (&pGps->destBearing) : NULL; 1950 } 1951 1952 /*! 1953 @brief GPS IFDに含まれる、目的地までの距離の単位を取得します。 1954 1955 @param[in] pGps GPS IFDを指定します。 1956 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1957 1958 @return 成功した場合、目的地までの距離の単位を返します。 1959 失敗した場合、0x00 を返します。 1960 */ GetGpsDestDistanceRef(const GpsData * pGps)1961 static char GetGpsDestDistanceRef(const GpsData* pGps) 1962 { 1963 NN_ASSERT(pGps); 1964 1965 return pGps->destDistanceRef[0]; 1966 } 1967 1968 /*! 1969 @brief GPS IFDに含まれる、目的地までの距離(数値)を取得します。 1970 1971 @param[in] pGps GPS IFDを指定します。 1972 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1973 1974 @return 成功した場合、目的地までの距離(数値)を返します。 1975 失敗した場合、NULLを返します。 1976 */ GetGpsDestDistance(const GpsData * pGps)1977 static const Rational* GetGpsDestDistance(const GpsData* pGps) 1978 { 1979 NN_ASSERT(pGps); 1980 1981 return pGps->isDestDistanceValid ? (&pGps->destDistance) : NULL; 1982 } 1983 1984 /*! 1985 @brief GPS IFDに含まれる、測位方式の名称を取得します。 1986 1987 取得には画像データが必要です。破棄しないでください。 1988 1989 このデータ(文字列)はゼロ終了していません。<BR> 1990 データのバイト数は、@ref GetGpsProcessingMethodSize で取得できます。<BR> 1991 データのバイト数が0の場合は本関数も失敗します。 1992 1993 @param[in] pGps GPS IFDを指定します。 1994 あらかじめ、@ref GetLastGpsData で取得しておいてください。 1995 1996 @return 成功した場合、測位方式の名称へのポインタを返します。 1997 失敗した場合、NULLを返します。 1998 */ GetGpsProcessingMethodPointer(const GpsData * pGps)1999 static const u8* GetGpsProcessingMethodPointer(const GpsData* pGps) 2000 { 2001 NN_ASSERT(pGps); 2002 2003 if (pGps->pProcessingMethod && pGps->processingMethodSize) 2004 { 2005 return pGps->pProcessingMethod; 2006 } 2007 2008 return NULL; 2009 } 2010 2011 /*! 2012 @brief GPS IFDに含まれる、測位方式の名称のバイト数を取得します。 2013 2014 取得には画像データが必要です。破棄しないでください。 2015 2016 データへのポインタは @ref GetGpsProcessingMethodPointer で取得できます。<BR> 2017 データへのポインタがNULLの場合は本関数も失敗します。 2018 2019 @param[in] pGps GPS IFDを指定します。 2020 あらかじめ、@ref GetLastGpsData で取得しておいてください。 2021 2022 @return 成功した場合、測位方式の名称のバイト数を返します。 2023 失敗した場合、0を返します。 2024 */ GetGpsProcessingMethodSize(const GpsData * pGps)2025 static size_t GetGpsProcessingMethodSize(const GpsData* pGps) 2026 { 2027 NN_ASSERT(pGps); 2028 2029 if (pGps->pProcessingMethod && pGps->processingMethodSize) 2030 { 2031 return pGps->processingMethodSize; 2032 } 2033 2034 return 0; 2035 } 2036 2037 /*! 2038 @brief GPS IFDに含まれる、測位地点の名称を取得します。 2039 2040 取得には画像データが必要です。破棄しないでください。 2041 2042 このデータ(文字列)はゼロ終了していません。<BR> 2043 データのバイト数は、@ref GetGpsAreaInformationSize で取得できます。<BR> 2044 データのバイト数が0の場合は本関数も失敗します。 2045 2046 @param[in] pGps GPS IFDを指定します。 2047 あらかじめ、@ref GetLastGpsData で取得しておいてください。 2048 2049 @return 成功した場合、測位地点の名称へのポインタを返します。 2050 失敗した場合、NULLを返します。 2051 */ GetGpsAreaInformationPointer(const GpsData * pGps)2052 static const u8* GetGpsAreaInformationPointer(const GpsData* pGps) 2053 { 2054 NN_ASSERT(pGps); 2055 2056 if (pGps->pAreaInformation && pGps->areaInformationSize) 2057 { 2058 return pGps->pAreaInformation; 2059 } 2060 2061 return NULL; 2062 } 2063 2064 /*! 2065 @brief GPS IFDに含まれる、測位地点の名称のバイト数を取得します。 2066 2067 取得には画像データが必要です。破棄しないでください。 2068 2069 データへのポインタは @ref GetGpsAreaInformationPointer で取得できます。<BR> 2070 データへのポインタがNULLの場合は本関数も失敗します。 2071 2072 @param[in] pGps GPS IFDを指定します。 2073 あらかじめ、@ref GetLastGpsData で取得しておいてください。 2074 2075 @return 成功した場合、測位地点の名称のバイト数を返します。 2076 失敗した場合、0を返します。 2077 */ GetGpsAreaInformationSize(const GpsData * pGps)2078 static size_t GetGpsAreaInformationSize(const GpsData* pGps) 2079 { 2080 NN_ASSERT(pGps); 2081 2082 if (pGps->pAreaInformation && pGps->areaInformationSize) 2083 { 2084 return pGps->areaInformationSize; 2085 } 2086 2087 return 0; 2088 } 2089 2090 /*! 2091 @brief GPS IFDに含まれる、GPS日付を取得します。 2092 2093 取得には画像データが必要です。破棄しないでください。 2094 2095 @param[in] pGps GPS IFDを指定します。 2096 あらかじめ、@ref GetLastGpsData で取得しておいてください。 2097 2098 @return 成功した場合、GPS日付へのポインタを返します。 2099 データのバイト数は末尾の 0x00 を含み @ref GPS_DATE_STAMP_SIZE (11) です。<BR> 2100 失敗した場合、NULLを返します。 2101 */ GetGpsDateStamp(const GpsData * pGps)2102 static const char* GetGpsDateStamp(const GpsData* pGps) 2103 { 2104 NN_ASSERT(pGps); 2105 2106 return pGps->pDateStamp; 2107 } 2108 2109 /*! 2110 @brief GPS IFDに含まれる、GPS補正測位を取得します。 2111 2112 @param[out] pBuffer GPS補正測位を格納するバッファを指定します。 2113 2114 @param[in] pGps GPS IFDを指定します。 2115 あらかじめ、@ref GetLastGpsData で取得しておいてください。 2116 2117 @return 成功した場合、trueを返します。 2118 失敗した場合、falseを返します。 2119 */ GetGpsDifferential(u16 * pBuffer,const GpsData * pGps)2120 static bool GetGpsDifferential(u16* pBuffer, const GpsData* pGps) 2121 { 2122 NN_ASSERT(pBuffer); 2123 NN_ASSERT(pGps); 2124 2125 if (pGps->isDifferentialValid) 2126 { 2127 *pBuffer = pGps->differential; 2128 } 2129 2130 return pGps->isDifferentialValid; 2131 } 2132 2133 /*! 2134 @} 2135 */ 2136 2137 protected: 2138 detail::JpegMpDecoderWorkObj* m_pWork; 2139 bool m_Initialized; 2140 bool m_Padding[3]; 2141 2142 detail::JpegMpDecoderTemporarySettingObj m_TemporarySetting; 2143 void ClearTemporarySetting(); 2144 2145 const u8* GetLastMakerNotePointer(u32 index) const; 2146 size_t GetLastMakerNoteSize(u32 index) const; 2147 }; 2148 2149 } // namespace CTR { 2150 } // namespace jpeg { 2151 } // namespace nn { 2152 2153 #endif // __cplusplus 2154 2155 #endif // NN_JPEG_JPEGMPDECODER_H_ 2156