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