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 <UL> 144 <LI> @ref PIXEL_SAMPLING_YUV444 を指定した場合は、縦横サイズがそれぞれ8の倍数である必要があります。 145 <LI> @ref PIXEL_SAMPLING_YUV420 を指定した場合は、縦横サイズがそれぞれ16の倍数である必要があります。 146 <LI> @ref PIXEL_SAMPLING_YUV422 を指定した場合は、縦サイズが8の倍数、横サイズが16の倍数である必要があります。 147 </LI></UL> 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 <UL> 200 <LI> @ref PIXEL_FORMAT_YUYV8 の場合、2の倍数である必要があります。 201 <LI> @ref PIXEL_FORMAT_CTR_RGB565_BLOCK8 、@ref PIXEL_FORMAT_CTR_RGB8_BLOCK8 、あるいは @ref PIXEL_FORMAT_CTR_RGBA8_BLOCK8 の場合、8の倍数である必要があります。 202 </LI></UL> 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 <UL> 239 <LI> @ref SetDateTime 240 <LI> @ref SetSoftware 241 <LI> @ref SetUserMakerNote 242 <LI> @ref SetImageUid 243 <LI> @ref SetOrientation 244 <LI> @ref SetGpsData 245 </LI></UL> 246 247 以下のMPフォーマットに関係する各種データ登録関数はAPP2の記録内容に影響します。 248 従って、APP1を記録しなくても有効です。 249 250 <UL> 251 <LI> @ref SetMpTypeFlags 252 <LI> @ref SetMpIndividualNum 253 <LI> @ref SetMpPanOrientation 254 <LI> @ref SetMpPanOverlapH 255 <LI> @ref SetMpPanOverlapV 256 <LI> @ref SetMpBaseViewpointNum 257 <LI> @ref SetMpConvergenceAngle 258 <LI> @ref SetMpBaselineLength 259 <LI> @ref SetMpVerticalDivergence 260 <LI> @ref SetMpAxisDistanceX 261 <LI> @ref SetMpAxisDistanceY 262 <LI> @ref SetMpAxisDistanceZ 263 <LI> @ref SetMpYawAngle 264 <LI> @ref SetMpPitchAngle 265 <LI> @ref SetMpRollAngle 266 </LI></UL> 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 <UL> 384 <LI> 登録できる最大サイズについて<BR> 385 メーカーノートに登録できるデータのサイズは、APP1セグメント全体のサイズに依存します。<BR> 386 メーカーノートはExifに含まれるため、APP1セグメントの一部となりますが、このAPP1セグメントは0xFFFFバイトまでのサイズしか扱えないようになっています。<BR> 387 そのため、サムネイル等のAPP1領域のデータサイズによって、メーカーノートに埋め込めるデータのサイズは変動することになります。<BR> 388 (目安として 640x480の画像をサムネイル付き、YUV422、クオリティ90でエンコードする場合、トータル 0xE000バイト以下までのサイズにすることをお勧めします。) 389 </LI></UL> 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 <OL> 517 <LI> 本関数を呼ばずに @ref StartMpEncoderFirst を使った場合、この画像(先頭画像)が代表画像(代表画像フラグ=1)となります。 518 <LI> 本関数を呼ばずに @ref StartMpEncoderNext を使った場合、まだ代表画像が存在していなければ、この画像が代表画像となります。<BR> 519 代表画像が存在していれば、この画像は代表画像フラグ=0となります。 520 </LI></OL> 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 <OL> 1184 <LI> アプリケーションでGPS IFD 登録用構造体を確保して、本関数でその構造体を初期化してください。 1185 <LI> @ref SetGpsLatitude 、@ref SetGpsLongitude 等の関数を呼んで、その構造体へGPS情報を登録してください。<BR> 1186 登録関数によっては、@ref SetGpsSatellites のように、登録したいデータへのポインタのみ保持するものがあります。この場合、登録したいデータはエンコードが終了するまで保持しておく必要があります。 1187 <LI> 構造体へのデータ登録がすべて終わったら、@ref SetGpsData を呼んで登録内容を確定してください。<BR> 1188 エンコーダオブジェクトは、この構造体へのポインタのみ保持しています。従って、構造体はエンコードが終了するまで保持しておく必要があります。 1189 <LI> エンコード関数を呼んで画像をエンコードしてください。 1190 <LI> エンコード関数が成功、失敗問わず終了したら、構造体および登録したいデータを解放できます。<BR> 1191 構造体を再利用する場合、本関数で再初期化してください。 1192 </LI></OL> 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 <UL> 2142 <LI> @ref PIXEL_SAMPLING_YUV444 を指定した場合は、縦横サイズがそれぞれ8の倍数である必要があります。 2143 <LI> @ref PIXEL_SAMPLING_YUV420 を指定した場合は、縦横サイズがそれぞれ16の倍数である必要があります。 2144 <LI> @ref PIXEL_SAMPLING_YUV422 を指定した場合は、縦サイズが8の倍数、横サイズが16の倍数である必要があります。 2145 </LI></UL> 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 <UL> 2198 <LI> @ref SetUserMakerNote 2199 <LI> @ref SetImageUid 2200 <LI> @ref SetMpTypeFlags 2201 <LI> @ref SetMpIndividualNum 2202 <LI> @ref SetMpPanOrientation 2203 <LI> @ref SetMpPanOverlapH 2204 <LI> @ref SetMpPanOverlapV 2205 <LI> @ref SetMpBaseViewpointNum 2206 <LI> @ref SetMpConvergenceAngle 2207 <LI> @ref SetMpBaselineLength 2208 <LI> @ref SetMpVerticalDivergence 2209 <LI> @ref SetMpAxisDistanceX 2210 <LI> @ref SetMpAxisDistanceY 2211 <LI> @ref SetMpAxisDistanceZ 2212 <LI> @ref SetMpYawAngle 2213 <LI> @ref SetMpPitchAngle 2214 <LI> @ref SetMpRollAngle 2215 </LI></UL> 2216 2217 以下の関数を呼んだ場合、指定は両方の画像に対して有効で、同一値が登録されます。 2218 2219 <UL> 2220 <LI> @ref SetThumbnailSize 2221 <LI> @ref SetInputBufferWidth 2222 <LI> @ref SetDateTime (*) 2223 <LI> @ref SetSoftware 2224 <LI> @ref SetOrientation 2225 <LI> @ref SetGpsData 2226 </LI></UL> 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 <UL> 2300 <LI> 引数 typeCode に指定できる値について<BR> 2301 以下のいずれかの値を指定できます。 2302 2303 <UL> 2304 <LI> @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像) 2305 <LI> @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像) 2306 <LI> @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像) 2307 <LI> @ref MP_TYPE_CODE_UNDEFINED (未定義種別) 2308 <LI> @ref MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE (Baseline MP 主画像) 2309 </LI></UL> 2310 2311 @ref MP_TYPE_CODE_BASELINE_MP_PRIMARY_IMAGE (Baseline MP 主画像) を指定すると、Baseline MPフォーマットを使用します。<BR> 2312 それ以外を指定すると、Extended MPフォーマットを使用します。<BR> 2313 2314 </LI></UL> 2315 2316 Baseline MPフォーマットではMP個別情報IFDを格納しませんので、以下の関数を呼んでも無効です。 2317 2318 <UL> 2319 <LI> @ref SetMpIndividualNum 2320 <LI> @ref SetMpPanOrientation 2321 <LI> @ref SetMpPanOverlapH 2322 <LI> @ref SetMpPanOverlapV 2323 <LI> @ref SetMpBaseViewpointNum 2324 <LI> @ref SetMpConvergenceAngle 2325 <LI> @ref SetMpBaselineLength 2326 <LI> @ref SetMpVerticalDivergence 2327 <LI> @ref SetMpAxisDistanceX 2328 <LI> @ref SetMpAxisDistanceY 2329 <LI> @ref SetMpAxisDistanceZ 2330 <LI> @ref SetMpYawAngle 2331 <LI> @ref SetMpPitchAngle 2332 <LI> @ref SetMpRollAngle 2333 </LI></UL> 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 <UL> 2431 <LI> 引数 typeCode に指定できる値について<BR> 2432 以下のいずれかの値を指定できます。 2433 2434 <UL> 2435 <LI> @ref MP_TYPE_CODE_MULTI_VIEW_DISPARITY_IMAGE (立体視用画像) 2436 <LI> @ref MP_TYPE_CODE_MULTI_VIEW_PANORAMA_IMAGE (パノラマ画像) 2437 <LI> @ref MP_TYPE_CODE_MULTI_VIEW_MULTI_ANGLE_IMAGE (マルチアングル画像) 2438 <LI> @ref MP_TYPE_CODE_UNDEFINED (未定義種別) 2439 <LI> @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 および @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像) 2440 </LI></UL> 2441 2442 なお、モニタ表示用画像以外を指定する場合、先頭画像のMP種別と同じである必要があります。 2443 2444 </LI></UL> 2445 2446 モニタ表示用画像をエンコードする場合、APP1に記録するタグは以下のもののみとなります。<BR> 2447 このため、モニタ表示用画像のエンコード直後に @ref GetMpRegionsToBuildJpegData を使ってJPEGデータの再構成はできません。 2448 2449 <UL> 2450 <LI> IFD0 の 2451 <UL> 2452 <LI> Exif IFD Pointer 2453 <LI> Exif Private Tag の MakerNote (メーカーノート登録時) 2454 <LI> PixelXDimension (*) 2455 <LI> PixelYDimension (*) 2456 <LI> ImageUniqueID (画像ユニークID登録時) 2457 </LI></UL> 2458 <LI> IFD1 の 2459 <UL> 2460 <LI> JPEGInterchangeFormat (サムネイル付加時) 2461 <LI> JPEGInterchangeFormatLength (サムネイル付加時) 2462 </LI></UL> 2463 </LI></UL> 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