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