1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     jpeg_MpEncoder.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: 28853 $
14  *---------------------------------------------------------------------------*/
15 
16 /*! @file
17     @brief    JpegMpEncoder に関するAPIの宣言
18 
19     :include nn/jpeg.h
20 */
21 
22 #ifndef NN_JPEG_JPEGMPENCODER_H_
23 #define NN_JPEG_JPEGMPENCODER_H_
24 
25 #include <nn/util/util_NonCopyable.h>
26 #include <nn/jpeg/CTR/jpeg_MpTypes.h>
27 #include <string.h>
28 
29 #ifdef __cplusplus
30 
31 namespace nn {
32 namespace jpeg {
33 namespace CTR {
34 
35 namespace detail {
36     struct JpegMpEncoderWorkObj;
37 }
38 
39 /*!
40     @brief JPEGエンコードを行うクラスです。
41 */
42 class JpegMpEncoder : private nn::util::NonCopyable<JpegMpEncoder>
43 {
44 public:
45     /*!
46         @name       初期化・終了
47 
48         @{
49      */
50 
51     /*!
52         @brief      エンコーダオブジェクト用ワークバッファのバイト数を計算します。
53 
54                     バッファの確保と解放はアプリケーションで行ってください。
55 
56         @param[in]  numImages   MP(マルチピクチャ)フォーマットを使用せず、通常のJPEGフォーマットのみを使用する場合は0を指定します。<BR>
57                                 MPフォーマットを使用する場合は、格納する画像数を指定します。<BR>
58                                 MPフォーマットを使用するかどうか、あるいは格納する画像数が未定のままバッファを確保する必要がある場合、
59                                 アプリケーションが想定する最大格納画像数を指定してください。<BR>
60                                 デフォルトは0です。
61 
62         @return     バッファのバイト数を返します。
63                     ただし、格納する画像数(numImages)が大きすぎる(4096以上)場合には、エラーとして0を返します。
64      */
65     static size_t GetWorkBufferSize(u32 numImages = 0);
66 
67     /*!
68         @brief      エンコーダオブジェクトを構築します。
69 
70                     初期化しません。
71      */
JpegMpEncoder()72     JpegMpEncoder() : m_Initialized(false) {}
73 
74     /*!
75         @brief      エンコーダオブジェクトを初期化します。
76 
77                     エンコーダオブジェクト用ワークバッファも初期化します。
78 
79                     初期化を一度行えば、MPフォーマットへ格納する画像数に変更がない限り、終了するまで再初期化不要です。
80                     @ref StartMpEncoderNext を呼ぶ前でなければ、再初期化してもかまいません。
81 
82         @param[out] workBuffer          エンコーダオブジェクト用ワークバッファを指定します。
83                                         4バイトアラインメントが必要です。<BR>
84                                         バッファサイズは @ref GetWorkBufferSize で計算します。<BR>
85                                         ワークバッファはエンコーダオブジェクト毎に必要です。
86 
87         @param[in]  workBufferSize      バッファのバイト数を指定します。
88                                         @ref GetWorkBufferSize の返り値を指定してください。
89 
90         @param[in]  numImages           MPフォーマットへ格納する画像数を指定します。<BR>
91                                         @ref GetWorkBufferSize 呼び出し時と同じかそれ以下の値を指定してください。<BR>
92                                         デフォルトは0です。
93 
94         @return     成功した場合、trueを返します。
95                     失敗した場合、falseを返します。
96                     workBufferのアラインメントと、他の引数を確認してください。
97      */
98     bool Initialize(void* workBuffer, size_t workBufferSize, u32 numImages = 0);
99 
100     /*!
101         @brief      エンコーダオブジェクトの終了処理を行います。
102 
103         @return     なし。
104      */
Finalize()105     void Finalize() { m_Initialized = false; }
106 
107     /*!
108         @brief      デストラクタです。
109                     内部で Finalize() を呼びます。
110      */
~JpegMpEncoder()111     ~JpegMpEncoder() { Finalize(); }
112 
113     /*!
114         @}
115 
116         @name       エンコード前の設定
117 
118         @{
119      */
120 
121     /*!
122      :private
123      本関数を呼ばないでください。
124      関数リファレンス作成の都合により、ここにstaticのダミー関数を定義しています。
125      */
DoNotCallMe1()126     static void DoNotCallMe1() {}
127 
128     /*!
129         @brief      サムネイルの画像サイズおよび出力形式を指定します。
130 
131                     エンコード関数がサムネイルを付加する場合、
132                     サムネイルの画像サイズ(pixel)は、デフォルトでは横幅 @ref DEFAULT_THUMBNAIL_WIDTH (160)、
133                     縦幅 @ref DEFAULT_THUMBNAIL_HEIGHT (120) となり、アスペクト比は4:3です。
134 
135                     サムネイルは指定された画像サイズで生成されるため、元画像のアスペクト比が4:3でない場合、
136                     縮小率が縦方向と横方向で異なる、歪んだサムネイルが生成されます。
137 
138                     本関数でサムネイル画像サイズを指定することにより、元画像とサムネイルのアスペクト比を一致あるいは近づけることができます。<BR>
139                     サムネイル画像サイズを大きくしすぎると、APP1セグメント(0xFFFFバイトまで)に収まらず、エンコードが失敗する可能性があります。
140 
141                     指定できる画像サイズは、出力形式(引数 dstPixelSampling)によって変わります。
142 
143                     &lt;UL&gt;
144                         &lt;LI&gt; @ref PIXEL_SAMPLING_YUV444 を指定した場合は、縦横サイズがそれぞれ8の倍数である必要があります。
145                         &lt;LI&gt; @ref PIXEL_SAMPLING_YUV420 を指定した場合は、縦横サイズがそれぞれ16の倍数である必要があります。
146                         &lt;LI&gt; @ref PIXEL_SAMPLING_YUV422 を指定した場合は、縦サイズが8の倍数、横サイズが16の倍数である必要があります。
147                     &lt;/LI&gt;&lt;/UL&gt;
148 
149                     デフォルトの画像出力形式は @ref DEFAULT_THUMBNAIL_PIXEL_SAMPLING ( @ref PIXEL_SAMPLING_YUV422 ) です。
150 
151                     本関数は、エンコード関数を呼ぶ前に呼んでください。
152                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
153                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
154                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
155 
156                     引数 width、height、dstPixelSamplingの組み合わせが不正な場合は、
157                     全てデフォルト値で置き換えられます。
158 
159         @param[in]  width               サムネイルの横幅(pixel)を指定します。(65536未満)
160 
161         @param[in]  height              サムネイルの縦幅(pixel)を指定します。(65536未満)
162 
163         @param[in]  dstPixelSampling    画像の出力形式(画素サンプリング)を指定します。<BR>
164                                         デフォルトは @ref DEFAULT_THUMBNAIL_PIXEL_SAMPLING ( @ref PIXEL_SAMPLING_YUV422 ) です。
165 
166         @return     なし。
167      */
168     void SetThumbnailSize(u32 width, u32 height, PixelSampling dstPixelSampling = DEFAULT_THUMBNAIL_PIXEL_SAMPLING)
169     {
170         if (m_Initialized)
171         {
172             m_TemporarySetting.thumbnailWidth    = width;
173             m_TemporarySetting.thumbnailHeight   = height;
174             m_TemporarySetting.thumbnailSampling = dstPixelSampling;
175         }
176     }
177 
178     /*!
179         @brief      入力画像バッファの横幅を指定します。
180 
181                     本関数は、エンコードしたい画像横幅より、その画像バッファ(例えばGPUテクスチャバッファ)
182                     の画像横幅が大きい場合に使います。
183 
184                     入力画像バッファの画像横幅を指定することにより、
185                     エンコード関数が入力画像バッファから左詰めで切り抜き処理を行います。<BR>
186                     サムネイルを付加する場合、主画像と同様に切り抜き後の画像から縮小処理を行います。
187 
188                     本関数は、エンコード関数を呼ぶ前に呼んでください。
189                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
190                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
191                     他にも、引数 width に0を指定するか、
192                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
193 
194                     本関数で指定した画像横幅より、エンコード関数で指定したものが大きい場合は、
195                     エンコード関数の指定が優先されます。
196 
197                     引数 width は、エンコード関数で指定する入力ピクセルフォーマット (@ref PixelFormat) に応じて以下の制限があります(エンコード時にそれぞれの倍数へ切り下げられます)。
198 
199                     &lt;UL&gt;
200                         &lt;LI&gt; @ref PIXEL_FORMAT_YUYV8 の場合、2の倍数である必要があります。
201                         &lt;LI&gt; @ref PIXEL_FORMAT_CTR_RGB565_BLOCK8 、@ref PIXEL_FORMAT_CTR_RGB8_BLOCK8 、あるいは @ref PIXEL_FORMAT_CTR_RGBA8_BLOCK8 の場合、8の倍数である必要があります。
202                     &lt;/LI&gt;&lt;/UL&gt;
203 
204         @param[in]  width               入力画像バッファの横幅(pixel)を指定します。<BR>
205                                         0を指定すると、エンコード関数での指定が優先されます。<BR>
206                                         @ref MAX_ENCODER_INPUT_BUFFER_WIDTH (65536) を超える値の指定は無視されます。
207 
208         @return     なし。
209      */
SetInputBufferWidth(u32 width)210     void SetInputBufferWidth(u32 width)
211     {
212         if (m_Initialized)
213         {
214             if (width <= MAX_ENCODER_INPUT_BUFFER_WIDTH)
215             {
216                 m_TemporarySetting.inputBufferWidth  = width;
217             }
218         }
219     }
220 
221     /*!
222         @brief      JPEGエンコード時のオプションを指定します。
223 
224                     オプションを指定することにより、エンコード関数の動作を変更できます。
225 
226                     @ref StartMpEncoderLR でエンコードする場合、オプションは2枚の画像に対して有効です。
227 
228                     本関数は、エンコード関数を呼ぶ前に呼んでください。
229                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
230                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
231                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
232 
233                     エンコード関数を呼ぶ前に本関数を繰り返し呼んだ場合、最後の指定が有効になります。
234 
235                     以下の各種データ登録関数はAPP1の記録内容に影響します。
236                     APP1を記録しない場合、呼んでも効果がありません。
237 
238                     &lt;UL&gt;
239                         &lt;LI&gt; @ref SetDateTime
240                         &lt;LI&gt; @ref SetSoftware
241                         &lt;LI&gt; @ref SetUserMakerNote
242                         &lt;LI&gt; @ref SetImageUid
243                         &lt;LI&gt; @ref SetOrientation
244                         &lt;LI&gt; @ref SetGpsData
245                     &lt;/LI&gt;&lt;/UL&gt;
246 
247                     以下のMPフォーマットに関係する各種データ登録関数はAPP2の記録内容に影響します。
248                     従って、APP1を記録しなくても有効です。
249 
250                     &lt;UL&gt;
251                         &lt;LI&gt; @ref SetMpTypeFlags
252                         &lt;LI&gt; @ref SetMpIndividualNum
253                         &lt;LI&gt; @ref SetMpPanOrientation
254                         &lt;LI&gt; @ref SetMpPanOverlapH
255                         &lt;LI&gt; @ref SetMpPanOverlapV
256                         &lt;LI&gt; @ref SetMpBaseViewpointNum
257                         &lt;LI&gt; @ref SetMpConvergenceAngle
258                         &lt;LI&gt; @ref SetMpBaselineLength
259                         &lt;LI&gt; @ref SetMpVerticalDivergence
260                         &lt;LI&gt; @ref SetMpAxisDistanceX
261                         &lt;LI&gt; @ref SetMpAxisDistanceY
262                         &lt;LI&gt; @ref SetMpAxisDistanceZ
263                         &lt;LI&gt; @ref SetMpYawAngle
264                         &lt;LI&gt; @ref SetMpPitchAngle
265                         &lt;LI&gt; @ref SetMpRollAngle
266                     &lt;/LI&gt;&lt;/UL&gt;
267 
268         @param[in]  option              オプションを指定します。<BR>
269                                         指定できる値は、@ref EncoderOption をビット論理和したものです。<BR>
270                                         @ref JPEG_ENCODER_OPTION_NONE (0) を指定すると、エンコード関数の動作はデフォルトに戻ります。
271 
272         @return     なし。
273      */
SetOption(u32 option)274     void SetOption(u32 option)
275     {
276         if (m_Initialized)
277         {
278             m_TemporarySetting.option = option;
279         }
280     }
281 
282     /*!
283         @brief      指定済みのエンコードオプションを取得します。
284 
285         @return     エンコードオプション (@ref EncoderOption) を返します。
286      */
GetOption()287     u32 GetOption()
288     {
289         if (m_Initialized)
290         {
291             return m_TemporarySetting.option;
292         }
293 
294         return JPEG_ENCODER_OPTION_NONE;
295     }
296 
297     /*!
298         @}
299 
300         @name       Exif情報登録
301 
302         @{
303      */
304 
305     /*!
306         @brief      JPEGに埋め込む撮影日時情報を登録します。
307 
308                     この情報は、IFD0 の DateTime と、Exif IFD の DateTimeOriginal タグ、DateTimeDigitized タグとして登録されます。<BR>
309                     デフォルトは未登録で、この場合はエンコード関数が内部で @ref GetDateTimeNow を呼び、現在日時を登録します。<BR>
310                     @ref SetOption でオプション指定を行いAPP1を記録しなかった場合、エンコード関数は @ref GetDateTimeNow を呼びません。
311 
312                     本関数は、エンコード関数を呼ぶ前に呼んでください。
313                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
314                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
315                     他にも、引数 pBuffer にNULLを指定するか、
316                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
317 
318         @param[in]  pBuffer             日時情報を指定します。
319                                         文字列は「YYYY:MM:DD HH:MM:DD」+0x00 の 20 文字としてください。<BR>
320                                         NULLを指定するとクリアします。
321 
322         @return     なし。
323      */
SetDateTime(const char * pBuffer)324     void SetDateTime(const char* pBuffer)
325     {
326         if (m_Initialized)
327         {
328             if (pBuffer)
329             {
330                 memcpy(m_TemporarySetting.dateTimeBuffer, pBuffer, sizeof(m_TemporarySetting.dateTimeBuffer));
331                 m_TemporarySetting.dateTimeBuffer[sizeof(m_TemporarySetting.dateTimeBuffer) - 1] = '\0';
332                 m_TemporarySetting.isDateTimeSet = true;
333             }
334             else
335             {
336                 m_TemporarySetting.isDateTimeSet = false;
337             }
338         }
339     }
340 
341     /*!
342         @brief      現在日時を取得し、@ref SetDateTime の引数に指定できる文字列を作成します。
343 
344                     現在日時の取得には @ref nn::fnd::DateTime::GetNow を使っています。
345 
346         @param[out] pBuffer             日時情報を格納するバッファを指定します。
347                                         バッファのバイト数は @ref DATE_TIME_SIZE (20) です。
348 
349         @return     なし。
350      */
351     static void GetDateTimeNow(char* pBuffer);
352 
353     /*!
354         @brief      JPEGのExif IFDに埋め込む、ソフトウェア名を登録します。
355 
356                     この情報は、IFD0 の Software タグとして登録されます。
357                     デフォルトは未登録です。
358 
359                     本関数は、エンコード関数を呼ぶ前に呼んでください。
360                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
361                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
362                     他にも、引数 pBuffer にNULLを指定するか、
363                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
364 
365         @param[in]  pBuffer             ソフトウェア名を指定します。
366 
367         @return     なし。
368      */
SetSoftware(const char * pBuffer)369     void SetSoftware(const char* pBuffer)
370     {
371         if (m_Initialized)
372         {
373             m_TemporarySetting.pSoftware = pBuffer;
374         }
375     }
376 
377     /*!
378         @brief      JPEGのメーカーノート部分に埋め込む各種データを登録します。
379 
380                     埋め込まれたデータを取得するためには、デコードあるいはExif情報の抽出を行った後、
381                     @ref JpegMpDecoder::GetLastUserMakerNotePointer および @ref JpegMpDecoder::GetLastUserMakerNoteSize を呼んでください。
382 
383                     &lt;UL&gt;
384                         &lt;LI&gt; 登録できる最大サイズについて<BR>
385                                    メーカーノートに登録できるデータのサイズは、APP1セグメント全体のサイズに依存します。<BR>
386                                    メーカーノートはExifに含まれるため、APP1セグメントの一部となりますが、このAPP1セグメントは0xFFFFバイトまでのサイズしか扱えないようになっています。<BR>
387                                    そのため、サムネイル等のAPP1領域のデータサイズによって、メーカーノートに埋め込めるデータのサイズは変動することになります。<BR>
388                                   (目安として 640x480の画像をサムネイル付き、YUV422、クオリティ90でエンコードする場合、トータル 0xE000バイト以下までのサイズにすることをお勧めします。)
389                     &lt;/LI&gt;&lt;/UL&gt;
390 
391                     本関数は、エンコード関数を呼ぶ前に呼んでください。
392                     埋め込むデータはエンコード関数終了まで破棄しないでください。<BR>
393                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
394                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
395                     他にも、引数 pBuffer にNULLを指定するか、size に0を指定するか、
396                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
397 
398         @param[in]  pBuffer             埋め込むデータを指定します。<BR>
399                                         NULLを指定するとクリアします。
400 
401         @param[in]  size                埋め込むデータのバイト数を指定します。<BR>
402                                         0を指定するとクリアします。
403 
404         @return     なし。
405      */
406     void SetUserMakerNote(const u8* pBuffer, size_t size);
407 
408     /*!
409         @brief      JPEGのExif IFDに埋め込む、画像ユニークIDを登録します。
410 
411                     埋め込まれたデータを取得するためには、デコードあるいはExif情報の抽出を行った後、
412                     @ref JpegMpDecoder::GetLastImageUid を呼んでください。
413 
414                     MPフォーマットを使用する場合、@ref StartMpEncoderFirst で「個別画像ユニークIDリストを付加する」と指定すると、
415                     @ref StartMpEncoderNext 呼び出し毎に、本関数で登録したIDが個別画像ユニークIDとしてコピーされます(先頭画像を除く)。
416 
417                     本関数は、エンコード関数を呼ぶ前に呼んでください。
418                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
419                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
420                     他にも、引数 pBuffer にNULLを指定するか、
421                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
422 
423         @param[in]  pBuffer             画像ユニークIDを指定します。<BR>
424                                         文字列は128ビットの整数値を16進数表記したASCII文字列(32文字)で、バイト数は末尾の 0x00 を含み @ref IMAGE_UID_SIZE (33) バイトです。<BR>
425                                         NULLを指定するとクリアします。
426 
427         @return     なし。
428      */
SetImageUid(const char * pBuffer)429     void SetImageUid(const char* pBuffer)
430     {
431         if (m_Initialized)
432         {
433             if (pBuffer)
434             {
435                 memcpy(m_TemporarySetting.imageUidBuffer, pBuffer, sizeof(m_TemporarySetting.imageUidBuffer));
436                 m_TemporarySetting.imageUidBuffer[sizeof(m_TemporarySetting.imageUidBuffer) - 1] = '\0';
437                 m_TemporarySetting.isImageUidSet = true;
438             }
439             else
440             {
441                 m_TemporarySetting.isImageUidSet = false;
442             }
443         }
444     }
445 
446     /*!
447         @brief      JPEGのExif IFDに埋め込む、画像方向を登録します。
448 
449                     この情報は、IFD0 の Orientation タグとして登録されます。
450                     デフォルトは未登録です。
451 
452                     本関数は、エンコード関数を呼ぶ前に呼んでください。
453                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
454                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
455                     他にも、@ref ClearOrientation を呼ぶか、
456                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
457 
458         @param[in]  orientation         画像方向(1から8まで)を指定します。
459 
460         @return     なし。
461      */
SetOrientation(u16 orientation)462     void SetOrientation(u16 orientation)
463     {
464         if (m_Initialized)
465         {
466             m_TemporarySetting.orientation = orientation;
467             m_TemporarySetting.isOrientationSet = true;
468         }
469     }
470 
471     /*!
472         @brief      JPEGのExif IFDに画像方向を埋め込まないよう指示します(デフォルト動作)。
473 
474         @return     なし。
475      */
ClearOrientation()476     void ClearOrientation()
477     {
478         if (m_Initialized)
479         {
480             m_TemporarySetting.isOrientationSet = false;
481         }
482     }
483 
484     /*!
485         @}
486 
487         @name       MPエントリ 情報登録
488 
489         @{
490      */
491 
492     /*!
493      :private
494      本関数を呼ばないでください。
495      関数リファレンス作成の都合により、ここにstaticのダミー関数を定義しています。
496      */
DoNotCallMe2()497     static void DoNotCallMe2() {}
498 
499     /*!
500         @brief      MPエントリに埋め込む、個別画像種別管理情報の各種フラグと、従属画像エントリ番号を登録します。
501 
502                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
503                     @ref StartMpEncoderLR を使う場合には無効です(デフォルト値が登録されます)。
504 
505                     個別画像種別管理情報のフィールドのうち、「従属親画像フラグ」、「従属子画像フラグ」、「代表画像フラグ」
506                     を指定できます。<BR>
507                     他のフィールドのうち、「予約(0)」、「データ形式(0: JPEG)」はライブラリで固定されており、指定できません。<BR>
508                     「種別コード」は @ref StartMpEncoderFirst で指定します。
509 
510                     本関数を呼ばずに @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使っても問題ありません。
511                     デフォルトで、「従属親画像フラグ=0」、「従属子画像フラグ=0」、
512                     「代表画像フラグ=先頭画像のみ1、他は0」となります。
513 
514                     デフォルト動作の詳細は以下の通りです。
515 
516                     &lt;OL&gt;
517                         &lt;LI&gt; 本関数を呼ばずに @ref StartMpEncoderFirst を使った場合、この画像(先頭画像)が代表画像(代表画像フラグ=1)となります。
518                         &lt;LI&gt; 本関数を呼ばずに @ref StartMpEncoderNext を使った場合、まだ代表画像が存在していなければ、この画像が代表画像となります。<BR>
519                                    代表画像が存在していれば、この画像は代表画像フラグ=0となります。
520                     &lt;/LI&gt;&lt;/OL&gt;
521 
522                     本関数は、エンコード関数を呼ぶ前に呼んでください。
523                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
524                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
525                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
526 
527         @param[in]  flags               @ref MpTypeFlag を単独あるいは論理和で指定します。0も指定できます。<BR>
528                                         @ref MP_TYPE_FLAG_REPRESENTATIVE_IMAGE (代表画像フラグ)をセットしても、
529                                         既に代表画像が存在していれば無視されます。<BR>
530                                         デフォルトは0です。
531 
532         @param[in]  image1              従属画像1エントリ番号を指定します。
533                                         デフォルトは0です。
534 
535         @param[in]  image2              従属画像2エントリ番号を指定します。
536                                         デフォルトは0です。
537 
538         @return     なし。
539      */
540     void SetMpTypeFlags(u32 flags = 0, u16 image1 = 0, u16 image2 = 0)
541     {
542         if (m_Initialized)
543         {
544             m_TemporarySetting.isDependentParent = (flags & MP_TYPE_FLAG_DEPENDENT_IMAGE_PARENT) ? true : false;
545             m_TemporarySetting.isDependentChild  = (flags & MP_TYPE_FLAG_DEPENDENT_IMAGE_CHILD)  ? true : false;
546             m_TemporarySetting.isRepresentativeSet = true;
547             m_TemporarySetting.isRepresentative  = (flags & MP_TYPE_FLAG_REPRESENTATIVE_IMAGE)   ? true : false;
548             m_TemporarySetting.dependentImage1EntryNum = image1;
549             m_TemporarySetting.dependentImage2EntryNum = image2;
550         }
551     }
552 
553     /*!
554         @}
555 
556         @name       MP個別情報IFD 情報登録
557 
558         @{
559      */
560 
561     /*!
562      :private
563      本関数を呼ばないでください。
564      関数リファレンス作成の都合により、ここにstaticのダミー関数を定義しています。
565      */
DoNotCallMe3()566     static void DoNotCallMe3() {}
567 
568     /*!
569         @brief      MP個別情報IFDに埋め込む、個別画像番号を登録します。
570 
571                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
572                     @ref StartMpEncoderLR を使う場合には無効です(デフォルト値が登録されます)。
573 
574                     本関数を呼ばない場合、ライブラリがデフォルト値を登録します。<BR>
575                     デフォルト値は @ref StartMpEncoderFirst を呼ぶと1に初期化され、エンコード関数終了後、1ずつ増加します。
576 
577                     本関数は、エンコード関数を呼ぶ前に呼んでください。
578                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
579                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
580                     他にも、@ref ClearMpIndividualNum を呼ぶか、
581                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
582 
583         @param[in]  value               個別画像番号を指定します。
584 
585         @return     なし。
586      */
SetMpIndividualNum(u32 value)587     void SetMpIndividualNum(u32 value)
588     {
589         if (m_Initialized)
590         {
591             m_TemporarySetting.mpAttribute.mpIndividualNum = value;
592             m_TemporarySetting.mpAttribute.isMpIndividualNumValid = true;
593         }
594     }
595 
596     /*!
597         @brief      MP個別情報IFDに埋め込む、個別画像番号をデフォルト値に戻します。
598 
599         @return     なし。
600      */
ClearMpIndividualNum()601     void ClearMpIndividualNum()
602     {
603         if (m_Initialized)
604         {
605             m_TemporarySetting.mpAttribute.isMpIndividualNumValid = false;
606         }
607     }
608 
609     /*!
610         @brief      MP個別情報IFDに埋め込む、画像配置を登録します。
611 
612                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
613                     @ref StartMpEncoderLR を使う場合には無効です。
614 
615                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像)
616                     でない場合、値は埋め込まれません。
617 
618                     本関数は、エンコード関数を呼ぶ前に呼んでください。
619                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
620                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
621                     他にも、@ref ClearMpPanOrientation を呼ぶか、
622                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
623 
624         @param[in]  value               画像配置を指定します。
625 
626         @return     なし。
627      */
SetMpPanOrientation(u32 value)628     void SetMpPanOrientation(u32 value)
629     {
630         if (m_Initialized)
631         {
632             m_TemporarySetting.mpAttribute.panOrientation = value;
633             m_TemporarySetting.mpAttribute.isPanOrientationValid = true;
634         }
635     }
636 
637     /*!
638         @brief      MP個別情報IFDに画像配置を埋め込まないよう指示します(デフォルト動作)。
639 
640         @return     なし。
641      */
ClearMpPanOrientation()642     void ClearMpPanOrientation()
643     {
644         if (m_Initialized)
645         {
646             m_TemporarySetting.mpAttribute.isPanOrientationValid = false;
647         }
648     }
649 
650     /*!
651         @brief      MP個別情報IFDに埋め込む、水平オーバーラップを登録します。
652 
653                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
654                     @ref StartMpEncoderLR を使う場合には無効です。
655 
656                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像)
657                     でない場合、値は埋め込まれません。
658 
659                     本関数は、エンコード関数を呼ぶ前に呼んでください。
660                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
661                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
662                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpPanOverlapH を呼ぶか、
663                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
664 
665         @param[in]  pValue              水平オーバーラップを指定します。<BR>
666                                         NULLを指定するとクリアします。
667 
668         @return     なし。
669      */
SetMpPanOverlapH(const Rational * pValue)670     void SetMpPanOverlapH(const Rational* pValue)
671     {
672         if (m_Initialized)
673         {
674             if (pValue)
675             {
676                 m_TemporarySetting.mpAttribute.panOverlapH = *pValue;
677                 m_TemporarySetting.mpAttribute.isPanOverlapHValid = true;
678             }
679             else
680             {
681                 m_TemporarySetting.mpAttribute.isPanOverlapHValid = false;
682             }
683         }
684     }
685 
686     /*!
687         @brief      MP個別情報IFDに水平オーバーラップを埋め込まないよう指示します(デフォルト動作)。
688 
689         @return     なし。
690      */
ClearMpPanOverlapH()691     void ClearMpPanOverlapH() { SetMpPanOverlapH(NULL); }
692 
693     /*!
694         @brief      MP個別情報IFDに埋め込む、垂直オーバーラップを登録します。
695 
696                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
697                     @ref StartMpEncoderLR を使う場合には無効です。
698 
699                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像)
700                     でない場合、値は埋め込まれません。
701 
702                     本関数は、エンコード関数を呼ぶ前に呼んでください。
703                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
704                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
705                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpPanOverlapV を呼ぶか、
706                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
707 
708         @param[in]  pValue              垂直オーバーラップを指定します。<BR>
709                                         NULLを指定するとクリアします。
710 
711         @return     なし。
712      */
SetMpPanOverlapV(const Rational * pValue)713     void SetMpPanOverlapV(const Rational* pValue)
714     {
715         if (m_Initialized)
716         {
717             if (pValue)
718             {
719                 m_TemporarySetting.mpAttribute.panOverlapV = *pValue;
720                 m_TemporarySetting.mpAttribute.isPanOverlapVValid = true;
721             }
722             else
723             {
724                 m_TemporarySetting.mpAttribute.isPanOverlapVValid = false;
725             }
726         }
727     }
728 
729     /*!
730         @brief      MP個別情報IFDに垂直オーバーラップを埋め込まないよう指示します。(デフォルト動作)
731 
732         @return     なし。
733      */
ClearMpPanOverlapV()734     void ClearMpPanOverlapV() { SetMpPanOverlapV(NULL); }
735 
736     /*!
737         @brief      MP個別情報IFDに埋め込む、基準視点番号を登録します。
738 
739                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
740                     @ref StartMpEncoderLR を使う場合には無効です(デフォルト値が登録されます)。
741 
742                     本関数を呼ばない場合、ライブラリがデフォルト値(1)を登録します。<BR>
743                     ただし、画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像)
744                     でも @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像) でもない場合、
745                     値は埋め込まれません。
746 
747                     基準視点番号は全ての個別画像で同一の値を埋め込む必要があるため、
748                     本関数は、@ref StartMpEncoderFirst を呼ぶ前に呼んでください。
749                     @ref StartMpEncoderNext を呼ぶ前に本関数を呼んでも無視されます。
750 
751                     全ての個別画像のエンコードが終了後、成功、失敗問わず本関数の指定はクリアされます。
752                     他にも、@ref ClearMpBaseViewpointNum を呼ぶか、
753                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
754 
755         @param[in]  value               基準視点番号を指定します。
756 
757         @return     なし。
758      */
SetMpBaseViewpointNum(u32 value)759     void SetMpBaseViewpointNum(u32 value)
760     {
761         if (m_Initialized)
762         {
763             m_TemporarySetting.mpAttribute.baseViewpointNum = value;
764             m_TemporarySetting.mpAttribute.isBaseViewpointNumValid = true;
765         }
766     }
767 
768     /*!
769         @brief      MP個別情報IFDに埋め込む、基準視点番号をデフォルト値に戻します。
770 
771         @return     なし。
772      */
ClearMpBaseViewpointNum()773     void ClearMpBaseViewpointNum()
774     {
775         if (m_Initialized)
776         {
777             m_TemporarySetting.mpAttribute.isBaseViewpointNumValid = false;
778         }
779     }
780 
781     /*!
782         @brief      MP個別情報IFDに埋め込む、輻輳角を登録します。
783 
784                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
785                     @ref StartMpEncoderLR を使う場合には無効です(デフォルト値が登録されます)。
786 
787                     本関数を呼ばない場合、ライブラリがデフォルト値(0xFFFFFFFF/0xFFFFFFFF)を登録します。<BR>
788                     ただし、画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像)
789                     でない場合、値は埋め込まれません。
790 
791                     本関数は、エンコード関数を呼ぶ前に呼んでください。
792                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
793                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
794                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpConvergenceAngle を呼ぶか、
795                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
796 
797         @param[in]  pValue              輻輳角を指定します。<BR>
798                                         NULLを指定するとクリアします。
799 
800         @return     なし。
801      */
SetMpConvergenceAngle(const Srational * pValue)802     void SetMpConvergenceAngle(const Srational* pValue)
803     {
804         if (m_Initialized)
805         {
806             if (pValue)
807             {
808                 m_TemporarySetting.mpAttribute.convergenceAngle = *pValue;
809                 m_TemporarySetting.mpAttribute.isConvergenceAngleValid = true;
810             }
811             else
812             {
813                 m_TemporarySetting.mpAttribute.isConvergenceAngleValid = false;
814             }
815         }
816     }
817 
818     /*!
819         @brief      MP個別情報IFDに埋め込む、輻輳角をデフォルト値に戻します。
820 
821         @return     なし。
822      */
ClearMpConvergenceAngle()823     void ClearMpConvergenceAngle() { SetMpConvergenceAngle(NULL); }
824 
825     /*!
826         @brief      MP個別情報IFDに埋め込む、基線長を登録します。
827 
828                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
829                     @ref StartMpEncoderLR を使う場合には無効です(デフォルト値が登録されます)。
830 
831                     本関数を呼ばない場合、ライブラリがデフォルト値(0xFFFFFFFF/0xFFFFFFFF)を登録します。<BR>
832                     ただし、画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像)
833                     でない場合、値は埋め込まれません。
834 
835                     本関数は、エンコード関数を呼ぶ前に呼んでください。
836                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
837                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
838                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpBaselineLength を呼ぶか、
839                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
840 
841         @param[in]  pValue              基線長を指定します。<BR>
842                                         NULLを指定するとクリアします。
843 
844         @return     なし。
845      */
SetMpBaselineLength(const Rational * pValue)846     void SetMpBaselineLength(const Rational* pValue)
847     {
848         if (m_Initialized)
849         {
850             if (pValue)
851             {
852                 m_TemporarySetting.mpAttribute.baselineLength = *pValue;
853                 m_TemporarySetting.mpAttribute.isBaselineLengthValid = true;
854             }
855             else
856             {
857                 m_TemporarySetting.mpAttribute.isBaselineLengthValid = false;
858             }
859         }
860     }
861 
862     /*!
863         @brief      MP個別情報IFDに埋め込む、基線長をデフォルト値に戻します。
864 
865         @return     なし。
866      */
ClearMpBaselineLength()867     void ClearMpBaselineLength() { SetMpBaselineLength(NULL); }
868 
869     /*!
870         @brief      MP個別情報IFDに埋め込む、水平からのずれを登録します。
871 
872                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
873                     @ref StartMpEncoderLR を使う場合には無効です。
874 
875                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像)
876                     でない場合、値は埋め込まれません。
877 
878                     本関数は、エンコード関数を呼ぶ前に呼んでください。
879                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
880                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
881                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpVerticalDivergence を呼ぶか、
882                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
883 
884         @param[in]  pValue              水平からのずれを指定します。<BR>
885                                         NULLを指定するとクリアします。
886 
887         @return     なし。
888      */
SetMpVerticalDivergence(const Srational * pValue)889     void SetMpVerticalDivergence(const Srational* pValue)
890     {
891         if (m_Initialized)
892         {
893             if (pValue)
894             {
895                 m_TemporarySetting.mpAttribute.verticalDivergence = *pValue;
896                 m_TemporarySetting.mpAttribute.isVerticalDivergenceValid = true;
897             }
898             else
899             {
900                 m_TemporarySetting.mpAttribute.isVerticalDivergenceValid = false;
901             }
902         }
903     }
904 
905     /*!
906         @brief      MP個別情報IFDに水平からのずれを埋め込まないよう指示します(デフォルト動作)。
907 
908         @return     なし。
909      */
ClearMpVerticalDivergence()910     void ClearMpVerticalDivergence() { SetMpVerticalDivergence(NULL); }
911 
912     /*!
913         @brief      MP個別情報IFDに埋め込む、水平軸方向の距離(X)を登録します。
914 
915                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
916                     @ref StartMpEncoderLR を使う場合には無効です。
917 
918                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
919                     でない場合、値は埋め込まれません。
920 
921                     本関数は、エンコード関数を呼ぶ前に呼んでください。
922                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
923                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
924                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpAxisDistanceX を呼ぶか、
925                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
926 
927         @param[in]  pValue              水平軸方向の距離(X)を指定します。<BR>
928                                         NULLを指定するとクリアします。
929 
930         @return     なし。
931      */
SetMpAxisDistanceX(const Srational * pValue)932     void SetMpAxisDistanceX(const Srational* pValue)
933     {
934         if (m_Initialized)
935         {
936             if (pValue)
937             {
938                 m_TemporarySetting.mpAttribute.axisDistanceX = *pValue;
939                 m_TemporarySetting.mpAttribute.isAxisDistanceXValid = true;
940             }
941             else
942             {
943                 m_TemporarySetting.mpAttribute.isAxisDistanceXValid = false;
944             }
945         }
946     }
947 
948     /*!
949         @brief      MP個別情報IFDに水平軸方向の距離(X)を埋め込まないよう指示します(デフォルト動作)。
950 
951         @return     なし。
952      */
ClearMpAxisDistanceX()953     void ClearMpAxisDistanceX() { SetMpAxisDistanceX(NULL); }
954 
955     /*!
956         @brief      MP個別情報IFDに埋め込む、鉛直軸方向の距離(Y)を登録します。
957 
958                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
959                     @ref StartMpEncoderLR を使う場合には無効です。
960 
961                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
962                     でない場合、値は埋め込まれません。
963 
964                     本関数は、エンコード関数を呼ぶ前に呼んでください。
965                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
966                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
967                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpAxisDistanceY を呼ぶか、
968                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
969 
970         @param[in]  pValue              鉛直軸方向の距離(Y)を指定します。<BR>
971                                         NULLを指定するとクリアします。
972 
973         @return     なし。
974      */
SetMpAxisDistanceY(const Srational * pValue)975     void SetMpAxisDistanceY(const Srational* pValue)
976     {
977         if (m_Initialized)
978         {
979             if (pValue)
980             {
981                 m_TemporarySetting.mpAttribute.axisDistanceY = *pValue;
982                 m_TemporarySetting.mpAttribute.isAxisDistanceYValid = true;
983             }
984             else
985             {
986                 m_TemporarySetting.mpAttribute.isAxisDistanceYValid = false;
987             }
988         }
989     }
990 
991     /*!
992         @brief      MP個別情報IFDに鉛直軸方向の距離(Y)を埋め込まないよう指示します(デフォルト動作)。
993 
994         @return     なし。
995      */
ClearMpAxisDistanceY()996     void ClearMpAxisDistanceY() { SetMpAxisDistanceY(NULL); }
997 
998     /*!
999         @brief      MP個別情報IFDに埋め込む、視準軸方向の距離(Z)を登録します。
1000 
1001                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
1002                     @ref StartMpEncoderLR を使う場合には無効です。
1003 
1004                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
1005                     でない場合、値は埋め込まれません。
1006 
1007                     本関数は、エンコード関数を呼ぶ前に呼んでください。
1008                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
1009                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
1010                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpAxisDistanceZ を呼ぶか、
1011                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
1012 
1013         @param[in]  pValue              視準軸方向の距離(Z)を指定します。<BR>
1014                                         NULLを指定するとクリアします。
1015 
1016         @return     なし。
1017      */
SetMpAxisDistanceZ(const Srational * pValue)1018     void SetMpAxisDistanceZ(const Srational* pValue)
1019     {
1020         if (m_Initialized)
1021         {
1022             if (pValue)
1023             {
1024                 m_TemporarySetting.mpAttribute.axisDistanceZ = *pValue;
1025                 m_TemporarySetting.mpAttribute.isAxisDistanceZValid = true;
1026             }
1027             else
1028             {
1029                 m_TemporarySetting.mpAttribute.isAxisDistanceZValid = false;
1030             }
1031         }
1032     }
1033 
1034     /*!
1035         @brief      MP個別情報IFDに視準軸方向の距離(Z)を埋め込まないよう指示します(デフォルト動作)。
1036 
1037         @return     なし。
1038      */
ClearMpAxisDistanceZ()1039     void ClearMpAxisDistanceZ() { SetMpAxisDistanceZ(NULL); }
1040 
1041     /*!
1042         @brief      MP個別情報IFDに埋め込む、ヨー角を登録します。
1043 
1044                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
1045                     @ref StartMpEncoderLR を使う場合には無効です。
1046 
1047                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
1048                     でない場合、値は埋め込まれません。
1049 
1050                     本関数は、エンコード関数を呼ぶ前に呼んでください。
1051                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
1052                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
1053                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpYawAngle を呼ぶか、
1054                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
1055 
1056         @param[in]  pValue              ヨー角を指定します。<BR>
1057                                         NULLを指定するとクリアします。
1058 
1059         @return     なし。
1060      */
SetMpYawAngle(const Srational * pValue)1061     void SetMpYawAngle(const Srational* pValue)
1062     {
1063         if (m_Initialized)
1064         {
1065             if (pValue)
1066             {
1067                 m_TemporarySetting.mpAttribute.yawAngle = *pValue;
1068                 m_TemporarySetting.mpAttribute.isYawAngleValid = true;
1069             }
1070             else
1071             {
1072                 m_TemporarySetting.mpAttribute.isYawAngleValid = false;
1073             }
1074         }
1075     }
1076 
1077     /*!
1078         @brief      MP個別情報IFDにヨー角を埋め込まないよう指示します(デフォルト動作)。
1079 
1080         @return     なし。
1081      */
ClearMpYawAngle()1082     void ClearMpYawAngle() { SetMpYawAngle(NULL); }
1083 
1084     /*!
1085         @brief      MP個別情報IFDに埋め込む、ピッチ角を登録します。
1086 
1087                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
1088                     @ref StartMpEncoderLR を使う場合には無効です。
1089 
1090                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
1091                     でない場合、値は埋め込まれません。
1092 
1093                     本関数は、エンコード関数を呼ぶ前に呼んでください。
1094                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
1095                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
1096                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpPitchAngle を呼ぶか、
1097                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
1098 
1099         @param[in]  pValue              ピッチ角を指定します。<BR>
1100                                         NULLを指定するとクリアします。
1101 
1102         @return     なし。
1103      */
SetMpPitchAngle(const Srational * pValue)1104     void SetMpPitchAngle(const Srational* pValue)
1105     {
1106         if (m_Initialized)
1107         {
1108             if (pValue)
1109             {
1110                 m_TemporarySetting.mpAttribute.pitchAngle = *pValue;
1111                 m_TemporarySetting.mpAttribute.isPitchAngleValid = true;
1112             }
1113             else
1114             {
1115                 m_TemporarySetting.mpAttribute.isPitchAngleValid = false;
1116             }
1117         }
1118     }
1119 
1120     /*!
1121         @brief      MP個別情報IFDにピッチ角を埋め込まないよう指示します(デフォルト動作)。
1122 
1123         @return     なし。
1124      */
ClearMpPitchAngle()1125     void ClearMpPitchAngle() { SetMpPitchAngle(NULL); }
1126 
1127     /*!
1128         @brief      MP個別情報IFDに埋め込む、ロール角を登録します。
1129 
1130                     本関数はエンコード関数として @ref StartMpEncoderFirst および @ref StartMpEncoderNext を使う場合に有効です。
1131                     @ref StartMpEncoderLR を使う場合には無効です。
1132 
1133                     本関数を呼ばない場合、あるいは画像のMP種別 (@ref MpTypeCode) が @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
1134                     でない場合、値は埋め込まれません。
1135 
1136                     本関数は、エンコード関数を呼ぶ前に呼んでください。
1137                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
1138                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
1139                     他にも、引数 pValue にNULLを指定するか、@ref ClearMpRollAngle を呼ぶか、
1140                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
1141 
1142         @param[in]  pValue              ロール角を指定します。<BR>
1143                                         NULLを指定するとクリアします。
1144 
1145         @return     なし。
1146      */
SetMpRollAngle(const Srational * pValue)1147     void SetMpRollAngle(const Srational* pValue)
1148     {
1149         if (m_Initialized)
1150         {
1151             if (pValue)
1152             {
1153                 m_TemporarySetting.mpAttribute.rollAngle = *pValue;
1154                 m_TemporarySetting.mpAttribute.isRollAngleValid = true;
1155             }
1156             else
1157             {
1158                 m_TemporarySetting.mpAttribute.isRollAngleValid = false;
1159             }
1160         }
1161     }
1162 
1163     /*!
1164         @brief      MP個別情報IFDにロール角を埋め込まないよう指示します(デフォルト動作)。
1165 
1166         @return     なし。
1167      */
ClearMpRollAngle()1168     void ClearMpRollAngle() { SetMpRollAngle(NULL); }
1169 
1170     /*!
1171         @}
1172 
1173         @name       GPS IFD 情報登録
1174 
1175         @{
1176      */
1177 
1178     /*!
1179         @brief      GPS IFD 登録用構造体を初期化します。
1180 
1181                     画像にGPS情報を登録してエンコードする手順は以下の通りです。
1182 
1183                     &lt;OL&gt;
1184                         &lt;LI&gt; アプリケーションでGPS IFD 登録用構造体を確保して、本関数でその構造体を初期化してください。
1185                         &lt;LI&gt; @ref SetGpsLatitude 、@ref SetGpsLongitude 等の関数を呼んで、その構造体へGPS情報を登録してください。<BR>
1186                                    登録関数によっては、@ref SetGpsSatellites のように、登録したいデータへのポインタのみ保持するものがあります。この場合、登録したいデータはエンコードが終了するまで保持しておく必要があります。
1187                         &lt;LI&gt; 構造体へのデータ登録がすべて終わったら、@ref SetGpsData を呼んで登録内容を確定してください。<BR>
1188                                    エンコーダオブジェクトは、この構造体へのポインタのみ保持しています。従って、構造体はエンコードが終了するまで保持しておく必要があります。
1189                         &lt;LI&gt; エンコード関数を呼んで画像をエンコードしてください。
1190                         &lt;LI&gt; エンコード関数が成功、失敗問わず終了したら、構造体および登録したいデータを解放できます。<BR>
1191                                    構造体を再利用する場合、本関数で再初期化してください。
1192                     &lt;/LI&gt;&lt;/OL&gt;
1193 
1194                     初期化後の構造体は、GPSタグのバージョン(本ライブラリのデフォルト値=2.2)のみ登録済みです。<BR>
1195                     後から @ref SetGpsVersionId を呼ぶとバージョンを変更でき、@ref ClearGpsVersionId を呼ぶと登録しないよう指示できます。
1196 
1197         @param[out] pGps                GPS IFD (登録用構造体)を指定します。<BR>
1198                                         格納されるデータ形式は、ライブラリで処理しやすい形式であり、エンコード結果のバイナリ列とは異なります。
1199 
1200         @return     なし。
1201      */
InitializeGpsData(GpsData * pGps)1202     static void InitializeGpsData(GpsData* pGps)
1203     {
1204         memset(pGps, 0, sizeof(*pGps));
1205         // GPSタグのバージョン 2.2。
1206         pGps->versionId[0] = 2;
1207         pGps->versionId[1] = 2;
1208         pGps->isVersionIdValid = true;
1209     }
1210 
1211     /*!
1212         @brief      GPS IFDに、GPSタグのバージョンを登録します。
1213 
1214                     なお、@ref InitializeGpsData を呼ぶと、GPSタグのバージョンには本ライブラリのデフォルト値が登録されます。
1215 
1216                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1217                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1218 
1219         @param[out] pGps                GPS IFDを指定します。
1220 
1221         @param[in]  pVersionId          GPSタグのバージョンを指定します。<BR>
1222                                         データのバイト数は @ref GPS_VERSION_ID_SIZE (4) です。<BR>
1223                                         NULLを指定すると登録しません。
1224 
1225         @return     なし。
1226      */
SetGpsVersionId(GpsData * pGps,const u8 * pVersionId)1227     static void SetGpsVersionId(GpsData* pGps, const u8* pVersionId)
1228     {
1229         NN_ASSERT(pGps);
1230 
1231         if (pVersionId)
1232         {
1233             memcpy(pGps->versionId, pVersionId, sizeof(pGps->versionId));
1234             pGps->isVersionIdValid = true;
1235         }
1236         else
1237         {
1238             pGps->isVersionIdValid = false;
1239         }
1240     }
1241 
1242     /*!
1243         @brief      GPS IFDに、GPSタグのバージョンを登録しないよう指示します。
1244 
1245                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1246                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1247 
1248         @param[out] pGps                GPS IFDを指定します。
1249 
1250         @return     なし。
1251      */
ClearGpsVersionId(GpsData * pGps)1252     static void ClearGpsVersionId(GpsData* pGps) { SetGpsVersionId(pGps, NULL); }
1253 
1254     /*!
1255         @brief      GPS IFDに、緯度を登録します。
1256 
1257                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1258                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1259 
1260         @param[out] pGps                GPS IFDを指定します。
1261 
1262         @param[in]  ref                 北緯('N') or 南緯('S')を指定します。<BR>
1263                                         0x00 を指定すると、この情報を登録しません。
1264 
1265         @param[in]  pValue              緯度(数値)へのポインタを指定します。<BR>
1266                                         NULLを指定すると、この情報を登録しません。
1267 
1268         @return     なし。
1269      */
SetGpsLatitude(GpsData * pGps,char ref,const Rational * pValue)1270     static void SetGpsLatitude(GpsData* pGps, char ref, const Rational* pValue)
1271     {
1272         NN_ASSERT(pGps);
1273 
1274         pGps->latitudeRef[0] = ref;
1275         pGps->latitudeRef[1] = '\0';
1276 
1277         if (pValue)
1278         {
1279             memcpy(pGps->latitude, pValue, sizeof(pGps->latitude));
1280             pGps->isLatitudeValid = true;
1281         }
1282         else
1283         {
1284             pGps->isLatitudeValid = false;
1285         }
1286     }
1287 
1288     /*!
1289         @brief      GPS IFDに、緯度を登録しないよう指示します(デフォルト動作)。
1290 
1291                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1292                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1293 
1294         @param[out] pGps                GPS IFDを指定します。
1295 
1296         @return     なし。
1297      */
ClearGpsLatitude(GpsData * pGps)1298     static void ClearGpsLatitude(GpsData* pGps) { SetGpsLatitude(pGps, '\0', NULL); }
1299 
1300     /*!
1301         @brief      GPS IFDに、経度を登録します。
1302 
1303                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1304                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1305 
1306         @param[out] pGps                GPS IFDを指定します。
1307 
1308         @param[in]  ref                 東経('E') or 西経('W')を指定します。<BR>
1309                                         0x00 を指定すると、この情報を登録しません。
1310 
1311         @param[in]  pValue              経度(数値)へのポインタを指定します。<BR>
1312                                         NULLを指定すると、この情報を登録しません。
1313 
1314         @return     なし。
1315      */
SetGpsLongitude(GpsData * pGps,char ref,const Rational * pValue)1316     static void SetGpsLongitude(GpsData* pGps, char ref, const Rational* pValue)
1317     {
1318         NN_ASSERT(pGps);
1319 
1320         pGps->longitudeRef[0] = ref;
1321         pGps->longitudeRef[1] = '\0';
1322 
1323         if (pValue)
1324         {
1325             memcpy(pGps->longitude, pValue, sizeof(pGps->longitude));
1326             pGps->isLongitudeValid = true;
1327         }
1328         else
1329         {
1330             pGps->isLongitudeValid = false;
1331         }
1332     }
1333 
1334     /*!
1335         @brief      GPS IFDに、経度を登録しないよう指示します(デフォルト動作)。
1336 
1337                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1338                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1339 
1340         @param[out] pGps                GPS IFDを指定します。
1341 
1342         @return     なし。
1343      */
ClearGpsLongitude(GpsData * pGps)1344     static void ClearGpsLongitude(GpsData* pGps) { SetGpsLongitude(pGps, '\0', NULL); }
1345 
1346     /*!
1347         @brief      GPS IFDに、高度を登録します。
1348 
1349                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1350                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1351 
1352                     引数 pValue にNULLを指定すると、高度の基準も高度(数値)も登録しません。
1353 
1354         @param[out] pGps                GPS IFDを指定します。
1355 
1356         @param[in]  ref                 高度の基準を指定します。<BR>
1357                                         登録しない場合は無視されます。
1358 
1359         @param[in]  pValue              高度(数値)へのポインタを指定します。<BR>
1360                                         NULLを指定すると登録しません。
1361 
1362         @return     なし。
1363      */
SetGpsAltitude(GpsData * pGps,u8 ref,const Rational * pValue)1364     static void SetGpsAltitude(GpsData* pGps, u8 ref, const Rational* pValue)
1365     {
1366         NN_ASSERT(pGps);
1367 
1368         if (pValue)
1369         {
1370             pGps->altitudeRef = ref;
1371             memcpy(&pGps->altitude, pValue, sizeof(pGps->altitude));
1372             pGps->isAltitudeRefValid = pGps->isAltitudeValid = true;
1373         }
1374         else
1375         {
1376             pGps->isAltitudeRefValid = pGps->isAltitudeValid = false;
1377         }
1378     }
1379 
1380     /*!
1381         @brief      GPS IFDに、高度を登録しないよう指示します(デフォルト動作)。
1382 
1383                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1384                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1385 
1386         @param[out] pGps                GPS IFDを指定します。
1387 
1388         @return     なし。
1389      */
ClearGpsAltitude(GpsData * pGps)1390     static void ClearGpsAltitude(GpsData* pGps) { SetGpsAltitude(pGps, 0, NULL); }
1391 
1392     /*!
1393         @brief      GPS IFDに、GPS時間(原子時計の時間)を登録します。
1394 
1395                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1396                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1397 
1398         @param[out] pGps                GPS IFDを指定します。
1399 
1400         @param[in]  pValue              GPS時間(原子時計の時間)へのポインタを指定します。<BR>
1401                                         NULLを指定すると登録しません。
1402 
1403         @return     なし。
1404      */
SetGpsTimeStamp(GpsData * pGps,const Rational * pValue)1405     static void SetGpsTimeStamp(GpsData* pGps, const Rational* pValue)
1406     {
1407         NN_ASSERT(pGps);
1408 
1409         if (pValue)
1410         {
1411             memcpy(pGps->timeStamp, pValue, sizeof(pGps->timeStamp));
1412             pGps->isTimeStampValid = true;
1413         }
1414         else
1415         {
1416             pGps->isTimeStampValid = false;
1417         }
1418     }
1419 
1420     /*!
1421         @brief      GPS IFDに、GPS時間(原子時計の時間)を登録しないよう指示します(デフォルト動作)。
1422 
1423                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1424                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1425 
1426         @param[out] pGps                GPS IFDを指定します。
1427 
1428         @return     なし。
1429      */
ClearGpsTimeStamp(GpsData * pGps)1430     static void ClearGpsTimeStamp(GpsData* pGps) { SetGpsTimeStamp(pGps, NULL); }
1431 
1432     /*!
1433         @brief      GPS IFDに、測位に使った衛星信号を登録します。
1434 
1435                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1436                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1437 
1438         @param[out] pGps                GPS IFDを指定します。
1439 
1440         @param[in]  pSatellites         測位に使った衛星信号へのポインタを指定します。<BR>
1441                                         指定した文字列データは、エンコード関数が終了するまで保持しておく必要があります。<BR>
1442                                         NULLを指定すると登録しません。
1443 
1444         @return     なし。
1445      */
SetGpsSatellites(GpsData * pGps,const char * pSatellites)1446     static void SetGpsSatellites(GpsData* pGps, const char* pSatellites)
1447     {
1448         NN_ASSERT(pGps);
1449 
1450         pGps->pSatellites = pSatellites;
1451     }
1452 
1453     /*!
1454         @brief      GPS IFDに、測位に使った衛星信号を登録しないよう指示します(デフォルト動作)。
1455 
1456                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1457                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1458 
1459         @param[out] pGps                GPS IFDを指定します。
1460 
1461         @return     なし。
1462      */
ClearGpsSatellites(GpsData * pGps)1463     static void ClearGpsSatellites(GpsData* pGps) { SetGpsSatellites(pGps, NULL); }
1464 
1465     /*!
1466         @brief      GPS IFDに、GPS受信機の状態を登録します。
1467 
1468                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1469                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1470 
1471         @param[out] pGps                GPS IFDを指定します。
1472 
1473         @param[in]  status              GPS受信機の状態を指定します。<BR>
1474                                         0x00 を指定すると登録しません。
1475 
1476         @return     なし。
1477      */
SetGpsStatus(GpsData * pGps,char status)1478     static void SetGpsStatus(GpsData* pGps, char status)
1479     {
1480         NN_ASSERT(pGps);
1481 
1482         pGps->status[0] = status;
1483         pGps->status[1] = '\0';
1484     }
1485 
1486     /*!
1487         @brief      GPS IFDに、GPS受信機の状態を登録しないよう指示します(デフォルト動作)。
1488 
1489                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1490                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1491 
1492         @param[out] pGps                GPS IFDを指定します。
1493 
1494         @return     なし。
1495      */
ClearGpsStatus(GpsData * pGps)1496     static void ClearGpsStatus(GpsData* pGps) { SetGpsStatus(pGps, '\0'); }
1497 
1498     /*!
1499         @brief      GPS IFDに、GPSの測位方法を登録します。
1500 
1501                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1502                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1503 
1504         @param[out] pGps                GPS IFDを指定します。
1505 
1506         @param[in]  measureMode         GPSの測位方法を指定します。<BR>
1507                                         0x00 を指定すると登録しません。
1508 
1509         @return     なし。
1510      */
SetGpsMeasureMode(GpsData * pGps,char measureMode)1511     static void SetGpsMeasureMode(GpsData* pGps, char measureMode)
1512     {
1513         NN_ASSERT(pGps);
1514 
1515         pGps->measureMode[0] = measureMode;
1516         pGps->measureMode[1] = '\0';
1517     }
1518 
1519     /*!
1520         @brief      GPS IFDに、GPSの測位方法を登録しないよう指示します(デフォルト動作)。
1521 
1522                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1523                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1524 
1525         @param[out] pGps                GPS IFDを指定します。
1526 
1527         @return     なし。
1528      */
ClearGpsMeasureMode(GpsData * pGps)1529     static void ClearGpsMeasureMode(GpsData* pGps) { SetGpsMeasureMode(pGps, '\0'); }
1530 
1531     /*!
1532         @brief      GPS IFDに、測位の信頼性を登録します。
1533 
1534                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1535                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1536 
1537         @param[out] pGps                GPS IFDを指定します。
1538 
1539         @param[in]  pValue              測位の信頼性へのポインタを指定します。<BR>
1540                                         NULLを指定すると登録しません。
1541 
1542         @return     なし。
1543      */
SetGpsDop(GpsData * pGps,const Rational * pValue)1544     static void SetGpsDop(GpsData* pGps, const Rational* pValue)
1545     {
1546         NN_ASSERT(pGps);
1547 
1548         if (pValue)
1549         {
1550             memcpy(&pGps->dop, pValue, sizeof(pGps->dop));
1551             pGps->isDopValid = true;
1552         }
1553         else
1554         {
1555             pGps->isDopValid = false;
1556         }
1557     }
1558 
1559     /*!
1560         @brief      GPS IFDに、測位の信頼性を登録しないよう指示します(デフォルト動作)。
1561 
1562                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1563                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1564 
1565         @param[out] pGps                GPS IFDを指定します。
1566 
1567         @return     なし。
1568      */
ClearGpsDop(GpsData * pGps)1569     static void ClearGpsDop(GpsData* pGps) { SetGpsDop(pGps, NULL); }
1570 
1571     /*!
1572         @brief      GPS IFDに、速度を登録します。
1573 
1574                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1575                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1576 
1577         @param[out] pGps                GPS IFDを指定します。
1578 
1579         @param[in]  ref                 速度の単位を指定します。<BR>
1580                                         0x00 を指定すると、この情報を登録しません。
1581 
1582         @param[in]  pValue              速度(数値)へのポインタを指定します。<BR>
1583                                         NULLを指定すると、この情報を登録しません。
1584 
1585         @return     なし。
1586      */
SetGpsSpeed(GpsData * pGps,char ref,const Rational * pValue)1587     static void SetGpsSpeed(GpsData* pGps, char ref, const Rational* pValue)
1588     {
1589         NN_ASSERT(pGps);
1590 
1591         pGps->speedRef[0] = ref;
1592         pGps->speedRef[1] = '\0';
1593 
1594         if (pValue)
1595         {
1596             memcpy(&pGps->speed, pValue, sizeof(pGps->speed));
1597             pGps->isSpeedValid = true;
1598         }
1599         else
1600         {
1601             pGps->isSpeedValid = false;
1602         }
1603     }
1604 
1605     /*!
1606         @brief      GPS IFDに、速度を登録しないよう指示します(デフォルト動作)。
1607 
1608                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1609                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1610 
1611         @param[out] pGps                GPS IFDを指定します。
1612 
1613         @return     なし。
1614      */
ClearGpsSpeed(GpsData * pGps)1615     static void ClearGpsSpeed(GpsData* pGps) { SetGpsSpeed(pGps, '\0', NULL); }
1616 
1617     /*!
1618         @brief      GPS IFDに、進行方向を登録します。
1619 
1620                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1621                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1622 
1623         @param[out] pGps                GPS IFDを指定します。
1624 
1625         @param[in]  ref                 進行方向の単位を指定します。<BR>
1626                                         0x00 を指定すると、この情報を登録しません。
1627 
1628         @param[in]  pValue              進行方向(数値)へのポインタを指定します。<BR>
1629                                         NULLを指定すると、この情報を登録しません。
1630 
1631         @return     なし。
1632      */
SetGpsTrack(GpsData * pGps,char ref,const Rational * pValue)1633     static void SetGpsTrack(GpsData* pGps, char ref, const Rational* pValue)
1634     {
1635         NN_ASSERT(pGps);
1636 
1637         pGps->trackRef[0] = ref;
1638         pGps->trackRef[1] = '\0';
1639 
1640         if (pValue)
1641         {
1642             memcpy(&pGps->track, pValue, sizeof(pGps->track));
1643             pGps->isTrackValid = true;
1644         }
1645         else
1646         {
1647             pGps->isTrackValid = false;
1648         }
1649     }
1650 
1651     /*!
1652         @brief      GPS IFDに、進行方向を登録しないよう指示します(デフォルト動作)。
1653 
1654                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1655                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1656 
1657         @param[out] pGps                GPS IFDを指定します。
1658 
1659         @return     なし。
1660      */
ClearGpsTrack(GpsData * pGps)1661     static void ClearGpsTrack(GpsData* pGps) { SetGpsTrack(pGps, '\0', NULL); }
1662 
1663     /*!
1664         @brief      GPS IFDに、撮影した画像の方向を登録します。
1665 
1666                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1667                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1668 
1669         @param[out] pGps                GPS IFDを指定します。
1670 
1671         @param[in]  ref                 撮影した画像の方向の単位を指定します。<BR>
1672                                         0x00 を指定すると、この情報を登録しません。
1673 
1674         @param[in]  pValue              撮影した画像の方向(数値)へのポインタを指定します。<BR>
1675                                         NULLを指定すると、この情報を登録しません。
1676 
1677         @return     なし。
1678      */
SetGpsImgDirection(GpsData * pGps,char ref,const Rational * pValue)1679     static void SetGpsImgDirection(GpsData* pGps, char ref, const Rational* pValue)
1680     {
1681         NN_ASSERT(pGps);
1682 
1683         pGps->imgDirectionRef[0] = ref;
1684         pGps->imgDirectionRef[1] = '\0';
1685 
1686         if (pValue)
1687         {
1688             memcpy(&pGps->imgDirection, pValue, sizeof(pGps->imgDirection));
1689             pGps->isImgDirectionValid = true;
1690         }
1691         else
1692         {
1693             pGps->isImgDirectionValid = false;
1694         }
1695     }
1696 
1697     /*!
1698         @brief      GPS IFDに、撮影した画像の方向を登録しないよう指示します(デフォルト動作)。
1699 
1700                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1701                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1702 
1703         @param[out] pGps                GPS IFDを指定します。
1704 
1705         @return     なし。
1706      */
ClearGpsImgDirection(GpsData * pGps)1707     static void ClearGpsImgDirection(GpsData* pGps) { SetGpsImgDirection(pGps, '\0', NULL); }
1708 
1709     /*!
1710         @brief      GPS IFDに、測位に用いた地図データを登録します。
1711 
1712                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1713                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1714 
1715         @param[out] pGps                GPS IFDを指定します。
1716 
1717         @param[in]  pMapDatum           測位に用いた地図データへのポインタを指定します。<BR>
1718                                         指定した文字列データは、エンコード関数が終了するまで保持しておく必要があります。<BR>
1719                                         NULLを指定すると登録しません。
1720 
1721         @return     なし。
1722      */
SetGpsMapDatum(GpsData * pGps,const char * pMapDatum)1723     static void SetGpsMapDatum(GpsData* pGps, const char* pMapDatum)
1724     {
1725         NN_ASSERT(pGps);
1726 
1727         pGps->pMapDatum = pMapDatum;
1728     }
1729 
1730     /*!
1731         @brief      GPS IFDに、測位に用いた地図データを登録しないよう指示します(デフォルト動作)。
1732 
1733                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1734                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1735 
1736         @param[out] pGps                GPS IFDを指定します。
1737 
1738         @return     なし。
1739      */
ClearGpsMapDatum(GpsData * pGps)1740     static void ClearGpsMapDatum(GpsData* pGps) { SetGpsMapDatum(pGps, NULL); }
1741 
1742     /*!
1743         @brief      GPS IFDに、目的地の緯度を登録します。
1744 
1745                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1746                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1747 
1748         @param[out] pGps                GPS IFDを指定します。
1749 
1750         @param[in]  ref                 目的地の北緯('N') or 南緯('S')を指定します。<BR>
1751                                         0x00 を指定すると、この情報を登録しません。
1752 
1753         @param[in]  pValue              目的地の緯度(数値)へのポインタを指定します。<BR>
1754                                         NULLを指定すると、この情報を登録しません。
1755 
1756         @return     なし。
1757      */
SetGpsDestLatitude(GpsData * pGps,char ref,const Rational * pValue)1758     static void SetGpsDestLatitude(GpsData* pGps, char ref, const Rational* pValue)
1759     {
1760         NN_ASSERT(pGps);
1761 
1762         pGps->destLatitudeRef[0] = ref;
1763         pGps->destLatitudeRef[1] = '\0';
1764 
1765         if (pValue)
1766         {
1767             memcpy(pGps->destLatitude, pValue, sizeof(pGps->destLatitude));
1768             pGps->isDestLatitudeValid = true;
1769         }
1770         else
1771         {
1772             pGps->isDestLatitudeValid = false;
1773         }
1774     }
1775 
1776     /*!
1777         @brief      GPS IFDに、目的地の緯度を登録しないよう指示します(デフォルト動作)。
1778 
1779                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1780                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1781 
1782         @param[out] pGps                GPS IFDを指定します。
1783 
1784         @return     なし。
1785      */
ClearGpsDestLatitude(GpsData * pGps)1786     static void ClearGpsDestLatitude(GpsData* pGps) { SetGpsDestLatitude(pGps, '\0', NULL); }
1787 
1788     /*!
1789         @brief      GPS IFDに、目的地の経度を登録します。
1790 
1791                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1792                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1793 
1794         @param[out] pGps                GPS IFDを指定します。
1795 
1796         @param[in]  ref                 目的地の東経('E') or 西経('W')を指定します。<BR>
1797                                         0x00 を指定すると、この情報を登録しません。
1798 
1799         @param[in]  pValue              目的地の経度(数値)へのポインタを指定します。<BR>
1800                                         NULLを指定すると、この情報を登録しません。
1801 
1802         @return     なし。
1803      */
SetGpsDestLongitude(GpsData * pGps,char ref,const Rational * pValue)1804     static void SetGpsDestLongitude(GpsData* pGps, char ref, const Rational* pValue)
1805     {
1806         NN_ASSERT(pGps);
1807 
1808         pGps->destLongitudeRef[0] = ref;
1809         pGps->destLongitudeRef[1] = '\0';
1810 
1811         if (pValue)
1812         {
1813             memcpy(pGps->destLongitude, pValue, sizeof(pGps->destLongitude));
1814             pGps->isDestLongitudeValid = true;
1815         }
1816         else
1817         {
1818             pGps->isDestLongitudeValid = false;
1819         }
1820     }
1821 
1822     /*!
1823         @brief      GPS IFDに、目的地の経度を登録しないよう指示します(デフォルト動作)。
1824 
1825                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1826                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1827 
1828         @param[out] pGps                GPS IFDを指定します。
1829 
1830         @return     なし。
1831      */
ClearGpsDestLongitude(GpsData * pGps)1832     static void ClearGpsDestLongitude(GpsData* pGps) { SetGpsDestLongitude(pGps, '\0', NULL); }
1833 
1834     /*!
1835         @brief      GPS IFDに、目的地の方角を登録します。
1836 
1837                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1838                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1839 
1840         @param[out] pGps                GPS IFDを指定します。
1841 
1842         @param[in]  ref                 目的地の方角の単位を指定します。<BR>
1843                                         0x00 を指定すると、この情報を登録しません。
1844 
1845         @param[in]  pValue              目的地の方角(数値)へのポインタを指定します。<BR>
1846                                         NULLを指定すると、この情報を登録しません。
1847 
1848         @return     なし。
1849      */
SetGpsDestBearing(GpsData * pGps,char ref,const Rational * pValue)1850     static void SetGpsDestBearing(GpsData* pGps, char ref, const Rational* pValue)
1851     {
1852         NN_ASSERT(pGps);
1853 
1854         pGps->destBearingRef[0] = ref;
1855         pGps->destBearingRef[1] = '\0';
1856 
1857         if (pValue)
1858         {
1859             memcpy(&pGps->destBearing, pValue, sizeof(pGps->destBearing));
1860             pGps->isDestBearingValid = true;
1861         }
1862         else
1863         {
1864             pGps->isDestBearingValid = false;
1865         }
1866     }
1867 
1868     /*!
1869         @brief      GPS IFDに、目的地の方角の単位を登録しないよう指示します(デフォルト動作)。
1870 
1871                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1872                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1873 
1874         @param[out] pGps                GPS IFDを指定します。
1875 
1876         @return     なし。
1877      */
ClearGpsDestBearing(GpsData * pGps)1878     static void ClearGpsDestBearing(GpsData* pGps) { SetGpsDestBearing(pGps, '\0', NULL); }
1879 
1880     /*!
1881         @brief      GPS IFDに、目的地までの距離を登録します。
1882 
1883                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1884                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1885 
1886         @param[out] pGps                GPS IFDを指定します。
1887 
1888         @param[in]  ref                 目的地までの距離の単位を指定します。<BR>
1889                                         0x00 を指定すると、この情報を登録しません。
1890 
1891         @param[in]  pValue              目的地までの距離(数値)へのポインタを指定します。<BR>
1892                                         NULLを指定すると、この情報を登録しません。
1893 
1894         @return     なし。
1895      */
SetGpsDestDistance(GpsData * pGps,char ref,const Rational * pValue)1896     static void SetGpsDestDistance(GpsData* pGps, char ref, const Rational* pValue)
1897     {
1898         NN_ASSERT(pGps);
1899 
1900         pGps->destDistanceRef[0] = ref;
1901         pGps->destDistanceRef[1] = '\0';
1902 
1903         if (pValue)
1904         {
1905             memcpy(&pGps->destDistance, pValue, sizeof(pGps->destDistance));
1906             pGps->isDestDistanceValid = true;
1907         }
1908         else
1909         {
1910             pGps->isDestDistanceValid = false;
1911         }
1912     }
1913 
1914     /*!
1915         @brief      GPS IFDに、目的地までの距離を登録しないよう指示します(デフォルト動作)。
1916 
1917                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1918                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1919 
1920         @param[out] pGps                GPS IFDを指定します。
1921 
1922         @return     なし。
1923      */
ClearGpsDestDistance(GpsData * pGps)1924     static void ClearGpsDestDistance(GpsData* pGps) { SetGpsDestDistance(pGps, '\0', NULL); }
1925 
1926     /*!
1927         @brief      GPS IFDに、測位方式の名称を登録します。
1928 
1929                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1930                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1931 
1932         @param[out] pGps                GPS IFDを指定します。
1933 
1934         @param[in]  pProcessingMethod       測位方式の名称へのポインタを指定します。<BR>
1935                                             NULLを指定すると登録しません。
1936 
1937         @param[in]  processingMethodSize    pProcessingMethodのデータバイト数を指定します。<BR>
1938                                             0を指定すると登録しません。
1939 
1940         @return     なし。
1941      */
SetGpsProcessingMethod(GpsData * pGps,const u8 * pProcessingMethod,size_t processingMethodSize)1942     static void SetGpsProcessingMethod(GpsData* pGps, const u8* pProcessingMethod, size_t processingMethodSize)
1943     {
1944         NN_ASSERT(pGps);
1945 
1946         if (pProcessingMethod && processingMethodSize)
1947         {
1948             pGps->pProcessingMethod    = pProcessingMethod;
1949             pGps->processingMethodSize = processingMethodSize;
1950         }
1951         else
1952         {
1953             pGps->pProcessingMethod    = NULL;
1954             pGps->processingMethodSize = 0;
1955         }
1956     }
1957 
1958     /*!
1959         @brief      GPS IFDに、測位方式の名称を登録しないよう指示します(デフォルト動作)。
1960 
1961                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1962                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1963 
1964         @param[out] pGps                GPS IFDを指定します。
1965 
1966         @return     なし。
1967      */
ClearGpsProcessingMethod(GpsData * pGps)1968     static void ClearGpsProcessingMethod(GpsData* pGps) { SetGpsProcessingMethod(pGps, NULL, 0); }
1969 
1970     /*!
1971         @brief      GPS IFDに、測位地点の名称を登録します。
1972 
1973                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
1974                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
1975 
1976         @param[out] pGps                GPS IFDを指定します。
1977 
1978         @param[in]  pAreaInformation        測位地点の名称へのポインタを指定します。<BR>
1979                                             NULLを指定すると登録しません。
1980 
1981         @param[in]  areaInformationSize     pAreaInformationのデータバイト数を指定します。<BR>
1982                                             0を指定すると登録しません。
1983 
1984         @return     なし。
1985      */
SetGpsAreaInformation(GpsData * pGps,const u8 * pAreaInformation,size_t areaInformationSize)1986     static void SetGpsAreaInformation(GpsData* pGps, const u8* pAreaInformation, size_t areaInformationSize)
1987     {
1988         NN_ASSERT(pGps);
1989 
1990         if (pAreaInformation && areaInformationSize)
1991         {
1992             pGps->pAreaInformation    = pAreaInformation;
1993             pGps->areaInformationSize = areaInformationSize;
1994         }
1995         else
1996         {
1997             pGps->pAreaInformation    = NULL;
1998             pGps->areaInformationSize = 0;
1999         }
2000     }
2001 
2002     /*!
2003         @brief      GPS IFDに、測位地点の名称を登録しないよう指示します(デフォルト動作)。
2004 
2005                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
2006                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
2007 
2008         @param[out] pGps                GPS IFDを指定します。
2009 
2010         @return     なし。
2011      */
ClearGpsAreaInformation(GpsData * pGps)2012     static void ClearGpsAreaInformation(GpsData* pGps) { SetGpsAreaInformation(pGps, NULL, 0); }
2013 
2014     /*!
2015         @brief      GPS IFDに、GPS日付を登録します。
2016 
2017                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
2018                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
2019 
2020         @param[out] pGps                GPS IFDを指定します。
2021 
2022         @param[in]  pDateStamp          GPS日付へのポインタを指定します。<BR>
2023                                         指定した文字列データは、エンコード関数が終了するまで保持しておく必要があります。<BR>
2024                                         NULLを指定すると登録しません。
2025 
2026         @return     なし。
2027      */
SetGpsDateStamp(GpsData * pGps,const char * pDateStamp)2028     static void SetGpsDateStamp(GpsData* pGps, const char* pDateStamp)
2029     {
2030         NN_ASSERT(pGps);
2031 
2032         pGps->pDateStamp = pDateStamp;
2033     }
2034 
2035     /*!
2036         @brief      GPS IFDに、GPS日付を登録しないよう指示します(デフォルト動作)。
2037 
2038                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
2039                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
2040 
2041         @param[out] pGps                GPS IFDを指定します。
2042 
2043         @return     なし。
2044      */
ClearGpsDateStamp(GpsData * pGps)2045     static void ClearGpsDateStamp(GpsData* pGps) { SetGpsDateStamp(pGps, NULL); }
2046 
2047     /*!
2048         @brief      GPS IFDに、GPS補正測位を登録します。
2049 
2050                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
2051                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
2052 
2053         @param[out] pGps                GPS IFDを指定します。
2054 
2055         @param[in]  differential        GPS補正測位を指定します。
2056 
2057         @return     なし。
2058      */
SetGpsDifferential(GpsData * pGps,u16 differential)2059     static void SetGpsDifferential(GpsData* pGps, u16 differential)
2060     {
2061         NN_ASSERT(pGps);
2062 
2063         pGps->differential = differential;
2064         pGps->isDifferentialValid = true;
2065     }
2066 
2067     /*!
2068         @brief      GPS IFDに、GPS補正測位を登録しないよう指示します(デフォルト動作)。
2069 
2070                     引数 pGpsで指定した構造体の操作(情報登録/解除)が初めての場合、本関数を呼ぶ前に @ref InitializeGpsData で初期化してください。<BR>
2071                     今回で構造体の操作が最後の場合、本関数を呼んだ後に @ref SetGpsData を呼んで登録内容を確定してください。
2072 
2073         @param[out] pGps                GPS IFDを指定します。
2074 
2075         @return     なし。
2076      */
ClearGpsDifferential(GpsData * pGps)2077     static void ClearGpsDifferential(GpsData* pGps)
2078     {
2079         NN_ASSERT(pGps);
2080 
2081         pGps->isDifferentialValid = false;
2082     }
2083 
2084 
2085     /*!
2086         @brief      JPEGにGPS IFDを埋め込みます。
2087 
2088                     指定したGPS IFD 登録用構造体を、ポインタのままエンコーダオブジェクトへ登録します。<BR>
2089                     この構造体はエンコード関数 (@ref StartJpegEncoder 、@ref StartMpEncoderLR 、@ref StartMpEncoderFirst 、@ref StartMpEncoderNext) の処理中に参照されるため、エンコード関数が成功、失敗問わず終了するまで、保持しておく必要があります。
2090 
2091                     @ref StartMpEncoderLR でエンコードする場合、指定は2枚の画像に対して有効です。
2092 
2093                     この構造体の操作については、@ref InitializeGpsData を参照してください。
2094 
2095                     本関数は、エンコード関数を呼ぶ前に呼んでください。
2096                     エンコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。
2097                     複数回エンコードする場合は、それぞれのエンコード前に本関数を呼ぶ必要があります。
2098                     他にも、引数 pGps にNULLを指定するか、@ref ClearGpsData を呼ぶか、
2099                     @ref Initialize でエンコーダオブジェクトを再初期化すると指定はクリアされます。
2100 
2101         @param[in]  pGps                GPS IFDを指定します。<BR>
2102                                         NULLを指定するとGPS IFDを埋め込みません。
2103 
2104         @return     なし。
2105      */
SetGpsData(const GpsData * pGps)2106     void SetGpsData(const GpsData* pGps)
2107     {
2108         if (m_Initialized)
2109         {
2110             m_TemporarySetting.pGpsData = pGps;
2111         }
2112     }
2113 
2114     /*!
2115         @brief      JPEGにGPS IFDを埋め込まないよう指示します(デフォルト動作)。
2116 
2117         @return     なし。
2118      */
ClearGpsData()2119     void ClearGpsData() { SetGpsData(NULL); }
2120 
2121     /*!
2122         @}
2123 
2124         @name       エンコード
2125 
2126         @{
2127      */
2128 
2129     /*!
2130      :private
2131      本関数を呼ばないでください。
2132      関数リファレンス作成の都合により、ここにstaticのダミー関数を定義しています。
2133      */
DoNotCallMe4()2134     static void DoNotCallMe4() {}
2135 
2136     /*!
2137         @brief      JPEGエンコードを実行します。
2138 
2139                     本関数でエンコードできる画像の縦横サイズは画像の出力形式(引数 dstPixelSampling)によって変わります。
2140 
2141                     &lt;UL&gt;
2142                         &lt;LI&gt; @ref PIXEL_SAMPLING_YUV444 を指定した場合は、縦横サイズがそれぞれ8の倍数である必要があります。
2143                         &lt;LI&gt; @ref PIXEL_SAMPLING_YUV420 を指定した場合は、縦横サイズがそれぞれ16の倍数である必要があります。
2144                         &lt;LI&gt; @ref PIXEL_SAMPLING_YUV422 を指定した場合は、縦サイズが8の倍数、横サイズが16の倍数である必要があります。
2145                     &lt;/LI&gt;&lt;/UL&gt;
2146 
2147         @param[out] dst                 エンコード結果を格納するバッファを指定します。
2148 
2149         @param[in]  limit               dstのバイト数を指定します。
2150                                         このバイト数を超えるとエンコードに失敗します。
2151 
2152         @param[in]  src                 エンコードする画像データバッファを指定します。
2153                                         4バイトアラインメントが必要です。
2154 
2155         @param[in]  width               画像の横幅(pixel)を指定します(65536未満)。
2156 
2157         @param[in]  height              画像の縦幅(pixel)を指定します(65536未満)。
2158 
2159         @param[in]  quality             エンコードのクオリティを指定します。<BR>
2160                                         1~100 まで指定可能であり、100 に近づくほど高画質になりサイズが大きくなります。
2161 
2162         @param[in]  dstPixelSampling    画像の出力形式(画素サンプリング)を指定します。
2163 
2164         @param[in]  srcPixelFormat      エンコードする画像の入力ピクセルフォーマットを指定します。
2165 
2166         @param[in]  addThumbnail        サムネイルを付加するかどうかを指定します。
2167 
2168         @return     成功した場合、生成されたJPEGフォーマットデータのバイト数を返します。
2169                     失敗した場合、0を返します。<BR>
2170                     失敗の原因は @ref GetLastError で取得できます。
2171      */
2172     size_t StartJpegEncoder(u8* dst,
2173                             size_t limit,
2174                             const void* src,
2175                             u32 width,
2176                             u32 height,
2177                             u32 quality,
2178                             PixelSampling dstPixelSampling,
2179                             PixelFormat srcPixelFormat,
2180                             bool addThumbnail);
2181 
2182     /*!
2183         @brief      JPEGエンコードを2枚の画像に対して実行し、Extended MPフォーマット(立体視用)で格納します。
2184 
2185                     最初に左目用画像をエンコードし、MPフォーマットの先頭画像(かつ代表画像)として格納します。
2186                     成功すれば、続けて右目用画像をエンコードし格納します。
2187                     本関数では、左目用画像の視点番号は1、基準視点番号も1です。
2188                     右目用画像の視点番号は2です。
2189 
2190                     本関数でエンコードできる画像の縦横サイズは画像の出力形式(引数 dstPixelSampling)によって変わります。
2191                     @ref StartJpegEncoder と同じです。
2192 
2193                     輻輳角および基線長はデフォルト値 {0xFFFFFFFF,0xFFFFFFFF} になります。
2194 
2195                     以下の各種データ登録関数を呼んでも効果がありません。
2196 
2197                     &lt;UL&gt;
2198                         &lt;LI&gt; @ref SetUserMakerNote
2199                         &lt;LI&gt; @ref SetImageUid
2200                         &lt;LI&gt; @ref SetMpTypeFlags
2201                         &lt;LI&gt; @ref SetMpIndividualNum
2202                         &lt;LI&gt; @ref SetMpPanOrientation
2203                         &lt;LI&gt; @ref SetMpPanOverlapH
2204                         &lt;LI&gt; @ref SetMpPanOverlapV
2205                         &lt;LI&gt; @ref SetMpBaseViewpointNum
2206                         &lt;LI&gt; @ref SetMpConvergenceAngle
2207                         &lt;LI&gt; @ref SetMpBaselineLength
2208                         &lt;LI&gt; @ref SetMpVerticalDivergence
2209                         &lt;LI&gt; @ref SetMpAxisDistanceX
2210                         &lt;LI&gt; @ref SetMpAxisDistanceY
2211                         &lt;LI&gt; @ref SetMpAxisDistanceZ
2212                         &lt;LI&gt; @ref SetMpYawAngle
2213                         &lt;LI&gt; @ref SetMpPitchAngle
2214                         &lt;LI&gt; @ref SetMpRollAngle
2215                     &lt;/LI&gt;&lt;/UL&gt;
2216 
2217                     以下の関数を呼んだ場合、指定は両方の画像に対して有効で、同一値が登録されます。
2218 
2219                     &lt;UL&gt;
2220                         &lt;LI&gt; @ref SetThumbnailSize
2221                         &lt;LI&gt; @ref SetInputBufferWidth
2222                         &lt;LI&gt; @ref SetDateTime (*)
2223                         &lt;LI&gt; @ref SetSoftware
2224                         &lt;LI&gt; @ref SetOrientation
2225                         &lt;LI&gt; @ref SetGpsData
2226                     &lt;/LI&gt;&lt;/UL&gt;
2227 
2228                     (*) @ref SetDateTime を呼ばなかった場合は先頭画像のエンコード時に現在日時を取得し、2枚の画像の日時情報は同じになります。
2229 
2230         @param[out] dst                 エンコード結果を格納するバッファを指定します。
2231 
2232         @param[in]  limit               dstのバイト数を指定します。
2233                                         このバイト数を超えるとエンコードに失敗します。
2234 
2235         @param[in]  srcL                エンコードする左目用画像データバッファを指定します。
2236                                         4バイトアラインメントが必要です。
2237 
2238         @param[in]  srcR                エンコードする右目用画像データバッファを指定します。
2239                                         4バイトアラインメントが必要です。
2240 
2241         @param[in]  width               画像の横幅(pixel)を指定します(65536未満)。
2242                                         サムネイル以外の左右画像で共通です。
2243 
2244         @param[in]  height              画像の縦幅(pixel)を指定します(65536未満)。
2245                                         サムネイル以外の左右画像で共通です。
2246 
2247         @param[in]  quality             エンコードのクオリティを指定します。<BR>
2248                                         1~100 まで指定可能であり、100 に近づくほど高画質になりサイズが大きくなります。<BR>
2249                                         サムネイル以外の左右画像で共通です。
2250 
2251         @param[in]  dstPixelSampling    画像の出力形式(画素サンプリング)を指定します。
2252                                         サムネイル以外の左右画像で共通です。
2253 
2254         @param[in]  srcPixelFormat      エンコードする画像の入力ピクセルフォーマットを指定します。
2255                                         全ての画像で共通です。
2256 
2257         @param[in]  addThumbnailL       左目用画像へサムネイルを付加するかどうかを指定します。
2258 
2259         @param[in]  addThumbnailR       右目用画像へサムネイルを付加するかどうかを指定します。
2260 
2261         @return     成功した場合、生成されたMPフォーマットデータのバイト数を返します。
2262                     失敗した場合、0を返します。<BR>
2263                     失敗の原因は @ref GetLastError で取得できます。
2264      */
2265     size_t StartMpEncoderLR(u8* dst,
2266                             size_t limit,
2267                             const void* srcL,
2268                             const void* srcR,
2269                             u32 width,
2270                             u32 height,
2271                             u32 quality,
2272                             PixelSampling dstPixelSampling,
2273                             PixelFormat srcPixelFormat,
2274                             bool addThumbnailL,
2275                             bool addThumbnailR);
2276 
2277     /*!
2278         @brief      JPEGエンコードを実行し、MPフォーマットの先頭画像として格納します。
2279 
2280                     本関数では1組のMPフォーマットデータ(マルチピクチャオブジェクト、以下「MPO」)
2281                     に含む合計画像数の指定と、先頭画像のエンコードを行います。
2282                     2枚目から合計画像数までのエンコードを行うためには、@ref StartMpEncoderNext を呼んでください。
2283 
2284                     後続の @ref StartMpEncoderNext のエンコード結果に応じて、本関数でエンコードした先頭画像のAPP2
2285                     (MPインデックスIFDやMPエントリ、MP個別情報IFDを含みます)が書き換えられます。
2286                     指定した合計画像数のエンコード途中で失敗した場合や、エンコードを中止した場合は、
2287                     先頭画像からエンコードをやり直す必要があります。
2288 
2289                     @ref StartMpEncoderLR と異なり、@ref SetUserMakerNote 、@ref SetMpTypeFlags 、@ref SetDateTime
2290                     等を呼んで、画像毎に各種データを登録できます。
2291                     2枚目以降に各種データを登録する場合、@ref StartMpEncoderNext を呼ぶ前にそれらの関数を呼ぶ必要があります。
2292 
2293                     また、@ref SetThumbnailSize および @ref SetInputBufferWidth の指定も画像毎になります。
2294                     2枚目以降に指定を行う場合、@ref StartMpEncoderNext を呼ぶ前にそれらの関数を呼ぶ必要があります。
2295 
2296                     本関数でエンコードできる画像の縦横サイズは画像の出力形式(引数 dstPixelSampling)によって変わります。
2297                     @ref StartJpegEncoder と同じです。
2298 
2299                     &lt;UL&gt;
2300                         &lt;LI&gt; 引数 typeCode に指定できる値について<BR>
2301                                    以下のいずれかの値を指定できます。
2302 
2303                                    &lt;UL&gt;
2304                                        &lt;LI&gt; @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像)
2305                                        &lt;LI&gt; @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像)
2306                                        &lt;LI&gt; @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
2307                                        &lt;LI&gt; @ref MP_TYPE_CODE_UNDEFINED (未定義種別)
2308                                        &lt;LI&gt; @ref MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE (Baseline MP 主画像)
2309                                    &lt;/LI&gt;&lt;/UL&gt;
2310 
2311                     @ref MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE (Baseline MP 主画像) を指定すると、Baseline MPフォーマットを使用します。<BR>
2312                     それ以外を指定すると、Extended MPフォーマットを使用します。<BR>
2313 
2314                     &lt;/LI&gt;&lt;/UL&gt;
2315 
2316                     Baseline MPフォーマットではMP個別情報IFDを格納しませんので、以下の関数を呼んでも無効です。
2317 
2318                     &lt;UL&gt;
2319                         &lt;LI&gt; @ref SetMpIndividualNum
2320                         &lt;LI&gt; @ref SetMpPanOrientation
2321                         &lt;LI&gt; @ref SetMpPanOverlapH
2322                         &lt;LI&gt; @ref SetMpPanOverlapV
2323                         &lt;LI&gt; @ref SetMpBaseViewpointNum
2324                         &lt;LI&gt; @ref SetMpConvergenceAngle
2325                         &lt;LI&gt; @ref SetMpBaselineLength
2326                         &lt;LI&gt; @ref SetMpVerticalDivergence
2327                         &lt;LI&gt; @ref SetMpAxisDistanceX
2328                         &lt;LI&gt; @ref SetMpAxisDistanceY
2329                         &lt;LI&gt; @ref SetMpAxisDistanceZ
2330                         &lt;LI&gt; @ref SetMpYawAngle
2331                         &lt;LI&gt; @ref SetMpPitchAngle
2332                         &lt;LI&gt; @ref SetMpRollAngle
2333                     &lt;/LI&gt;&lt;/UL&gt;
2334 
2335         @param[out] dst                 エンコード結果を格納するバッファを指定します。<BR>
2336                                         指定した合計画像数のエンコードが完了するまで、このバッファを保持しておく必要があります。
2337                                         エンコードを中止した場合はバッファを破棄できます。
2338 
2339         @param[in]  limit               dstのバイト数を指定します。
2340                                         このバイト数を超えるとエンコードに失敗します。<BR>
2341                                         指定した合計画像数のエンコード途中に @ref StartMpEncoderNext が失敗した場合、
2342                                         このバイト数が不足している可能性があります。
2343 
2344         @param[in]  src                 エンコードする画像データバッファを指定します。
2345                                         4バイトアラインメントが必要です。
2346 
2347         @param[in]  width               画像の横幅(pixel)を指定します(65536未満)。
2348 
2349         @param[in]  height              画像の縦幅(pixel)を指定します(65536未満)。
2350 
2351         @param[in]  quality             エンコードのクオリティを指定します。<BR>
2352                                         1~100 まで指定可能であり、100 に近づくほど高画質になりサイズが大きくなります。
2353 
2354         @param[in]  dstPixelSampling    画像の出力形式(画素サンプリング)を指定します。
2355 
2356         @param[in]  srcPixelFormat      エンコードする画像の入力ピクセルフォーマットを指定します。
2357 
2358         @param[in]  addThumbnail        サムネイルを付加するかどうかを指定します。
2359 
2360         @param[in]  numImages           1つのMPOに含む合計画像数を指定します。<BR>
2361                                         MP種別(引数 typeCode)が立体視用画像の場合は、2以上にする必要があります。<BR>
2362                                         Baseline MP 主画像の場合は、3以下にする必要があります。<BR>
2363                                         デフォルトは2です。
2364 
2365         @param[in]  typeCode            MP種別を指定します。<BR>
2366                                         指定できる値については説明文を参照してください。<BR>
2367                                         デフォルトは @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像) です。
2368 
2369         @param[in]  addImageUidList     個別画像ユニークIDリストを付加するかどうかを指定します。<BR>
2370                                         trueを指定すると付加し、falseを指定すると付加しません。<BR>
2371                                         付加する値は、本関数および @ref StartMpEncoderNext を呼ぶ直前に @ref SetImageUid で指定した画像ユニークIDです。<BR>
2372                                         @ref SetImageUid を呼ばなかった場合や、先頭画像の場合はNULL (全バイトが0)になります。<BR>
2373                                         デフォルトはfalseです。
2374 
2375         @param[in]  addTotalFrames      撮影時総コマ数を付加するかどうかを指定します。<BR>
2376                                         trueを指定すると付加し、falseを指定すると付加しません。<BR>
2377                                         MP種別(引数 typeCode)が @ref MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE の場合、指定は無視され、撮影時総コマ数を付加しません。<BR>
2378                                         付加する値は、通常は合計画像数になりますが、
2379                                         本関数および @ref StartMpEncoderNext を呼ぶ直前に @ref SetMpIndividualNum で個別画像番号を0に指定した場合、
2380                                         その画像はカウントされません。<BR>
2381                                         2枚目以降の、MP種別が @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 あるいは @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像)
2382                                         である画像もカウントされません。<BR>
2383                                         デフォルトはfalseです。
2384 
2385         @return     成功した場合、生成されたMPOのバイト数を返します(ただし合計画像数が1より大きい場合、このMPOは未完成状態です)。<BR>
2386                     失敗した場合、0を返します。
2387                     失敗の原因は @ref GetLastError で取得できます。
2388      */
2389     size_t StartMpEncoderFirst(u8* dst,
2390                                size_t limit,
2391                                const void* src,
2392                                u32 width,
2393                                u32 height,
2394                                u32 quality,
2395                                PixelSampling dstPixelSampling,
2396                                PixelFormat srcPixelFormat,
2397                                bool addThumbnail,
2398                                u32 numImages = 2,
2399                                MpTypeCode typeCode = MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE,
2400                                bool addImageUidList = false,
2401                                bool addTotalFrames = false);
2402 
2403     /*!
2404         @brief      JPEGエンコードを実行し、直前の @ref StartMpEncoderFirst あるいは本関数によるエンコード結果に追記します。
2405 
2406                     それらの処理が失敗した場合は、本関数も失敗します(先頭画像からエンコードをやり直す必要があります)。
2407 
2408                     本関数は、@ref StartMpEncoderFirst で指定した合計画像数が1より大きい場合、マルチピクチャオブジェクト(MPO)
2409                     を完成させるため、(合計画像数-1)回呼ぶ必要があります。
2410                     必要回数を超えて呼ぶと失敗します。
2411                     エンコード途中で失敗した場合や、エンコードを中止する場合は、それ以降本関数を呼ぶ必要はありません。
2412 
2413                     途中でエンコーダオブジェクトを初期化するとエンコード結果の追記ができませんので、
2414                     本関数を呼ぶ前に @ref Initialize を呼ばないでください。
2415 
2416                     本関数のエンコード結果は、@ref StartMpEncoderFirst で指定したバッファとバイト数の範囲内で、
2417                     直前の画像エンコード結果に追記します。
2418                     追記先のバイトオフセット(バッファ先頭から)が2の倍数になるようパディングされます。
2419                     このため、直前の個別画像のEOIマーカと、今回の個別画像のSOIマーカの間に1バイトの0が挿入される場合があります。
2420                     追記後にはパディングされません。
2421 
2422                     @ref SetUserMakerNote 、@ref SetMpTypeFlags 、@ref SetDateTime 等で登録した各種データや、
2423                     @ref SetThumbnailSize および @ref SetInputBufferWidth の指定は、
2424                     終了後、成功、失敗問わずクリアされます。
2425                     複数回エンコードする場合は、それぞれの画像エンコード前にそれらの関数を呼ぶ必要があります。
2426 
2427                     先頭画像のMP種別が @ref MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE (Baseline MP 主画像)の場合、Baseline MPフォーマットを使用しますので、
2428                     MP個別情報IFDを格納しません。@ref StartMpEncoderFirst と同様に、MP個別情報IFDを登録する関数を呼んでも無効です。
2429 
2430                     &lt;UL&gt;
2431                         &lt;LI&gt; 引数 typeCode に指定できる値について<BR>
2432                                    以下のいずれかの値を指定できます。
2433 
2434                                     &lt;UL&gt;
2435                                         &lt;LI&gt; @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像)
2436                                         &lt;LI&gt; @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像)
2437                                         &lt;LI&gt; @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像)
2438                                         &lt;LI&gt; @ref MP_TYPE_CODE_UNDEFINED (未定義種別)
2439                                         &lt;LI&gt; @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 および @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像)
2440                                     &lt;/LI&gt;&lt;/UL&gt;
2441 
2442                     なお、モニタ表示用画像以外を指定する場合、先頭画像のMP種別と同じである必要があります。
2443 
2444                     &lt;/LI&gt;&lt;/UL&gt;
2445 
2446                     モニタ表示用画像をエンコードする場合、APP1に記録するタグは以下のもののみとなります。<BR>
2447                     このため、モニタ表示用画像のエンコード直後に @ref GetMpRegionsToBuildJpegData を使ってJPEGデータの再構成はできません。
2448 
2449                     &lt;UL&gt;
2450                         &lt;LI&gt; IFD0 の
2451                         &lt;UL&gt;
2452                             &lt;LI&gt; Exif IFD Pointer
2453                             &lt;LI&gt; Exif Private Tag の MakerNote (メーカーノート登録時)
2454                             &lt;LI&gt; PixelXDimension (*)
2455                             &lt;LI&gt; PixelYDimension (*)
2456                             &lt;LI&gt; ImageUniqueID (画像ユニークID登録時)
2457                         &lt;/LI&gt;&lt;/UL&gt;
2458                         &lt;LI&gt; IFD1 の
2459                         &lt;UL&gt;
2460                             &lt;LI&gt; JPEGInterchangeFormat (サムネイル付加時)
2461                             &lt;LI&gt; JPEGInterchangeFormatLength (サムネイル付加時)
2462                         &lt;/LI&gt;&lt;/UL&gt;
2463                     &lt;/LI&gt;&lt;/UL&gt;
2464 
2465                     (*) MPフォーマット規格では、これらのタグは「モニタ元画像と同じ場合、記録しないことを推奨する」となっています。
2466                         エンコードする画像サイズ(引数 width および height)が、モニタ元画像の画像サイズと同じかどうかはアプリケーションで確認してください。
2467                         引数 omitPixelDimensions にtrueを指定すると、記録しません。
2468 
2469         @param[in]  src                 エンコードする画像データバッファを指定します。
2470                                         4バイトアラインメントが必要です。
2471 
2472         @param[in]  width               画像の横幅(pixel)を指定します(65536未満)。
2473 
2474         @param[in]  height              画像の縦幅(pixel)を指定します(65536未満)。
2475 
2476         @param[in]  quality             エンコードのクオリティを指定します。<BR>
2477                                         1~100 まで指定可能であり、100 に近づくほど高画質になりサイズが大きくなります。
2478 
2479         @param[in]  dstPixelSampling    画像の出力形式(画素サンプリング)を指定します。
2480 
2481         @param[in]  srcPixelFormat      エンコードする画像の入力ピクセルフォーマットを指定します。
2482 
2483         @param[in]  addThumbnail        サムネイルを付加するかどうかを指定します。
2484 
2485         @param[in]  typeCode            MP種別を指定します。<BR>
2486                                         指定できる値については説明文を参照してください。<BR>
2487                                         デフォルトは @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像) です。
2488 
2489         @param[in]  omitPixelDimensions MP種別(引数 typeCode)が @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 あるいは @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像)
2490                                         の場合、APP1へ実効画像サイズ(PixelXDimension、PixelYDimension)の記録を省略するかどうかを指定します。<BR>
2491                                         それ以外のMP種別では記録は省略できないため、指定は無視されます。<BR>
2492                                         trueを指定すると省略し、falseを指定すると記録します。<BR>
2493                                         デフォルトはfalseです。
2494 
2495         @return     成功した場合、生成されたMPOのバイト数を返します(ただし必要回数の呼び出しが成功するまでは、このMPOは未完成状態です)。<BR>
2496                     失敗した場合、0を返します。
2497                     失敗の原因は @ref GetLastError で取得できます。
2498      */
2499     size_t StartMpEncoderNext(const void* src,
2500                               u32 width,
2501                               u32 height,
2502                               u32 quality,
2503                               PixelSampling dstPixelSampling,
2504                               PixelFormat srcPixelFormat,
2505                               bool addThumbnail,
2506                               MpTypeCode typeCode = MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE,
2507                               bool omitPixelDimensions = false);
2508 
2509     /*!
2510         @brief      直前の @ref StartMpEncoderFirst 、@ref StartMpEncoderNext あるいは @ref StartMpEncoderLR によるエンコード結果から、
2511                     JPEGデータを再構成するための領域情報を取得します。
2512 
2513                     それらの処理が失敗した場合は、本関数も失敗します。<BR>
2514                     直前に @ref StartJpegEncoder を呼んだ場合も失敗します。<BR>
2515                     直前に @ref StartMpEncoderNext でモニタ表示用画像をエンコードした場合も失敗します。<BR>
2516                     JPEGデータの再構成にはエンコード結果が必要です。破棄しないでください。
2517 
2518                     本関数は、同じ画像をMPフォーマットと、MPフォーマットではないJPEG形式で繰り返しエンコードする代わりに、
2519                     前者の結果を利用して高速に後者の結果を得るために使います。
2520 
2521                     MPフォーマットの個別画像データ構造は、簡単には「(JPEGヘッダ) + (APP2) + (JPEGデータ)」のようになっており、
2522                     APP2はMPフォーマット付属情報を含んでいます。<BR>
2523                     APP2を切り詰めれば、「(JPEGヘッダ) + (JPEGデータ)」となり、MPフォーマットではないJPEG形式でエンコードした結果と一致します。<BR>
2524                     本関数は、「(JPEGヘッダ)」と「(JPEGデータ)」の領域情報(ポインタとバイト数)を取得します。
2525 
2526                     直前に @ref StartMpEncoderLR を呼んだ場合、取得できるのは左目用画像の領域情報になります。
2527 
2528         @param[out] pBuffer             領域情報を格納するバッファです。
2529 
2530         @return     成功した場合、trueを返します。
2531                     失敗した場合、falseを返します。<BR>
2532                     失敗の原因は取得できません。本関数は @ref GetLastError が返す値を更新しません。
2533      */
2534     bool GetMpRegionsToBuildJpegData(MpRegionsToBuildJpegData* pBuffer);
2535 
2536     /*!
2537         @brief      直前の @ref StartJpegEncoder 、@ref StartMpEncoderFirst 、@ref StartMpEncoderNext あるいは @ref StartMpEncoderLR によるエンコードの失敗原因を取得します。
2538 
2539         @return     直前のエンコードが成功した場合、@ref JPEG_ENCODER_ERROR_NONE (0) を返します。<BR>
2540                     エンコーダオブジェクトの初期化直後および再初期化直後も0を返します。<BR>
2541                     失敗した場合、0以外の値 (@ref EncoderErrorCode) を返します。
2542      */
2543     s32 GetLastError() const;
2544 
2545     /*!
2546         @}
2547      */
2548 
2549 protected:
2550     detail::JpegMpEncoderWorkObj* m_pWork;
2551     bool    m_Initialized;
2552     bool    m_Padding[3];
2553 
2554     detail::JpegMpEncoderTemporarySettingObj m_TemporarySetting;
2555     void ClearTemporarySetting();
2556 
2557     void SetMakerNote(const u8* pBuffer, size_t size, u32 index);
2558 };
2559 
2560 } // namespace CTR {
2561 } // namespace jpeg {
2562 } // namespace nn {
2563 
2564 #endif // __cplusplus
2565 
2566 #endif // NN_JPEG_JPEGMPENCODER_H_
2567