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