/*---------------------------------------------------------------------------* Project: Horizon File: jpeg_MpDecoder.h Copyright (C)2009-2010 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 26510 $ *---------------------------------------------------------------------------*/ /*! @file @brief JpegMpDecoder に関するAPIの宣言 :include nn/jpeg.h */ #ifndef NN_JPEG_JPEGMPDECODER_H_ #define NN_JPEG_JPEGMPDECODER_H_ #include #include #ifdef __cplusplus namespace nn { namespace jpeg { namespace CTR { namespace detail { struct JpegMpDecoderWorkObj; } /*! @brief JPEGデコードを行うクラスです。 */ class JpegMpDecoder : private nn::util::NonCopyable { public: /*! @brief デコーダオブジェクト用ワークバッファのバイト数を計算します。 バッファの確保と解放はアプリケーションで行ってください。 @return バッファのバイト数を返します。 */ static size_t GetWorkBufferSize(); /*! @brief JPEGデコード結果(画像1枚分)を格納するバッファのバイト数を計算します。 バッファの確保と解放はアプリケーションで行ってください。 格納するピクセルフォーマット(引数 dstPixelFormat)により、 バッファの画像サイズはデコードを許す画像サイズ(引数 maxWidth、maxHeight)より大きくなる(切り上げられる)場合があります。 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します。(65536未満)
縮小デコード (@ref StartJpegDecoderShrink) を行う場合は、デコード結果(縮小後)の最大横幅を指定します。
@ref SetOutputBufferWidth で出力画像バッファの横幅を指定する場合は、 本関数では大きい方の値を指定してください。
それより大きい値でもかまいません。 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します。(65536未満)
縮小デコードを行う場合は、デコード結果(縮小後)の最大縦幅を指定します。
それより大きい値でもかまいません。 @param[in] dstPixelFormat 格納するピクセルフォーマットを指定します。
@ref PIXEL_FORMAT_CTR_RGB565_BLOCK8 、@ref PIXEL_FORMAT_CTR_RGB8_BLOCK8 、あるいは @ref PIXEL_FORMAT_CTR_RGBA8_BLOCK8 を指定した場合、 引数 maxWidthおよびmaxHeightを8の倍数へ切り上げてバッファのバイト数を計算します。
@ref PIXEL_FORMAT_YUYV8 の場合、 引数 maxWidthを2の倍数へ切り上げて計算します。 @return デコード結果を格納するバッファのバイト数を返します。
引数が不正か、バイト数がsize_t型の範囲を超えた場合は、エラーとして0を返します。 */ static size_t GetDstBufferSize(u32 maxWidth, u32 maxHeight, PixelFormat dstPixelFormat) { size_t size = 0; u64 size64; switch (dstPixelFormat) { case PIXEL_FORMAT_YUYV8: // 横幅を2の倍数へ切り上げます。 maxWidth = (maxWidth + 1) & ~1; size = 2; break; case PIXEL_FORMAT_CTR_RGB565: size = 2; break; case PIXEL_FORMAT_CTR_RGB565_BLOCK8: // 横幅および縦幅を8の倍数へ切り上げます。 maxWidth = (maxWidth + 7) & ~7; maxHeight = (maxHeight + 7) & ~7; size = 2; break; case PIXEL_FORMAT_RGB8: case PIXEL_FORMAT_BGR8: size = 3; break; case PIXEL_FORMAT_CTR_RGB8_BLOCK8: maxWidth = (maxWidth + 7) & ~7; maxHeight = (maxHeight + 7) & ~7; size = 3; break; case PIXEL_FORMAT_RGBA8: case PIXEL_FORMAT_ABGR8: size = 4; break; case PIXEL_FORMAT_CTR_RGBA8_BLOCK8: maxWidth = (maxWidth + 7) & ~7; maxHeight = (maxHeight + 7) & ~7; size = 4; break; default: // unexpected format size = 0; break; } size64 = static_cast(size) * maxWidth * maxHeight; size = static_cast(size64); if (size != size64) { size = 0; } return size; } /*! @brief デコーダオブジェクトを構築します。 初期化しません。 */ JpegMpDecoder() : m_Initialized(false) {} /*! @brief デコーダオブジェクトを初期化します。 デコーダオブジェクト用ワークバッファも初期化します。 初期化を一度行えば、終了するまで再初期化不要です。 再初期化してもかまいません。 @param[out] workBuffer デコーダオブジェクト用ワークバッファを指定します。 4バイトアラインメントが必要です。
バッファサイズは @ref GetWorkBufferSize で計算します。
ワークバッファはデコーダオブジェクト毎に必要です。 @param[in] workBufferSize バッファのバイト数を指定します。 @ref GetWorkBufferSize の返り値を指定してください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。
workBufferのアラインメントと、workBufferSizeを確認してください。 */ bool Initialize(void* workBuffer, size_t workBufferSize); /*! @brief 出力画像バッファの横幅を指定します。 本関数は、デコードしたい画像横幅より、デコード結果を出力する画像バッファ(例えばGPUテクスチャバッファ) の画像横幅が大きい場合に使います。 出力画像バッファの画像横幅を指定することにより、 デコード関数( @ref StartJpegDecoder 、@ref StartJpegDecoderShrink 、@ref StartMpDecoderLR )が出力画像バッファから左詰めで出力します。 出力されない余白部分のバッファ内容は変更しません。 本関数は、デコード関数を呼ぶ前に呼んでください。 デコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。 複数回デコードする場合は、それぞれのデコード前に本関数を呼ぶ必要があります。 他にも、引数 width に0を指定するか、 @ref Initialize でデコーダオブジェクトを再初期化すると指定はクリアされます。 本関数で指定した画像横幅が、デコード結果を出力するために必要な横幅より小さい場合は、 デコード関数が出力画像バッファの横幅を切り上げます。 (切り上げた結果、デコード関数に指定された出力画像バッファのバイト数を超える場合はデコードに失敗します) デコード関数で指定する出力ピクセルフォーマットが @ref PIXEL_FORMAT_CTR_RGB565_BLOCK8 、@ref PIXEL_FORMAT_CTR_RGB8_BLOCK8 、あるいは @ref PIXEL_FORMAT_CTR_RGBA8_BLOCK8 の場合、 引数 width が8の倍数でないと正しく動作しません。(8の倍数へ切り下げられます) @ref PIXEL_FORMAT_YUYV8 の場合、引数 width が2の倍数でないと正しく動作しません。(2の倍数へ切り下げられます) @param[in] width 出力画像バッファの横幅(pixel)を指定します。
0を指定すると、デコード関数が画像サイズに応じた横幅に自動設定します。
MAX_DECODER_OUTPUT_BUFFER_WIDTH (65536) を超える値の指定は無視されます。 @return なし。 */ void SetOutputBufferWidth(u32 width) { if (m_Initialized) { if (width <= MAX_DECODER_OUTPUT_BUFFER_WIDTH) { m_TemporarySetting.outputBufferWidth = width; } } } /*! @brief JPEGデコード時のオプションを指定します。 オプションを指定することにより、デコード関数の動作を変更できます。 @ref StartMpDecoderLR でデコードする場合、オプションは2枚の主画像に対して有効です。 本関数は、デコード関数を呼ぶ前に呼んでください。 デコード関数終了後、成功、失敗問わず本関数の指定はクリアされます。 複数回デコードする場合は、それぞれのデコード前に本関数を呼ぶ必要があります。 @param[in] option オプションを指定します。以下の定数をビット論理和できます。 @ref JPEG_DECODER_OPTION_ENABLE_DEFAULT_DHT
JPEGデータ中にDHT (ハフマンテーブル)が見つからなかった場合、ライブラリ内蔵の標準ハフマンテーブルを使います。 デコード関数のデフォルト動作では、エラーになります。 (@ref GetLastError が返すエラーコードは、他のエラーが発生していなければ @ref JPEG_DECODER_ERROR_DHT_NOT_FOUND です) 現在は上記1種類のみ実装されています。
0を指定すると、デコード関数の動作はデフォルトに戻ります。 @return なし。 */ void SetOption(u32 option) { if (m_Initialized) { m_TemporarySetting.option = option; } } /*! @brief 指定済みのデコードオプションを取得します。 @return デコードオプションを返します。 */ u32 GetOption() { if (m_Initialized) { return m_TemporarySetting.option; } return 0; } /*! @brief JPEGデコードを実行します。 画像サイズが8あるいは16ピクセルの倍数でない場合は、処理時間が長くなります。
高速にデコードできる画像サイズの条件は、画素サンプリング形式により、以下のようになります。
・@ref PIXEL_SAMPLING_YUV444 の場合は、縦横サイズがそれぞれ8の倍数であること。
・@ref PIXEL_SAMPLING_YUV420 の場合は、縦横サイズがそれぞれ16の倍数であること。
・@ref PIXEL_SAMPLING_YUV422 の場合は、縦サイズが8の倍数、横サイズが16の倍数であること。
@param[out] dst デコード結果を格納するバッファを指定します。
4バイトアラインメントが必要です。
出力バッファを直接GPUのテクスチャとして参照する場合は、 128バイトアラインメントにする必要があります。(本関数ではこのチェックは行いません) @param[in] dstSize dstのバイト数を指定します。
@ref GetDstBufferSize の返り値を指定してください。 @param[in] src デコードするJPEGデータを指定します。 @param[in] srcSize srcのバイト数を指定します。 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します。(65536未満)
デコード成功後は、@ref GetLastWidth で実際の画像横幅を、 @ref GetLastOutputBufferWidth でバッファの横幅を取得できます。 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します。(65536未満)
デコード成功後は、@ref GetLastHeight で実際の画像縦幅を、 @ref GetLastOutputBufferHeight でバッファの縦幅を取得できます。 @param[in] dstPixelFormat 出力ピクセルフォーマットを指定します。 @param[in] decodeThumbnail サムネイルをデコードする場合はtrueを指定します。
主画像をデコードする場合はfalseを指定します。 @return 成功した場合、デコード結果を格納したバイト数を返します。
失敗した場合、0を返します。
失敗の原因は @ref GetLastError で取得できます。 */ size_t StartJpegDecoder(void* dst, size_t dstSize, const u8* src, size_t srcSize, u32 maxWidth, u32 maxHeight, PixelFormat dstPixelFormat, bool decodeThumbnail); /*! @brief JPEGデコードを実行し、画像を縮小して出力します。 縮小レベル(引数 shrinkLevel)の指定により、 元画像の横幅および縦幅を同時に 1/2、1/4、1/8、あるいは 1/16 に縮小します。(端数切り上げ) 引数 dst のアラインメントは、@ref StartJpegDecoder と同じです。 デコードを許す最大画像サイズ(引数 maxWidth および maxHeight)には、縮小レベルに応じて (1 << shrinkLevel) の倍数を指定する必要があります。
具体的には以下の条件を満たしてください。
・shrinkLevelに1を指定する場合、2の倍数であること。
・shrinkLevelに2を指定する場合、4の倍数であること。
・shrinkLevelに3を指定する場合、8の倍数であること。
・shrinkLevelに4を指定する場合、16の倍数であること。
実際の画像サイズは、(1 << shrinkLevel) の倍数でなくてもかまいません。 本関数成功後に @ref GetLastWidth および @ref GetLastHeight を呼び出すと、 元画像(縮小前)の画像サイズを返します。 @ref GetLastOutputBufferWidth および @ref GetLastOutputBufferHeight は、 デコード結果(縮小後)の出力画像バッファの画像サイズを返します。 処理時間は、元画像サイズが8あるいは16ピクセルの倍数であるかに関係なく、 元画像およびデコード結果の画像サイズが大きいほど長くなります。 @param[out] dst デコード結果を格納するバッファを指定します。
出力ピクセルフォーマット(引数 dstPixelFormat)に応じたアラインメントが必要です。 @param[in] dstSize dstのバイト数を指定します。
@ref GetDstBufferSize の返り値を指定してください。
@ref GetDstBufferSize に指定する引数 maxWidth および maxHeightは、デコード結果(縮小後)の最大画像サイズです。
本関数の引数 maxWidth 、maxHeight 、dstPixelFormat および shrinkLevel を利用すると、以下の例のように指定できます。
@ref GetDstBufferSize ( maxWidth >> shrinkLevel, maxHeight >> shrinkLevel, dstPixelFormat )
ただし、@ref SetOutputBufferWidth を使う場合、その指定横幅と (maxWidth >> shrinkLevel) のうち大きい方の値を指定してください。 @param[in] src デコードするJPEGデータを指定します。 @param[in] srcSize srcのバイト数を指定します。 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します。(65536未満)
(1 << shrinkLevel) の倍数である必要があります。
デコード成功後は、@ref GetLastWidth で元画像(縮小前)の画像横幅を、 @ref GetLastOutputBufferWidth でデコード結果(縮小後)の画像バッファの横幅を取得できます。 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します。(65536未満)
(1 << shrinkLevel) の倍数である必要があります。
デコード成功後は、@ref GetLastHeight で元画像(縮小前)の画像縦幅を、 @ref GetLastOutputBufferHeight でデコード結果(縮小後)の画像バッファの縦幅を取得できます。 @param[in] dstPixelFormat 出力ピクセルフォーマットを指定します。 @param[in] decodeThumbnail サムネイルをデコードする場合はtrueを指定します。
主画像をデコードする場合はfalseを指定します。 @param[in] shrinkLevel 縮小レベルを指定します。指定できる値は1から4までです。
1を指定すると、元画像の横幅および縦幅を同時に1/2に縮小します。
2、3、4を指定すると、それぞれ1/4、1/8、1/16に縮小します。 @return 成功した場合、デコード結果を格納したバイト数を返します。
失敗した場合、0を返します。
失敗の原因は @ref GetLastError で取得できます。 */ size_t StartJpegDecoderShrink(void* dst, size_t dstSize, const u8* src, size_t srcSize, u32 maxWidth, u32 maxHeight, PixelFormat dstPixelFormat, bool decodeThumbnail, u32 shrinkLevel); /*! @brief Exif情報を抽出します。 デコード処理は行わないため @ref StartJpegDecoder を呼び出した場合よりも早く取得できます。 実際に Exif に含まれていた情報を取得するには、本関数が成功した後に、以下の GetLast 関数を使用してください。
・@ref GetLastDateTime
・@ref GetLastSoftwarePointer
・@ref GetLastSoftwareLength
・@ref GetLastUserMakerNotePointer
・@ref GetLastUserMakerNoteSize
・@ref GetLastTwlPhotoMakerNote
・@ref GetLastTwlUserMakerNotePointer
・@ref GetLastTwlUserMakerNoteSize
・@ref GetLastImageUid
・@ref GetLastOrientation
・@ref GetLastGpsData さらに、主画像あるいはサムネイルの画像サイズを、@ref GetLastWidth および @ref GetLastHeight で取得できます。 本関数が成功しても、画像のデコードが成功するとは限りません。 @param[in] src デコードするJPEGデータを指定します。 @param[in] srcSize srcのバイト数を指定します。 @param[in] extractThumbnail サムネイルの画像サイズを抽出する場合はtrueを指定します。
主画像の画像サイズを抽出する場合はfalseを指定します。
trueを指定した場合、サムネイルが見つからなければ失敗します。 @return 成功した場合、trueを返します。 Exif情報が存在しなくても、画像サイズを取得できる可能性がある場合はtrueを返します。
失敗した場合、falseを返します。 失敗の原因は @ref GetLastError で取得できます。 */ bool ExtractExif(const u8* src, size_t srcSize, bool extractThumbnail); /*! @brief MPフォーマットで格納された2枚の画像に対してJPEGデコードを実行します。 @ref StartJpegDecoder と同じで、 画像サイズが8あるいは16ピクセルの倍数でない場合は、処理時間が長くなります。 引数 dst のアラインメントについても同じです。 MPフォーマットで格納された画像データのMP種別を、MPエントリの格納順に調べ、立体視用画像のみを2枚デコードします。 ただし、最初に見つかった立体視用画像が左目用画像であることや、その次のものが右目用画像であることは調べていません。 本関数では、2枚の主画像のサイズは一致している必要があります。 本関数成功後に @ref GetLastWidth および @ref GetLastHeight を呼び出すと、主画像のサイズを取得できます。 一致していない場合、デコードに失敗します。 デコードできた主画像が2枚未満の場合も失敗します。 サムネイルはデコードしません。 デコード成功後に取得できるExif情報について 本関数は、MPエントリの格納順に2枚の立体視用画像をデコードします。
以下の関数で取得できるExif情報は、最後にデコードした(MPエントリの2番目に格納されている)画像のものになります。
・@ref GetLastDateTime
・@ref GetLastSoftwarePointer
・@ref GetLastSoftwareLength
・@ref GetLastUserMakerNotePointer
・@ref GetLastUserMakerNoteSize
・@ref GetLastImageUid
・@ref GetLastOrientation
・@ref GetLastGpsData
なお、以下の関数を呼び出しても問題ありませんが、推奨しません。
・@ref GetLastTwlPhotoMakerNote
・@ref GetLastTwlUserMakerNotePointer
・@ref GetLastTwlUserMakerNoteSize
画像毎にExif情報を取得する場合は、本関数を使わずに1枚ずつデコードするか、@ref ExtractExif を使ってください。 @param[out] dstL 先頭画像のデコード結果を格納するバッファを指定します。
出力ピクセルフォーマット(引数 dstPixelFormat)に応じたアラインメントが必要です。 @param[out] dstR 次の個別画像のデコード結果を格納するバッファを指定します。
出力ピクセルフォーマット(引数 dstPixelFormat)に応じたアラインメントが必要です。 @param[in] dstSize dstLおよびdstRのバイト数を指定します。
この値は画像1枚分のものであり、2枚分の和ではありません。
@ref GetDstBufferSize の返り値を指定してください。 @param[in] src デコードするMPフォーマットデータを指定します。 @param[in] srcSize srcのバイト数を指定します。 @param[in] maxWidth デコードを許す画像の最大横幅(pixel)を指定します。(65536未満)
デコード成功後は、@ref GetLastWidth で実際の画像横幅を、 @ref GetLastOutputBufferWidth でバッファの横幅(画像1枚分)を取得できます。 @param[in] maxHeight デコードを許す画像の最大縦幅(pixel)を指定します。(65536未満)
デコード成功後は、@ref GetLastHeight で実際の画像縦幅を、 @ref GetLastOutputBufferHeight でバッファの縦幅(画像1枚分)を取得できます。 @param[in] dstPixelFormat 出力ピクセルフォーマットを指定します。 @return 成功した場合、デコード結果を格納したバイト数を返します。
この値は画像1枚分のものであり、2枚分の和ではありません。
失敗した場合、0を返します。
失敗の原因は @ref GetLastError で取得できます。 */ size_t StartMpDecoderLR(void* dstL, void* dstR, size_t dstSize, const u8* src, size_t srcSize, u32 maxWidth, u32 maxHeight, PixelFormat dstPixelFormat); /*! @brief MPフォーマットで格納されたデータに含まれる、MPインデックスIFDを取得します。 取得したMPエントリは、@ref GetMpEntry や @ref GetMpAttribute 等で参照されます。 引数srcとsrcSizeで指定した領域は、取得したMPエントリが不要になるまで保持しておく必要があります。 本関数は、デコード処理と共通の処理を部分的に実行するため、 本関数呼び出し直後の @ref GetLastWidth 、@ref GetLastHeight 、 @ref GetLastOutputBufferWidth 、および @ref GetLastOutputBufferHeight 呼び出しや、 @ref GetLastDateTime 等のExif情報取得関数の呼び出しはできません(返り値は不定です)。 @param[out] pIndex MPインデックスIFDを格納するバッファを指定します。
格納されるデータ形式は、元データのMPインデックスIFDをライブラリで処理しやすい形式へ変換したものであり、 元データのバイナリ列とは異なります。 @param[in] src MPフォーマットデータの先頭を指定します。
MPインデックスIFDは先頭画像にのみ存在しますので、先頭画像を指定してください。 @param[in] srcSize srcのバイト数を指定します。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。
失敗の原因は @ref GetLastError で取得できます。 */ bool GetMpIndex(MpIndex* pIndex, const u8* src, size_t srcSize); /*! @brief MPインデックスIFDに含まれる、記録画像数を取得します。 @param[out] pNumber 記録画像数を格納するバッファを指定します。 @param[in] pIndex MPインデックスIFDを指定します。 あらかじめ、@ref GetMpIndex で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpNumberOfImages(u32* pNumber, const MpIndex* pIndex) { NN_ASSERT(pNumber); NN_ASSERT(pIndex); if (pIndex->isNumberOfImagesValid) { *pNumber = pIndex->numberOfImages; return true; } return false; } /*! @brief MPインデックスIFDに含まれる、個別画像ユニークIDリストのバイト数を取得します。 個別画像ユニークIDリストはMPフォーマットのオプションタグであり、どの画像でも取得できるとは限りません。 リストの1要素あたりのバイト数は、@ref MP_IMAGE_UID_SIZE (33) です。 リストへのバイトオフセットは、@ref GetMpImageUidListOffset で取得してください。 @param[in] pIndex MPインデックスIFDを指定します。 あらかじめ、@ref GetMpIndex で取得しておいてください。 @return 成功した場合、個別画像ユニークIDリストのバイト数を返します。
失敗した場合、0を返します。 */ static size_t GetMpImageUidListSize(const MpIndex* pIndex) { NN_ASSERT(pIndex); if (pIndex->imageUidListSize && pIndex->offsetToImageUidList) { return pIndex->imageUidListSize; } return 0; } /*! @brief MPインデックスIFDに含まれる、先頭画像から個別画像ユニークIDリストへのバイトオフセットを取得します。 個別画像ユニークIDリストはMPフォーマットのオプションタグであり、どの画像でも取得できるとは限りません。 リストのバイト数は、@ref GetMpImageUidListSize で取得してください。 取得したバイトオフセットと、@ref GetMpImagUidListSize で取得したバイト数で示される領域が正当かどうかは、 アプリケーションで確認する必要があります。 @param[in] pIndex MPインデックスIFDを指定します。 あらかじめ、@ref GetMpIndex で取得しておいてください。 @return 成功した場合、個別画像ユニークIDリストへのバイトオフセットを返します。
失敗した場合、0を返します。 */ static size_t GetMpImageUidListOffset(const MpIndex* pIndex) { NN_ASSERT(pIndex); if (pIndex->imageUidListSize && pIndex->offsetToImageUidList) { return pIndex->offsetToImageUidList; } return 0; } /*! @brief MPインデックスIFDに含まれる、撮影時総コマ数を取得します。 撮影時総コマ数はMPフォーマットのオプションタグであり、どの画像でも取得できるとは限りません。 @param[out] pFrames 撮影時総コマ数を格納するバッファを指定します。 @param[in] pIndex MPインデックスIFDを指定します。 あらかじめ、@ref GetMpIndex で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpTotalFrames(u32* pFrames, const MpIndex* pIndex) { NN_ASSERT(pFrames); NN_ASSERT(pIndex); if (pIndex->isTotalFramesValid) { *pFrames = pIndex->totalFrames; return true; } return false; } /*! @brief MPフォーマットで格納されたデータに含まれる、MPエントリを取得します。 MPエントリ全体のうち、指定された1個を取得します。 指定方法は、MPエントリ全体内の格納順です。0から始まります。 格納順は、MPフォーマットの個別画像番号とは異なります。 (個別画像番号は通常1から始まりますが、番号が連続しない場合や番号が付けられていない場合があります) 取得したMPエントリは、@ref GetMpImageOffset や @ref GetMpImageSize 等で参照されます。 @param[out] pEntry MPエントリを格納するバッファを指定します。
格納されるデータ形式は、元データのMPエントリをライブラリで処理しやすい形式へ変換したものであり、 元データのバイナリ列とは異なります。 @param[in] pIndex MPインデックスIFDを指定します。 あらかじめ、@ref GetMpIndex で取得しておいてください。 @param[in] index MPエントリ内の格納順を指定します。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。
失敗の原因は、引数が不正か、MPエントリが不正であると本関数が判断したためです。 */ static bool GetMpEntry(MpEntry* pEntry, const MpIndex* pIndex, u32 index); /*! @brief MPエントリに含まれる、個別画像種別管理情報を取得します。 @param[in] pEntry MPエントリを指定します。 あらかじめ、@ref GetMpEntry で取得しておいてください。 @return 個別画像種別管理情報を返します。
値は @ref MpTypeFlag 、@ref MpTypeDataFormat 、@ref MpTypeCode のビット論理和です。 */ static u32 GetMpImageType(const MpEntry* pEntry) { NN_ASSERT(pEntry); return pEntry->type; } /*! @brief MPエントリに含まれる、個別画像データのバイト数を取得します。 取得したバイト数と、(先頭画像へのポインタ + @ref GetMpImageOffset で取得したバイトオフセット) で示される領域が正当かどうかは、 アプリケーションで確認する必要があります。 @param[in] pEntry MPエントリを指定します。 あらかじめ、@ref GetMpEntry で取得しておいてください。 @return 個別画像データのバイト数を返します。 */ static size_t GetMpImageSize(const MpEntry* pEntry) { NN_ASSERT(pEntry); return pEntry->imageDataSize; } /*! @brief MPエントリに含まれる、先頭画像から個別画像データへのバイトオフセットを取得します。 取得したバイトオフセットと、@ref GetMpImageSize で取得したバイト数で示される領域が正当かどうかは、 アプリケーションで確認する必要があります。 @param[in] pEntry MPエントリを指定します。 あらかじめ、@ref GetMpEntry で取得しておいてください。 @return 個別画像データへのバイトオフセットを返します。
このオフセットは先頭画像データからのものであり、 MPフォーマットの「オフセットアドレスの基点」を処理済みです。 */ static size_t GetMpImageOffset(const MpEntry* pEntry) { NN_ASSERT(pEntry); return pEntry->offsetToImageData; } /*! @brief MPエントリに含まれる、従属画像1エントリ番号を取得します。 @param[in] pEntry MPエントリを指定します。 あらかじめ、@ref GetMpEntry で取得しておいてください。 @return 従属画像1エントリ番号を返します。 */ static u16 GetMpDependentImage1EntryNum(const MpEntry* pEntry) { NN_ASSERT(pEntry); return pEntry->dependentImage1EntryNum; } /*! @brief MPエントリに含まれる、従属画像2エントリ番号を取得します。 @param[in] pEntry MPエントリを指定します。 あらかじめ、@ref GetMpEntry で取得しておいてください。 @return 従属画像2エントリ番号を返します。 */ static u16 GetMpDependentImage2EntryNum(const MpEntry* pEntry) { NN_ASSERT(pEntry); return pEntry->dependentImage2EntryNum; } /*! @brief MPフォーマットで格納された個別画像データに含まれる、MP個別情報IFDを取得します。 MP個別情報IFDは、個別画像データに含まれます。 通常は、引数srcには (先頭画像へのポインタ + @ref GetMpImageOffset の返り値) を、 srcSizeには @ref GetMpImageSize の返り値を指定します。 あらかじめ、srcとsrcSizeで指定する領域が正当であることを確認してください。 個別画像のMP種別が @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 あるいは @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像) の場合、MPフォーマット付属情報 (およびMP個別情報IFD)を含まないため、本関数は失敗します。 本関数は、デコード処理と共通の処理を部分的に実行するため、 本関数呼び出し直後の @ref GetLastWidth 、@ref GetLastHeight 、 @ref GetLastOutputBufferWidth 、および @ref GetLastOutputBufferHeight 呼び出しや、 @ref GetLastDateTime 等のExif情報取得関数の呼び出しはできません(返り値は不定です)。 @param[out] pAttr MP個別情報IFDを格納するバッファを指定します。
格納されるデータ形式は、元データのMP個別情報IFDをライブラリで処理しやすい形式へ変換したものであり、 元データのバイナリ列とは異なります。 @param[in] src 個別画像データの先頭を指定します。 @param[in] srcSize srcのバイト数を指定します。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。
失敗の原因は @ref GetLastError で取得できます。 */ bool GetMpAttribute(MpAttribute* pAttr, const u8* src, size_t srcSize); /*! @brief MP個別情報IFDに含まれる、個別画像番号を取得します。 @param[out] pBuffer 個別画像番号を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpIndividualNum(u32* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isMpIndividualNumValid) { *pBuffer = pAttr->mpIndividualNum; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、画像配置を取得します。 @param[out] pBuffer 画像配置を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpPanOrientation(u32* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isPanOrientationValid) { *pBuffer = pAttr->panOrientation; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、水平オーバーラップを取得します。 @param[out] pBuffer 水平オーバーラップを格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpPanOverlapH(Rational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isPanOverlapHValid) { *pBuffer = pAttr->panOverlapH; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、垂直オーバーラップを取得します。 @param[out] pBuffer 垂直オーバーラップを格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpPanOverlapV(Rational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isPanOverlapVValid) { *pBuffer = pAttr->panOverlapV; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、基準視点番号を取得します。 @param[out] pBuffer 基準視点番号を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpBaseViewpointNum(u32* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isBaseViewpointNumValid) { *pBuffer = pAttr->baseViewpointNum; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、輻輳角を取得します。 @param[out] pBuffer 輻輳角を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpConvergenceAngle(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isConvergenceAngleValid) { *pBuffer = pAttr->convergenceAngle; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、基線長を取得します。 @param[out] pBuffer 基線長を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpBaselineLength(Rational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isBaselineLengthValid) { *pBuffer = pAttr->baselineLength; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、水平からのずれを取得します。 @param[out] pBuffer 水平からのずれを格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpVerticalDivergence(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isVerticalDivergenceValid) { *pBuffer = pAttr->verticalDivergence; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、水平軸方向の距離(X)を取得します。 @param[out] pBuffer 水平軸方向の距離(X)を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpAxisDistanceX(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isAxisDistanceXValid) { *pBuffer = pAttr->axisDistanceX; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、鉛直軸方向の距離(Y)を取得します。 @param[out] pBuffer 鉛直軸方向の距離(Y)を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpAxisDistanceY(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isAxisDistanceYValid) { *pBuffer = pAttr->axisDistanceY; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、視準軸方向の距離(Z)を取得します。 @param[out] pBuffer 視準軸方向の距離(Z)を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpAxisDistanceZ(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isAxisDistanceZValid) { *pBuffer = pAttr->axisDistanceZ; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、ヨー角を取得します。 @param[out] pBuffer ヨー角を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpYawAngle(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isYawAngleValid) { *pBuffer = pAttr->yawAngle; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、ピッチ角を取得します。 @param[out] pBuffer ピッチ角を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpPitchAngle(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isPitchAngleValid) { *pBuffer = pAttr->pitchAngle; return true; } return false; } /*! @brief MP個別情報IFDに含まれる、ロール角を取得します。 @param[out] pBuffer ロール角を格納するバッファを指定します。 @param[in] pAttr MP個別情報IFDを指定します。 あらかじめ、@ref GetMpAttribute で取得しておいてください。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ static bool GetMpRollAngle(Srational* pBuffer, const MpAttribute* pAttr) { NN_ASSERT(pBuffer); NN_ASSERT(pAttr); if (pAttr->isRollAngleValid) { *pBuffer = pAttr->rollAngle; return true; } return false; } /*! @brief MPフォーマットで格納された個別画像データから、JPEGデータを再構成するための領域情報を取得します。 MPフォーマットの個別画像データ構造は、簡単には「(JPEGヘッダ) + (APP2) + (JPEGデータ)」のようになっており、 APP2はMPフォーマット付属情報を含んでいます。 APP2を切り詰めれば、「(JPEGヘッダ) + (JPEGデータ)」となり、MPフォーマットではないJPEG形式のデータが得られます。 本関数は、「(JPEGヘッダ)」と「(JPEGデータ)」の領域情報(ポインタとバイト数)を取得します。 通常は、引数srcには (先頭画像へのポインタ + @ref GetMpImageOffset の返り値) を、 srcSizeには @ref GetMpImageSize の返り値を指定します。 あらかじめ、srcとsrcSizeで指定する領域が正当であることを確認してください。 個別画像のMP種別が @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_1 あるいは @ref MP_TYPE_CODE_LARGE_THUMBNAIL_IMAGE_CLASS_2 (モニタ表示用画像) の場合、MPフォーマット付属情報を含まないため、本関数は失敗します。 モニタ表示用画像はExif情報が省略されている可能性があるため、JPEGデータを再構成するためのデータとしては適しません。 本関数は、デコード処理と共通の処理を部分的に実行するため、 本関数呼び出し直後の @ref GetLastWidth 、@ref GetLastHeight 、 @ref GetLastOutputBufferWidth 、および @ref GetLastOutputBufferHeight 呼び出しや、 @ref GetLastDateTime 等のExif情報取得関数の呼び出しはできません(返り値は不定です)。 @param[out] pBuffer 領域情報を格納するバッファを指定します。 @param[in] src 個別画像データの先頭を指定します。 @param[in] srcSize srcのバイト数を指定します。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。
失敗の原因は @ref GetLastError で取得できます。 */ bool GetMpRegionsToBuildJpegData(MpRegionsToBuildJpegData* pBuffer, const u8* src, size_t srcSize); /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の横幅を取得します。 それらの処理が失敗した場合は0を返します。 @return 画像の横幅(pixel)。 */ u32 GetLastWidth() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の縦幅を取得します。 それらの処理が失敗した場合は0を返します。 @return 画像の縦幅(pixel)。 */ u32 GetLastHeight() const; /*! @brief 直前にデコードを行った出力画像バッファの横幅を取得します。 直前にデコードを行わずExif情報の抽出のみを行った場合は、本関数の呼び出しはできません。(返り値は不定です) @return 出力画像バッファの横幅(pixel)。
デコード前に @ref SetOutputBufferWidth で出力画像バッファの横幅を指定していた場合、 その値(をピクセルフォーマットに応じて切り下げたもの)と、 画像横幅(をピクセルフォーマットに応じて切り上げたもの)のうち、大きい方を返します。 失敗した場合は0を返します。 */ u32 GetLastOutputBufferWidth() const; /*! @brief 直前にデコードを行った出力画像バッファの縦幅を取得します。 直前にデコードを行わずExif情報の抽出のみを行った場合は、本関数の呼び出しはできません。(返り値は不定です) @return 出力画像バッファの縦幅(pixel)。
画像縦幅をピクセルフォーマットに応じて切り上げたものです。
失敗した場合は0を返します。 */ u32 GetLastOutputBufferHeight() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の撮影日時を取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。
この情報は、IFD0 の DateTime タグに登録されていたものです。 @param[out] pBuffer 日時情報を格納するバッファです。 バッファのバイト数は @ref DATE_TIME_SIZE (20) です。
取得できる日時情報フォーマットは「YYYY:MM:DD HH:MM:DD」+0x00 の 20 文字になります。 @return 成功した場合、@ref DATE_TIME_SIZE (20) を返します。 失敗した場合、0を返します。 */ size_t GetLastDateTime(char* pBuffer) const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、ソフトウェア名への文字列ポインタを取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。
この情報は、IFD0 の Software タグに登録されていたものです。 文字列がゼロ終了していない場合は失敗します。 文字数は @ref GetLastSoftwareLength で取得できます。 @return 成功した場合、ソフトウェア名への文字列ポインタを返します。 ただし、成功しても文字数(末尾の '\0' を除く)が0の場合、NULLを返します。
失敗した場合、NULLを返します。 */ const char* GetLastSoftwarePointer() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、ソフトウェア名の文字数を取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。
この情報は、IFD0 の Software タグに登録されていたものです。 文字列がゼロ終了していない場合は失敗します。 文字列ポインタは @ref GetLastSoftwarePointer で取得できます。 @return 成功した場合、文字列の文字数(末尾の '\0' を除く)を返します。 従って、成功しても0を返す場合があります。
失敗した場合、0を返します。 */ size_t GetLastSoftwareLength() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 CTRアプリケーション用メーカーノートへのポインタを取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。 データのバイト数は @ref GetLastUserMakerNoteSize で取得できます。 データのバイト数が0の場合は本関数も失敗します。 本関数が成功しても、その画像がCTRアプリケーションで撮影されたものであるとは限りません。 @return 成功した場合、メーカーノートへのポインタを返します。 失敗した場合、NULLを返します。 */ const u8* GetLastUserMakerNotePointer() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 CTRアプリケーション用メーカーノートのバイト数を取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。 データへのポインタは @ref GetLastUserMakerNotePointer で取得できます。 本関数が成功しても、その画像がCTRアプリケーションで撮影されたものであるとは限りません。 @return 成功した場合、メーカーノートのバイト数を返します。 失敗した場合、0を返します。 */ size_t GetLastUserMakerNoteSize() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、「ニンテンドーDSiカメラ」(ニンテンドーDSi本体内蔵のアプリケーション名) 用メーカーノートを取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。 本関数が成功しても、その画像がニンテンドーDSiカメラで撮影されたものであるとは限りません。 @param[out] pBuffer メーカーノートを格納するバッファです。 バッファのバイト数は TWL_PHOTO_MAKER_NOTE_SIZE (8) です。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ bool GetLastTwlPhotoMakerNote(u8* pBuffer) const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 ニンテンドーDSiアプリケーション用メーカーノートへのポインタを取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。 データのバイト数は @ref GetLastTwlUserMakerNoteSize で取得できます。 データのバイト数が0の場合は本関数も失敗します。 本関数が成功しても、その画像がニンテンドーDSiアプリケーションで撮影されたものであるとは限りません。 CTRアプリケーション用メーカーノートの取得は、 @ref GetLastUserMakerNotePointer および @ref GetLastUserMakerNoteSize を使ってください。 @return 成功した場合、メーカーノートへのポインタを返します。 失敗した場合、NULLを返します。 */ const u8* GetLastTwlUserMakerNotePointer() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、 ニンテンドーDSiアプリケーション用メーカーノートのバイト数を取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。 データへのポインタは @ref GetLastTwlUserMakerNotePointer で取得できます。 本関数が成功しても、その画像がニンテンドーDSiアプリケーションで撮影されたものであるとは限りません。 CTRアプリケーション用メーカーノートの取得は、 @ref GetLastUserMakerNotePointer および @ref GetLastUserMakerNoteSize を使ってください。 @return 成功した場合、メーカーノートのバイト数を返します。 失敗した場合、0を返します。 */ size_t GetLastTwlUserMakerNoteSize() const; /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、Exif IFDの画像ユニークIDを取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。
この情報は、Exif IFDの ImageUniqueID タグに登録されていたものです。 MPインデックスIFDに含まれる、個別画像ユニークIDリストの取得は、 @ref GetMpImageUidListOffset および @ref GetMpImageUidListSize を使ってください。 @param[out] pBuffer 画像ユニークIDを格納するバッファです。
文字列は128ビットの整数値を16進数表記したASCII文字列(32文字)で、 バイト数は末尾の '\0' を含み @ref IMAGE_UID_SIZE (33) バイトです。 @return 成功した場合、@ref IMAGE_UID_SIZE (33) を返します。 失敗した場合、0を返します。 */ size_t GetLastImageUid(char* pBuffer); /*! @brief 直前にデコードあるいはExif情報の抽出を行った画像の、Exif IFDの画像方向を取得します。 それらの処理が失敗した場合は、本関数も失敗します。 取得には画像データが必要です。破棄しないでください。
この情報は、IFD0の Orientation タグに登録されていたものです。 @param[out] pBuffer 画像方向を格納するバッファです。 @return 成功した場合、trueを返します。 失敗した場合、falseを返します。 */ bool GetLastOrientation(u16* pBuffer); // リファレンスは追って作成します。 // GPS情報が登録されていた場合、trueを返します。 // 登録されていなかった場合、falseを返します。pBufferが指すバッファ内容は変更しません。 // 本関数成功後も、GPS情報の各値を取得するためには画像データが必要です。破棄しないでください。 bool GetLastGpsData(GpsData* pBuffer); static const u8* GetGpsVersionId(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isVersionIdValid ? pGps->versionId : NULL; } static char GetGpsLatitudeRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->latitudeRef[0]; } static const Rational* GetGpsLatitude(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isLatitudeValid ? pGps->latitude : NULL; } static char GetGpsLongitudeRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->longitudeRef[0]; } static const Rational* GetGpsLongitude(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isLongitudeValid ? pGps->longitude : NULL; } static bool GetGpsAltitudeRef(u8* pBuffer, const GpsData* pGps) { NN_ASSERT(pBuffer); NN_ASSERT(pGps); if (pGps->isAltitudeRefValid) { *pBuffer = pGps->altitudeRef; } return pGps->isAltitudeRefValid; } static const Rational* GetGpsAltitude(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isAltitudeValid ? (&pGps->altitude) : NULL; } static const Rational* GetGpsTimeStamp(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isTimeStampValid ? pGps->timeStamp : NULL; } static const char* GetGpsSatellites(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->pSatellites; } static char GetGpsStatus(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->status[0]; } static char GetGpsMeasureMode(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->measureMode[0]; } static const Rational* GetGpsDop(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isDopValid ? (&pGps->dop) : NULL; } static char GetGpsSpeedRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->speedRef[0]; } static const Rational* GetGpsSpeed(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isSpeedValid ? (&pGps->speed) : NULL; } static char GetGpsTrackRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->trackRef[0]; } static const Rational* GetGpsTrack(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isTrackValid ? (&pGps->track) : NULL; } static char GetGpsImgDirectionRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->imgDirectionRef[0]; } static const Rational* GetGpsImgDirection(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isImgDirectionValid ? (&pGps->imgDirection) : NULL; } static const char* GetGpsMapDatum(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->pMapDatum; } static char GetGpsDestLatitudeRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->destLatitudeRef[0]; } static const Rational* GetGpsDestLatitude(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isDestLatitudeValid ? pGps->destLatitude : NULL; } static char GetGpsDestLongitudeRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->destLongitudeRef[0]; } static const Rational* GetGpsDestLongitude(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isDestLongitudeValid ? pGps->destLongitude : NULL; } static char GetGpsDestBearingRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->destBearingRef[0]; } static const Rational* GetGpsDestBearing(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isDestBearingValid ? (&pGps->destBearing) : NULL; } static char GetGpsDestDistanceRef(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->destDistanceRef[0]; } static const Rational* GetGpsDestDistance(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->isDestDistanceValid ? (&pGps->destDistance) : NULL; } static const u8* GetGpsProcessingMethodPointer(const GpsData* pGps) { NN_ASSERT(pGps); if (pGps->pProcessingMethod && pGps->processingMethodSize) { return pGps->pProcessingMethod; } return NULL; } static size_t GetGpsProcessingMethodSize(const GpsData* pGps) { NN_ASSERT(pGps); if (pGps->pProcessingMethod && pGps->processingMethodSize) { return pGps->processingMethodSize; } return 0; } static const u8* GetGpsAreaInformationPointer(const GpsData* pGps) { NN_ASSERT(pGps); if (pGps->pAreaInformation && pGps->areaInformationSize) { return pGps->pAreaInformation; } return NULL; } static size_t GetGpsAreaInformationSize(const GpsData* pGps) { NN_ASSERT(pGps); if (pGps->pAreaInformation && pGps->areaInformationSize) { return pGps->areaInformationSize; } return 0; } static const char* GetGpsDateStamp(const GpsData* pGps) { NN_ASSERT(pGps); return pGps->pDateStamp; } static bool GetGpsDifferential(u16* pBuffer, const GpsData* pGps) { NN_ASSERT(pBuffer); NN_ASSERT(pGps); if (pGps->isDifferentialValid) { *pBuffer = pGps->differential; } return pGps->isDifferentialValid; } /*! @brief 直前に行ったデコード等の、失敗原因を取得します。 以下の関数呼び出し後に失敗原因が更新されます。(成功した場合は0になります)
@ref StartJpegDecoder 、@ref StartJpegDecoderShrink 、@ref ExtractExif 、 @ref StartMpDecoderLR 、@ref GetMpIndex 、@ref GetMpAttribute 、@ref GetMpRegionsToBuildJpegData @return 直前の処理が成功した場合、@ref JPEG_DECODER_ERROR_NONE (0) を返します。 デコーダオブジェクトの初期化直後および再初期化直後も0を返します。
失敗した場合、0以外の値を返します。リファレンスは追って作成します。 */ s32 GetLastError() const; /*! @brief 別スレッドから、デコード処理中止を要求します。 本関数は、デコーダオブジェクト内部へ「中止要求(フラグ)」をセットします。 デコード関数( @ref StartJpegDecoder 、@ref StartJpegDecoderShrink 、@ref StartMpDecoderLR )が、 このフラグを監視してデコード処理を中止します。 基本的に、デコーダオブジェクトはスレッドセーフではないため、複数スレッドから同一デコーダオブジェクトへはアクセスできません。 ただし、デコーダオブジェクトが有効である(初期化済み、かつ終了していない)ことをアプリケーションで確認できる期間中は、 別スレッドから同一デコーダオブジェクトの本関数を呼ぶことができます。 一般的に、JPEG画像のデコードには時間がかかります。 アプリケーションはメインスレッドの応答速度を維持するため、デコード用に別スレッドを使うことがあります。 例えば複数の画像を一覧するような場面で、一旦着手した画像のデコードを中止したい場合に、 デコード用スレッドよりも優先度の高い別スレッド(メインスレッドやアラームハンドラ)から、 本関数を呼ぶことができます。 中止要求は、デコード関数が内部主処理の直前にクリアします。 以下の制限により、本関数を一度呼んだだけでは、確実にデコード処理を中止できるとは限りません。 1. デコード用スレッドがデコード関数を呼ぶ前、およびデコード内部主処理に達する前は、中止できません。
2. デコード内部主処理が完了した後は、中止できません。(他にエラーが発生していなければ、デコードに成功します)
3. @ref StartMpDecoderLR は、2枚の画像デコード毎にフラグをクリアします。 1枚目のデコード完了直後から2枚目のデコード開始直前の期間は、中止できません。 上記 1. および 3. に対応するため、デコードが中止できたこと、あるいは成功失敗にかかわらず終了したことが確認できるまで、 本関数を繰り返し(例えばゲームフレーム毎に)呼んでください。 デコード関数が中止要求を受け付けた場合、デコード失敗時と同じ値 (0) を返します。 (@ref GetLastError が返すエラーコードは、他のエラーが発生していなければ @ref JPEG_DECODER_ERROR_STOPPED です) 中止要求は取り消しできません。また、中止時点からのデコード再開はできません。 @return なし。 */ void StopDecoder(); /*! @brief デコーダオブジェクトの終了処理を行います。 @return なし。 */ void Finalize() { m_Initialized = false; } /*! @brief デストラクタです。 内部で Finalize() を呼びます。 */ ~JpegMpDecoder() { Finalize(); } protected: detail::JpegMpDecoderWorkObj* m_pWork; bool m_Initialized; bool m_Padding[3]; detail::JpegMpDecoderTemporarySettingObj m_TemporarySetting; void ClearTemporarySetting(); const u8* GetLastMakerNotePointer(u32 index) const; size_t GetLastMakerNoteSize(u32 index) const; }; } // namespace CTR { } // namespace jpeg { } // namespace nn { #endif // __cplusplus #endif // NN_JPEG_JPEGMPDECODER_H_