MSET用のImageDBを追加

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@690 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2012-04-25 00:56:48 +00:00
parent 0d14ccf41e
commit e4fddb3dda
52 changed files with 13130 additions and 0 deletions

View File

@ -0,0 +1,496 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDatabase.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DATABASE_H_
#define IMAGE_DATABASE_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbSingleton.h"
#include "ImageDbResult.h"
#include "ImageDbConst.h"
#include "ImageDbSearchObject.h"
#include "ImageDbRecord.h"
#include "ImageDbRecordParam.h"
#include "ImageDbPictureDatabase.h"
#include "ImageDbImageCollector.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
NANDやSDカードに保存されている写真
TWLのTCLライブラリの管理ファイル操作関連に似せています
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageDatabase : public Singleton<ImageDatabase>
{
friend class ImageDbSearchObject;
friend class Allocator;
public:
//------------------------------------------------------------------------
// 初期化関連
//------------------------------------------------------------------------
/*!----------------------------------------------------------------------
@brief
@param[in] bInitDbNand NAND側データベースを使用するフラグ
@param[in] bInitDbSd SD側データベースを使用するフラグ
-----------------------------------------------------------------------*/
void Initialize(bool bInitDbNand, bool bInitDbSd);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Finalize();
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
bool IsInitialized() const;
/*!----------------------------------------------------------------------
@brief
@details
ImageDbはスレッドセーフではありませんが
LoadDatabase()
RestoreDatabase()
ReflectImageCollector()
-----------------------------------------------------------------------*/
void StopProcess();
//-----------------------------------------------------------------------
// データベース関連
//-----------------------------------------------------------------------
/*!----------------------------------------------------------------------
@brief 調
@param[in] eStoType
@return true
@details
ResultErrorNeedRestoreを返すようになりますRestoreDatabase()
falseを返します
-----------------------------------------------------------------------*/
bool IsNeedRestore(StorageType eStoType) const;
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@details
ResultErrorNeedRestoreを返します
ResultErrorNeedRestoreを返すようになります
RestoreDatabase()
ResultSuccessを返します
StopProcess()
ResultErrorStoppedを返し
IsNeedRestore()true
-----------------------------------------------------------------------*/
Result LoadDatabase(StorageType eStoType);
/*!----------------------------------------------------------------------
@brief 調
@param[in] eStoType
@return true
@details
LoadDatabase()
falseを返します
-----------------------------------------------------------------------*/
bool IsExistNewerDatabase(StorageType eStoType) const;
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@details
調
ResultSuccessを返します
StopProcess()
-----------------------------------------------------------------------*/
Result RestoreDatabase(StorageType eStoType);
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@details
ResultSuccessを返します
-----------------------------------------------------------------------*/
Result CreateDatabase(StorageType eStoType);
//------------------------------------------------------------------------
// 画像登録関連
//------------------------------------------------------------------------
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@return
@details
-----------------------------------------------------------------------*/
int GetEmptyImageNum(StorageType eStoType) const;
/*!----------------------------------------------------------------------
@brief 使
@param[in] eStoType
@return 使
@details
-----------------------------------------------------------------------*/
int GetRegisteredImageNum(StorageType eStoType) const;
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@return
@details
-----------------------------------------------------------------------*/
int GetMaxImageNum(StorageType eStoType) const;
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] eImgKind
@param[in] rRecParam
@param[in] bSave
@param[out] pLink
@details
pLinkから求まるファイルパスへ保存してください
RegisterImagePost()
ResultErrorを返します
rRecParamはPost側でも指定できますPre側の段階で設定できる情報はできる
Pre側で設定してくださいPostが行えなかったと
bSaveにfalseを指定すると管理ファイルの保存は行われません
RegisterImagePost()
trueを指定してください
-----------------------------------------------------------------------*/
Result RegisterImagePre(
StorageType eStoType, ImageKind eImgKind,
const ImageDbRecordParam& rRecParam, bool bSave,
ImageDbRecordLink* pLink);
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@param[in] rRecParam
@param[in] nImageDataSize
@details
pLinkから求まるファイルパスへ保存してください
ResultErrorを返します
Pre側で設定した映像情報はPost側の設定ですべて上書きされます
-----------------------------------------------------------------------*/
Result RegisterImagePost(
const ImageDbRecordLink& rLink,
const ImageDbRecordParam& rRecParam, std::size_t nImageDataSize);
/*!----------------------------------------------------------------------
@brief JPEGを管理ファイルに登録する
@param[in] eStoType
@param[in] pJpegData JPEGデータ
@param[in] nJpegDataSize JPEGデータのサイズ
@param[in] rRecParam
@param[out] pLink
@details
JPEGを管理ファイルに登録し
nSecondを省略した場合は現在の時間が設定されます
ResultErrorを返します
-----------------------------------------------------------------------*/
Result RegisterJpeg(
StorageType eStoType,
const void* pJpegData, std::size_t nJpegDataSize,
const ImageDbRecordParam& rRecParam,
ImageDbRecordLink* pLink = 0);
/*!----------------------------------------------------------------------
@brief MPを管理ファイルに登録する
@param[in] eStoType
@param[in] pMpData MPデータ
@param[in] nMpDataSize MPデータのサイズ
@param[in] pJpegData JPEGデータ
@param[in] nJpegDataSize JPEGデータのサイズ
@param[in] rRecParam
@param[out] pLink
@details
MPを管理ファイルに登録し
JPEGデータの指定がない場合はMPデータの左画像が利用されます
JPEGのExifはMPデータのExifをもとに設定されます
nSecondを省略した場合は現在の時間が設定されます
ResultErrorを返します
-----------------------------------------------------------------------*/
//@{
Result RegisterMp(
StorageType eStoType,
const void* pMpData, std::size_t nMpDataSize,
const ImageDbRecordParam& rRecParam,
ImageDbRecordLink* pLink = 0);
#if 0
Result RegisterMp(
StorageType eStoType,
const void* pMpData, std::size_t nMpDataSize,
const void* pJpegData, std::size_t nJpegDataSize,
const ImageDbRecordParam& rRecParam,
ImageDbRecordLink* pLink = 0);
#endif
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@param[in] eStoType
@param[out] pUnregNum
@param[out] pTotalNum
@details
ResultErrorを返します
-----------------------------------------------------------------------*/
//@{
Result UnregisterImage(const ImageDbRecordLink& rLink);
Result UnregisterImage(StorageType eStoType, int* pUnregNum = 0, int *pTotalNum = 0);
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] rLinkSrc
@param[in] eStoTypeSrc
@param[in] pSrcData
@param[in] nSrcDataSize
@param[in] eStoTypeDst
@param[out] pLinkDst
@param[out] rResultSrc
@param[out] rResultDst
@details
pSrcDataとnSrcDataSizeで
JPEGやMPなど適切なデータを指定してください
-----------------------------------------------------------------------*/
//@{
bool DuplicateImage(
const ImageDbRecordLink& rLinkSrc,
StorageType eStoTypeDst, ImageDbRecordLink* pLinkDst,
Result& rResultSrc, Result& rResultDst);
bool DuplicateImage(
const ImageDbRecordLink& rLinkSrc,
void* pSrcData, std::size_t nSrcDataSize,
StorageType eStoTypeDst, ImageDbRecordLink* pLinkDst,
Result& rResultSrc, Result& rResultDst);
//@}
//------------------------------------------------------------------------
// 検索関連
//------------------------------------------------------------------------
/*!----------------------------------------------------------------------
@brief
@param[in] rSearch
-----------------------------------------------------------------------*/
void CreateSearchObject(ImageDbSearchObject& rSearch);
//------------------------------------------------------------------------
// レコード関連
//------------------------------------------------------------------------
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@return
@details
rLinkのレコードの種類に応じてPictureDbRecordまたは
MovieDbRecordクラスにダウンキャスト可能です
-----------------------------------------------------------------------*/
const ImageDbRecord* FindRecord(const ImageDbRecordLink& rLink) const;
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@param[out] rRecParam
-----------------------------------------------------------------------*/
Result GetRecordParam(
const ImageDbRecordLink& rLink, ImageDbRecordParam& rRecParam) const;
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@param[out] rValidityStateTblRec
@details
FindRecord()ImageDbRecordの
GetValidityStateTableRecord()
-----------------------------------------------------------------------*/
Result GetRecordValidityState(
const ImageDbRecordLink& rLink,
ValidityStateTableRecord& rValidityStateTblRec) const;
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@param[in] rValidityStateTblRec
@details
-----------------------------------------------------------------------*/
Result SetRecordValidityState(
const ImageDbRecordLink& rLink,
const ValidityStateTableRecord& rValidityStateTblRec);
//------------------------------------------------------------------------
// コレクター関連
//------------------------------------------------------------------------
/*!----------------------------------------------------------------------
@brief
@param[in,out] rCollector
@param[in] eStoType
-----------------------------------------------------------------------*/
void CreateImageCollector(ImageCollector& rCollector, StorageType eStoType) const;
/*!----------------------------------------------------------------------
@brief
@param[in,out] rCollector
@details
StopProcess()
ResultErrorStoppedを返し
IsNeedRestore()true
-----------------------------------------------------------------------*/
Result ReflectImageCollector(const ImageCollector& rCollector);
private:
// シングルトン
ImageDatabase();
virtual ~ImageDatabase();
// 中止要求関連
bool IsRequestStop() const;
void ResetRequestStop();
// 映像データベース関連
bool IsAvailableDatabase(StorageType eStoType) const;
bool GetFileDatabaseSaveCount(
u32& rSaveCnt, StorageType eStoType) const;
Result UpdateNewerDatabase(StorageType eStoType);
// 復元必要フラグ関連
void SetNeedRestore(StorageType eStoType);
void ResetNeedRestore(StorageType eStoType);
// 管理テーブル関連
Result SaveDatabase(StorageType eStoType);
void ResetTable(StorageType eStoType);
Result ReadPictureDatabase(StorageType eStoType, bool bTwlCompatible);
Result WritePictureDatabase(StorageType eStoType, bool bTwlCompatible, bool bInvalidCrc=false);
// TWL写真管理とCTR管理情報のつじつま合わせ
Result SyncPictureDatabaseWithTwl(StorageType eStoType);
Result SortPictureDatabaseCtrAndTwl(StorageType eStoType);
Result SyncPictureDatabaseDelSizeZero(StorageType eStoType);
Result SyncPictureDatabaseCore(StorageType eStoType);
// レコード関連
ImageDbRecord* FindRecordMutable(const ImageDbRecordLink& rLink){
return const_cast<ImageDbRecord*>(static_cast<const ImageDatabase&>(*this).FindRecord(rLink)); }
Result CreateRecordLink(
ImageDbRecordLink& rLink,
StorageType eStoType, const DateTimeSeconds& rCreateSeconds, ImageKind eImgKind,
const ImageDbRecordParam& rRecParam, s64 nImgDataSize1);
Result CreateRecordLinkByIndexInfo(
ImageDbRecordLink& rLink,
StorageType eStoType, const DateTimeSeconds& rCreateSeconds, ImageKind eImgKind,
const ImageDbRecordParam& rRecParam, s64 nImageSize, const IndexInfo& rIdxInfo);
Result CreateRecordLinkByImageInfo(
ImageDbRecordLink& rLink, StorageType eStoType,
const ImageDbRecordParam& rRecParam, s64 nImageSize, const ImageInfo& rImgInfo);
Result UnregisterRecord(const ImageDbRecordLink& rLink);
Result UnregisterRecord(const ImageDbRecordLink& rLink, ImageDbRecord& rImgRec);
Result UnregisterRecord(StorageType eStoType, int nRecIndex, ImageDbRecord& rImgRec);
void InsertRecordLinkList(
RecordLinkList& rLinkList, const ImageDbRecordLink& rLink) const;
std::size_t FindRecordLinkListInsertPos(
const RecordLinkList& rLinkList, const ImageDbRecordLink& rLink) const;
void InsertValidPictureRecordToList(
StorageType eStoType, RecordLinkList& rLinkList);
static void StoreImageDbRecordFromParam(
ImageDbRecord& rImgRec,
const ImageDbRecordParam& rRecParam, ImageKind eImgKind);
static void StorePictureDbRecordFromParam(
PictureDbRecord& rPicRec,
const ImageDbRecordParam & rRecParam, ImageKind eImgKind);
// 映像関連
Result RegisterImage(
StorageType eStoType, ImageKind eImgKind,
const void* pImgData1, std::size_t nImgDataSize1,
const void* pImgData2, std::size_t nImgDataSize2,
const ImageDbRecordParam& rRecParam,
bool bSave,
const IndexInfo* pIdxInfo = 0,
ImageDbRecordLink* pLink = 0);
// コレクター関連
bool RegisterNewPictureFromImageCollector(
StorageType eStoType, const ImageCollectionTableRecord& rColRec, bool bValidate);
static void SetImageCollectionTableRecordByExistence(
ImageCollectionTableRecord& rColTblRec, const ImageInfo& rImgInfo);
static bool CompImageInfoFileStr(
const ImageInfo& rImgInfo,
const wchar_t* pDirName, const wchar_t* pFileName, const wchar_t* pExt);
void ReflectImageCollectorPictureLost(const ImageCollector& rCollector);
void ReflectImageCollectorPictureNew(const ImageCollector& rCollector);
void ReflectImageCollectorPictureChange(const ImageCollector& rCollector);
private:
// 映像データベース初期化済みフラグ
bool m_bInitialized;
// 処理中止要求
volatile bool m_bReqStop;
// 復元必要フラグ
bool m_bNeedRestoreFlag[StorageTypeNum];
// データベース
PictureDatabase m_PictDb[StorageTypeNum];
// NAND/SD合わせて現在管理しているデータのレコードリンクのリスト日付順でソート済み
RecordLinkList m_lRecordLinkList;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DATABASE_H_

View File

@ -0,0 +1,220 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbAllocator.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_ALLOCATOR_H_
#define IMAGE_DB_ALLOCATOR_H_
#include <limits>
#include <nn/types.h>
#include <nn/fnd.h>
namespace imgdb {
class Allocator;
/*!--------------------------------------------------------------------------*
@brief 使
*---------------------------------------------------------------------------*/
Allocator* GetAllocator();
/*!--------------------------------------------------------------------------*
@brief 使
@details
使
*---------------------------------------------------------------------------*/
Allocator* GetFileAllocator();
/*!--------------------------------------------------------------------------*
@brief 使
*---------------------------------------------------------------------------*/
void SetAllocator(nn::fnd::IAllocator* pAllocator, nn::fnd::IAllocator* pFileAllocator);
/*!--------------------------------------------------------------------------*
@brief 使
*---------------------------------------------------------------------------*/
void ResetAllocator();
/*!--------------------------------------------------------------------------*
@brief ImageDbアロケータ
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class Allocator : private nn::util::NonCopyable<Allocator>
{
public:
static const int c_nDefaultAlignment = 4;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
Allocator() : m_pAllocator(0){}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~Allocator(){ Release(); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsInitialized() const{ return (0 != m_pAllocator); }
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
-----------------------------------------------------------------------*/
void Initialize(nn::fnd::IAllocator& rAllocator){
NN_ASSERT(!IsInitialized());
if(!IsInitialized()){
m_pAllocator = &rAllocator;
}
}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Release(){ m_pAllocator = 0; }
/*!----------------------------------------------------------------------
@brief
@param[in] nSize
@param[in] nAligment
@return
-----------------------------------------------------------------------*/
void* Alloc(size_t nSize, int nAligment=c_nDefaultAlignment){
NN_NULL_ASSERT(m_pAllocator);
return m_pAllocator->Allocate(nSize, static_cast<u8>(nAligment));
}
/*!----------------------------------------------------------------------
@brief
@param[in] nSize
@param[in] nAligment
@return
-----------------------------------------------------------------------*/
template<typename TObject>
TObject* AllocAndConstruct(std::size_t nSize, int nAligment=c_nDefaultAlignment){
TObject* pObj = static_cast<TObject*>(Alloc(sizeof(TObject)*nSize, nAligment));
if(0 != pObj){
for(std::size_t i = 0; i < nSize; ++i){
Construct(&pObj[i]);
}
}
return pObj;
}
/*!----------------------------------------------------------------------
@brief
@param[in] pAddr
-----------------------------------------------------------------------*/
void Free(void* pAddr){
NN_NULL_ASSERT(m_pAllocator);
m_pAllocator->Free(pAddr);
}
/*!----------------------------------------------------------------------
@brief
@param[in] pObj
@param[in] nSize
-----------------------------------------------------------------------*/
template<typename TObject>
void DestructAndFree(TObject* pObj, std::size_t nSize){
if(0 != pObj){
for(std::size_t i = 0; i < nSize; ++i){
Destruct(&pObj[i]);
}
Free(pObj);
}
}
private:
template<typename TObject>
void Construct(TObject* pObj){ new(static_cast<void*>(pObj)) TObject; }
template<typename TObject>
void Destruct(TObject* pObj){ pObj->~TObject(); }
private:
nn::fnd::IAllocator* m_pAllocator;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief STL関連で使用するアロケータ
@details
GetAllocator()使
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
template<typename T>
class XAllocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template <class U> struct rebind { typedef XAllocator<U> other; };
XAllocator() throw(){}
XAllocator(const XAllocator&) throw(){}
template <typename U> XAllocator(const XAllocator<U>&) throw(){}
~XAllocator() throw(){}
pointer address(reference value) const { return &value; }
const_pointer address(const_reference value) const { return &value; }
pointer allocate(size_type num, void* hint = 0){
(void)(&hint);
return static_cast<pointer>(GetAllocator()->Alloc(num * sizeof(T), 32));
}
void deallocate(pointer p, size_type num){
(void)(&num);
GetAllocator()->Free(static_cast<pointer>(p));
}
size_type max_size() const throw(){
return std::numeric_limits<size_t>::max() / sizeof(T);
}
void construct(pointer p, const T& value) { new( (void*)p ) T(value); }
void destroy(pointer p){ p->~T(); }
};
template<typename T>
bool operator==(const XAllocator<T>&, const XAllocator<T>&){ return true; }
template<typename T>
bool operator!=(const XAllocator<T>&, const XAllocator<T>&){ return false; }
template<>
class XAllocator<void>
{
public:
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<class U> struct rebind { typedef XAllocator<U> other; };
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_ALLOCATOR_H_

View File

@ -0,0 +1,328 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbArchiveMounter.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_ARCHIVE_MOUNTER_H_
#define IMAGE_DB_ARCHIVE_MOUNTER_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbSingleton.h"
#include "ImageDbAllocator.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
class ArchiveMounter
{
public:
/*!----------------------------------------------------------------------
@brief
@return true
@details
-----------------------------------------------------------------------*/
virtual bool Mount() = 0;
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
virtual void Unmount() = 0;
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
virtual bool IsMount() const = 0;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
virtual s64 GetFreeSize() const = 0;
protected:
virtual ~ArchiveMounter() = 0;
};
/*!--------------------------------------------------------------------------*
@brief SDカード領域マウントクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class SdArchiveMounter : public Singleton<SdArchiveMounter>
, public ArchiveMounter
, private nn::util::NonCopyable<SdArchiveMounter>
{
friend class Allocator;
public:
// SDカードのアーカイブ名 例:"$phtsd"
static const char* c_pArchiveName;
static const wchar_t* c_pWArchiveName;
// SDカードのアーカイブ名の文字数
static const int c_nArchiveNameLength = 6;
// SDカードのコロンつきアーカイブ名 例:"$phtsd:"
static const char* c_pArchiveNameWithColon;
static const wchar_t* c_pWArchiveNameWithColon;
// SDカードのコロンつきアーカイブ名の文字数
static const int c_nArchiveNameLengthWithColon = c_nArchiveNameLength + 1;
// SDカードの仮想アーカイブ名 例:"$_sdmc"
static const char* c_pVirtualArchiveName;
static const wchar_t* c_pWVirtualArchiveName;
// SDカードの仮想アーカイブ名の文字数
static const int c_nVirtualArchiveNameLength = 6;
// SDカードのコロンつき仮想アーカイブ名 例:"$_sdmc:"
static const char* c_pVirtualArchiveNameWithColon;
static const wchar_t* c_pWVirtualArchiveNameWithColon;
// SDカードのコロンつき仮想アーカイブ名の文字数
static const int c_nVirtualArchiveNameLengthWithColon = c_nVirtualArchiveNameLength + 1;
public:
/*!----------------------------------------------------------------------
@brief SDカード領域をマウントする
@return true
@details
falseを返します
-----------------------------------------------------------------------*/
virtual bool Mount();
/*!----------------------------------------------------------------------
@brief SDカード領域をアンマウントする
@details
-----------------------------------------------------------------------*/
virtual void Unmount();
/*!----------------------------------------------------------------------
@brief SDカード領域をマウントしているかチェックする
@return true
-----------------------------------------------------------------------*/
virtual bool IsMount() const;
/*!----------------------------------------------------------------------
@brief SDカード領域の空きサイズを取得する
@return
@details
SDカードが抜けているなどでサイズが取得できない場
-----------------------------------------------------------------------*/
virtual s64 GetFreeSize() const;
/*!----------------------------------------------------------------------
@brief SDカード領域の総容量サイズを取得する
@return
@details
SDカードが抜けているなどでサイズが取得できない場
-----------------------------------------------------------------------*/
s64 GetTotalSize() const;
/*!----------------------------------------------------------------------
@brief SDカードが挿入されているかチェックする
@return true
@details
-----------------------------------------------------------------------*/
static bool IsInsert();
/*!----------------------------------------------------------------------
@brief SDカードが書き込み可能かチェックする
@return true
@details
SDカードが挿入されOffになっていれば書き込み
-----------------------------------------------------------------------*/
static bool IsWritable();
/*!----------------------------------------------------------------------
@brief SDカードが壊れているかチェックする
@return true
@details
SDカードをマウントした時のメディアの状態となります
-----------------------------------------------------------------------*/
bool IsBadMedia() const;
private:
// シングルトン
SdArchiveMounter();
virtual ~SdArchiveMounter();
private:
bool m_bMount;
bool m_bIsBadMedia;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief CTR-NAND領域マウントクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class CtrNandArchiveMounter : public Singleton<CtrNandArchiveMounter>
, public ArchiveMounter
, private nn::util::NonCopyable<CtrNandArchiveMounter>
{
friend class Allocator;
public:
// CTR-NANDのアーカイブ名 "$_phtsh"
static const char* c_pArchiveName;
static const wchar_t* c_pWArchiveName;
// CTR-NANDのアーカイブ名の文字数
static const int c_nArchiveNameLength = 4;
// CTR-NANDのコロンつきアーカイブ名 例:"$_phtsh:"
static const char* c_pArchiveNameWithColon;
static const wchar_t* c_pWArchiveNameWithColon;
// CTR-NANDのコロンつきアーカイブ名の文字数
static const int c_nArchiveNameLengthWithColon = c_nArchiveNameLength + 1;
static const bit32 c_nSharedExtSaveDataId = 0xf0000001;
public:
/*!----------------------------------------------------------------------
@brief CTR-NAND領域をマウントする
@return true
@details
falseを返します
-----------------------------------------------------------------------*/
virtual bool Mount();
/*!----------------------------------------------------------------------
@brief CTR-NAND領域をアンマウントする
@details
-----------------------------------------------------------------------*/
virtual void Unmount();
/*!----------------------------------------------------------------------
@brief CTR-NAND領域をマウントしているかチェックする
@return true
-----------------------------------------------------------------------*/
virtual bool IsMount() const;
/*!----------------------------------------------------------------------
@brief CTR-NAND領域の空きサイズを取得する
@return
@details
-----------------------------------------------------------------------*/
virtual s64 GetFreeSize() const;
/*!----------------------------------------------------------------------
@brief CTR-NAND領域の空きブロック数を求める
@param[out] rTotalBlock
@param[out] rLeftBlock
@param[out] rBlockSize Byte
@return true
@details
falseを返します
-----------------------------------------------------------------------*/
bool GetSharedExtSaveDataBlockSize(
s64& rTotalBlock, s64& rLeftBlock, s32& rBlockSize) const;
private:
// シングルトン
CtrNandArchiveMounter();
virtual ~CtrNandArchiveMounter();
private:
bool m_bMount;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief TWL-NAND領域マウントクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class TwlNandArchiveMounter : public Singleton<TwlNandArchiveMounter>
, public ArchiveMounter
, private nn::util::NonCopyable<TwlNandArchiveMounter>
{
friend class Allocator;
public:
// TWL-NANDのアーカイブ名 "twlp"
static const char* c_pArchiveName;
static const wchar_t* c_pWArchiveName;
// TWL-NANDのアーカイブ名の文字数
static const int c_nArchiveNameLength = 7;
// TWL-NANDのコロンつきアーカイブ名 例:"twlp:"
static const char* c_pArchiveNameWithColon;
static const wchar_t* c_pWArchiveNameWithColon;
// TWL-NANDのコロンつきアーカイブ名の文字数
static const int c_nArchiveNameLengthWithColon = c_nArchiveNameLength + 1;
public:
/*!----------------------------------------------------------------------
@brief TWL-NAND領域をマウントする
@return true
@details
falseを返します
-----------------------------------------------------------------------*/
virtual bool Mount();
/*!----------------------------------------------------------------------
@brief TWL-NAND領域をアンマウントする
@details
-----------------------------------------------------------------------*/
virtual void Unmount();
/*!----------------------------------------------------------------------
@brief TWL-NAND領域をマウントしているかチェックする
@return true
-----------------------------------------------------------------------*/
virtual bool IsMount() const;
/*!----------------------------------------------------------------------
@brief TWL-NAND領域の空きサイズを取得する
@return
@details
-----------------------------------------------------------------------*/
virtual s64 GetFreeSize() const;
private:
// シングルトン
TwlNandArchiveMounter();
virtual ~TwlNandArchiveMounter();
private:
bool m_bMount;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_ARCHIVE_MOUNTER_H_

View File

@ -0,0 +1,325 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbConst.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_CONST_H_
#define IMAGE_DB_CONST_H_
#include "ImageDbDebug.h"
#include "ImageDbTypes.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
*---------------------------------------------------------------------------*/
class Const
{
Const();
Const(const Const&);
public:
// PNOTEのタイトルユニークID20bitの値
static const u32 c_nPNoteTitleUniqueId = 0x00204;
// PNOTEのExifのソフトウェア名タイトルユニークIDの文字列
static const char* c_pPNoteExifSoftware;
//! ドライブ名の最大文字数sdmc:/
#if defined(IMG_DB_EMULATE_CTR_NAND_ON_SD) || defined(IMG_DB_EMULATE_TWL_NAND_ON_SD)
// NANDをSDでエミュレートしているため多め
static const int c_nMaxDriveNameLength = 20;
#else
static const int c_nMaxDriveNameLength = 10;
#endif
//! NANDプライベート領域のディレクトリphoto/Nintendo 3DS/Private/00020400
static const wchar_t* c_pWPrivateDirectoryNand;
static const char* c_pPrivateDirectoryNand;
//! NANDプライベート領域のディレクトリの文字数
static const int c_nPrivateDirectoryLengthNand = 35;
//! SDプライベート領域のディレクトリNintendo 3DS/Private/00020400
static const wchar_t* c_pWPrivateDirectorySd;
static const char* c_pPrivateDirectorySd;
//! SDプライベート領域のディレクトリの文字数
static const int c_nPrivateDirectoryLengthSd = 29;
//! CTRプライベート領域のディレクトリ
static const wchar_t* c_pWPrivateDirectoryCtr[StorageTypeNum];
static const char* c_pPrivateDirectoryCtr[StorageTypeNum];
//! CTRプライベート領域のディレクトリの文字数
static const int c_nPrivateDirectoryLengthCtr[StorageTypeNum];
//! CTRプライベート領域のディレクトリの最大文字数
static const int c_nMaxPrivateDirectoryLengthCtr = (c_nPrivateDirectoryLengthNand < c_nPrivateDirectoryLengthSd) ?
c_nPrivateDirectoryLengthSd :
c_nPrivateDirectoryLengthNand;
//! レガシープライベート領域のディレクトリphoto/private/ds/app/484E494A
static const wchar_t* c_pWLegacyPrivateDirectory;
static const char* c_pLegacyPrivateDirectory;
//! レガシープライベート領域のディレクトリの文字数
static const int c_nLegacyPrivateDirectoryLength = 29;
//! プライベート領域のディレクトリの最大文字数
static const int c_nMaxPrivateDirectoryLength = (c_nMaxPrivateDirectoryLengthCtr < c_nLegacyPrivateDirectoryLength) ?
c_nLegacyPrivateDirectoryLength :
c_nMaxPrivateDirectoryLengthCtr;
//! レガシー管理テーブルのファイル名pit.bin
static const wchar_t* c_pWLegacyTableFileName;
static const char* c_pLegacyTableFileName;
//! レガシー管理テーブルのファイル名の文字数
static const int c_nLegacyTableFileNameLength = 7;
//! 写真管理テーブルのファイル名phtcache.bin
static const wchar_t* c_pWPictureTableFileName;
static const char* c_pPictureTableFileName;
//! 写真管理テーブルのファイル名の文字数
static const int c_nPictureTableFileNameLength = 12;
//! 管理テーブルのファイル名の最大文字数
static const int c_nMaxTableFileNameLength = (c_nLegacyTableFileNameLength < c_nPictureTableFileNameLength) ?
c_nPictureTableFileNameLength :
c_nLegacyTableFileNameLength;
//! 管理テーブルのファイルフルパスの最大文字数sdmc:/private/ds/app/484E494A/pit.binの文字数
static const int c_nMaxTableFileFullPathLength = c_nMaxDriveNameLength // sdmc:/
+ c_nMaxPrivateDirectoryLength // private/ds/app/484E494A
+ 1 // /
+ c_nMaxTableFileNameLength; // pit.bin
//! NAND写真のルートディレクトリphoto/DCIM
static const wchar_t* c_pWPictureRootDirectoryNand;
static const char* c_pPictureRootDirectoryNand;
//! NAND写真のルートディレクトリの文字数
static const int c_nPictureRootDirectoryLengthNand = 10;
//! SD写真のルートディレクトリDCIM
static const wchar_t* c_pWPictureRootDirectorySd;
static const char* c_pPictureRootDirectorySd;
//! SD写真のルートディレクトリの文字数
static const int c_nPictureRootDirectoryLengthSd = 4;
//! 写真のルートディレクトリの配列
static const wchar_t* c_pWPictureRootDirectorys[StorageTypeNum];
static const char* c_pPictureRootDirectorys[StorageTypeNum];
//! 写真のルートディレクトリの文字数の配列
static const int c_nPictureRootDirectorysLength[StorageTypeNum];
//! 写真のルートディレクトリの最大文字数
static const int c_nMaxPictureRootDirectorysLength = (c_nPictureRootDirectoryLengthNand < c_nPictureRootDirectoryLengthSd) ?
c_nPictureRootDirectoryLengthSd :
c_nPictureRootDirectoryLengthNand;
//! 映像のルートディレクトリの配列
static const wchar_t* c_pWRootDirectorys[StorageTypeNum];
static const char* c_pRootDirectorys[StorageTypeNum];
//! 映像のルートディレクトリの文字数の配列
static const int c_nRootDirectorysLength[StorageTypeNum];
//! 映像のルートディレクトリの最大文字数
static const int c_nMaxRootDirectorysLength = c_nMaxPictureRootDirectorysLength;
//! 映像ディレクトリの文字数100NIN02 DCFではピッタリ8文字がルール
static const int c_nImageDirectoryLength = 8; // 変更不可
//! 映像ディレクトリの番号部分の桁数
static const int c_nImageDirectoryNumberDigit = 3; // 変更不可
//! 映像ディレクトリのポストフィックスのコア名NIN
static const wchar_t* c_pWImageDirectoryNamePostfixCore;
static const char* c_pImageDirectoryNamePostfixCore;
//! 映像ディレクトリのポストフィックスのコア名の文字数
static const int c_nImageDirectoryNamePostfixCoreLength = 3; // 変更不可
//! 映像ディレクトリのポストフィックスNIN03
static const wchar_t* c_pWImageDirectoryNamePostfix;
static const char* c_pImageDirectoryNamePostfix;
//! 映像ディレクトリのポストフィックスの後ろの数字の値
static const int c_nImageDirectoryNamePostfixNoValue = 3;
//! レガシー映像ディレクトリのポストフィックスNIN02
static const wchar_t* c_pWLegacyImageDirectoryNamePostfix;
static const char* c_pLegacyImageDirectoryNamePostfix;
//! レガシー映像ディレクトリのポストフィックスの後ろの数字の値
static const int c_nLegacyImageDirectoryNamePostfixNoValue = 2;
//! 映像ディレクトリのポストフィックスの文字数
static const int c_nImageDirectoryNamePostfixLength = 5; // 変更不可
//! 映像データのファイル名の文字数DCFではピッタリ8文字がルール
static const int c_nImageFileNameLength = 8; // 変更不可
//! 映像データのファイル名のプレフィックスHNI_
static const wchar_t* c_pWImageFileNamePrefix;
static const char* c_pImageFileNamePrefix;
//! 映像データのファイル名のプレフィックスの文字数
static const int c_nImageFileNamePrefixLength = 4; // 変更不可
//! 映像データのファイル名の番号部分の桁数
static const int c_nImageFileNameNumberDigit = 4; // 変更不可
//! 拡張子の最大文字数ドットは含まない。DCFでは文字数規定なし
static const int c_nMaxExtLength = 4;
//! 映像データの拡張子
static const wchar_t* c_pWImageFileExt[ImageKindNum];
static const char* c_pImageFileExt[ImageKindNum];
//! 映像データの拡張子の文字数
static const int c_nImageFileExtLength[ImageKindNum];
//! 映像のルートディレクトリパスの最大文字数sdmc:/DCIM
static const int c_nMaxRootDirectoryPathLength = c_nMaxDriveNameLength // sdmc:/
+ c_nMaxRootDirectorysLength; // DCIM
//! 映像ディレクトリパスの最大文字数sdmc:/DCIM/100NIN02
static const int c_nMaxImageDirectoryPathLength = c_nMaxRootDirectoryPathLength // sdmc:/DCIM
+ 1 // /
+ c_nImageDirectoryLength; // 100NIN02
//! 映像データのファイル名拡張子の最大文字数HNI_0001.JPG
static const int c_nMaxImageFileNameWithExtLength = c_nImageFileNameLength // HNI_0001
+ 1 // .
+ c_nMaxExtLength; // JPG
//! 映像データのファイルパスの最大文字数100NIN02/HNI_0001.JPGの文字数
static const int c_nMaxImageFilePathLength = c_nImageDirectoryLength // 100NIN02
+ 1 // /
+ c_nMaxImageFileNameWithExtLength; // HNI_0001.JPG
//! 映像データのファイルフルパスの最大文字数sdmc:/DCIM/100NIN02/HNI_0001.JPGの文字数
static const int c_nMaxImageFileFullPathLength = c_nMaxRootDirectoryPathLength // sdmc:/DCIM
+ 1 // /
+ c_nMaxImageFilePathLength; // 100NIN02/HNI_0001.JPG
//! TWLで扱える写真枚数
//@{
static const int c_nLegacyPictureRecordNumNand = 500; // 変更不可
static const int c_nLegacyPictureRecordNumSd = 3000; // 変更不可
//@}
//! NANDで扱える映像数
//@{
static const int c_nPictureRecordNumNand = 500; // 変更可
static const int c_nAllRecordNumNand = c_nPictureRecordNumNand;
//@}
//! SDカードで扱える映像数
//@{
static const int c_nPictureRecordNumSd = 3000; // 変更可
static const int c_nAllRecordNumSd = c_nPictureRecordNumSd;
//@}
//! 全体で扱える映像数
//@{
static const int c_nPictureRecordNum = c_nPictureRecordNumNand + c_nPictureRecordNumSd;
static const int c_nAllRecordNum = c_nPictureRecordNum;
//@}
//! 扱える映像数を配列でアクセスするための定数
static const int c_nRecordNumAry[StorageTypeNum];
//! 顔情報の最大数
static const int c_nMaxFaceInfoNum = 4;
/*!
@details
JPEG/MPの最大サイズとなります
*/
//@{
static const std::size_t c_nMaxHandleTwlJpegSize = 200*1024-1; // TWLのJPEG
static const std::size_t c_nMaxHandleJpegSize = 200*1024; // JPEG
static const std::size_t c_nMaxHandleMpSize = 400*1024; // MP
static const std::size_t c_nMaxHandleJpegInMJpegSize = c_nMaxHandleMpSize; // モーションJPEG内のJPEG
//@}
//! 扱える映像ファイルの最大サイズの配列
static const std::size_t c_nMaxHandleImageSize[ImageKindNum];
/*!
@details
JPEG/MPの平均的なサイズとなります
*/
//@{
static const std::size_t c_nJpegDefaultQualityAvgImageSize = 80*1024; // TWLのときと一緒
// MPOは150KBとして見積もりたいが、NANDのブロック消費数が想定の+4ブロックとなるため(38+4)*4K=168KBと設定する
static const std::size_t c_nMpDefaultQualityAvgImageSize = 42*4*1024;
//@}
//! 扱う映像ファイルの平均サイズの配列
static const std::size_t c_nDefaultQualityAvgImageSize[ImageKindNum];
//! 読み込める映像ファイルのデフォルト最大サイズ(バイト単位)
static const std::size_t c_nDefaultMaxReadImageFileSize = c_nMaxHandleMpSize; // MPと同じサイズまで
//! 一般的なディレクトリでの最大リード数
static const int c_nMaxReadDirNumInGeneral = 1000;
//! DCFの映像ディレクトリ100NIN02999NIN02での最大リード数
static const int c_nMaxReadDirNumInDcfDir = 1000;
//! DCFの映像ファイルHNI_0001.XXXHNI_0100.XXXでの最大リード数
static const int c_nMaxReadDirNumInDcfFile = c_nPictureRecordNumSd*2; //最大で扱える映像数に対となるデータを考慮した数
//! 標準で扱う最大の画像サイズ
//@{
static const int c_nMaxStandardPictureWidth = 1024;
static const int c_nMaxStandardPictureHeight = 768;
//@}
//! 標準で扱う最小の画像サイズ
//@{
static const int c_nMinStandardPictureWidth = 160;
static const int c_nMinStandardPictureHeight = 120;
//@}
//! 標準で扱う画像の最大縮小レベル
static const int c_nMaxStandardPictureShrinkLevel = 2;
//! 標準で扱う最大のサムネイル画像サイズ
//@{
static const int c_nMaxStandardThumbnailWidth = 320;
static const int c_nMaxStandardThumbnailHeight = 240;
//@}
//! 標準で扱う最小のサムネイル画像サイズ
//@{
static const int c_nMinStandardThumbnailWidth = 0;
static const int c_nMinStandardThumbnailHeight = 0;
//@}
//! 標準で扱うサムネイル画像の最大縮小レベル
static const int c_nMaxStandardThumbnailShrinkLevel = 2;
//! 本画像からサムネイル作成できる最大の画像サイズ
//@{
static const int c_nMaxThumbnailFromPictureWidth = 256;
static const int c_nMaxThumbnailFromPictureHeight = 192;
//@}
//! 本画像からサムネイル作成できる最小の画像サイズ
//@{
static const int c_nMinThumbnailFromPictureWidth = c_nMinStandardPictureWidth;
static const int c_nMinThumbnailFromPictureHeight = c_nMinStandardPictureHeight;
//@}
//! 本画像からサムネイル作成できる画像の最大縮小レベル
static const int c_nMaxThumbnailFromPictureShrinkLevel = 2;
//! 動画の最大撮影時間(秒単位)
static const int c_nMaxMovieRecordingTime = 600;
// ImageDbが内部で利用しているutil::NmjPlayerConfigクラスのId負数
enum NmjPlayerConfigId {
NmjPlayerConfigIdDefault = -1,
NmjPlayerConfigIdCollector = -2,
NmjPlayerConfigIdReflectCollector = -3,
NmjPlayerConfigIdSysNoteRw = -4
};
// ImageDbが内部で利用しているutil::NmjPlayerConfigクラスのId負数
enum NmjRecordingConfigId {
NmjPlayerConfigIdEstimate = -1
};
};
} // end of namespace imgdb
#endif // IMAGE_DB_CONST_H_

View File

@ -0,0 +1,127 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbCrc.h
CRC
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_CRC_H_
#define IMAGE_DB_CRC_H_
#include <nn/types.h>
#include <nn/crypto.h>
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief CRC16クラス
@details
nn::crypto::HashContextBase設計にあわせたCRC16を求めるクラスです
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class Crc16Context : public nn::crypto::HashContextBase
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
Crc16Context();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~Crc16Context();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual void Initialize();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual void Finalize();
/*!----------------------------------------------------------------------
@brief CRC値を与えられたデータで更新する
-----------------------------------------------------------------------*/
virtual void Update(const void* pData, size_t length);
/*!----------------------------------------------------------------------
@brief CRCの長さを取得する
-----------------------------------------------------------------------*/
virtual size_t GetHashLength() { return 2; }
/*!----------------------------------------------------------------------
@brief CRC計算結果を取得する
-----------------------------------------------------------------------*/
virtual void GetHash(void* pOut);
private:
static const int c_nTableElementNum = 256;
static const u32 c_nStandardPoly = 0xa001;
static const u16 c_nInitHash = 0;
private:
static void InitTable();
private:
static bool m_bInitializedTable;
static u16 m_nCrcTable[c_nTableElementNum];
bool m_bInitialized;
u16 m_nHash;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief CRC16クラス
@details
Crc16Contextを気軽に使い捨て使用できるようにラップしたクラスです
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class Crc16
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] pData
@param[in] nSize
-----------------------------------------------------------------------*/
//@{
Crc16();
Crc16(const void* pData, std::size_t nSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~Crc16();
/*!----------------------------------------------------------------------
@brief CRC値を与えられたデータで更新する
-----------------------------------------------------------------------*/
void Update(const void* pData, std::size_t nSize);
/*!----------------------------------------------------------------------
@brief CRC値を取得する
-----------------------------------------------------------------------*/
u16 GetHash();
private:
Crc16Context m_Ctx;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_CRC_H_

View File

@ -0,0 +1,212 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbDateTimeSeconds.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_DATE_TIME_SECONDS_H_
#define IMAGE_DB_DATE_TIME_SECONDS_H_
#include <nn/types.h>
#include <nn/fnd.h>
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
@details
2000/1/1 000
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct DateTimeSeconds
{
public:
s64 nSeconds;
public:
//! 日時文字列の文字数
static const int c_nDateTimeStringLength = 19;
//! 1日の秒数
static const s64 c_nOneDaySeconds = 24*60*60;
public:
/*!----------------------------------------------------------------------
@brief
@return
@detail
1900/1/1 000
-----------------------------------------------------------------------*/
static DateTimeSeconds GetMinSeconds();
/*!----------------------------------------------------------------------
@brief
@return
@detail
2150/12/31 235959
-----------------------------------------------------------------------*/
static DateTimeSeconds GetMaxSeconds();
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
static s64 GetInvalidSeconds();
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
static int GetInvalidDays();
/*!----------------------------------------------------------------------
@brief
@details
2000/1/1 000
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void InitializeInvalid();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsInvalid() const;
/*!----------------------------------------------------------------------
@brief
@details
2000/1/1 000s64で取得
-----------------------------------------------------------------------*/
//@{
s64 GetSeconds() const{ return nSeconds; }
void SetSeconds(s64 nSeconds);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetDays() const;
/*!----------------------------------------------------------------------
@brief
@details
使
GetDays()2000/1/1 0:0:0
-1GetDays()0GetDateDays()-1
-----------------------------------------------------------------------*/
int GetDateDays() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
static DateTimeSeconds GetCurrentDateTime();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void SetCurrentDateTime();
/*=======================================================================
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@param[out] pYear
@param[out] pMonth
@param[out] pDay
@param[out] pHour
@param[out] pMin
@param[out] pSec
-----------------------------------------------------------------------*/
void ConvertToParam(
int* pYear, int* pMonth, int* pDay,
int* pHour, int* pMin, int* pSec) const;
/*!----------------------------------------------------------------------
@brief
@param[in] nYear
@param[in] nMonth
@param[in] nDay
@param[in] nHour
@param[in] nMin
@param[in] nSec
@return true
@details
falseを返します
-----------------------------------------------------------------------*/
bool ConvertFromParam(
int nYear, int nMonth, int nDay,
int nHour, int nMin, int nSec);
/*=======================================================================
nn::fnd::DateTime型
=======================================================================*/
/*!----------------------------------------------------------------------
@brief nn::fnd::DateTime型で取得する
@return nn::fnd::DateTime型のデータ
-----------------------------------------------------------------------*/
nn::fnd::DateTime ConvertToNNDateTime() const;
/*!----------------------------------------------------------------------
@brief nn::fnd::DateTime型で設定する
@param[in]
-----------------------------------------------------------------------*/
void ConvertFromNNDateTime(const nn::fnd::DateTime& rNNDT);
/*=======================================================================
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@param[out] pStr
@param[in] nSize
@details
"YYYY:MM:DD HH:MM:SS"
pStrはc_nStrinLength+1
-----------------------------------------------------------------------*/
void ConvertToDateTimeString(char* pStr, int nSize) const;
/*!----------------------------------------------------------------------
@brief
@param[in]
-----------------------------------------------------------------------*/
bool ConvertFromDateTimeString(const char* pStr);
/*!----------------------------------------------------------------------
@brief
@param[in] pString
@return true
@detail
"YYYY:MM:DD HH:MM:DD"
-----------------------------------------------------------------------*/
static bool IsValidDateTimeString(const char* pStr);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
bool operator==(const DateTimeSeconds& x) const{ return (GetSeconds() == x.GetSeconds()); }
bool operator!=(const DateTimeSeconds& x) const{ return (GetSeconds() != x.GetSeconds()); }
bool operator< (const DateTimeSeconds& x) const{ return (GetSeconds() < x.GetSeconds()); }
bool operator<=(const DateTimeSeconds& x) const{ return (GetSeconds() <= x.GetSeconds()); }
bool operator> (const DateTimeSeconds& x) const{ return (GetSeconds() > x.GetSeconds()); }
bool operator>=(const DateTimeSeconds& x) const{ return (GetSeconds() >= x.GetSeconds()); }
//@}
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_DATE_TIME_SECONDS_H_

View File

@ -0,0 +1,59 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbDebug.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_DEBUG_H_
#define IMAGE_DB_DEBUG_H_
#include <nn/dbg.h>
// NAND領域をSD上に再現する定義
// 定義を有効にするとSD上にNANDがエミュレートされます。
#if defined(IMAGE_DB_LIB)
// #define IMG_DB_EMULATE_CTR_NAND_ON_SD
// #define IMG_DB_EMULATE_TWL_NAND_ON_SD
#else
// #define IMG_DB_EMULATE_CTR_NAND_ON_SD
// #define IMG_DB_EMULATE_TWL_NAND_ON_SD
#endif
// 通常ログ表示の有効定義
// ログを表示しない場合はコメントアウト
//#define IMGDB_ENABLE_LOG
// 警告ログ表示の有効定義
// ログを表示しない場合はコメントアウト
//#define IMGDB_ENABLE_WARNING_LOG
// エラーログ表示の有効定義
// ログを表示しない場合はコメントアウト
//#define IMGDB_ENABLE_ERROR_LOG
#if defined(IMGDB_ENABLE_LOG)
#define IMGDB_LOG(...) (NN_LOG("[ImageDb]"), NN_LOG(__VA_ARGS__))
#else
#define IMGDB_LOG(...) ((void)0)
#endif
#if defined(IMGDB_ENABLE_WARNING_LOG)
#define IMGDB_WARNING(...) (NN_LOG("[ImageDb] Warning! "), NN_LOG(__VA_ARGS__))
#else
#define IMGDB_WARNING(...) ((void)0)
#endif
#if defined(IMGDB_ENABLE_ERROR_LOG)
#define IMGDB_ERROR(...) (NN_LOG("[ImageDb] Error!!! "), NN_LOG(__VA_ARGS__))
#else
#define IMGDB_ERROR(...) ((void)0)
#endif
#endif // IMAGE_DB_DEBUG_H_

View File

@ -0,0 +1,147 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbDirectory.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_DIRECTORY_H_
#define IMAGE_DB_DIRECTORY_H_
#include <nn/types.h>
#include <nn/fs.h>
#include "ImageDbAllocator.h"
#include "ImageDbDynamicArray.h"
#include "ImageDbTypes.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class Directory
{
public:
//! 拡張子リスト
typedef DynamicArray< wchar_t*, XAllocator<wchar_t*> > ExtList;
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] eStoType
@param[in] pPath
@param[in] nReadLimitNum 1
@details
pPathの末尾にスラッシュはつけないでください:"sdmc:/DCIM"
nReadLimitNumはRead()
Read()
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じス
-----------------------------------------------------------------------*/
//@{
Directory();
Directory(
Allocator& rAllocator,
StorageType eStoType, const wchar_t* pPath,
int nReadLimitNum);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~Directory();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsInitialized() const{ return (0 != m_pAllocator); }
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
void Initialize(
Allocator& rAllocator,
StorageType eStoType, const wchar_t* pPath,
int nReadLimitNum);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Release();
/*!----------------------------------------------------------------------
@brief 調
-----------------------------------------------------------------------*/
bool IsReady() const { return m_bReady; }
/*!----------------------------------------------------------------------
@brief
@return false
-----------------------------------------------------------------------*/
bool Read();
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
const nn::fs::DirectoryEntry* GetEntry() const;
/*!----------------------------------------------------------------------
@brief 調
@return true
-----------------------------------------------------------------------*/
bool IsDirectory() const;
/*!----------------------------------------------------------------------
@brief 調
@param[in] pExt
@param[in] rExtList
@return true
@details
trueを返します
trueを返します
:"JPG"
-----------------------------------------------------------------------*/
//@{
bool IsFile() const;
bool IsFile(const wchar_t* pExt) const;
bool IsFile(const ExtList& rExtList) const;
//@}
private:
static const int c_nCacheSize = 64;
private:
Allocator* m_pAllocator;
bool m_bReady;
NN_PADDING3;
StorageType m_eStoType;
NN_PADDING3;
nn::fs::Directory m_Directory;
nn::fs::DirectoryEntry* m_pEntries;
int m_nEntryNum;
int m_nEntryIndex;
int m_nReadLimitNum;
int m_nReadCnt;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_DIRECTORY_H_

View File

@ -0,0 +1,753 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbDynamicArray.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_DYNAMIC_ARRAY_H_
#define IMAGE_DB_DYNAMIC_ARRAY_H_
#include <algorithm>
#include <memory>
#include <limits>
#include <iterator>
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
STL準拠のシーケンシャルなランダムアクセス可能コンテナです
std::vectorと同じような仕様になっていますが
std::vectorではキャパシティは倍ずつDyamicArrayはメモリブ
std::vectorではキャパシティは減ること
DyamicArrayはメモリブロック単位で減少します
std::vectorに比べ
memconとreserve()調
memconは前述のメモリブロックのサイズです
reserve()reserve()
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
#pragma pack(push, 4)
template< typename T, typename Allocator=std::allocator<T> >
class DynamicArray
{
public:
typedef T* iterator;
typedef const T* const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef typename Allocator::reference reference;
typedef typename Allocator::const_reference const_reference;
typedef typename Allocator::value_type value_type;
typedef typename Allocator::size_type size_type;
typedef typename Allocator::difference_type difference_type;
typedef typename Allocator::pointer pointer;
typedef typename Allocator::const_pointer const_pointer;
typedef Allocator allocator_type;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
class MemoryControl {
public:
//! デフォルトのブロックサイズ
static const size_type c_nDefaultBlockSize = 32;
/*!------------------------------------------------------------------
@brief
@param[in] block_size
-------------------------------------------------------------------*/
//@{
explicit MemoryControl(size_type block_size=c_nDefaultBlockSize) : m_nBlockSize(block_size){}
MemoryControl(const MemoryControl& x) : m_nBlockSize(x.GetBlockSize()){}
//@}
/*!------------------------------------------------------------------
@brief
@param[in] block_size
-------------------------------------------------------------------*/
size_type GetBlockSize() const{ return m_nBlockSize; }
private:
const size_type m_nBlockSize;
};
private:
template<int v> struct Int2Type{ enum{value=v}; };
public:
/*!----------------------------------------------------------------------
@brief
@param[in] memcon
-----------------------------------------------------------------------*/
//@{
explicit DynamicArray(const allocator_type& a=allocator_type());
explicit DynamicArray(size_type n, const_reference value=T(), const allocator_type& a=allocator_type());
template< typename InpIt >
DynamicArray(InpIt first, InpIt last, const allocator_type& a=allocator_type());
DynamicArray(const DynamicArray< T,allocator_type >& x);
explicit DynamicArray(MemoryControl memcon, const allocator_type& a=allocator_type());
DynamicArray(MemoryControl memcon, size_type n, const_reference value=T(), const allocator_type& a=allocator_type());
template< typename InpIt >
DynamicArray(MemoryControl memcon, InpIt first, InpIt last, const allocator_type& a=allocator_type());
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~DynamicArray(){ Destroy(); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
iterator begin(){ return iterator(m_pBegin); }
const_iterator begin() const{ return const_iterator(m_pBegin); }
iterator end(){ return iterator(m_pEnd); }
const_iterator end() const{ return const_iterator(m_pEnd); }
reverse_iterator rbegin(){ return reverse_iterator(end()); }
const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); }
reverse_iterator rend(){ return reverse_iterator(begin()); }
const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); }
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
iterator erase(iterator position){ return erase(position, position+1); }
iterator erase(iterator first, iterator last);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void clear(){ resize(0); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
iterator insert(iterator position, const_reference x);
void insert(iterator position, size_type n, const_reference x){ Insert(position, n, x, Int2Type<true>()); }
template< typename InpIt >
void insert(iterator position, InpIt first, InpIt last){
Insert(position, first, last, Int2Type<std::numeric_limits<InpIt>::is_integer>()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
void pop_back(){ erase(end()-1); }
void push_back(const_reference x){ insert(end(), x); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
void pop_front(){ erase(begin()); }
void push_front(const_reference x){ insert(begin(), x); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
template< typename InpIt >
void assign(InpIt first, InpIt last){
Assign(first, last, Int2Type<std::numeric_limits<InpIt>::is_integer>()); }
void assign(size_type n, const_reference c){ m_pEnd = m_pBegin; resize(n, c); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void resize(size_type n, T c=T());
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void swap(DynamicArray<T,Allocator>& that);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
reference back(){ return *(end()-1); }
const_reference back() const{ return *(end()-1); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
reference front(){ return *begin(); }
const_reference front() const{ return *begin(); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
size_type size() const{ return m_pEnd - m_pBegin; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool empty() const{ return (0 == size()); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
size_type max_size() const{ return std::numeric_limits<size_type>::max(); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
reference at(size_type n){ return m_pBegin[n]; }
const_reference at(size_type n) const{ return m_pBegin[n]; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
size_type capacity() const{ return m_nCapacity; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void reserve(size_type n);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
allocator_type get_allocator() const{ return m_Allocator; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
const MemoryControl& get_memcon() const{ return m_MemCon; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
DynamicArray& operator=(const DynamicArray& v){ assign(v.begin(), v.end()); return *this; }
reference operator[](size_type n){ return at(n); }
const_reference operator[](size_type n) const{ return at(n); }
//@}
private:
template< typename T1, typename T2 >
void DynamicArrayInternal(T1 n, T2 value, Int2Type<true>);
template< typename T1, typename T2 >
void DynamicArrayInternal(T1 first, T2 last, Int2Type<false>);
template< typename T1, typename T2 >
void Insert(iterator position, T1 n, T2 value, Int2Type<true>);
template< typename T1, typename T2 >
void Insert(iterator position, T1 first, T2 last, Int2Type<false>);
template< typename T1, typename T2 >
void Assign(T1 n, T2 value, Int2Type<true>);
template< typename T1, typename T2 >
void Assign(T1 first, T2 last, Int2Type<false>);
bool IsSetReserveSize() const{ return (m_MemCon.GetBlockSize() < m_nReserveSize); }
void SetAddress(value_type* p, size_type n);
void Create(size_type n);
void Create(size_type n, size_type capa);
void Recreate(size_type n);
void Destroy();
void Refresh();
private:
// m_pBegin m_pEnd
// 下位├─────┼────┼───┤上位
// ← size() →
// ←─ m_nReserveSize →
// ←──── m_nCapacity ───→
allocator_type m_Allocator;
NN_PADDING3;
MemoryControl m_MemCon;
size_type m_nCapacity;
size_type m_nReserveSize;
T* m_pBegin;
T* m_pEnd;
};
#pragma pack(pop)
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
DynamicArray<T, Allocator>::DynamicArray(const allocator_type& a)
: m_Allocator(a)
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
SetAddress(0, 0);
}
template< typename T, typename Allocator >
DynamicArray<T, Allocator>::DynamicArray(size_type n, const_reference value, const allocator_type& a)
: m_Allocator(a)
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
DynamicArrayInternal(n, value, Int2Type<true>());
}
template< typename T, typename Allocator >
template< typename InpIt >
DynamicArray<T, Allocator>::DynamicArray(InpIt first, InpIt last, const allocator_type& a)
: m_Allocator(a)
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
DynamicArrayInternal(first, last, Int2Type<std::numeric_limits<InpIt>::is_integer>());
}
template< typename T, typename Allocator >
DynamicArray<T, Allocator>::DynamicArray(const DynamicArray< T,allocator_type >& x)
: m_Allocator(x.get_allocator())
, m_MemCon(x.get_memcon())
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
DynamicArrayInternal(x.begin(), x.end(), Int2Type<false>());
}
template< typename T, typename Allocator >
DynamicArray<T, Allocator>::DynamicArray(MemoryControl memcon, const allocator_type& a)
: m_Allocator(a)
, m_MemCon(memcon)
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
SetAddress(0, 0);
}
template< typename T, typename Allocator >
DynamicArray<T, Allocator>::DynamicArray(MemoryControl memcon, size_type n, const_reference value, const allocator_type& a)
: m_Allocator(a)
, m_MemCon(memcon)
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
DynamicArrayInternal(n, value, Int2Type<true>());
}
template< typename T, typename Allocator >
template< typename InpIt >
DynamicArray<T, Allocator>::DynamicArray(MemoryControl memcon, InpIt first, InpIt last, const allocator_type& a)
: m_Allocator(a)
, m_MemCon(memcon)
, m_nCapacity(0)
, m_nReserveSize(0)
, m_pBegin(0)
, m_pEnd(0)
{
DynamicArrayInternal(first, last, Int2Type<std::numeric_limits<InpIt>::is_integer>());
}
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
typename DynamicArray<T, Allocator>::iterator DynamicArray<T, Allocator>::erase(iterator first, iterator last)
{
size_type nPos = first - begin();
// last以降のデータをfirst側に詰めていく
{
iterator s = first;
const_iterator e = last;
while(e != end()){
*(s++) = *(e++);
}
}
// 削除により詰めたendに設定する
const size_type nEraseNum = last - first;
SetAddress(begin(), size()-nEraseNum);
Refresh();
return begin() + nPos;
}
/*---------------------------------------------------------------------------*
positionの手前に追加される
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
typename DynamicArray<T, Allocator>::iterator DynamicArray<T, Allocator>::insert(iterator position, const_reference x)
{
const size_type pos = position - m_pBegin;
// キャパシティに余裕が無ければリサイズして要素数を増やす
if(size() + 1 > capacity()){
Recreate(size() + 1);
}
// 挿入する位置より後ろのデータをずらす
const size_type nMoveNum = size() - pos;
for(size_type i = 0; i < nMoveNum; ++i){
m_pBegin[size()-i] = m_pBegin[size()-1-i];
}
// データを挿入する
++m_pEnd;
m_pBegin[pos] = x;
return m_pBegin + pos;
}
/*---------------------------------------------------------------------------*
cで埋められる
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::resize(size_type n, T c)
{
// 増える
if(size() < n){
// キャパシティが不足している場合はメモリを確保しなおす
if(capacity() < n){
Recreate(n);
}
// 追加された要素に指定データを格納する
while(size() < n){
push_back(c);
}
Refresh();
}
// 減る
else if(size() > n){
m_pEnd -= size() - n;
Refresh();
}
}
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::swap(DynamicArray<T,Allocator>& that)
{
const size_type nThisSize = size();
const size_type nThatSize = that.size();
const size_type nMaxSize = std::max(nThisSize, nThatSize);
// どちらも同じサイズにする
if(nMaxSize > size()){
resize(nMaxSize);
}
else if(nMaxSize > that.size()){
that.resize(nMaxSize);
}
// 交換する
for(size_type i = 0; i < nMaxSize; ++i){
std::swap(at(i), that.at(i));
}
// 交換後のサイズに設定する
resize(nThatSize);
that.resize(nThisSize);
}
/*---------------------------------------------------------------------------*
n以上に保つ
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::reserve(size_type n)
{
m_nReserveSize = n;
if(m_nCapacity < m_nReserveSize){
Recreate(n);
}
Refresh();
}
/*---------------------------------------------------------------------------*
DynamicArray(size_type n, const_reference value)
template<typename InpIt> DynamicArray(InpIt first, InpIt last)
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
template< typename T1, typename T2 >
void DynamicArray<T, Allocator>::DynamicArrayInternal(T1 n, T2 value, Int2Type<true>){
Create(n);
for(size_type i = 0; i < size(); ++i){
m_Allocator.construct(&m_pBegin[i], value);
}
}
template< typename T, typename Allocator >
template< typename T1, typename T2 >
void DynamicArray<T, Allocator>::DynamicArrayInternal(T1 first, T2 last, Int2Type<false>){
Create(last - first);
for(size_type i = 0; i < size(); ++i){
m_Allocator.construct(&m_pBegin[i], *first++);
}
}
/*---------------------------------------------------------------------------*
insert内部実装
void insert(iterator position, size_type n, const_reference x)
template<typename InpIt> void insert(iterator position, InpIt first, InpIt last)
insertの呼出を期待してても後者がよばれ
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
template< typename T1, typename T2 >
void DynamicArray<T, Allocator>::Insert(iterator position, T1 n, T2 x, Int2Type<true>)
{
const size_type pos = position - m_pBegin;
// キャパシティに余裕が無ければリサイズして要素数を増やす
if(size() + n > capacity()){
Recreate(size() + 1);
}
// 挿入する位置より後ろのデータをずらす
const size_type nMoveNum = size() - pos;
for(size_type i = 0; i < nMoveNum; ++i){
m_pBegin[size()+(n-1)-i] = m_pBegin[size()-1-i];
}
// データを挿入する
m_pEnd += n;
for(T1 i = 0; i < n; ++i){
m_pBegin[pos+i] = x;
}
}
template< typename T, typename Allocator >
template< typename T1, typename T2 >
void DynamicArray<T, Allocator>::Insert(iterator position, T1 first, T2 last, Int2Type<false>)
{
const size_type pos = position - m_pBegin;
const size_type n = last - first;
// キャパシティに余裕が無ければリサイズして要素数を増やす
if(size() + n > capacity()){
Recreate(size() + 1);
}
// 挿入する位置より後ろのデータをずらす
const size_type nMoveNum = size() - pos;
for(size_type i = 0; i < nMoveNum; ++i){
m_pBegin[size()+(n-1)-i] = m_pBegin[size()-1-i];
}
// データを挿入する
m_pEnd += n;
for(size_type i = 0; i < n; ++i){
m_pBegin[pos+i] = first[i];
}
}
/*---------------------------------------------------------------------------*
assign内部実装
void assign(size_type n, const_reference u)
template<typename InpIt> void assign(InpIt first, InpIt last)
assignの呼出を期待してても後者がよばれ
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
template< typename T1, typename T2 >
void DynamicArray<T, Allocator>::Assign(T1 n, T2 value, Int2Type<true>)
{
m_pEnd = m_pBegin;
resize(n, value);
}
template< typename T, typename Allocator >
template< typename T1, typename T2 >
void DynamicArray<T, Allocator>::Assign(T1 first, T2 last, Int2Type<false>)
{
m_pEnd = m_pBegin;
insert(begin(), first, last);
}
/*---------------------------------------------------------------------------*
BeginとEndのアドレス設定
p Beginのポインタ
n
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::SetAddress(value_type* p, size_type n)
{
m_pBegin = p;
m_pEnd = p + n;
}
/*---------------------------------------------------------------------------*
n
capa
capaの要素数分のメモリを確保します
capaを省略した場合は
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::Create(size_type n)
{
size_type nNewCapa = n + m_MemCon.GetBlockSize();
// 求めたキャパシティがリザーブより下回っている場合は調整する
if(IsSetReserveSize() && nNewCapa < m_nReserveSize){
nNewCapa = m_nReserveSize;
}
if(capacity() != nNewCapa){
Create(n, nNewCapa);
}
else{
// 再確保の必要が無いのでend()だけ調整する
SetAddress(m_pBegin, n);
}
}
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::Create(size_type n, size_type capa)
{
Destroy();
if(0 < capa){
m_nCapacity = capa;
SetAddress(m_Allocator.allocate(m_nCapacity, 0), n);
}
}
/*---------------------------------------------------------------------------*
n
n
nまでの要素が維持されます
10abcdefghijRecreate(3)abc???
?
end()cの次調
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::Recreate(size_type n)
{
size_type nNewCapa = n + m_MemCon.GetBlockSize();
// 求めたキャパシティがリザーブより下回っている場合は調整する
if(IsSetReserveSize() && nNewCapa < m_nReserveSize){
nNewCapa = m_nReserveSize;
}
if(capacity() != nNewCapa){
value_type* pNewBegin = 0;
size_type nNewSize = 0;
if(0 < nNewCapa){
pNewBegin = m_Allocator.allocate(nNewCapa, 0);
nNewSize = (size() <= n) ? size() : n;
for(size_type i = 0; i < nNewSize; ++i){
pNewBegin[i] = m_pBegin[i];
}
}
Destroy();
m_nCapacity = nNewCapa;
SetAddress(pNewBegin, nNewSize);
}
else{
// 再確保の必要が無いのでend()だけ調整する
SetAddress(m_pBegin, n);
}
}
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::Destroy()
{
if(0 != m_pBegin){
// 要素のデストラクタを呼び出してからメモリを解放する
for(size_type i = 0; i < size(); ++i){
m_Allocator.destroy(&m_pBegin[i]);
}
m_Allocator.deallocate(m_pBegin, capacity());
m_pBegin = m_pEnd = 0;
m_nCapacity = 0;
}
}
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
template< typename T, typename Allocator >
void DynamicArray<T, Allocator>::Refresh()
{
// 空きキャパシティが一定以上であればリサイズしてメモリを詰める
if(m_MemCon.GetBlockSize()*2 <= capacity() - size()){
if(empty() && !IsSetReserveSize()){
Destroy();
}
else{
Recreate(size());
}
}
}
} // end of namespace imgdb
#endif // IMAGE_DB_DYNAMIC_ARRAY_H_

View File

@ -0,0 +1,235 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbFaceInfo.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_FACE_INFO_H_
#define IMAGE_DB_FACE_INFO_H_
#include <nn/types.h>
#include <nn/util.h>
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
@note
[0.0, 1.0)UV値で0bit16bitの符号なし固定小数で格納さ
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct FaceInfo
{
//! 空データの信頼度
static const int c_nConfEmpty = 0;
//! 信頼度の最小値
static const int c_nConfMin = 1;
//! 信頼度の最大値
static const int c_nConfMax = 1000;
//! 固定小数の小数部のビット数
static const int c_nFixedPointBit = 16;
//! フィールド
u16 nField; // 0 9bit 信頼度 低[0,1000]高 0はデータなし
// 1015bit 予約
//! 顔の境界ボックス(固定小数)
//@{
u16 nBoundingBoxLeft;
u16 nBoundingBoxTop;
u16 nBoundingBoxRight;
u16 nBoundingBoxBottom;
//@}
//! 左目の座標(固定小数)
//@{
u16 nLeftEyeX;
u16 nLeftEyeY;
//@}
//! 右目の座標(固定小数)
//@{
u16 nRightEyeX;
u16 nRightEyeY;
//@}
//----- フィールド -----//
// bit0-9 信頼度
static const int c_nFieldConfBits = 10;
static const int c_nFieldConfShift = 0;
static const u32 c_nFieldConfMask = ((1<<c_nFieldConfBits)-1)<<c_nFieldConfShift;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
bool IsEmpty() const{ return (c_nConfEmpty == GetConfidence()); }
/*!----------------------------------------------------------------------
@brief
@param[in]
@details
c_nConfMinc_nConfMaxの値を指定してください
c_nConfEmpty
-----------------------------------------------------------------------*/
//@{
int GetConfidence() const;
void SetConfidence(int nConf);
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[out] pLeft
@param[out] pTop
@param[out] pRight
@param[out] pBottom
@details
nWidthとnHeightにピクセル単位での画像サイズを渡すと
-----------------------------------------------------------------------*/
void GetBoundingBoxByPixel(
int nWidth, int nHeight,
int* pLeft, int* pTop, int* pRight, int* pBottom) const;
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[in] nLeft
@param[in] nTop
@param[in] nRight
@param[in] nBottom
-----------------------------------------------------------------------*/
void SetBoundingBoxByPixel(
int nWidth, int nHeight,
int nLeft, int nTop, int nRight, int nBottom);
/*!----------------------------------------------------------------------
@brief UV値で取得する
@param[out] pLeft
@param[out] pTop
@param[out] pRight
@param[out] pBottom
@details
[0.0, 1.0)UV値を返します
-----------------------------------------------------------------------*/
void GetBoundingBoxByFloatUV(
f32* pLeft, f32* pTop, f32* pRight, f32* pBottom) const;
/*!----------------------------------------------------------------------
@brief UV値で設定する
@param[in] fLeft UV値
@param[in] fTop UV値
@param[in] fRight UV値
@param[in] fBottom UV値
@details
[0.0, 1.0)UV値を返します
-----------------------------------------------------------------------*/
void SetBoundingBoxByFloatUV(
f32 fLeft, f32 fTop, f32 fRight, f32 fBottom);
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[out] pX
@param[out] pY
@details
nWidthとnHeightにピクセル単位での画像サイズを渡すと
-----------------------------------------------------------------------*/
void GetLeftEyeByPixel(int nWidth, int nHeight, int* pX, int* pY) const;
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[in] nX
@param[in] nY
-----------------------------------------------------------------------*/
void SetLeftEyeByPixel(int nWidth, int nHeight, int nX, int nY);
/*!----------------------------------------------------------------------
@brief UV値で取得する
@param[out] pX UV単位
@param[out] pY UV単位
@details
[0.0, 1.0)UV値を返します
-----------------------------------------------------------------------*/
void GetLeftEyeByFloatUV(int* pX, int* pY) const;
/*!----------------------------------------------------------------------
@brief UV値で設定する
@param[in] fX UV値
@param[in] fY UV値
@details
[0.0, 1.0)UV値を返します
-----------------------------------------------------------------------*/
void SetLeftEyeByFloatUV(f32 fX, f32 fY);
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[out] pX
@param[out] pY
@details
nWidthとnHeightにピクセル単位での画像サイズを渡すと
-----------------------------------------------------------------------*/
void GetRightEyeByPixel(int nWidth, int nHeight, int* pX, int* pY) const;
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[in] nX
@param[in] nY
-----------------------------------------------------------------------*/
void SetRightEyeByPixel(int nWidth, int nHeight, int nX, int nY);
/*!----------------------------------------------------------------------
@brief UV値で取得する
@param[out] pX UV単位
@param[out] pY UV単位
@details
[0.0, 1.0)UV値を返します
-----------------------------------------------------------------------*/
void GetRightEyeByFloatUV(int* pX, int* pY) const;
/*!----------------------------------------------------------------------
@brief UV値で設定する
@param[in] fX UV値
@param[in] fY UV値
@details
[0.0, 1.0)UV値を返します
-----------------------------------------------------------------------*/
void SetRightEyeByFloatUV(f32 fX, f32 fY);
private:
static u16 Float2Fix(f32 fFloat);
static f32 Fix2Float(u16 nFix);
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_FACE_INFO_H_

View File

@ -0,0 +1,134 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageFileDuplicator.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_FILE_DUPLICATOR_H_
#define IMAGE_DB_FILE_DUPLICATOR_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbAllocator.h"
#include "ImageDbImageInfo.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageFileDuplicator : private nn::util::NonCopyable<ImageFileDuplicator>
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] eStoTypeSrc
@param[in] rImgInfoSrc
@param[in] pSrcData
@param[in] nSrcDataSize
@param[in] eStoTypeDst
@param[in] rImgInfoDst
@param[in] rCreateSeconds
@details
pSrcDataとnSrcDataSizeで
JPEGやMPなど適切なデータを指定してください
-----------------------------------------------------------------------*/
//@{
ImageFileDuplicator(
Allocator& rAllocator,
StorageType eStoTypeSrc, const ImageInfo& rImgInfoSrc,
StorageType eStoTypeDst, const ImageInfo& rImgInfoDst,
const DateTimeSeconds& rCreateSeconds);
ImageFileDuplicator(
Allocator& rAllocator,
StorageType eStoTypeSrc, const ImageInfo& rImgInfoSrc,
void* pSrcData, std::size_t nSrcDataSize,
StorageType eStoTypeDst, const ImageInfo& rImgInfoDst,
const DateTimeSeconds& rCreateSeconds);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~ImageFileDuplicator();
/*!----------------------------------------------------------------------
@brief
@param[out] rResultSrc
@param[out] rResultDst
@return true
falseの場合はrResultSrcとrResultDstのいずれか
rResultSrc側で失敗したら
rResultDstはResultErrorになります
-----------------------------------------------------------------------*/
bool Duplicate(Result& rResultSrc, Result& rResultDst);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
StorageType GetStorageTypeSrc() const { return m_eStoTypeSrc; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
StorageType GetStorageTypeDst() const { return m_eStoTypeDst; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const ImageInfo& GetImageInfoSrc() const { return m_rImgInfoSrc; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const ImageInfo& GetImageInfoDst() const { return m_rImgInfoDst; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const DateTimeSeconds& GetCreateSecond() const { return m_sCreateSeconds; }
private:
bool DuplicateJpeg(Result& rResultSrc, Result& rResultDst) const;
bool DuplicateMp(Result& rResultSrc, Result& rResultDst) const;
//Result DuplicateFile(const XWString& rPathSrc, const XWString& rPathDst);
private:
// 読み書きバッファサイズ
// このサイズずつ読み書きする
//static const int c_nIOBufferSize = 32*1024;
private:
Allocator& m_rAllocator;
const StorageType m_eStoTypeSrc;
const ImageInfo& m_rImgInfoSrc;
void* m_pSrcData;
const std::size_t m_nSrcDataSize;
const StorageType m_eStoTypeDst;
const ImageInfo& m_rImgInfoDst;
const DateTimeSeconds m_sCreateSeconds;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_FILE_DUPLICATOR_H_

View File

@ -0,0 +1,498 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbFileReader.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_FILE_READER_H_
#define IMAGE_DB_FILE_READER_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbTypes.h"
#include "ImageDbResult.h"
#include "ImageDbAllocator.h"
#include "ImageDbImageInfo.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class FileReader : private nn::util::NonCopyable<FileReader>
{
public:
// ファイルサイズ制限無し
static const std::size_t c_nUnlimitFileSize = static_cast<std::size_t>(-1);
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] pBuf
@param[in] nLimitFileSize
@param[in] nBufSize
@param[in] bReadLimit
@details
nLimitFileSizeより大きい場合は失敗となります
使
bReadLimitがtrueの場合nLimitFileSizenBufSize
-----------------------------------------------------------------------*/
//@{
explicit FileReader(Allocator& rAllocator);
FileReader(
Allocator& rAllocator,
std::size_t nLimitFileSize, bool bReadLimit=false);
FileReader(
void* pBuf, std::size_t nBufSize, bool bReadLimit=false);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~FileReader();
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] pPath
@param[in] nStartPos
@param[in] nReadSize
@return true
@details
nReadSizeにゼロを指定した場合はnStartPos以降すべてを読み込みます
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じスト
-----------------------------------------------------------------------*/
//@{
virtual bool Read(
StorageType eStoType, const wchar_t* pPath);
virtual bool Read(
StorageType eStoType, const wchar_t* pPath,
s64 nStartPos, std::size_t nReadSize);
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
const void* GetData() const;
void* GetData();
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetDataSize() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
GetDataSize()
-----------------------------------------------------------------------*/
s64 GetFileSize() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
Result GetResult() const;
/*!----------------------------------------------------------------------
@brief FSライブラリが返す結果を取得する
@return
-----------------------------------------------------------------------*/
nn::Result GetNnResult() const;
protected:
void* Alloc(std::size_t nSize);
void Free(void* pAddr);
bool IsAvailableUserBuffer() const;
void AllocFileData(std::size_t nSize);
void FreeFileData();
private:
Allocator* m_pAllocator;
void* m_pUserBuffer;
const std::size_t m_nLimitFileOrBufSize;
const bool m_bReadLimit;
void* m_pFileData;
std::size_t m_nFileDataSize;
s64 m_nFileSize;
Result m_eResult;
nn::Result m_NnResult;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
使SetLimitFileSize()
使
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PhotoFileReader : public FileReader
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] nLimFileSize
@details
nLimFileSizeを省略した場合はSetDefaultLimitFileSize()
使
-----------------------------------------------------------------------*/
//@{
explicit PhotoFileReader(Allocator& rAllocator);
PhotoFileReader(Allocator& rAllocator, std::size_t nLimFileSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~PhotoFileReader();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
std::size_t GetLimitFileSize() const{ return m_nCurLimitFileSize; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
static bool IsValidDefaultLimitFileSize();
static std::size_t GetDefaultLimitFileSize();
static void SetDefaultLimitFileSize(std::size_t nSize);
//@}
private:
static bool bSetDefaultLimitFileSize;
static std::size_t nDefaultLimitFileSize;
private:
std::size_t m_nCurLimitFileSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
JPEGのExif(APP1)
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PhotoHeaderFileReader : public FileReader
{
public:
// 読み込みファイルサイズ
// SOIから本画像データがあるまでのマーカーが読み込めるぐらいのサイズです
// 本来は決め打ちにできないサイズですが、これぐらいのサイズであれば大抵は
// 対応できるサイズとなっています。
static const std::size_t c_nReadFileSize = 128*1024;
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] nLimFileSize
@details
nLimFileSizeを省略した場合はSetDefaultLimitFileSize()
使
-----------------------------------------------------------------------*/
//@{
explicit PhotoHeaderFileReader(Allocator& rAllocator);
PhotoHeaderFileReader(Allocator& rAllocator, std::size_t nLimFileSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~PhotoHeaderFileReader();
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] pPath
@return
@details
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じスト
-----------------------------------------------------------------------*/
//@{
virtual bool Read(
StorageType eStoType, const wchar_t* pPath);
virtual bool Read(
StorageType eStoType, const wchar_t* pPath,
s64 nStartPos, std::size_t nReadSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
std::size_t GetLimitFileSize() const{ return m_nCurLimitFileSize; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
static bool IsValidDefaultLimitFileSize();
static std::size_t GetDefaultLimitFileSize();
static void SetDefaultLimitFileSize(std::size_t nSize);
//@}
private:
static bool bSetDefaultLimitFileSize;
static std::size_t nDefaultLimitFileSize;
private:
std::size_t m_nCurLimitFileSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PhotoImageInfoReader : private PhotoFileReader
{
public:
/*!----------------------------------------------------------------------
@brief
@param
@param[in] rAllocator 使
@param[in] nLimFileSize
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
nLimFileSizeを省略した場合は
bTwlCompatibleはTWL互換用の領域を指定するフラグでNANDで
JPEGファイル時のみ意味がありますfalseを指定
CTR領域trueを指定するとTWL領域のパスを返します
-----------------------------------------------------------------------*/
//@{
PhotoImageInfoReader(
Allocator& rAllocator,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
PhotoImageInfoReader(
Allocator& rAllocator, std::size_t nLimFileSize,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
Result ReadImage();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
StorageType GetStorageType() const { return m_eStoType; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const ImageInfo& GetImageInfo() const { return m_rImgInfo; }
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
//@{
const void* GetImageData() const { return GetData(); }
void* GetImageData(){ return GetData(); }
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetImageDataSize() const{ return GetDataSize(); }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
s64 GetImageFileSize() const{ return GetFileSize(); }
private:
const StorageType m_eStoType;
const ImageInfo& m_rImgInfo;
const bool m_bTwlCompatible;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
JPEGのExif(APP1)
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PhotoHeaderImageInfoReader : private PhotoHeaderFileReader
{
public:
/*!----------------------------------------------------------------------
@brief
@param
@param[in] rAllocator 使
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
bTwlCompatibleはTWL互換用の領域を指定するフラグでNANDで
JPEGファイル時のみ意味がありますfalseを指定
CTR領域trueを指定するとTWL領域のパスを返します
-----------------------------------------------------------------------*/
PhotoHeaderImageInfoReader(
Allocator& rAllocator,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
Result ReadImage();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
StorageType GetStorageType() const { return m_eStoType; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const ImageInfo& GetImageInfo() const { return m_rImgInfo; }
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
//@{
const void* GetImageData() const { return GetData(); }
void* GetImageData(){ return GetData(); }
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetImageDataSize() const{ return GetDataSize(); }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
s64 GetImageFileSize() const{ return GetFileSize(); }
private:
const StorageType m_eStoType;
const ImageInfo& m_rImgInfo;
const bool m_bTwlCompatible;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief JPEG内のJPEG読み込みクラス
@details
使SetLimitFileSize()
使
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class JpegInMJpegFileReader : public FileReader
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] nLimFileSize
@details
nLimFileSizeを省略した場合はSetDefaultLimitFileSize()
使
-----------------------------------------------------------------------*/
//@{
explicit JpegInMJpegFileReader(Allocator& rAllocator);
JpegInMJpegFileReader(Allocator& rAllocator, std::size_t nLimFileSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegInMJpegFileReader();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
std::size_t GetLimitFileSize() const{ return m_nCurLimitFileSize; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
static bool IsValidDefaultLimitFileSize();
static std::size_t GetDefaultLimitFileSize();
static void SetDefaultLimitFileSize(std::size_t nSize);
//@}
private:
static bool bSetDefaultLimitFileSize;
static std::size_t nDefaultLimitFileSize;
private:
std::size_t m_nCurLimitFileSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_FILE_READER_H_

View File

@ -0,0 +1,560 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbFileUtility.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_FILE_UTILITY_H_
#define IMAGE_DB_FILE_UTILITY_H_
#include <nn/fs.h>
#include "ImageDbTypes.h"
#include "ImageDbDynamicArray.h"
#include "ImageDbAllocator.h"
#include "ImageDbResult.h"
#include "ImageDbIndexInfo.h"
#include "ImageDbImageInfo.h"
#include "ImageDbPathUtility.h"
namespace imgdb {
namespace util {
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct FileIndexInfo
{
public:
union{
u32 nValue;
struct{
u32 nNo:14; // ファイル番号9999まで対応
u32 nImageKind:3; // 映像データの種類 ImageKind列挙型
u32 reserved:15;
};
};
public:
void Initialize(){ nValue = 0; }
int GetNo() const { return nNo; }
void SetNo(int nNo){ this->nNo = nNo; }
ImageKind GetImageKind() const { return static_cast<ImageKind>(nImageKind); }
void SetImageKind(ImageKind eImgKind){ nImageKind = eImgKind; }
bool operator==(const FileIndexInfo& x) const{ return (nValue == x.nValue); }
bool operator!=(const FileIndexInfo& x) const{ return operator==(x); }
bool operator<(const FileIndexInfo& x) const{ return (nNo < x.nNo); }
bool operator<=(const FileIndexInfo& x) const{ return (nNo <= x.nNo); }
bool operator>(const FileIndexInfo& x) const{ return !operator<=(x); }
bool operator>=(const FileIndexInfo& x) const{ return !operator<(x); }
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*---------------------------------------------------------------------------*
ImageDbが扱うDCF準拠のディレクトリの有無を記録するクラス
*---------------------------------------------------------------------------*/
class DcfDirectoriesEntity
{
public:
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
DcfDirectoriesEntity(){ std::memset(m_nBit, 0, sizeof(m_nBit)); }
/*-----------------------------------------------------------------------
nIndex DCFディレクトリインデックス [0,899]
nNo DCFディレクトリ番号 [100,999]
-----------------------------------------------------------------------*/
bool GetValidFlag(int nIndex) const{
NN_ASSERT(IndexInfo::IsValidDirectoryIndex(nIndex));
return (m_nBit[ElementTypeValidFlag][ComputeArrayIndex(nIndex)] & ComputeBitFlag(nIndex));
}
bool GetValidFlagByDcf(int nNo) const{
return GetValidFlag(IndexInfo::ConvDirectoryIndexFromDcf(nNo));
}
void SetValidFlag(int nIndex, bool bValid){
NN_ASSERT(IndexInfo::IsValidDirectoryIndex(nIndex));
if(bValid){ m_nBit[ElementTypeValidFlag][ComputeArrayIndex(nIndex)] |= ComputeBitFlag(nIndex); }
else{ m_nBit[ElementTypeValidFlag][ComputeArrayIndex(nIndex)] &= ~ComputeBitFlag(nIndex); }
}
void SetValidFlagByDcf(int nNo, bool bValid){
SetValidFlag(IndexInfo::ConvDirectoryIndexFromDcf(nNo), bValid);
}
bool GetOfficialFlag(int nIndex) const{
NN_ASSERT(IndexInfo::IsValidDirectoryIndex(nIndex));
return (m_nBit[ElementTypeOfficialFlag][ComputeArrayIndex(nIndex)] & ComputeBitFlag(nIndex));
}
bool GetOfficialFlagByDcf(int nNo) const{
return GetOfficialFlag(IndexInfo::ConvDirectoryIndexFromDcf(nNo));
}
void SetOfficialFlag(int nIndex, bool bValid){
NN_ASSERT(IndexInfo::IsValidDirectoryIndex(nIndex));
if(bValid){ m_nBit[ElementTypeOfficialFlag][ComputeArrayIndex(nIndex)] |= ComputeBitFlag(nIndex); }
else{ m_nBit[ElementTypeOfficialFlag][ComputeArrayIndex(nIndex)] &= ~ComputeBitFlag(nIndex); }
}
void SetOfficialFlagByDcf(int nNo, bool bValid){
SetOfficialFlag(IndexInfo::ConvDirectoryIndexFromDcf(nNo), bValid);
}
private:
int ComputeArrayIndex(int nIndex) const{ return nIndex / 8; }
int ComputeBitFlag(int nIndex) const{ return 1 << (nIndex % 8); }
private:
enum ElementType {
ElementTypeValidFlag = 0,
ElementTypeOfficialFlag,
ElementTypeNum
};
u8 m_nBit[ElementTypeNum][(IndexInfo::c_nDirectoryIndexMax+7)/8];
};
/*---------------------------------------------------------------------------*
ImageDbが扱うDCF準拠のファイルの有無を記録するクラス
*---------------------------------------------------------------------------*/
class DcfFilesEntity
{
public:
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
DcfFilesEntity(){ std::memset(m_nBit, 0, sizeof(m_nBit)); }
/*-----------------------------------------------------------------------
nIndex DCFファイルインデックス [0,99]
nNo DCFファイル番号 [1,100]
-----------------------------------------------------------------------*/
bool GetValidFlag(int nIndex) const{
NN_ASSERT(IndexInfo::IsValidFileIndex(nIndex));
return (m_nBit[ComputeArrayIndex(nIndex)] & ComputeBitFlag(nIndex));
}
bool GetValidFlagByDcf(int nNo) const{
return GetValidFlag(IndexInfo::ConvFileIndexFromDcf(nNo));
}
void SetValidFlag(int nIndex, bool bValid){
NN_ASSERT(IndexInfo::IsValidFileIndex(nIndex));
if(bValid){ m_nBit[ComputeArrayIndex(nIndex)] |= ComputeBitFlag(nIndex); }
else{ m_nBit[ComputeArrayIndex(nIndex)] &= ~ComputeBitFlag(nIndex); }
}
void SetValidFlagByDcf(int nNo, bool bValid){
SetValidFlag(IndexInfo::ConvFileIndexFromDcf(nNo), bValid);
}
private:
int ComputeArrayIndex(int nIndex) const{ return nIndex / 8; }
int ComputeBitFlag(int nIndex) const{ return 1 << (nIndex % 8); }
private:
u8 m_nBit[(IndexInfo::c_nOfficialFileIndexMax+7)/8];
};
typedef DynamicArray< int, XAllocator<int> > DirectoryIndexList;
typedef DynamicArray< FileIndexInfo, XAllocator<FileIndexInfo> > FileIndexList;
/*!--------------------------------------------------------------------------*
@brief NANDのファイル操作失敗によるFATALエラー呼び出しを処理する
@param[in] ret NAND操作結果
@return retそのもの
@details
retにはNAND操作FSのファイルオープンやリードライトなど
FATALが発動します
*---------------------------------------------------------------------------*/
nn::Result ThrowFatalErrByNandOperation(nn::Result ret);
/*---------------------------------------------------------------------------*
@return true
@details
DCIM
*---------------------------------------------------------------------------*/
bool IsExistImageDataEvidence(StorageType eStoType);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@return true
@details
falseを返します
NANDに読み取り専用は無いのでfalseしか返しません
*---------------------------------------------------------------------------*/
bool IsDbFileReadOnly(StorageType eStoType);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pDirPath
@details
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じストレージ
*---------------------------------------------------------------------------*/
Result CreateDirectory(StorageType eStoType, const wchar_t* pDirPath, Allocator* pAllocator=0);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pPath
@return true
@details
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じストレージ
*---------------------------------------------------------------------------*/
Result DeleteFile(StorageType eStoType, const wchar_t* pPath);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pDirPath
@return true
@details
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じストレージ
*---------------------------------------------------------------------------*/
Result DeleteDirectory(StorageType eStoType, const wchar_t* pDirPath);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pPath
@return true
@details
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じストレージ
*---------------------------------------------------------------------------*/
bool IsExistFile(StorageType eStoType, const wchar_t* pPath);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pDirPath
@return true
@details
falseを返します
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じストレージ
*---------------------------------------------------------------------------*/
bool IsExistDir(StorageType eStoType, const wchar_t* pDirPath);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pDirPath
@return true
@details
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じストレージ
*---------------------------------------------------------------------------*/
bool IsExistDirContents(StorageType eStoType, const wchar_t* pDirPath);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] pPath
@param[out] pIsAvailable
@return
@details
pIsAvailableにfalseが格納されます
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じストレージ
*---------------------------------------------------------------------------*/
s64 GetFileSize(StorageType eStoType, const wchar_t* pPath, bool* pIsAvailable=0);
/*!--------------------------------------------------------------------------*
@brief
@param[out] rAttrib
@param[in] eStoType
@param[in] pPath
@return true
@details
eStoTypeにSDカード以外を指定した場合rAttrib::isDirectory以外はfalseとなります
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じストレージ
*---------------------------------------------------------------------------*/
bool GetFileAttribute(
nn::fs::Attributes& rAttrib, StorageType eStoType, const wchar_t* pPath);
/*!--------------------------------------------------------------------------*
@brief
@param[out] rAttrib
@param[in] eStoType
@param[in] pPath
@return true
@details
eStoTypeにSDカード以外を指定した場合rAttrib::isDirectory以外はfalseとなります
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じストレージ
*---------------------------------------------------------------------------*/
bool GetDirectoryAttribute(
nn::fs::Attributes& rAttrib, StorageType eStoType, const wchar_t* pPath);
/*---------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return true
@details
rIdxInfoから求まる映像のディレクトリ名が既に存在する
trueを返します
使
falseを返します
DCF仕様として先頭文字の数字が重複してはならない
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
*---------------------------------------------------------------------------*/
bool IsAvailableIndexInfoDirectory(
StorageType eStoType, const IndexInfo& rIdxInfo, bool bTwlCompatible);
/*---------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return true
@details
rIdxInfoから求まる映像のディレクトリに
trueを返します
falseを返しま
DCF仕様として末尾文字の数字が重複してはならない
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
*---------------------------------------------------------------------------*/
bool IsAvailableIndexInfoFile(
StorageType eStoType, const IndexInfo& rIdxInfo, bool bTwlCompatible);
/*---------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return true
@details
eImgKindとrIdxInfoから求まるファイル名が使用可能か
調
使falseを返します
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
IsAvailableIndexInfoDirectory()IsAvailableIndexInfoFile()
*---------------------------------------------------------------------------*/
bool IsAvailableIndexInfo(
StorageType eStoType, const IndexInfo& rIdxInfo, bool bTwlCompatible);
/*---------------------------------------------------------------------------*
@brief
@param[out] rIdxInfo
@param[in] eStoType
@param[in] bTwlCompatible TWL互換フラグ
@param[in] rStartIdxInfo
@return true
使DCFのディレクトリ
調
rStartIdxInfoを指定した場合は
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
rIdxInfoとrStartIdxInfoは同一のデータを指定することが可能です
*---------------------------------------------------------------------------*/
//@{
bool FindAvailableIndexInfo(
IndexInfo& rIdxInfo, StorageType eStoType, bool bTwlCompatible);
bool FindAvailableIndexInfo(
IndexInfo& rIdxInfo, StorageType eStoType, bool bTwlCompatible,
const IndexInfo& rStartIdxInfo);
//@}
/*---------------------------------------------------------------------------*
@brief CTR-NANDとTWL-NANDから利用可能なインテックス情報を探す
@param[out] rIdxInfo
@param[in] rStartIdxInfo
@return true
CTR-NANDとTWL-NANDの両方で利用可能な使DCFのディレ
調
rStartIdxInfoを指定した場合は
rIdxInfoとrStartIdxInfoは同一のデータを指定することが可能です
*---------------------------------------------------------------------------*/
//@{
bool FindAvailableIndexInfoInNand(IndexInfo& rIdxInfo);
bool FindAvailableIndexInfoInNand(IndexInfo& rIdxInfo, const IndexInfo& rStartIdxInfo);
//@}
/*---------------------------------------------------------------------------*
@brief 100NIN02999NIN02
@param[out] rList
@param[in] eStoType
@param[in] pDirPath
@param[in] bTwlCompatible TWL互換フラグ
@details
bTwlCompatible=trueの場合は100NIN02999NIN02falseの場合は100NIN03999NIN03
pDirPathの末尾にスラッシュはつけないでください
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じストレージ
*---------------------------------------------------------------------------*/
void EnumImageDirectory(DirectoryIndexList& rList, StorageType eStoType, const wchar_t* pDirPath, bool bTwlCompatible);
/*---------------------------------------------------------------------------*
@brief HNI_0001.XXXHNI_0100.XXX
@param[out] rList
@param[in] eStoType
@param[in] pDirPath
@param[in] eImgKind
@param[in] eImgKindBit
@param[in] bTwlCompatible TWL互換フラグ
@details
pDirPathの末尾にスラッシュはつけないでください
eImgKindBitで複数の映像を指定して
FSで最初に見つかった映像が優先されますJPEGの場合は他に違う
MPOと対となるJPEGの場合MPOが優先される
bTwlCompatibleは現状意味がありません
eStoTypeはエラーが起こった時の扱いに使用されますpDirPathと同じストレージ
*---------------------------------------------------------------------------*/
//@{
void EnumImageFile(FileIndexList& rList, StorageType eStoType, const wchar_t* pDirPath, ImageKind eKind, bool bTwlCompatible);
void EnumImageFile(FileIndexList& rList, StorageType eStoType, const wchar_t* pDirPath, ImageKindBit eImgKindBit, bool bTwlCompatible);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] rImgInfo
@param[in] pImgData1
@param[in] nImgDataSize1
@param[in] pImgData2
@param[in] nImgDataSize2
@param[in] pMpData MPデータ
@param[in] nMpDataSize MPデータサイズ
@param[in] pJpegData JPEGデータ
@param[in] nJpegDataSize JPEGデータサイズ
@return
@details
SaveImage()rImgRecの情報を元にJPEGであればData1にJPEGデータMPであれば
Data1にMPデータData2に対となるJPEGデータと解釈します
MPデータ時にData2の指定がなければMPデータからJPEGデータを作り出します
SaveImageMp()JPEGデータの指定がなければMPデータからJPEGデータを作り出します
*---------------------------------------------------------------------------*/
//@{
Result SaveImage(
StorageType eStoType, const ImageInfo& rImgInfo,
const void* pImgData1, std::size_t nImgDataSize1,
const void* pImgData2, std::size_t nImgDataSize2);
Result SaveImageJpeg(
StorageType eStoType, const ImageInfo& rImgInfo,
const void* pJpegData, std::size_t nJpegDataSize);
Result SaveImageMp(
StorageType eStoType, const ImageInfo& rImgInfo,
const void* pMpData, std::size_t nMpDataSize,
const void* pJpegData, std::size_t nJpegDataSize);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] rImgRec
@param[in] bTwlCompatible TWL互換フラグ
@param[in] bDeleteDirectory
@details
bDeleteDirectory=trueなら
ResultSuccessを返します
*---------------------------------------------------------------------------*/
//@{
// 指定の映像情報のファイルを削除する
// 内部で映像の種類を判断してそれぞれにあった削除関数を呼び出します。
Result DeleteImage(
StorageType eStoType, const ImageInfo& rImgInfo, bool bDeleteDirectory=true);
// 指定のJPEGファイルを削除するJPEG以外を指定するとアサート
// NANDであればTWL側も削除します。
Result DeleteImageJpeg(
StorageType eStoType, const ImageInfo& rImgInfo, bool bDeleteDirectory=true);
// 指定のMPOファイルを削除するMPO以外を指定するとアサート
// 対となるJPEGも削除します。
Result DeleteImageMp(
StorageType eStoType, const ImageInfo& rImgInfo, bool bDeleteDirectory=true);
// 指定のモーションJPEGファイルを削除するモーションJPEG以外を指定するとアサート
Result DeleteImageMotionJpeg(
StorageType eStoType, const ImageInfo& rImgInfo, bool bDeleteDirectory=true);
// 指定映像のTWL側だけ削除する
// NANDが対象の場合TWL-NAND側の写真だけを削除します。
// SDが対象の場合はDeleteImage()と処理は変わりません。
Result DeleteImageTwl(
StorageType eStoType, const ImageInfo& rImgInfo, bool bDeleteDirectory=true);
// NANDが対象の場合CTR-NAND側の写真だけを削除します。
// SDが対象の場合はDeleteImage()と処理は変わりません。
Result DeleteImageCtr(
StorageType eStoType, const ImageInfo& rImgInfo, bool bDeleteDirectory=true);
//@}
/*!--------------------------------------------------------------------------*
@brief TWL-NAND領域にあるPNOTE関連のデータをすべて削除する
@details
privateDCIMディレクトリが削除されます
*---------------------------------------------------------------------------*/
void CleanupTwlNand();
/*!--------------------------------------------------------------------------*
@brief CTR-NAND領域にあるPNOTE関連のデータをすべて削除する
@details
privateDCIMディレクトリが削除されます
*---------------------------------------------------------------------------*/
void CleanupCtrNand();
/*!--------------------------------------------------------------------------*
@brief SDカードにあるPNOTE関連のデータをすべて削除する
@details
privateDCIMディレクトリが削除されます
*---------------------------------------------------------------------------*/
void CleanupSd();
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoTypeSrc
@param[in] pSrcDir
@param[in] eStoTypeDst
@param[in] pDstDir
@details
:"sdmc:/DCIM"
:"sdmc:/"
eStoTypeSrcやeStoTypeDstはエラーが起こった時の扱いに使用されます
*---------------------------------------------------------------------------*/
bool CopyAll(
StorageType eStoTypeSrc, const wchar_t* pSrcDir,
StorageType eStoTypeDst, const wchar_t* pDstDir);
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_FILE_UTILITY_H_

View File

@ -0,0 +1,162 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbFileWriter.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_FILE_WRITER_H_
#define IMAGE_DB_FILE_WRITER_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbTypes.h"
#include "ImageDbResult.h"
#include "ImageDbAllocator.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class FileWriter : private nn::util::NonCopyable<FileWriter>
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
-----------------------------------------------------------------------*/
explicit FileWriter(Allocator& rAllocator);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~FileWriter();
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] pPath
@param[in] pData
@param[in] nDataSize
@return true
@details
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じスト
-----------------------------------------------------------------------*/
virtual bool Write(
StorageType eStoType, const wchar_t* pPath,
const void* pData, std::size_t nDataSize);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
Result GetResult() const;
/*!----------------------------------------------------------------------
@brief FSライブラリが返す結果を取得する
@return
-----------------------------------------------------------------------*/
nn::Result GetNnResult() const;
protected:
void* Alloc(std::size_t nSize);
void Free(void* pAddr);
private:
Allocator& m_rAllocator;
Result m_eResult;
nn::Result m_NnResult;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageFileWriter : private FileWriter
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@param[in] pImgData
@param[in] nImgSize
@details
bTwlCompatibleはTWL互換用の領域を指定するフラグでNANDで
JPEGファイル時のみ意味がありますfalseを指定
CTR領域trueを指定するとTWL領域のパスを返します
-----------------------------------------------------------------------*/
ImageFileWriter(
Allocator& rAllocator,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible,
const void* pImgData, std::size_t nImgSize);
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
Result WriteImage();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
StorageType GetStorageType() const { return m_eStoType; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const ImageInfo& GetImageInfo() const { return m_rImgInfo; }
/*!----------------------------------------------------------------------
@brief TWL互換フラグを取得する
@return TWL互換フラグ
-----------------------------------------------------------------------*/
bool IsTwlCompatible() const { return m_bTwlCompatible; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetImageData() const { return m_pImgData; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetImageDataSize() const { return m_nImgSize; }
private:
const StorageType m_eStoType;
const ImageInfo& m_rImgInfo;
const bool m_bTwlCompatible;
const void* m_pImgData;
const std::size_t m_nImgSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_FILE_WRITER_H_

View File

@ -0,0 +1,472 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbImageCollector.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_IMAGE_COLLECTOR_H_
#define IMAGE_DB_IMAGE_COLLECTOR_H_
#include <functional>
#include <nn/types.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
#include "ImageDbAllocator.h"
#include "ImageDbImageSearcher.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
#pragma pack(push, 4)
struct ImageCollectionTableRecord
{
public:
// レコードステート列挙型
enum State {
StateEmpty = 0, //!< 空きレコード
StateExistence, //!< 既存レコード
StateNew, //!< 新規追加レコード
StateLostFile, //!< ファイルが無くなったレコード
StateChangeMp2Jpg, //!< MPからJPEGに変更されたレコード
StateChangeJpg2Mp, //!< JPEGからMPに変更されたレコード
StateChangeFile, //!< 拡張子はそのままでファイルが挿し替わっているレコード
StateNum
};
// レコードステート列挙型
enum StateBit {
StateBitEmpty = 1 << StateEmpty,
StateBitExistence = 1 << StateExistence,
StateBitNew = 1 << StateNew,
StateBitLostFile = 1 << StateLostFile,
StateBitChangeMp2Jpg = 1 << StateChangeMp2Jpg,
StateBitChangeJpg2Mp = 1 << StateChangeJpg2Mp,
StateBitChangeFile = 1 << StateChangeFile,
StateBitAllWithoutEmypty = StateBitExistence
| StateBitNew
| StateBitLostFile
| StateBitChangeMp2Jpg
| StateBitChangeJpg2Mp
| StateBitChangeFile,
StateBitAll = StateBitEmpty
| StateBitAllWithoutEmypty
};
public:
DateTimeSeconds sShotSeconds; // 撮影日時
char cExt[Const::c_nMaxExtLength]; //!< 拡張子
char cFileName[Const::c_nImageFileNameLength]; //!< ファイル名
char cDirName[Const::c_nImageDirectoryLength]; //!< ディレクトリ名
u32 nField;
u32 nFileSize;
//----- フィールド -----//
// bit0-2 レコードステート列挙型
static const int c_nFieldStateBits = 3;
static const int c_nFieldStateShift = 0;
static const u32 c_nFieldStateMask = ((1UL<<c_nFieldStateBits)-1)<<c_nFieldStateShift;
// bit3 オフィシャル映像フラグ
static const int c_nFieldOfficialBits = 1;
static const int c_nFieldOfficialShift = c_nFieldStateBits + c_nFieldStateShift;
static const u32 c_nFieldOfficialMask = ((1UL<<c_nFieldOfficialBits)-1)<<c_nFieldOfficialShift;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
State GetState() const;
void SetState(State eState);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
bool GetOfficialFlag() const;
void SetOfficialFlag(bool bOfficial);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetShotSeconds() const{ return sShotSeconds; }
void SetShotSeconds(const DateTimeSeconds& rSecs){ sShotSeconds = rSecs; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
u32 GetFileSize() const{ return nFileSize; }
s64 GetFileSize64() const{ return static_cast<s64>(static_cast<u64>(nFileSize)); }
void SetFileSize(s64 nSize){ nFileSize = static_cast<u32>(nSize); }
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetExtInternal()
Const::c_nMaxExtLength要素数のバッファで
GetExt()
nSizeにはConst::c_nMaxExtLength+1
SetExt()Const::c_nMaxExtLengthまでです
-----------------------------------------------------------------------*/
//@{
const char* GetExtInternal() const{ return cExt; }
int GetExt(char* pExt, int nSize) const;
int GetExt(wchar_t* pExt, int nSize) const;
void SetExt(const char* pExt);
void SetExt(const wchar_t* pExt);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ImageKind GetImageKind() const;
/*!----------------------------------------------------------------------
@brief
@details
GetFileNameInternal()
Const::c_nImageFileNameLength要素数のバッファで
GetFileName()
nSizeにはConst::c_nImageFileNameLength+1
SetFileName()Const::c_nImageFileNameLength文字ま
-----------------------------------------------------------------------*/
//@{
const char* GetFileNameInternal() const{ return cFileName; }
int GetFileName(char* pFName, int nSize) const;
int GetFileName(wchar_t* pFName, int nSize) const;
void SetFileName(const char* pFName);
void SetFileName(const wchar_t* pFName);
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetDirNameInternal()
Const::c_nImageDirectoryLength要素数のバッファで
GetDirName()
nSizeにはConst::c_nImageDirectoryLength+1
SetDirName()Const::c_nImageDirectoryLength文字
-----------------------------------------------------------------------*/
//@{
const char* GetDirectoryNameInternal() const{ return cDirName; }
int GetDirectoryName(char* pDName, int nSize) const;
int GetDirectoryName(wchar_t* pDName, int nSize) const;
void SetDirectoryName(const char* pDName);
void SetDirectoryName(const wchar_t* pDName);
//@}
/*!----------------------------------------------------------------------
@brief
@param[out] pStr
@param[in] nSize
@param[in] eStoType
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"sdmc:/DCIM/100NIN02/HNI_0001.JPG"
Const::c_nMaxImageFileFullPathLength+1
eRecKindは大本のディレクトリのパスの決定で使用されるもので
-----------------------------------------------------------------------*/
int CreateImagePath(
wchar_t* pStr, int nSize, StorageType eStoType, bool bTwlCompatible) const;
/*!----------------------------------------------------------------------
@brief
@param[out] pStr
@param[in] nSize
@param[in] eStoType
@param[in] eImgKind
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"sdmc:/DCIM/100NIN02/HNI_0001.JPG"
Const::c_nMaxImageFileFullPathLength+1
使eImgKindで指定された映像の拡張子が使用され
-----------------------------------------------------------------------*/
int CreateImagePathWithChangeExt(
wchar_t* pStr, int nSize,
StorageType eStoType, ImageKind eImgKind, bool bTwlCompatible) const;
private:
static int CopyBufToStr(char* pDst, int nDstSize, const char* pBufSrc, int nBufSrcSize);
static int CopyBufToStr(wchar_t* pDst, int nDstSize, const char* pBufSrc, int nBufSrcSize);
static void CopyStrToBuf(char* pBufDst, int nBufDstSize, const char* pSrc);
static void CopyStrToBuf(char* pBufDst, int nBufDstSize, const wchar_t* pSrc);
};
#pragma pack(pop)
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageCollectionTable
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ImageCollectionTable();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~ImageCollectionTable();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsInitialized() const{ return (0 != m_pAllocator); }
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] nRecordNum
@details
-----------------------------------------------------------------------*/
void Initialize(Allocator& rAllocator, int nRecordNum);
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
void Release();
/*!----------------------------------------------------------------------
@brief
@details
Initialize()
-----------------------------------------------------------------------*/
int GetRecordNum() const{ NN_ASSERT(IsInitialized()); return m_nRecordNum; }
/*!----------------------------------------------------------------------
@brief
@details
Initialize()
-----------------------------------------------------------------------*/
//@{
const ImageCollectionTableRecord& GetRecord(int nIndex) const;
ImageCollectionTableRecord& GetRecord(int nIndex);
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] eState
-----------------------------------------------------------------------*/
//@{
void ClearRecord(ImageCollectionTableRecord::State eState);
void ClearRecord(ImageCollectionTableRecord::StateBit eStateBit);
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] eState
@param[in] nStartIndex
@return
@details
nStartIndexを指定すると
-----------------------------------------------------------------------*/
//@{
int FindRecord(ImageCollectionTableRecord::State eState, int nStartIndex = -1) const;
int FindRecord(ImageCollectionTableRecord::StateBit eStateBit, int nStartIndex = -1) const;
//@}
private:
Allocator* m_pAllocator;
ImageCollectionTableRecord* m_pRecords;
int m_nRecordNum;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageCollector
{
friend class ImageDatabase;
public:
enum ProcessType {
ProcessTypeNone = 0,
ProcessTypeCleanup, // 削除されたデータとファイルサイズの調査
ProcessTypeCollectOfficial, // オフィシャルデータ(任天堂データ)の調査中
ProcessTypeCollectUnofficial, // アンオフィシャルデータ(他社データ)の調査中
ProcessTypeNum
};
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ImageCollector();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~ImageCollector();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsInitialized() const{ return (0 != m_pAllocator); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Release();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
StorageType GetStorageType() const{ return m_eStoType; }
/*!----------------------------------------------------------------------
@brief
@param[in] eProcType
@details
Updateを呼び出して処理を更新してください
-----------------------------------------------------------------------*/
void StartProcess(ProcessType eProcType);
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
void Update();
/*!----------------------------------------------------------------------
@brief
@details
Update()
ResetDirty()
-----------------------------------------------------------------------*/
bool IsDirty() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void ResetDirty();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ProcessType GetProcessType() const{ return m_eProcType; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const ImageCollectionTable& GetTable() const{ return m_Table; }
ImageCollectionTable& GetTable(){
return const_cast<ImageCollectionTable&>(static_cast<const ImageCollector&>(*this).GetTable()); }
//@}
private:
void Initialize(Allocator& rAllocator, StorageType eStoType);
void SetDirty();
int FindSameInfoInTable(const ImageInfo& rImgInfo) const;
void ChangeProcess(ProcessType eProcType);
void InitProcessNone(){}
void EndProcessNone(){}
void UpdateProcessNone(){}
void InitProcessCleanup();
void EndProcessCleanup();
void UpdateProcessCleanup();
void InitProcessCollectOfficial();
void EndProcessCollectOfficial();
void UpdateProcessCollectOfficial();
void InitProcessCollectUnofficial();
void EndProcessCollectUnofficial();
void UpdateProcessCollectUnofficial();
private:
// プロセス初期化処理テーブル
static const std::mem_fun_t<void, ImageCollector> c_fnInitProcessTable[ProcessTypeNum];
// プロセス終了処理テーブル
static const std::mem_fun_t<void, ImageCollector> c_fnEndProcessTable[ProcessTypeNum];
// プロセス更新処理テーブル
static const std::mem_fun_t<void, ImageCollector> c_fnUpdateProcessTable[ProcessTypeNum];
private:
Allocator* m_pAllocator;
StorageType m_eStoType;
ImageCollectionTable m_Table;
bool m_bDirty;
ProcessType m_eProcType;
int m_nCleanupIndex;
ImageSearcher* m_pSearcher;
bool m_bFoundDir;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_IMAGE_COLLECTOR_H_

View File

@ -0,0 +1,341 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbImageInfo.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_IMAGE_INFO_H_
#define IMAGE_DB_IMAGE_INFO_H_
#include <nn/types.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
#include "ImageDbIndexInfo.h"
#include "ImageDbDateTimeSeconds.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
@details
PNOTE独自で保持する情報
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
#pragma pack(push, 4)
struct ImageInfo
{
public:
//! 本体ID最大数
static const int c_nIdMaxNum = 4;
//----- フラグA -----//
// bit0 有効フラグ
static const int c_nFlagAValidBits = 1;
static const int c_nFlagAValidShift = 0;
static const u32 c_nFlagAValidMask = ((1UL<<c_nFlagAValidBits)-1)<<c_nFlagAValidShift;
// bit1-8 取り扱いフラグ
static const int c_nFlagAHandleTypeBitBits = imgdb::HandleTypeMax; // 8
static const int c_nFlagAHandleTypeBitShift = c_nFlagAValidBits + c_nFlagAValidShift; // 1
static const u32 c_nFlagAHandleTypeBitMask = ((1UL<<c_nFlagAHandleTypeBitBits)-1)<<c_nFlagAHandleTypeBitShift;
// bit9-16 本体IDフラグ
static const int c_nFlagABodyIdTypeBitBits = imgdb::BodyIdTypeMax; // 8
static const int c_nFlagABodyIdTypeBitShift = c_nFlagAHandleTypeBitBits + c_nFlagAHandleTypeBitShift; // 9
static const u32 c_nFlagABodyIdTypeBitMask = ((1UL<<c_nFlagABodyIdTypeBitBits)-1)<<c_nFlagABodyIdTypeBitShift;
//----- フラグB -----//
// bit0-5 撮影モード
static const int c_nFlagBShootingTypeBits = 5;
static const int c_nFlagBShootingTypeShift = 0;
static const u32 c_nFlagBShootingTypeMask = ((1UL<<c_nFlagBShootingTypeBits)-1)<<c_nFlagBShootingTypeShift;
// bit6-21 写真特徴タイプフラグ
static const int c_nFlagBDistinctionTypeBitBits = 16;
static const int c_nFlagBDistinctionTypeBitShift = c_nFlagBShootingTypeBits + c_nFlagBShootingTypeShift; // 5
static const u32 c_nFlagBDistinctionTypeBitMask = ((1UL<<c_nFlagBDistinctionTypeBitBits)-1)<<c_nFlagBDistinctionTypeBitShift;
// bit22-25 保存過程
static const int c_nFlagBSaveProcessTypeBits = 4;
static const int c_nFlagBSaveProcessTypeShift = c_nFlagBDistinctionTypeBitBits + c_nFlagBDistinctionTypeBitShift; // 21
static const u32 c_nFlagBSaveProcessTypeMask = ((1UL<<c_nFlagBSaveProcessTypeBits)-1)<<c_nFlagBSaveProcessTypeShift;
public:
char cExt[Const::c_nMaxExtLength]; //!< 拡張子
char cFileName[Const::c_nImageFileNameLength]; //!< ファイル名
char cDirName[Const::c_nImageDirectoryLength]; //!< ディレクトリ名
DateTimeSeconds sShotSeconds; //!< 撮影日時
DateTimeSeconds sCreateSeconds; //!< ファイル作成日時
u32 nTitleUniqueId; //!< タイトルユニークIDソフトウェアID
u32 nFlagA; //!< フラグ
u32 nFlagB; //!< フラグ
u32 nBodyId[c_nIdMaxNum]; //!< 本体ID
u32 nFileSize; //!< ファイルサイズ
int : 32; // reserve
int : 32; // reserve
int : 32; // reserve
public:
/*!----------------------------------------------------------------------
@brief
@param[in] eImgKind
@details
eImgKindを省略すると従来通りで初期化されます
-----------------------------------------------------------------------*/
//@{
void Initialize();
void Initialize(ImageKind eImgKind);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
@details
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
@return true
@details
-----------------------------------------------------------------------*/
bool ValidateWithoutPath() const;
/*!----------------------------------------------------------------------
@brief
@details
GetExtInternal()
Const::c_nMaxExtLength要素数のバッファで
GetExt()
nSizeにはConst::c_nMaxExtLength+1
SetExt()Const::c_nMaxExtLengthまでです
-----------------------------------------------------------------------*/
//@{
const char* GetExtInternal() const{ return cExt; }
int GetExt(char* pExt, int nSize) const;
int GetExt(wchar_t* pExt, int nSize) const;
void SetExt(const char* pExt);
void SetExt(const wchar_t* pExt);
void SetExt(ImageKind eKind);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
@details
DCFに準拠しているかチェックします
-----------------------------------------------------------------------*/
bool ValidateExt() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
static ImageKind GetImageKind(const char* pExt);
static ImageKind GetImageKind(const wchar_t* pExt);
ImageKind GetImageKind() const;
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetFileNameInternal()
Const::c_nImageFileNameLength要素数のバッファで
GetFileName()
nSizeにはConst::c_nImageFileNameLength+1
SetFileName()Const::c_nImageFileNameLength文字ま
-----------------------------------------------------------------------*/
//@{
const char* GetFileNameInternal() const{ return cFileName; }
int GetFileName(char* pFName, int nSize) const;
int GetFileName(wchar_t* pFName, int nSize) const;
void SetFileName(const char* pFName);
void SetFileName(const wchar_t* pFName);
void SetFileName(const IndexInfo& rIdxInfo);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
@details
DCFに準拠しているかチェックします
-----------------------------------------------------------------------*/
bool ValidateFileName() const;
/*!----------------------------------------------------------------------
@brief
@return 0999919999
@details
-----------------------------------------------------------------------*/
int GetFileNo() const;
/*!----------------------------------------------------------------------
@brief
@param[in] 0999919999
@details
ValidateFileName()
-----------------------------------------------------------------------*/
void SetFileNo(int nNo);
/*!----------------------------------------------------------------------
@brief
@details
GetDirNameInternal()
Const::c_nImageDirectoryLength要素数のバッファで
GetDirName()
nSizeにはConst::c_nImageDirectoryLength+1
SetDirName()Const::c_nImageDirectoryLength文字
-----------------------------------------------------------------------*/
//@{
const char* GetDirectoryNameInternal() const{ return cDirName; }
int GetDirectoryName(char* pDName, int nSize) const;
int GetDirectoryName(wchar_t* pDName, int nSize) const;
void SetDirectoryName(const char* pDName);
void SetDirectoryName(const wchar_t* pDName);
void SetDirectoryName(const IndexInfo& rIdxInfo, bool bTwlCompatible=false);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
@details
DCFに準拠しているかチェックします
-----------------------------------------------------------------------*/
bool ValidateDirectoryName() const;
/*!----------------------------------------------------------------------
@brief
@return 0999100999
@details
-----------------------------------------------------------------------*/
int GetDirectoryNo() const;
/*!----------------------------------------------------------------------
@brief
@param[in] 0999100999
@details
ValidateDirectoryName()
-----------------------------------------------------------------------*/
void SetDirectoryNo(int nNo);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
IndexInfo GetIndexInfo() const;
/*!----------------------------------------------------------------------
@brief 2000/01/01 0:0:0
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetShotSeconds() const{ return sShotSeconds; }
void SetShotSeconds(const DateTimeSeconds& rDTSecs){ sShotSeconds = rDTSecs; }
//@}
/*!----------------------------------------------------------------------
@brief 2000/01/01 0:0:0
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetCreateSeconds() const{ return sCreateSeconds; }
void SetCreateSeconds(const DateTimeSeconds& rDTSecs){ sCreateSeconds = rDTSecs; }
//@}
/*!----------------------------------------------------------------------
@brief IDを取得
-----------------------------------------------------------------------*/
//@{
u32 GetTitleUniqueId() const{ return nTitleUniqueId; }
void SetTitleUniqueId(u32 nUId){ nTitleUniqueId = nUId; }
//@}
/*!----------------------------------------------------------------------
@brief
@detail
-----------------------------------------------------------------------*/
//@{
bool GetValidityFlag() const;
void SetValidityFlag(bool bValidity);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
HandleTypeBit GetHandleTypeBit() const;
void SetHandleTypeBit(HandleTypeBit eBit);
//@}
/*!----------------------------------------------------------------------
@brief IDの取得
-----------------------------------------------------------------------*/
//@{
u32 GetBodyId(BodyIdType eType) const;
void SetBodyId(BodyIdType eType, u32 nId);
bool IsValidBodyId(BodyIdType eType) const;
BodyIdTypeBit GetValidBodyIdBit() const;
void ResetBodyId(BodyIdType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
ShootingType GetShootingType() const;
void SetShootingType(ShootingType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
DistinctionTypeBit GetDistinctionTypeBit() const;
void SetDistinctionTypeBit(DistinctionTypeBit eBit);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
SaveProcessType GetSaveProcessType() const;
void SetSaveProcessType(SaveProcessType eType);
//@}
/*!----------------------------------------------------------------------
@brief Byte単位
-----------------------------------------------------------------------*/
//@{
u32 GetFileSize() const{ return nFileSize; }
s64 GetFileSize64() const{ return static_cast<s64>(static_cast<u64>(nFileSize)); }
void SetFileSize(u32 nSize){ nFileSize = nSize; }
//@}
private:
static int CopyBufToStr(char* pDst, int nDstSize, const char* pBufSrc, int nBufSrcSize);
static int CopyBufToStr(wchar_t* pDst, int nDstSize, const char* pBufSrc, int nBufSrcSize);
static void CopyStrToBuf(char* pBufDst, int nBufDstSize, const char* pSrc);
static void CopyStrToBuf(char* pBufDst, int nBufDstSize, const wchar_t* pSrc);
void SetValidBodyIdBit(BodyIdTypeBit eBit);
};
#pragma pack(pop)
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_IMAGE_INFO_H_

View File

@ -0,0 +1,135 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbImageSearcher.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_IMAGE_SEARCHER_H_
#define IMAGE_DB_IMAGE_SEARCHER_H_
#include <nn/types.h>
#include "ImageDbTypes.h"
#include "ImageDbAllocator.h"
#include "ImageDbImageInfo.h"
#include "ImageDbDirectory.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageSearcher
{
public:
// 検索ステート列挙型
enum SearchState {
SearchStateNone = 0, // 結果なし
SearchStateFound, // 発見
SearchStateSearching, // 検索中
SearchStateNum
};
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
ImageSearcher();
ImageSearcher(Allocator& rAllocator, StorageType eStoType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~ImageSearcher();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsInitialized() const{ return (0 != m_pAllocator); }
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
void Initialize(Allocator& rAllocator, StorageType eStoType);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Release();
/*!----------------------------------------------------------------------
@brief
@return
@details
SearchStateFoundの場合はDCF準拠のディレクトリを発見し
GetSearchedImageInfo()
SearchStateSearchingの場合は
SearchDirectoryを呼び出すことができます
SearchStateNoneの場合はこれ以上検索できないときの状態です
-----------------------------------------------------------------------*/
SearchState SearchDirectory();
/*!----------------------------------------------------------------------
@brief
@return true
@details
SearchStateFoundの場合はDCF準拠のディレクトリを発見し
GetSearchedImageInfo()
SearchStateSearchingの場合は
SearchDirectoryを呼び出すことができます
SearchStateNoneの場合はこれ以上検索できないときの状態です
-----------------------------------------------------------------------*/
SearchState SearchFile();
/*!----------------------------------------------------------------------
@brief
@return
@details
SearchDirectory()SearchFile()
SearchDirectory()
-----------------------------------------------------------------------*/
const ImageInfo& GetSearchedImageInfo() const{ return m_sFoundImgInfo; }
/*!----------------------------------------------------------------------
@brief CTRのディレクトリ名かチェックする
@return
@details
"100NIN03"
-----------------------------------------------------------------------*/
bool IsCtrDirectoryName() const;
/*!----------------------------------------------------------------------
@brief
@param[out] pPostfixNo "NIN??"
@details
DCF桁数字"NIN"
-----------------------------------------------------------------------*/
bool IsNintendoDirectoryName(int* pPostfixNo=0) const;
private:
Allocator* m_pAllocator;
StorageType m_eStoType;
Directory* m_pDirDirs;
Directory* m_pDirFiles;
ImageInfo m_sFoundImgInfo;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_IMAGE_SEARCHER_H_

View File

@ -0,0 +1,242 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbImageUtility.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_IMAGE_UTILITY_H_
#define IMAGE_DB_IMAGE_UTILITY_H_
#include "ImageDbTypes.h"
#include "ImageDbPictureTable.h"
#include "ImageDbFileReader.h"
#include "JpegMpDecoder.h"
#if defined(IMGDB_ENABLE_MOVIE)
#include "../../Movie/nmjPlayer.h"
#endif // defined(IMGDB_ENABLE_MOVIE)
namespace imgdb {
namespace util {
/*===========================================================================*
*===========================================================================*/
/*!--------------------------------------------------------------------------*
JPEGを作成する
@param[out] rReJpegData JPEG
@param[out] rReJpegDataSize JPEGのサイズ
@param[in] pJpegData JPEG
@param[in] nJpegDataSize JPEGのサイズ
@param[in] rCreateSeconds JPEGの作成日時
@return true
@details
Exif情報は元のJPEGと同じ内容が設定されます
rCreateSecondsは作成したJPEGのExifに書き込まれるファイく作成日時です
rCreateSecondsを省略
rReJpegDataはGetAllocator()->Free()
*---------------------------------------------------------------------------*/
//@{
bool ReEncodeJpeg(
void*& rReJpegData, std::size_t& rReJpegDataSize,
const void* pJpegData, std::size_t nJpegDataSize);
bool ReEncodeJpeg(
void*& rReJpegData, std::size_t& rReJpegDataSize,
const void* pJpegData, std::size_t nJpegDataSize,
const DateTimeSeconds& rCreateSeconds);
//@}
/*!--------------------------------------------------------------------------*
TWL互換用の画像の仕様になっているかチェックする
@param[in] nWidth
@param[in] nHeight
@return TWL仕様になっているならtrue
*---------------------------------------------------------------------------*/
bool CheckTwlSpec(int nWidth, int nHeight);
/*!--------------------------------------------------------------------------*
JPEGからTWL互換用のJPEGを作成する
@param[out] rTwlJpegData TWL互換JPEG
@param[out] rTwlJpegDataSize TWL互換JPEGのサイズ
@param[in] pJpegData JPEG
@param[in] nJpegDataSize JPEGのサイズ
@param[in] rCreateSeconds TWL互換JPEGの作成日時
@return true
@details
Exif情報は元のJPEGと同じ内容が設定されます
rCreateSecondsは作成したJPEGのExifに書き込まれるファイく作成日時です
rCreateSecondsを省略
rTwlJpegDataはGetAllocator()->Free()
TWL互換用JPEGはVGAサイズしか作成できません
*---------------------------------------------------------------------------*/
//@{
bool CreateTwlJpegFromJpeg(
void*& rTwlJpegData, std::size_t& rTwlJpegDataSize,
const void* pJpegData, std::size_t nJpegDataSize);
bool CreateTwlJpegFromJpeg(
void*& rTwlJpegData, std::size_t& rTwlJpegDataSize,
const void* pJpegData, std::size_t nJpegDataSize,
const DateTimeSeconds& rCreateSeconds);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[out] rPictTblRec
@param[in] pCfg
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@details
rPictTblRecには取り出した情報のみ上書きされます
ID
ID
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
pCfgについてはExtractMovieFileInfo()
*---------------------------------------------------------------------------*/
bool ExtractPictureInfoFromFile(
PictureTableRecord& rPictTblRec,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#if defined(IMGDB_ENABLE_MOVIE)
bool ExtractPictureInfoFromFile(
PictureTableRecord& rPictTblRec, nmj::player::Config* pCfg,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#endif // defined(IMGDB_ENABLE_MOVIE)
/*!--------------------------------------------------------------------------*
@brief Exifから写真情報を抽出する
@param[out] rPictTblRec
@param[in] rDec Exifを含むデコーダ
@details
rPictTblRecには取り出した情報のみ上書きされます
rDecはデコード成功直後やExtractExif()Exifが取得できる状態にしてください
*---------------------------------------------------------------------------*/
void ExtractPictureInfoFromExif(
PictureTableRecord& rPictTblRec, const JpegMpBaseDecoder& rDec);
/*!--------------------------------------------------------------------------*
@brief
@param[out] rImgRecParam
@param[in] eImgKind
@param[in] pCfg
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@details
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
eImgKindを省略すると従来通りで初期化されます
*---------------------------------------------------------------------------*/
bool ExtractRecordParamFromExif(
ImageDbRecordParam& rImgRecParam,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
bool ExtractRecordParamFromExif(
ImageDbRecordParam& rImgRecParam, ImageKind eImgKind,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#if defined(IMGDB_ENABLE_MOVIE)
bool ExtractRecordParamFromExif(
ImageDbRecordParam& rImgRecParam, nmj::player::Config* pCfg,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
bool ExtractRecordParamFromExif(
ImageDbRecordParam& rImgRecParam, ImageKind eImgKind, nmj::player::Config* pCfg,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#endif // defined(IMGDB_ENABLE_MOVIE)
/*!--------------------------------------------------------------------------*
@brief Exifから映像レコードパラメータを抽出する
@param[out] rImgRecParam
@param[in] eImgKind
@param[in] rDec Exifを含むデコーダ
@details
rDecはデコード成功直後やExtractExif()Exifが取得できる状態にしてください
eImgKindを省略すると初期値を写真として初期化されます
*---------------------------------------------------------------------------*/
void ExtractRecordParamFromExif(
ImageDbRecordParam& rImgRecParam, const JpegMpBaseDecoder& rDec);
void ExtractRecordParamFromExif(
ImageDbRecordParam& rImgRecParam, ImageKind eImgKind, const JpegMpBaseDecoder& rDec);
/*===========================================================================*
*===========================================================================*/
#if defined(IMGDB_ENABLE_MOVIE)
/*!--------------------------------------------------------------------------*
@brief
@param[in] rFileInfo
@return true
@details
ImageDbImageValidatorBasic
*---------------------------------------------------------------------------*/
bool ValidateMovieFileInfo(const nmj::player::FileInfo& rFileInfo);
/*!--------------------------------------------------------------------------*
@brief
@param[out] rFileInfo
@param[in] pCfg
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@return true
@details
SDカードでしか利用できないためeStoTypeにNANDを指定した場合は
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
pCfgにヌルを指定するとデフォルトのコンフィグでファイルアクセスが行われます
使
*---------------------------------------------------------------------------*/
Result ExtractMovieFileInfo(
nmj::player::FileInfo& rFileInfo, nmj::player::Config* pCfg,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
/*!--------------------------------------------------------------------------*
@brief JPEGからJPEGを抽出する
@param[out] rReader JPEGを格納するファイルリーダー
@param[in] pCfg
@param[in] rFileInfo
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
bTwlCompatible=trueの場合NANDであればTWL-NANDをチェックします
SDの場合はどの値でも無視されます
JPEGの妥当性はチェックしません
pPathを指定するタイプでは必ずSDカードのパスを指定することを保証してください
pCfgについてはExtractMovieFileInfo()
*---------------------------------------------------------------------------*/
Result ExtractJpegFromMJpeg(
JpegInMJpegFileReader& rReader, nmj::player::Config* pCfg,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
Result ExtractJpegFromMJpeg(
JpegInMJpegFileReader& rReader, const nmj::player::FileInfo& rFileInfo,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
Result ExtractJpegFromMJpeg(
JpegInMJpegFileReader& rReader, const nmj::player::FileInfo& rFileInfo,
const wchar_t* pPath);
#endif // defined(IMGDB_ENABLE_MOVIE)
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_IMAGE_UTILITY_H_

View File

@ -0,0 +1,165 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbImageValidator.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_IMAGE_VALIDATOR_H_
#define IMAGE_DB_IMAGE_VALIDATOR_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbTypes.h"
#include "ImageDbImageInfo.h"
#if defined(IMGDB_ENABLE_MOVIE)
#include "../../Movie/nmjPlayer.h"
#endif // IMAGE_DB_IMAGE_UTILITY_H_
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageDbImageValidatorBasic : private nn::util::NonCopyable<ImageDbImageValidatorBasic>
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ImageDbImageValidatorBasic();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~ImageDbImageValidatorBasic();
/*!----------------------------------------------------------------------
@brief
@param[in] pCfg
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@return true
@details
pCfgについてはExtractMovieFileInfo()
-----------------------------------------------------------------------*/
//@{
bool ValidateImage(StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#if defined(IMGDB_ENABLE_MOVIE)
bool ValidateImage(nmj::player::Config* pCfg, StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#endif // defined(IMGDB_ENABLE_MOVIE)
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] eImgKind
@param[in] pImgData
@param[in] nImgDataSize
@param[in] nFileSize
@return true
-----------------------------------------------------------------------*/
bool ValidatePicture(
ImageKind eImgKind, const void* pImgData, std::size_t nImgDataSize, s64 nFileSize);
/*!----------------------------------------------------------------------
@brief JPEGの妥当性を検証する
@param[in] pImgData
@param[in] nImgDataSize
@param[in] nFileSize
@return true
-----------------------------------------------------------------------*/
bool ValidateJpeg(const void* pImgData, std::size_t nImgDataSize, s64 nFileSize);
/*!----------------------------------------------------------------------
@brief MPの妥当性を検証する
@param[in] pImgData
@param[in] nImgDataSize
@param[in] nFileSize
@return true
-----------------------------------------------------------------------*/
bool ValidateMp(const void* pImgData, std::size_t nImgDataSize, s64 nFileSize);
/*!----------------------------------------------------------------------
@brief JPEGの妥当性を検証する
@param[in] pCfg
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@return true
@details
pCfgについてはExtractMovieFileInfo()
-----------------------------------------------------------------------*/
//@{
#if defined(IMGDB_ENABLE_MOVIE)
bool ValidateMotionJpeg(
nmj::player::Config* pCfg,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
bool ValidateMotionJpeg(
const nmj::player::FileInfo& rFileInfo,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
#endif // defined(IMGDB_ENABLE_MOVIE)
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsValid() const { return m_bValid; }
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
DateTimeSeconds GetShotSeconds() const { NN_ASSERT(IsValid()); return m_ShotSeconds; }
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
s64 GetFileSize() const { NN_ASSERT(IsValid()); return m_nFileSize; }
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
bool HasThumbnail() const { NN_ASSERT(IsValid()); return m_bHasThumbnail; }
/*!----------------------------------------------------------------------
@brief JPEGの妥当性を簡易検証する
@param[in] rFileInfo
@return true
@details
ValidateMotionJpegはJPEGのヘッダ部までチェックするがrFileInfo
-----------------------------------------------------------------------*/
#if defined(IMGDB_ENABLE_MOVIE)
static bool ValidateMotionJpegSimple(const nmj::player::FileInfo& rFileInfo);
#endif // defined(IMGDB_ENABLE_MOVIE)
private:
bool m_bValid;
DateTimeSeconds m_ShotSeconds;
s64 m_nFileSize;
bool m_bHasThumbnail;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_IMAGE_VALIDATOR_H_

View File

@ -0,0 +1,152 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbIndexInfo.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_INDEX_INFO_H_
#define IMAGE_DB_INDEX_INFO_H_
#include <nn/types.h>
#include <nn/util.h>
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
@details
TWLのTCLIndexInfo構造体に準拠
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct IndexInfo
{
u16 nDirectoryIndex; //!< ディレクトリ番号 0899
u16 nFileIndex; //!< ファイル番号 09998
// ディレクトリ番号の最大値DCF準拠
static const int c_nDirectoryIndexMax = 899;
// ファイル番号の最大値(オフィシャル)
static const int c_nOfficialFileIndexMax = 99;
// ファイル番号の最大値(アンオフィシャル or DCF準拠
static const int c_nUnofficialFileIndexMax = 9998;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
@return :[0,899] ByDcf:[100,999]
-----------------------------------------------------------------------*/
//@{
int GetDirectoryIndex() const { return nDirectoryIndex; }
int GetDirectoryIndexByDcf() const { return ConvDirectoryIndexToDcf(GetDirectoryIndex()); }
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex :[0,899] ByDcf:[100,999]
@return false
@details
nIndexに範囲外の値を入力した場合は何も行わずにfalseを返します
-----------------------------------------------------------------------*/
//@{
bool SetDirectoryIndex(int nIndex);
bool SetDirectoryIndexByDcf(int nIndex){ return SetDirectoryIndex(ConvDirectoryIndexFromDcf(nIndex)); }
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex
@return nIndexが[0,899]truefalse
-----------------------------------------------------------------------*/
//@{
static bool IsValidDirectoryIndex(int nIndex);
bool IsValidDirectoryIndex() const;
//@}
/*!----------------------------------------------------------------------
@brief DCF形式の番号へ変換する
@param[in] nIndex [0,899]
@return DCF形式のディレクトリ番号[100,999]
-----------------------------------------------------------------------*/
static int ConvDirectoryIndexToDcf(int nIndex){ return nIndex + 100; }
/*!----------------------------------------------------------------------
@brief DCF形式のディレクトリ番号を通常の番号へ変換する
@param[in] nIndex DCF形式のディレクトリ番号[100,999]
@return [0,899]
-----------------------------------------------------------------------*/
static int ConvDirectoryIndexFromDcf(int nIndexByDcf){ return nIndexByDcf - 100; }
/*!----------------------------------------------------------------------
@brief
@return :[0,99] ByDcf:[1,9999]
-----------------------------------------------------------------------*/
//@{
int GetFileIndex() const { return nFileIndex; }
int GetFileIndexByDcf() const { return ConvFileIndexToDcf(GetFileIndex()); }
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] nNo :[0,9998] ByDcf:[1,9999]
@return false
@details
noに範囲外の値を入力した場合は何も行わずにfalseを返します
-----------------------------------------------------------------------*/
//@{
bool SetFileIndex(int nIndex);
bool SetFileIndexByDcf(int nIndex){ return SetFileIndex(ConvFileIndexFromDcf(nIndex)); }
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex
@return nIndexが[0,9998]truefalse
-----------------------------------------------------------------------*/
//@{
static bool IsValidFileIndex(int nIndex);
bool IsValidFileIndex() const;
//@}
/*!----------------------------------------------------------------------
@brief DCF形式の番号へ変換する
@param[in] nIndex [0,99]
@return DCF形式のディレクトリ番号[1,100]
-----------------------------------------------------------------------*/
static int ConvFileIndexToDcf(int nIndex){ return nIndex + 1; }
/*!----------------------------------------------------------------------
@brief DCF形式のファイル番号を通常の番号へ変換する
@param[in] nIndex DCF形式のファイル番号[1,100]
@return [0,99]
-----------------------------------------------------------------------*/
static int ConvFileIndexFromDcf(int nIndexByDcf){ return nIndexByDcf - 1; }
/*!----------------------------------------------------------------------
@brief
@details
[1,100]
-----------------------------------------------------------------------*/
void UpdateNextIndexByOfficial();
/*!----------------------------------------------------------------------
@brief
@details
1
-----------------------------------------------------------------------*/
void UpdateNextDirectoryIndexByOfficial();
// 比較オペレータ
bool operator==(const IndexInfo& rX) const;
bool operator!=(const IndexInfo& rX) const;
bool operator<(const IndexInfo& rX) const;
bool operator<=(const IndexInfo& rX) const;
bool operator>(const IndexInfo& rX) const;
bool operator>=(const IndexInfo& rX) const;
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_INDEX_INFO_H_

View File

@ -0,0 +1,34 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbInit.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_INIT_H_
#define IMAGE_DB_INIT_H_
#include <nn/fnd.h>
#include "ImageDbResult.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@param[in] rAllocator 使
@details
使<BR>
Finalize() 575KB
*---------------------------------------------------------------------------*/
void Initialize(nn::fnd::IAllocator& rAllocator);
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
void Finalize();
} // end of namespace imgdb
#endif // IMAGE_DB_INIT_H_

View File

@ -0,0 +1,146 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbInitEx.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_INIT_EX_H_
#define IMAGE_DB_INIT_EX_H_
#include <nn/fnd.h>
#include "ImageDbResult.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@param[in] rAllocator 使
@param[in] rFileAllocator 使
@param[in] bInitDbNand NAND側データベースを使用するフラグ
@param[in] bInitDbSd SD側データベースを使用するフラグ
@param[in] nLimitFileSize
@param[out] rResultNand NAND側の初期化結果
@param[out] rResultSd SD側の初期化結果
@return true
@details
使
falseの場合はrResultNandとrResultSdのいずれか
nLimitFileSizeを省略した場合はConst::c_nDefaultMaxReadImageFileSizeとして
nLimitFileSizeの指定は行わない関数を使用してください
*---------------------------------------------------------------------------*/
//@{
bool InitializeEx(
nn::fnd::IAllocator& rAllocator,
bool bInitDbNand, bool bInitDbSd,
Result& rResultNand, Result& rResultSd);
bool InitializeEx(
nn::fnd::IAllocator& rAllocator, nn::fnd::IAllocator& rFileAllocator,
bool bInitDbNand, bool bInitDbSd,
std::size_t nLimitFileSize,
Result& rResultNand, Result& rResultSd);
//@}
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
void FinalizeEx();
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
Result Restore();
/*!--------------------------------------------------------------------------*
@brief TWL-NANDの準備を行う
@return
@details
TWL-NANDにDSiウェアのための写真の管理ファイルを作成します
InitializeEx()NANDの写真を扱うように初期化すればTWL-NANDに管理ファ
ImageDbは使うつもりがなければ使
Initialize()InitializeEx()ImageDbが初期化されていなくても
*---------------------------------------------------------------------------*/
Result SetupTwlNand(nn::fnd::IAllocator& rAllocator);
/*!--------------------------------------------------------------------------*
@brief
@param[in] rAllocator 使
@param[in] rFileAllocator 使
@param[in] bInitDbNand NAND側データベースを使用するフラグ
@param[in] bInitDbSd SD側データベースを使用するフラグ
@param[in] nLimitFileSize
@return true
@details
使
InitializeBody()ImageDbの初期化が完了し
使
*---------------------------------------------------------------------------*/
void InitializeSystem(
nn::fnd::IAllocator& rAllocator, nn::fnd::IAllocator& rFileAllocator,
bool bInitDbNand, bool bInitDbSd, std::size_t nLimitFileSize);
/*!--------------------------------------------------------------------------*
@brief
@details
使
*---------------------------------------------------------------------------*/
void FinalizeSystem();
/*!--------------------------------------------------------------------------*
@brief
@param[in] bInitDbNand NAND側データベースを使用するフラグ
@param[in] bInitDbSd SD側データベースを使用するフラグ
@param[out] rResultNand NAND側の初期化結果
@param[out] rResultSd SD側の初期化結果
@return true
@details
使InitializeSystem()
@details
使
*---------------------------------------------------------------------------*/
bool InitializeBody(
bool bInitDbNand, bool bInitDbSd, Result& rResultNand, Result& rResultSd);
/*!--------------------------------------------------------------------------*
@brief
@details
使
*---------------------------------------------------------------------------*/
void FinalizeBody();
/*!--------------------------------------------------------------------------*
@brief CTR-NANDの空き容量非制限フラグを取得する
@retval true
@retval false
@details
ImageDb3DSカメラNANDの写真撮影枚数が300と
NANDの写真撮絵枚数は380となります
*---------------------------------------------------------------------------*/
bool GetUnlimitedCtrNandFreeSpaceFlag();
/*!--------------------------------------------------------------------------*
@brief CTR-NANDの空き容量非制限フラグを設定する
@param[in] bUnlimited
@details
ImageDbの初期化前に呼び出してください
false
*---------------------------------------------------------------------------*/
void SetUnlimitedCtrNandFreeSpaceFlag(bool bUnlimited);
} // end of namespace imgdb
#endif // IMAGE_DB_INIT_EX_H_

View File

@ -0,0 +1,347 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbLegacyTable.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_LEGACY_TABLE_H_
#define IMAGE_DB_LEGACY_TABLE_H_
#include <nn/types.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
#include "ImageDbIndexInfo.h"
#include "ImageDbDateTimeSeconds.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct LegacyTableHeader
{
public:
u32 nSignature;
u32 nVersion;
u16 nNumElements;
u8 nTargetArchive;
u8 reserved0;
IndexInfo sPicIdxInfo;
IndexInfo sFrmIdxInfo;
u16 nCrc;
u16 nOffset;
// 識別子の内容
static const u32 c_nSignature = 0x50495430; // 'OTIP'
// バージョンの内容
static const u32 c_nVersion = 0x315f3030; // '00_1'
public:
/*!----------------------------------------------------------------------
@brief
@param[in] nRecordNum
@param[in] nExtAreaSize
-----------------------------------------------------------------------*/
void Initialize(int nRecordNum, u16 nExtAreaSize=0);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetRecordNum() const{ return nNumElements; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
StorageType GetTargetArchive() const;
void SetTargetArchive(StorageType eStoType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const IndexInfo& GetPictureIndexInfo() const { return sPicIdxInfo; }
void SetPictureIndexInfo(const IndexInfo& rIdxInfo){ sPicIdxInfo = rIdxInfo; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const IndexInfo& GetFrameIndexInfo() const { return sFrmIdxInfo; }
void SetFrameIndexInfo(const IndexInfo& rIdxInfo){ sFrmIdxInfo = rIdxInfo; }
//@}
/*!----------------------------------------------------------------------
@brief CRC値を取得
-----------------------------------------------------------------------*/
//@{
u16 GetCrc() const { return nCrc; }
void SetCrc(u16 nCrc){ this->nCrc = nCrc; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const void* GetExtArea() const{
return &reinterpret_cast<const u8*>(this)[sizeof(*this)]; }
void* GetExtArea(){
return const_cast<void*>(static_cast<const LegacyTableHeader&>(*this).GetExtArea()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
std::size_t GetExtAreaSize() const{ NN_ASSERT(sizeof(*this) <= nOffset); return (nOffset - sizeof(*this)); }
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
#pragma pack(push, 4)
struct LegacyTableRecord
{
public:
DateTimeSeconds sSeconds;
int nFavoriteOrder;
union {
u32 nBitField;
struct {
u32 nValidity : 1;
u32 nDirIdx : 10;
u32 nFileIdx : 7;
u32 nFavoriteType : 2;
u32 nImageType : 2;
u32 nkeyType : 2;
u32 nDefaultFrame : 1;
u32 nReserved : 7;
};
};
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
@return true
@details
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
bool GetValidityFlag() const { return (0 != nValidity); }
void SetValidityFlag(bool bValidity){ nValidity = bValidity ? 1 : 0; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
IndexInfo GetIndexInfo() const;
void SetIndexInfo(const IndexInfo& rIdxInfo);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetSeconds() const{ return sSeconds; }
void SetSeconds(const DateTimeSeconds& rDTSec){ sSeconds = rDTSec; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
int GetFavoriteOrder() const{ return nFavoriteOrder; }
void SetFavoriteOrder(int nOrder){ nFavoriteOrder = nOrder; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyKeyType GetKeyType() const{ return static_cast<LegacyKeyType>(nkeyType); }
void SetKeyType(LegacyKeyType eKey){ nkeyType = static_cast<u32>(eKey); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyFavoriteType GetFavoriteType() const{ return static_cast<LegacyFavoriteType>(nFavoriteType); }
void SetFavoriteType(LegacyFavoriteType eFavorite){ nFavoriteType = static_cast<u32>(eFavorite); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyImageType GetImageType() const{ return static_cast<LegacyImageType>(nImageType); }
void SetImageType(LegacyImageType eType){ nImageType = static_cast<u32>(eType); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsDefaultFrame() const{ return static_cast<bool>(nDefaultFrame); }
void SetDefaultFrame(bool bDefault){ nDefaultFrame = bDefault ? 1 : 0;}
};
#pragma pack(pop)
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
ComputeTableSize()
SetInitialTableData()
使SetExistingTableData()
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class LegacyTable
{
public:
//! 最大拡張領域サイズ(バイト単位)
static const u16 c_nMaxExtAreaSize = 0xffff;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
LegacyTable();
/*!----------------------------------------------------------------------
@brief
@param[in] nRecordNum
@param[in] nExtAreaSize
@return
-----------------------------------------------------------------------*/
static std::size_t ComputeTableSize(int nRecordNum, u16 nExtAreaSize=0);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetTableData() const{ return m_pData; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetTableDataSize() const{ return m_nDataSize; }
/*!----------------------------------------------------------------------
@brief
@details
false
-----------------------------------------------------------------------*/
bool SetInitialTableData(void* pData, std::size_t nDataSize, int nRecordNum, u16 nExtAreaSize=0);
/*!----------------------------------------------------------------------
@brief
@details
調falseを返します
-----------------------------------------------------------------------*/
bool SetExistingTableData(void* pData, std::size_t nDataSize);
/*!----------------------------------------------------------------------
@brief
@return true
@details
CRCなどをチェックします
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
const LegacyTableHeader* GetHeader() const{
NN_NULL_ASSERT(m_pData);
return reinterpret_cast<const LegacyTableHeader*>(m_pData); }
LegacyTableHeader* GetHeader(){
return const_cast<LegacyTableHeader*>(static_cast<const LegacyTable&>(*this).GetHeader()); }
//@}
/*!----------------------------------------------------------------------
@brief CRCを更新する
@details
CRCを求めます
-----------------------------------------------------------------------*/
void UpdateCrc();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRecordNum() const{ return GetHeader()->GetRecordNum(); }
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetRecordNum())
@return
-----------------------------------------------------------------------*/
//@{
const LegacyTableRecord* GetRecord(int nIndex) const{
NN_ASSERT(0 <= nIndex && nIndex < GetRecordNum());
return &GetTopRecord()[nIndex]; }
LegacyTableRecord* GetRecord(int nIndex){
return const_cast<LegacyTableRecord*>(static_cast<const LegacyTable&>(*this).GetRecord(nIndex)); }
//@}
/*!----------------------------------------------------------------------
@brief 使
@return 使
-----------------------------------------------------------------------*/
int CountUsedRecordNum() const;
/*!----------------------------------------------------------------------
@brief 使
@return 使
-----------------------------------------------------------------------*/
int CountEmptyRecordNum() const;
private:
u16 ComputeCrc() const;
const LegacyTableRecord* GetTopRecord() const {
return reinterpret_cast<const LegacyTableRecord*>(
&reinterpret_cast<const u8*>(m_pData)[GetHeader()->nOffset]); }
private:
void* m_pData;
std::size_t m_nDataSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_LEGACY_TABLE_H_

View File

@ -0,0 +1,211 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbMiscUtility.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_MISC_UTILITY_H_
#define IMAGE_DB_MISC_UTILITY_H_
#include "ImageDbTypes.h"
#include "ImageDbImageInfo.h"
#include "ImageDbRecordParam.h"
/*!--------------------------------------------------------------------------*
@brief
@param[in] x
@return
*---------------------------------------------------------------------------*/
#define IMGDB_ARRAY_LEN_OF(x) (sizeof(x) / sizeof((x)[0]))
namespace imgdb {
namespace util {
/*!--------------------------------------------------------------------------*
@brief
@param[in] first
@param[in] end
@param[in] pred
*---------------------------------------------------------------------------*/
template<typename It, typename Func>
void StableSort(It first, It end, Func pred)
{
// バブルソートアルゴリズム
It itBottom = end;
while(first != itBottom){
It itLast = first;
for( It it = first+1; it != itBottom; ++it){
// 大小比較は「より小さい(<)」で判定する
// 「より小さい」だけで同じを判断するには「!(A < B) && !(B < A) 」で行う
// A<B
if(pred(*(it-1), *it)){
// nop
}
// A>=B
else{
// B<A
if(pred(*it, *(it-1))){
std::swap(*(it-1), *it);
itLast = it + 1;
}
// A>=B && B>=A = A==B
else{
// nop
}
}
}
itBottom = itLast;
}
}
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
NANDの場合bTwlCompatible=trueでTWL-NANDfalseでCTR-NANDの
SDの場合は無視されます
*---------------------------------------------------------------------------*/
s64 GetStorageFreeSize(StorageType eStoType, bool bTwlCompatible);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] nSize
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
GetStorageFreeSize()
NANDの場合bTwlCompatible=trueでTWL-NANDfalseでCTR-NANDの
SDの場合は無視されます
*---------------------------------------------------------------------------*/
int EstimateRemainPictureNum(StorageType eStoType, std::size_t nSize, bool bTwlCompatible);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@param[in] nFreeSize (Byte単位)
@param[in] nSize
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
NANDの場合bTwlCompatible=trueでTWL-NANDfalseでCTR-NANDの
SDの場合は無視されます
*---------------------------------------------------------------------------*/
int EstimateRemainPictureNumWithFreeSize(StorageType eStoType, s64 nFreeSize, std::size_t nSize, bool bTwlCompatible);
/*!--------------------------------------------------------------------------*
@brief
@param[in] eStoType
@return
@details
GetStorageFreeSize()
*---------------------------------------------------------------------------*/
int EstimateRemainPictureNumByDefault(StorageType eStoType);
/*!--------------------------------------------------------------------------*
@brief NAND側の空き容量を指定して写真の残り撮影枚数を標準平均サイズで見積もる
@param[in] nFreeSizeCtr CTR-NAND側の空きサイズ
@param[in] nFreeSizeTwl TWL-NAND側の空きサイズ
@return
@details
*---------------------------------------------------------------------------*/
int EstimateRemainPictureNumByDefaultWithFreeSizeInNand(s64 nFreeSizeCtr, s64 nFreeSizeTwl);
/*!--------------------------------------------------------------------------*
@brief NAND側の空き容量を指定して写真の残り撮影枚数を標準平均サイズで見積もる
@param[in] nFreeSize SDの空きサイズ
@return
@details
*---------------------------------------------------------------------------*/
int EstimateRemainPictureNumByDefaultWithFreeSizeInSd(s64 nFreeSize);
/*!--------------------------------------------------------------------------*
@brief
@return
@details
*---------------------------------------------------------------------------*/
#if defined(IMGDB_ENABLE_MOVIE)
std::size_t EstimateMovieWorstSizePerSec();
#endif // IMGDB_ENABLE_MOVIE
/*!--------------------------------------------------------------------------*
@brief
@return
@details
SDカードの空き容量と管理ファイルの空きを参照して求めます
SDカードが刺さっていない場合はゼロを返します
*---------------------------------------------------------------------------*/
#if defined(IMGDB_ENABLE_MOVIE)
f32 EstimateMovieRecordingTime();
#endif // IMGDB_ENABLE_MOVIE
/*---------------------------------------------------------------------------*
IDを取得する
@return ID
*---------------------------------------------------------------------------*/
u32 GetOwnBodyId();
/*!--------------------------------------------------------------------------*
@brief
@param[out] rImgInfoNew
@param[in] rImgInfoBase
@param[in] eImgKind
@param[in] bTwlCompatible TWL互換フラグ
@details
bTwlCompatible=falseの場合rImgInfoMpの拡張子をJPEGに変えたものを作成します
trueの場合は拡張子に加え ???NIN02
*---------------------------------------------------------------------------*/
//@{
void GenerateImageInfoFromImageInfo(
ImageInfo& rImgInfoNew, const ImageInfo& rImgInfoBase, bool bTwlCompatible);
void GenerateImageInfoFromImageInfo(
ImageInfo& rImgInfoNew, const ImageInfo& rImgInfoBase, ImageKind eImgKind, bool bTwlCompatible);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[out] rImgInfo
@param[out] rStoType
@param[in] pPath
@return true
@details
pPathはドライブ名まで含まれたフルパスを指定する必要があります
falseを返しますrImgInforStoTypeの内容は
rImgInfoにはディレクトリ名
*---------------------------------------------------------------------------*/
bool GenerateImageInfoFromFullPath(
ImageInfo& rImgInfo, StorageType& rStoType, const wchar_t* pPath);
/*!--------------------------------------------------------------------------*
@brief ImageInfoImageDbRecordParamの代入処理
*---------------------------------------------------------------------------*/
//@{
void StoreImageDbRecordParam2ImageInfo(ImageInfo& rImgInfo, const ImageDbRecordParam& rImgRecParam);
void StoreImageInfo2ImageDbRecordParam(ImageDbRecordParam& rImgRecParam, const ImageInfo& rImgInfo);
//@}
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_MISC_UTILITY_H_

View File

@ -0,0 +1,158 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbNmjPlayerConfig.h
NMJプレイヤーのコンフィグデータ
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_NMJ_PLAYER_CONFIG_H_
#define IMAGE_DB_NMJ_PLAYER_CONFIG_H_
#if defined(IMGDB_ENABLE_MOVIE)
#include "../../Movie/nmjPlayer.h"
#endif // IMAGE_DB_IMAGE_UTILITY_H_
namespace imgdb {
namespace util {
#if defined(IMGDB_ENABLE_MOVIE)
/*!--------------------------------------------------------------------------*
@brief nmj::player::Config定義クラス
@details
nmj::player::Configもそれぞれ独自に用意する必要があります
Configで指定したファイル操作関連の関数が利用するファイルハンドラが
idに他と被らない正の値を指定します
NmjPlayerConfig<1> configA;
NmjPlayerConfig<2> configB;
configAとBは
AとB間では独立して操作することができるようになります
GetConfig()Configは
nmj::player::Player::GetFileInfoSync()
*---------------------------------------------------------------------------*/
template<int id>
class NmjPlayerConfig
{
enum { Id = id };
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
NmjPlayerConfig(){
std::memset(&m_Config, 0, sizeof(m_Config));
// fileFunc.
m_Config.fileFunc.pInitialize = OpenRead;
m_Config.fileFunc.pRead = Read;
m_Config.fileFunc.pGetSize = GetSize;
m_Config.fileFunc.pSeek = Seek;
m_Config.fileFunc.pFinalize = Close;
// Img.
m_Config.img.width = nmj::player::NUM_MOVIE_WIDTH_MAX;
m_Config.img.height = nmj::player::NUM_MOVIE_HEIGHT_MAX;
m_bOpend = false;
}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~NmjPlayerConfig(){ Close(m_Config.fileFunc.arg); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const nmj::player::Config& GetConfig() const{ return m_Config; }
nmj::player::Config& GetConfig(){ return const_cast<nmj::player::Config&>(static_cast<const NmjPlayerConfig<id>&>(*this).GetConfig()); }
//@}
private:
// 読み込みモードでオープンする
static bool OpenRead(void* pArg, const wchar_t* pPath){
NN_UNUSED_VAR(pArg);
NN_ASSERT(!m_bOpend);
const nn::Result ret = m_FileStream.TryInitialize(pPath, nn::fs::OPEN_MODE_READ);
m_bOpend = ret.IsSuccess();
return m_bOpend;
}
// クローズする
static bool Close(void* pArg){
NN_UNUSED_VAR(pArg);
if(m_bOpend){
m_bOpend = false;
m_FileStream.Finalize();
}
return true;
}
// 読み込む
static bool Read(void* pArg, u8* pDst, std::size_t nSize){
NN_UNUSED_VAR(pArg);
NN_ASSERT(m_bOpend);
s32 nReadSize;
const nn::Result ret = m_FileStream.TryRead(&nReadSize, pDst, nSize);
if(ret.IsSuccess() && static_cast<std::size_t>(nReadSize) == nSize){
return true;
}
else{
Close(pArg);
return false;
}
}
// ファイルサイズを取得する
static bool GetSize(void* pArg, std::size_t* pSize){
NN_UNUSED_VAR(pArg);
NN_ASSERT(m_bOpend);
NN_NULL_ASSERT(pSize);
s64 nSize64;
const nn::Result ret = m_FileStream.TryGetSize(&nSize64);
std::size_t nSize32 = static_cast<std::size_t>(nSize64);
if(ret.IsSuccess() && nSize32 == nSize64){
*pSize = nSize32;
return true;
}
else{
Close(pArg);
return false;
}
}
// ファイル先頭からシークする
static bool Seek(void* pArg, s64 nOfst){
NN_UNUSED_VAR(pArg);
NN_ASSERT(m_bOpend);
const nn::Result ret = m_FileStream.TrySeek(nOfst, nn::fs::POSITION_BASE_BEGIN);
if(ret.IsSuccess()){
return true;
}
else{
Close(pArg);
return false;
}
}
private:
static nmj::player::Config m_Config;
static nn::fs::FileStream m_FileStream;
static bool m_bOpend;
};
template<int id> nmj::player::Config NmjPlayerConfig<id>::m_Config;
template<int id> nn::fs::FileStream NmjPlayerConfig<id>::m_FileStream;
template<int id> bool NmjPlayerConfig<id>::m_bOpend;
#endif // defined(IMGDB_ENABLE_MOVIE)
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_NMJ_PLAYER_CONFIG_H_

View File

@ -0,0 +1,169 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbNmjRecordingConfig.h
NMJレコーダーのレコーディングコンフィグデータ
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_NMJ_RECORDING_CONFIG_H_
#define IMAGE_DB_NMJ_RECORDING_CONFIG_H_
#if defined(IMGDB_ENABLE_MOVIE)
#include "../../Movie/nmjRecorder.h"
#endif // IMAGE_DB_IMAGE_UTILITY_H_
namespace imgdb {
namespace util {
#if defined(IMGDB_ENABLE_MOVIE)
/*!--------------------------------------------------------------------------*
@brief nmj::recorder::RecordingConfig定義クラス
@details
nmj::recorder::RecordingConfigもそれぞれ独自に用意する必要
Configで指定したファイル操作関連の関数が利用するファイルハンドラが
idに他と被らない正の値を指定します
NmjRecordingConfig<1> configA;
NmjRecordingConfig<2> configB;
configAとBは
AとB間では独立して操作することができるようになります
GetConfig()Configは
*---------------------------------------------------------------------------*/
template<int id>
class NmjRecordingConfig
{
enum { Id = id };
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
NmjRecordingConfig(){
std::memset(&m_Config, 0, sizeof(m_Config));
// fileFunc.
m_Config.fileFunc.pInitialize = OpenWrite;
m_Config.fileFunc.pWrite = Write;
m_Config.fileFunc.pSetSize = SetSize;
m_Config.fileFunc.pSeek = Seek;
m_Config.fileFunc.pFinalize = Close;
m_Config.fileFunc.pDeleteFile = Delete;
m_cPath[0] = '\0';
m_bOpend = false;
}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~NmjRecordingConfig(){ Close(m_Config.fileFunc.arg); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const wchar_t* GetPath() const{ return m_cPath; }
void SetPath(const wchar_t* pPath){ NN_NULL_ASSERT(pPath); std::strcpy(m_cPath, pPath); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const nmj::recorder::RecordingConfig& GetConfig() const{ return m_Config; }
nmj::recorder::RecordingConfig& GetConfig(){ return const_cast<nmj::recorder::RecordingConfig&>(static_cast<const NmjRecordingConfig<id>&>(*this).GetConfig()); }
//@}
private:
// 書き込みモードでオープンする
static bool OpenWrite(void* pArg){
NN_UNUSED_VAR(pArg);
NN_ASSERT(!m_bOpend);
const nn::Result ret = m_FileStream.TryInitialize(m_cPath, nn::fs::OPEN_MODE_WRITE | nn::fs::OPEN_MODE_CREATE);
m_bOpend = ret.IsSuccess();
return m_bOpend;
}
// クローズする
static bool Close(void* pArg){
NN_UNUSED_VAR(pArg);
if(m_bOpend){
m_bOpend = false;
m_FileStream.Finalize();
}
return true;
}
// 書き込む
static bool Write(void* pArg, const u8* pSrc, std::size_t nSize){
NN_UNUSED_VAR(pArg);
NN_ASSERT(m_bOpend);
s32 nWriteSize;
const nn::Result ret = m_FileStream.TryWrite(&nWriteSize, pSrc, nSize);
if(ret.IsSuccess() && static_cast<std::size_t>(nWriteSize) == nSize){
return true;
}
else{
Close(pArg);
return false;
}
}
// ファイルサイズを設定する
static bool SetSize(void* pArg, std::size_t nSize){
NN_UNUSED_VAR(pArg);
NN_ASSERT(m_bOpend);
const nn::Result ret = m_FileStream.TrySetSize(nSize);
if(ret.IsSuccess()){
return true;
}
else{
Close(pArg);
return false;
}
}
// ファイル先頭からシークする
static bool Seek(void* pArg, s64 nOfst){
NN_UNUSED_VAR(pArg);
NN_ASSERT(m_bOpend);
const nn::Result ret = m_FileStream.TrySeek(nOfst, nn::fs::POSITION_BASE_BEGIN);
if(ret.IsSuccess()){
return true;
}
else{
Close(pArg);
return false;
}
}
// ファイルを削除する
static bool Delete(){
NN_ASSERT(!m_bOpend);
const nn::Result ret = nn::fs::TryDeleteFile(m_cPath);
return ret.IsSuccess();
}
private:
static nmj::recorder::RecordingConfig m_Config;
static nn::fs::FileStream m_FileStream;
static wchar_t m_cPath[nn::fs::MAX_FILE_PATH_LENGTH+1];
static bool m_bOpend;
};
template<int id> nmj::recorder::RecordingConfig NmjRecordingConfig<id>::m_Config;
template<int id> nn::fs::FileStream NmjRecordingConfig<id>::m_FileStream;
template<int id> wchar_t NmjRecordingConfig<id>::m_cPath[nn::fs::MAX_FILE_PATH_LENGTH+1];
template<int id> bool NmjRecordingConfig<id>::m_bOpend;
#endif // defined(IMGDB_ENABLE_MOVIE)
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_NMJ_RECORDING_CONFIG_H_

View File

@ -0,0 +1,372 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbPathUtility.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_PATH_UTILITY_H_
#define IMAGE_DB_PATH_UTILITY_H_
#include "ImageDbTypes.h"
#include "ImageDbIndexInfo.h"
#include "ImageDbImageInfo.h"
namespace imgdb {
namespace util {
/*!--------------------------------------------------------------------------*
@brief
@param[in] c
@return
*---------------------------------------------------------------------------*/
inline char ToLower(char c){ return ('A'<=c&&c<='Z') ? ('a'-'A'+c) : c; }
inline wchar_t ToLower(wchar_t c){ return (L'A'<=c&&c<=L'Z') ? (L'a'-L'A'+c) : c; }
/*!--------------------------------------------------------------------------*
@brief
@param[in] c
@return
*---------------------------------------------------------------------------*/
inline char ToUpper(char c){ return ('a'<=c&&c<='z') ? (c-('a'-'A')) : c; }
inline wchar_t ToUpper(wchar_t c){ return (L'a'<=c&&c<=L'z') ? (c-(L'a'-L'A')) : c; }
/*!--------------------------------------------------------------------------*
@brief
@param[in] pStr1
@param[in] pStr2
@return
*---------------------------------------------------------------------------*/
int WStricmp(const wchar_t* pStr1, const wchar_t* pStr2);
/*!--------------------------------------------------------------------------*
@brief
@param[in] pStr1
@param[in] pStr2
@param[in] nCount
@return
*---------------------------------------------------------------------------*/
int WStrnicmp(const wchar_t* pStr1, const wchar_t* pStr2, int nCount);
/*!--------------------------------------------------------------------------*
@brief DCFで使用可能な文字かチェックする
@param[in] c
@return 使true
@details
0-9A-Za-z_使
*---------------------------------------------------------------------------*/
inline bool IsDcfCharacter(char c){ return ('0'<=c&&c<='9' || 'A'<=c&&c<='Z' || 'a'<=c&&c<='z' || '_'==c); }
inline bool IsDcfCharacter(wchar_t c){ return (L'0'<=c&&c<=L'9' || L'A'<=c&&c<=L'Z' || L'a'<=c&&c<=L'z' || L'_'==c); }
/*!--------------------------------------------------------------------------*
@brief
@param[out] rN
@param[in] pStr
@param[in] nLength
@return false
@details
nLengthを指定した場合は指定した文字数に達するか
*---------------------------------------------------------------------------*/
//@{
bool AToI(int& rN, const char* pStr);
bool AToI(int& rN, const char* pStr, int nLength);
bool AToI(int& rN, const wchar_t* pStr);
bool AToI(int& rN, const wchar_t* pStr, int nLength);
//@}
/*!--------------------------------------------------------------------------*
@brief
@return
@details
"sdmc:/"
*---------------------------------------------------------------------------*/
//@{
const wchar_t* GetTwlNandDriveName();
const wchar_t* GetCtrNandDriveName();
const wchar_t* GetSdDriveName();
//@}
/*!--------------------------------------------------------------------------*
@brief
@return
*---------------------------------------------------------------------------*/
//@{
int GetTwlNandDriveNameLength();
int GetCtrNandDriveNameLength();
int GetSdDriveNameLength();
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[io] pStr
@param[in] nSize pStrのバッファサイズ
@details
Const::c_nMaxDriveNameLength分の空きがあれば
*---------------------------------------------------------------------------*/
//@{
void AppendTwlNandDriveName(wchar_t* pPath, int nSize);
void AppendCtrNandDriveName(wchar_t* pPath, int nSize);
void AppendSdDriveName(wchar_t* pPath, int nSize);
//@}
/*!--------------------------------------------------------------------------*
@brief DCFディレクトリ名かチェックする
@param[in] pDirName
@param[out] pDirNo
@return true
@details
"100NIN02"
WithoutLength版は文字数が多すぎたとしても考慮しません
*---------------------------------------------------------------------------*/
//@{
bool ValidateDcfDirectoryName(const char* pDirName, int* pDirNo=0);
bool ValidateDcfDirectoryName(const wchar_t* pDirName, int* pDirNo=0);
bool ValidateDcfDirectoryNameWithoutLength(const char* pDirName, int* pDirNo=0);
bool ValidateDcfDirectoryNameWithoutLength(const wchar_t* pDirName, int* pDirNo=0);
//@}
/*!--------------------------------------------------------------------------*
@brief DCFディレクトリ名からディレクトリ番号を取得する
@param[in] pDirName
@return [100,999]
@details
"100NIN02" -> 100
DCFディレクトリ名の前半文字の数字を数値に変換するだけです
*---------------------------------------------------------------------------*/
//@{
int GetDirectoryNoFromDcfDirectoryName(const char* pDirName);
int GetDirectoryNoFromDcfDirectoryName(const wchar_t* pDirName);
//@}
/*!--------------------------------------------------------------------------*
@brief DCFファイル名かチェックする
@param[in] pFileName
@param[out] pDirNo
@return true
@details
"HNI_0001.JPG" or "HNI_0001"
WithoutLength版は文字数が多すぎたとしても考慮しません
*---------------------------------------------------------------------------*/
//@{
bool ValidateDcfFileName(const char* pFileName, int* pFileNo=0);
bool ValidateDcfFileName(const wchar_t* pFileName, int* pFileNo=0);
bool ValidateDcfFileNameWithoutLength(const char* pFileName, int* pFileNo=0);
bool ValidateDcfFileNameWithoutLength(const wchar_t* pFileName, int* pFileNo=0);
//@}
/*!--------------------------------------------------------------------------*
@brief DCFファイル名からファイル番号を取得する
@param[in] pFileName
@return [1,9999]
@details
"HNI_0001.JPG" -> 1
DCFファイル名の後半文字の数字を数値に変換するだけです
*---------------------------------------------------------------------------*/
int GetFileNoFromDcfFileName(const char* pFileName);
int GetFileNoFromDcfFileName(const wchar_t* pFileName);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pDirPath
@param[in] nSize pDirPathのバッファサイズ
@param[in] pFilePath
@details
"sdmc:/DCIM/100NIN02/HNI_0001.JPG" -> "sdmc:/DCIM/100NIN02"
pFilePathの文字数
*---------------------------------------------------------------------------*/
void CreateDirectoryPathFromFilePath(wchar_t* pDirPath, int nSize, const wchar_t* pFilePath);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pStr
@param[in] nSize
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"HNI_0001"
Const::c_nImageFileNameLength+1
*---------------------------------------------------------------------------*/
int CreateImageFileName(
wchar_t* pStr, int nSize,
const IndexInfo& rIdxInfo, bool bTwlCompatible);
int CreateImageFileName(
wchar_t* pStr, int nSize,
const ImageInfo& rImgInfo);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pStr
@param[in] nSize
@param[in] eImgKind
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"HNI_0001.JPG"
Const::c_nMaxImageFilePathLength+1
*---------------------------------------------------------------------------*/
int CreateImageFileNameWithExt(
wchar_t* pStr, int nSize,
ImageKind eImgKind, const IndexInfo& rIdxInfo, bool bTwlCompatible);
int CreateImageFileNameWithExt(
wchar_t* pStr, int nSize,
const ImageInfo& rImgInfo);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pStr
@param[in] nSize
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"100NIN02"
Const::c_nImageDirectoryLength+1
*---------------------------------------------------------------------------*/
int CreateImageDirectoryName(
wchar_t* pStr, int nSize,
const IndexInfo& rIdxInfo, bool bTwlCompatible);
int CreateImageDirectoryName(
wchar_t* pStr, int nSize,
const ImageInfo& rImgInfo);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pStr
@param[in] nSize
@param[in] eStoType
@param[in] rImgInfo
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"sdmc:/DCIM/100NIN02/HNI_0001.JPG"
Const::c_nMaxImageFileFullPathLength+1
LegacyPictureInfoを渡すタイプの場合は拡張子は"JPG"
bTwlCompatibleはTWL互換用の領域を指定するフラグでNANDで
JPEGファイル時のみ意味がありますfalseを指定
CTR領域trueを指定するとTWL領域のパスを返します
*---------------------------------------------------------------------------*/
//@{
int CreateImagePath(
wchar_t* pStr, int nSize,
StorageType eStoType, ImageKind eImgKind, const IndexInfo& rIdxInfo, bool bTwlCompatible);
int CreateImagePath(
wchar_t* pStr, int nSize,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[out] pStr
@param[in] nSize
@param[in] eStoType
@param[in] rImgInfo
@param[in] rIdxInfo
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"sdmc:/DCIM/100NIN02"
Const::c_nMaxImageDirectoryPathLength+1
bTwlCompatibleはTWL互換用の領域を指定するフラグでNANDで
JPEGファイル時のみ意味がありますfalseを指定
CTR領域trueを指定するとTWL領域のパスを返します
*---------------------------------------------------------------------------*/
//@{
int CreateImageDirectoryPath(
wchar_t* pStr, int nSize,
StorageType eStoType, const ImageInfo& rImgInfo, bool bTwlCompatible);
int CreateImageDirectoryPath(
wchar_t* pStr, int nSize,
StorageType eStoType, const IndexInfo& rIdxInfo, bool bTwlCompatible);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[out] pStr
@param[in] nSize
@param[in] eStoType
@param[in] bTwlCompatible TWL互換フラグ
@return
@details
"sdmc:/DCIM"
Const::c_nMaxRootDirectoryPathLength+1
bTwlCompatibleはTWL互換用の領域を指定するフラグでNANDで
JPEGファイル時のみ意味がありますfalseを指定
CTR領域trueを指定するとTWL領域のパスを返します
*---------------------------------------------------------------------------*/
int CreateImageRootDirectoryPath(
wchar_t* pStr, int nSize, StorageType eStoType, bool bTwlCompatible);
/*!--------------------------------------------------------------------------*
@brief
@return
@details
"sdmc:/private/ds/app/484E494A/pit.bin"
*---------------------------------------------------------------------------*/
//@{
const wchar_t* GetLegacyPictureDbFilePath(StorageType eStoType);
const wchar_t* GetPictureDbFilePath(StorageType eStoType);
//@}
/*!--------------------------------------------------------------------------*
@brief
@return
@details
"sdmc:/private/ds/app/484E494A"
*---------------------------------------------------------------------------*/
//@{
const wchar_t* GetLegacyPictureDbFileDir(StorageType eStoType);
const wchar_t* GetPictureDbFileDir(StorageType eStoType);
//@}
/*!--------------------------------------------------------------------------*
@brief
@param[in]
@return true
*---------------------------------------------------------------------------*/
bool IsVirtualPath(const wchar_t* pPath);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pRPath
@param[in] nSize pRPathのバッファのサイズ
@param[in] pVPath
@return
@details
pRPathへ格納します
pVPathの内容をpRPathへそのまま格納します
nSizeは変換元で要求された以上のサイズが必要になります
*---------------------------------------------------------------------------*/
int ConvertVirtualToRealPath(wchar_t* pRPath, int nSize, const wchar_t* pVPath);
/*!--------------------------------------------------------------------------*
@brief
@param[out] pVPath
@param[in] nSize pVPathのバッファのサイズ
@param[in] pRPath
@return
@details
pVPathへ格納します
pRPathの内容をpVPathへそのまま格納します
nSizeは変換元で要求された以上のサイズが必要になります
*---------------------------------------------------------------------------*/
int ConvertRealToVirtualPath(wchar_t* pVPath, int nSize, const wchar_t* pRPath);
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_PATH_UTILITY_H_

View File

@ -0,0 +1,328 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbPictureDatabase.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_PICTURE_DATABASE_H_
#define IMAGE_DB_PICTURE_DATABASE_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
#include "ImageDbAllocator.h"
#include "ImageDbRecord.h"
#include "ImageDbLegacyTable.h"
#include "ImageDbPictureTable.h"
#include "ImageDbValidityStateTable.h"
namespace imgdb {
class PictureDatabase;
/*!--------------------------------------------------------------------------*
@brief
@details
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PictureDbRecord : public ImageDbRecord
{
friend class PictureDatabase;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
PictureDbRecord();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
virtual const ImageInfo& GetImageInfo() const;
virtual ImageInfo& GetImageInfo(){
return const_cast<ImageInfo&>(static_cast<const PictureDbRecord&>(*this).GetImageInfo()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
virtual const ValidityStateTableRecord& GetValidityStateTableRecord() const;
virtual ValidityStateTableRecord& GetValidityStateTableRecord(){
return const_cast<ValidityStateTableRecord&>(static_cast<const PictureDbRecord&>(*this).GetValidityStateTableRecord()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const PictureTableRecord& GetPictureTableRecord() const;
PictureTableRecord& GetPictureTableRecord(){
return const_cast<PictureTableRecord&>(static_cast<const PictureDbRecord&>(*this).GetPictureTableRecord()); }
//@}
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
//@{
const LegacyTableRecord* GetLegacyTableRecord() const;
LegacyTableRecord* GetLegacyTableRecord(){
return const_cast<LegacyTableRecord*>(static_cast<const PictureDbRecord&>(*this).GetLegacyTableRecord()); }
//@}
private:
bool IsInitialized() const;
void Initialize(PictureDatabase& rDb, int nIndex);
private:
PictureDatabase* m_pDb;
int m_nIndex;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PictureDatabase : private nn::util::NonCopyable<PictureDatabase>
{
friend class PictureDbRecord;
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] nRecordNum
@param[in] eStoType
@details
nRecordNumは初期化時に作られる管理テーブルのレコード数の決定と
Initialize()
-----------------------------------------------------------------------*/
//@{
PictureDatabase();
PictureDatabase(Allocator& rAllocator, int nRecordNum, StorageType eStoType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
~PictureDatabase();
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
bool IsInitialized() const;
/*!----------------------------------------------------------------------
@brief
@param[in] rAllocator 使
@param[in] nRecordNum
@param[in] eStoType
@details
使
nRecordNumは初期化時に作られる管理テーブルのレコード数の決定と
-----------------------------------------------------------------------*/
void Initialize(Allocator& rAllocator, int nRecordNum, StorageType eStoType);
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
void Release();
/*!----------------------------------------------------------------------
@brief
@details
nRecordNumのテーブルを作成し
-----------------------------------------------------------------------*/
//@{
void InitializeValidityStateTable();
void InitializePictureTable();
void InitializeLegacyTable();
//@}
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
//@{
void ReleaseValidityStateTable();
void ReleasePictureTable();
void ReleaseLegacyTable();
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] pPath
@return
@details
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じスト
falseを返して失敗します
InitializePictureTable()
-----------------------------------------------------------------------*/
//@{
Result LoadPictureTable(StorageType eStoType, const wchar_t* pPath);
Result LoadLegacyTable(StorageType eStoType, const wchar_t* pPath);
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] pPath
@param[in] bInvalidCrc CRC無効フラグ
@return
@details
eStoTypeはエラーが起こった時の扱いに使用されますpPathと同じスト
bInvalidCrcにtrueを指定するとCRCが不一致した状態で書き込まれます
-----------------------------------------------------------------------*/
//@{
Result SavePictureTable(StorageType eStoType, const wchar_t* pPath, bool bInvalidCrc=false);
Result SaveLegacyTable(StorageType eStoType, const wchar_t* pPath, bool bInvalidCrc=false);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
//@{
bool IsAvailableValidityStateTable() const{ NN_ASSERT(IsInitialized()); return (0 != m_pValidityStateTblData); }
bool IsAvailablePictureTable() const{ NN_ASSERT(IsInitialized()); return (0 != m_pPictTblData); }
bool IsAvailableLegacyTable() const{ NN_ASSERT(IsInitialized()); return (0 != m_pLegacyTblData); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
u32 GetPictureTableSaveCount() const{ NN_ASSERT(IsAvailablePictureTable()); return m_PictTbl.GetHeader()->GetSaveCount(); }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void SetPictureTableSaveCount(u32 nCnt){ NN_ASSERT(IsAvailablePictureTable()); m_PictTbl.GetHeader()->SetSaveCount(nCnt); }
/*!----------------------------------------------------------------------
@brief
@param[in] rIdxInfo
-----------------------------------------------------------------------*/
void SeNextIndexInfo(const IndexInfo& rIdxInfo);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetRecordNum() const{ NN_ASSERT(IsInitialized()); return m_nRecordNum; }
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0,GetRecordNum())
@return
-----------------------------------------------------------------------*/
//@{
const PictureDbRecord& GetRecord(int nIndex) const;
PictureDbRecord& GetRecord(int nIndex){
return const_cast<PictureDbRecord&>(static_cast<const PictureDatabase&>(*this).GetRecord(nIndex)); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetEmptyRecordNum() const;
/*!----------------------------------------------------------------------
@brief
@param[in] nStartIndex
@return [0,GetRecordNum())
@details
nStartIndexを省略すると先頭から探します
nStartIndexを指定するとnStartIndex+1
-----------------------------------------------------------------------*/
//@{
int FindEmptyRecordIndex() const;
int FindEmptyRecordIndex(int nStartIndex) const;
//@}
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] eImgKind
@param[in] rIdxInfo
@return [0,GetRecordNum())
@details
Onで
rIdxInfoを指定した場合は
-----------------------------------------------------------------------*/
//@{
int CreateNewRecord(StorageType eStoType, ImageKind eImgKind);
int CreateNewRecord(StorageType eStoType, ImageKind eImgKind, const IndexInfo& rIdxInfo);
//@}
private:
void* Alloc(std::size_t nSize);
void Free(void* pAddr);
bool IsEmpty() const;
bool IsExistRecord(const IndexInfo& rIdxInfo) const;
private:
Allocator* m_pAllocator;
imgdb::StorageType m_eStoType;
int m_nRecordNum;
PictureDbRecord* m_pRecords;
// 映像妥当性管理データ
void* m_pValidityStateTblData;
std::size_t m_nValidityStateTblDataSize;
ValidityStateTable m_ValidityStateTbl;
// 写真管理データ
void* m_pPictTblData;
std::size_t m_nPictTblDataSize;
std::size_t m_nPictTblDataRealSize; // 多めに確保した実際のサイズ
PictureTable m_PictTbl;
// レガシー写真管理データ
void* m_pLegacyTblData;
std::size_t m_nLegacyTblDataSize;
std::size_t m_nLegacyTblDataRealSize; // 多めに確保した実際のサイズ
LegacyTable m_LegacyTbl;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_PICTURE_DATABASE_H_

View File

@ -0,0 +1,313 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbPictureTable.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_PICTURE_TABLE_H_
#define IMAGE_DB_PICTURE_TABLE_H_
#include <nn/types.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
#include "ImageDbIndexInfo.h"
#include "ImageDbImageInfo.h"
#include "ImageDbFaceInfo.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct PictureTableHeader
{
public:
u32 nSignature;
u32 nVersion;
u32 nSaveCnt;
u16 nNumElements;
u8 nTargetArchive;
u8 reserved0;
IndexInfo sIdxInfo;
u16 nCrc;
u16 nOffset;
// 識別子の内容
static const u32 c_nSignature = 0x514a5531; // '1UJQ'
// バージョンの内容
static const u32 c_nVersion = 0x315f3030; // '00_1'
public:
/*!----------------------------------------------------------------------
@brief
@param[in] nRecordNum
@param[in] nExtAreaSize
-----------------------------------------------------------------------*/
void Initialize(int nRecordNum, u16 nExtAreaSize=0);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
u32 GetSignature() const{ return nSignature; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
u32 GetVersion() const{ return nVersion; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
u32 GetSaveCount() const{ return nSaveCnt; }
void SetSaveCount(u32 nCnt){ nSaveCnt = nCnt; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetRecordNum() const{ return nNumElements; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
StorageType GetTargetArchive() const;
void SetTargetArchive(StorageType eStoType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const IndexInfo& GetIndexInfo() const { return sIdxInfo; }
void SetIndexInfo(const IndexInfo& rIdxInfo){ sIdxInfo = rIdxInfo; }
//@}
/*!----------------------------------------------------------------------
@brief CRC値を取得
-----------------------------------------------------------------------*/
//@{
u16 GetCrc() const { return nCrc; }
void SetCrc(u16 nCrc){ this->nCrc = nCrc; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const void* GetExtArea() const{
return &reinterpret_cast<const u8*>(this)[sizeof(*this)]; }
void* GetExtArea(){
return const_cast<void*>(static_cast<const PictureTableHeader&>(*this).GetExtArea()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
std::size_t GetExtAreaSize() const{ NN_ASSERT(sizeof(*this) <= nOffset); return (nOffset - sizeof(*this)); }
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
#pragma pack(push, 4)
struct PictureTableRecord
{
public:
ImageInfo sImgInfo; //!< 映像情報
FaceInfo sFaceInfo[Const::c_nMaxFaceInfoNum]; //!< 顔情報
public:
/*!----------------------------------------------------------------------
@brief
@param[in] eImgKind
@details
eImgKindを省略すると従来通りで初期化されます
-----------------------------------------------------------------------*/
//@{
void Initialize();
void Initialize(ImageKind eImgKind);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
@details
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const ImageInfo& GetImageInfo() const{ return sImgInfo; }
ImageInfo& GetImageInfo(){
return const_cast<ImageInfo&>(static_cast<const PictureTableRecord&>(*this).GetImageInfo()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const FaceInfo& GetFaceInfo(int nIdx) const{ NN_ASSERT(Const::c_nMaxFaceInfoNum > nIdx); return sFaceInfo[nIdx]; }
FaceInfo& GetFaceInfo(int nIdx){
return const_cast<FaceInfo&>(static_cast<const PictureTableRecord&>(*this).GetFaceInfo(nIdx)); }
//@}
/*!----------------------------------------------------------------------
@brief
@return [0c_nMaxFaceNum]
-----------------------------------------------------------------------*/
int GetFaceNum() const;
};
#pragma pack(pop)
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
ComputeTableSize()
SetInitialTableData()
使SetExistingTableData()
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class PictureTable
{
public:
//! 最大拡張領域サイズ(バイト単位)
static const u16 c_nMaxExtAreaSize = 0xffff;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
PictureTable();
/*!----------------------------------------------------------------------
@brief
@param[in] nRecordNum
@param[in] nExtAreaSize
@return
-----------------------------------------------------------------------*/
static std::size_t ComputeTableSize(int nRecordNum, u16 nExtAreaSize=0);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetTableData() const{ return m_pData; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetTableDataSize() const{ return m_nDataSize; }
/*!----------------------------------------------------------------------
@brief
@details
false
-----------------------------------------------------------------------*/
bool SetInitialTableData(void* pData, std::size_t nDataSize, int nRecordNum, u16 nExtAreaSize=0);
/*!----------------------------------------------------------------------
@brief
@details
調falseを返します
-----------------------------------------------------------------------*/
bool SetExistingTableData(void* pData, std::size_t nDataSize);
/*!----------------------------------------------------------------------
@brief
@return true
@details
CRCなどをチェックします
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
const PictureTableHeader* GetHeader() const{
NN_NULL_ASSERT(m_pData);
return reinterpret_cast<const PictureTableHeader*>(m_pData); }
PictureTableHeader* GetHeader(){
return const_cast<PictureTableHeader*>(static_cast<const PictureTable&>(*this).GetHeader()); }
//@}
/*!----------------------------------------------------------------------
@brief CRCを更新する
@details
CRCを求めます
-----------------------------------------------------------------------*/
void UpdateCrc();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRecordNum() const{ return GetHeader()->GetRecordNum(); }
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetRecordNum())
@return
-----------------------------------------------------------------------*/
//@{
const PictureTableRecord* GetRecord(int nIndex) const{
NN_ASSERT(0 <= nIndex && nIndex < GetRecordNum());
return &GetTopRecord()[nIndex]; }
PictureTableRecord* GetRecord(int nIndex){
return const_cast<PictureTableRecord*>(static_cast<const PictureTable&>(*this).GetRecord(nIndex)); }
//@}
/*!----------------------------------------------------------------------
@brief 使
@return 使
-----------------------------------------------------------------------*/
int CountUsedRecordNum() const;
/*!----------------------------------------------------------------------
@brief 使
@return 使
-----------------------------------------------------------------------*/
int CountEmptyRecordNum() const;
private:
u16 ComputeCrc() const;
const PictureTableRecord* GetTopRecord() const {
return reinterpret_cast<const PictureTableRecord*>(
&reinterpret_cast<const u8*>(m_pData)[GetHeader()->nOffset]); }
private:
void* m_pData;
std::size_t m_nDataSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_PICTURE_TABLE_H_

View File

@ -0,0 +1,169 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbRecord.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_RECORD_H_
#define IMAGE_DB_RECORD_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbAllocator.h"
#include "ImageDbDynamicArray.h"
#include "ImageDbImageInfo.h"
#include "ImageDbValidityStateTable.h"
#include "ImageDbFaceInfo.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
class ImageDbRecord
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual const ImageInfo& GetImageInfo() const = 0;
virtual ImageInfo& GetImageInfo() = 0;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
virtual const ValidityStateTableRecord& GetValidityStateTableRecord() const = 0;
virtual ValidityStateTableRecord& GetValidityStateTableRecord() = 0;
//@}
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
使
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
class ImageDbRecordLink
{
friend class ImageDatabase;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ImageDbRecordLink();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
StorageType GetStorageType() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
ImageKind GetImageKind() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
IndexInfo GetIndexInfo() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
200/1/1
-----------------------------------------------------------------------*/
int GetDays() const;
bool operator==(const ImageDbRecordLink& x) const;
bool operator!=(const ImageDbRecordLink& x) const;
bool operator<(const ImageDbRecordLink& x) const;
private:
void SetStorageType(StorageType eType);
void SetImageKind(ImageKind eKind);
void SetIndexInfo(const IndexInfo& rIdxInfo);
int GetDbRecordIndex() const;
void SetDbRecordIndex(int nIdx);
void SetDays(int nDays);
private:
//----- ビットフィールドA -----//
// bit0-17 撮影経過日数 2000/1/1を基準に約±360年まで対応
static const int c_nBitFieldADaysBits = 18;
static const int c_nBitFieldADaysShift = 0;
static const u32 c_nBitFieldADaysMask = ((1UL<<c_nBitFieldADaysBits)-1)<<c_nBitFieldADaysShift;
// bit18-31 データベース上でのレコードインデックス
static const int c_nBitFieldARecordIndexBits = 14;
static const int c_nBitFieldARecordIndexShift = c_nBitFieldADaysBits + c_nBitFieldADaysShift;
static const u32 c_nBitFieldARecordIndexMask = ((1UL<<c_nBitFieldARecordIndexBits)-1)<<c_nBitFieldARecordIndexShift;
//----- ビットフィールドB -----//
// bit0-1 StorageType列挙型
static const int c_nBitFieldBStorageTypeBits = 2;
static const int c_nBitFieldBStorageTypeShift = 0;
static const u32 c_nBitFieldBStorageTypeMask = ((1UL<<c_nBitFieldBStorageTypeBits)-1)<<c_nBitFieldBStorageTypeShift;
// bit2-4 ImageKind列挙型
static const int c_nBitFieldBImageKindBits = 3;
static const int c_nBitFieldBImageKindShift = c_nBitFieldBStorageTypeBits + c_nBitFieldBStorageTypeShift;
static const u32 c_nBitFieldBImageKindMask = ((1UL<<c_nBitFieldBImageKindBits)-1)<<c_nBitFieldBImageKindShift;
// bit5-14 フォルダ番号のインデックス
static const int c_nBitFieldBDirIndexBits = 10;
static const int c_nBitFieldBDirIndexShift = c_nBitFieldBImageKindBits + c_nBitFieldBImageKindShift;
static const u32 c_nBitFieldBDirIndexMask = ((1UL<<c_nBitFieldBDirIndexBits)-1)<<c_nBitFieldBDirIndexShift;
// bit15-28 ファイル番号のインデックス
static const int c_nBitFieldBFileIndexBits = 14;
static const int c_nBitFieldBFileIndexShift = c_nBitFieldBDirIndexBits + c_nBitFieldBDirIndexShift;
static const u32 c_nBitFieldBFileIndexMask = ((1UL<<c_nBitFieldBFileIndexBits)-1)<<c_nBitFieldBFileIndexShift;
private:
union {
u64 m_nBitField;
struct {
u32 m_nBitFieldA;
u32 m_nBitFieldB;
};
};
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
//! レコードリンクリスト
typedef DynamicArray< ImageDbRecordLink, XAllocator<ImageDbRecordLink> > RecordLinkList;
} // end of namespace imgdb
#endif // IMAGE_DB_RECORD_H_

View File

@ -0,0 +1,158 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbRecordParam.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_RECORD_PARAM_H_
#define IMAGE_DB_RECORD_PARAM_H_
#include <nn/types.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
#include "ImageDbFaceInfo.h"
#include "ImageDbRecord.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct ImageDbRecordParamLegacy
{
s32 nFavoriteOrder;
LegacyFavoriteType eFavoriteType;
LegacyImageType eImageType;
LegacyKeyType eKey;
u8 reserved;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
#pragma pack(push, 4)
struct ImageDbRecordParam
{
DateTimeSeconds sShotSeconds; // 撮影日時
u32 nTitleUniqueId; // タイトルユニークID
SaveProcessType eSaveProcess; // 保存過程の種類
HandleTypeBit eHandleTypeBit; // 取り扱いビット
DistinctionTypeBit eDistinctionFlag; // 写真特徴フラグ DistinctionTypeBit列挙型
BodyIdTypeBit eValidBodyIdFlag; // 有効な本体IDのフラグ BodyIdTypeBit列挙型の論理和
u32 nBodyId[BodyIdTypeNum]; // 本体ID
ShootingType eShootingType; // 撮影タイプ
u8 reserved[3];
// 顔情報
imgdb::FaceInfo sFaceInfo[Const::c_nMaxFaceInfoNum];
/*!----------------------------------------------------------------------
@brief
@param[in] eImgKind
@details
eImgKindを省略すると写真として初期化されます
-----------------------------------------------------------------------*/
//@{
void Initialize();
void Initialize(ImageKind eImgKind);
//@}
/*!----------------------------------------------------------------------
@brief 2000/01/01 0:0:0
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetShotSeconds() const{ return sShotSeconds; }
void SetShotSeconds(const DateTimeSeconds& rDTSecs){ sShotSeconds = rDTSecs; }
//@}
/*!----------------------------------------------------------------------
@brief IDを取得
-----------------------------------------------------------------------*/
//@{
u32 GetTitleUniqueId() const{ return nTitleUniqueId; }
void SetTitleUniqueId(u32 nUId){ nTitleUniqueId = nUId; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
SaveProcessType GetSaveProcessType() const{ return eSaveProcess; }
void SetSaveProcessType(SaveProcessType eType){ eSaveProcess = eType; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
HandleTypeBit GetHandleTypeBit() const{ return eHandleTypeBit; }
void SetHandleTypeBit(HandleTypeBit eBit){ eHandleTypeBit = eBit; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
DistinctionTypeBit GetDistinctionTypeBit() const{ return eDistinctionFlag; }
void SetDistinctionTypeBit(DistinctionTypeBit eBit){ eDistinctionFlag = eBit; }
//@}
/*!----------------------------------------------------------------------
@brief IDの取得
-----------------------------------------------------------------------*/
//@{
u32 GetBodyId(BodyIdType eType) const;
void SetBodyId(BodyIdType eType, u32 nId);
bool IsValidBodyId(BodyIdType eType) const;
BodyIdTypeBit GetValidBodyIdBit() const;
void ResetBodyId(BodyIdType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
ShootingType GetShootingType() const{ return eShootingType; }
void SetShootingType(ShootingType eType){ eShootingType = eType; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const FaceInfo& GetFaceInfo(int nIdx) const{ NN_ASSERT(Const::c_nMaxFaceInfoNum > nIdx); return sFaceInfo[nIdx]; }
FaceInfo& GetFaceInfo(int nIdx){
return const_cast<FaceInfo&>(static_cast<const ImageDbRecordParam&>(*this).GetFaceInfo(nIdx)); }
//@}
/*!----------------------------------------------------------------------
@brief
@return [0, PictureDbFileRecord::c_nMaxFaceNum]
-----------------------------------------------------------------------*/
int GetFaceNum() const;
};
#pragma pack(pop)
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_RECORD_PARAM_H_

View File

@ -0,0 +1,130 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbRestore.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_RESTORE_H_
#define IMAGE_DB_RESTORE_H_
#include <nn/types.h>
#include <nn/fs.h>
#include "ImageDbTypes.h"
#include "JpegMpDecoder.h"
#include "ImageDbPictureDatabase.h"
#include "ImageDbUtility.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
*---------------------------------------------------------------------------*/
class ImageDbRestore
{
private:
// 生成不可
ImageDbRestore();
public:
/*!----------------------------------------------------------------------
@brief
@param[in] eStoType
@param[in] bNotEnumTwl TWL領域のファイル列挙は行わないフラグ
@param[in] bNotEnumCtr CTR領域のファイル列挙は行わないフラグ
@param[out] rPictDb
@details
NAND (JPG,MPO)
SD (JPG,MPO)
bNotEnumTwlbNotEnumCtrにtrueを指定すると
TWL側とCTR側の両方の管理ファイルが無い場合はfalseを指定すること
rPictDbは初期化済
使
trueにす
rPictDbDataは存在する方の
ResultSuccessしか返しませんがStopRestore()
ResultErrorStoppedを返します
-----------------------------------------------------------------------*/
static Result RestorePictureDatabase(
StorageType eStoType, bool bNotRestoreTwl, bool bNotRestoreCtr,
PictureDatabase& rPictDb);
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
static void StopRestore();
public:
static bool DeleteFileIfZeroByte(
StorageType eStoType, PictureDbRecord& rPictRec,
bool* pDelCtr=0, bool* pDelTwl=0);
static void SyncPictureDatabaseRecord(
StorageType eStoType, PictureDbRecord& rPictRec);
private:
// 中止要求関連
static bool IsRequestStop();
static void ResetRequestStop();
static void RestorePictureDatabaseTwl(
StorageType eStoType, PictureDatabase& rPictDb);
static void RestorePictureDatabaseDirTwl(
StorageType eStoType, PictureDatabase& rPictDb,
const IndexInfo& rIdxInfo);
static void RestorePictureDatabaseFileTwl(
StorageType eStoType, PictureDatabase& rPictDb,
const IndexInfo& rIdxInfo);
static void RestorePictureDatabaseCtr(
StorageType eStoType, PictureDatabase& rPictDb);
static void RestorePictureDatabaseDirCtr(
StorageType eStoType, PictureDatabase& rPictDb,
const IndexInfo& rIdxInfo);
static void RestorePictureDatabaseFileCtr(
StorageType eStoType, PictureDatabase& rPictDb,
const IndexInfo& rIdxInfo, ImageKind eImgKind);
static void SyncPictureDatabase(
StorageType eStoType, PictureDatabase& rPictDb);
// static void SyncPictureDatabaseRecord(
// StorageType eStoType, PictureDbRecord& rPictRec);
static void SyncPictureDatabaseRecordAvailableTwlOnly(
StorageType eStoType, PictureDbRecord& rPictRec);
static void SyncPictureDatabaseRecordAvailableCtrOnly(
StorageType eStoType, PictureDbRecord& rPictRec);
static void SyncPictureDatabaseRecordAvailableCtrOnlyJpeg(
StorageType eStoType, PictureDbRecord& rPictRec);
static void SyncPictureDatabaseRecordAvailableCtrOnlyMp(
StorageType eStoType, PictureDbRecord& rPictRec);
static void ExtractPictureDatabaseInfo(
StorageType eStoType, PictureDatabase& rPictDb);
static void ExtractPictureDatabaseInfoRecord(
StorageType eStoType, PictureDbRecord& rPictRec);
// static void DeleteFileIfZeroByte(
// StorageType eStoType, PictureDbRecord& rPictRec);
private:
// 処理中止要求
static volatile bool m_bReqStop;
};
} // end of namespace imgdb
#endif // IMAGE_DB_RESTORE_H_

View File

@ -0,0 +1,126 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbResult.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_RESULT_H_
#define IMAGE_DB_RESULT_H_
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
ImageDbが内部で使用しているエラーです<BR>
<BR>
ResultError<BR>
<BR>
<BR>
<BR>
ResultErrorInvalidParam<BR>
<BR>
使
<BR>
ResultErrorOverNumImages<BR>
ImageDbが扱える映像数を超えて<BR>
<BR>
ResultErrorOverNumDcf<BR>
DCF規格の限界を超えDCIM以下に保存される映像の名前がすべて使われ
<BR>
SDカード対しては普通に現れるエラーのため
<BR>
NANDに対して発生した場合はFATALエラーとして処理してください<BR>
ResultErrorFileOperationFailure<BR>
<BR>
SDカードで発生した場合はメッセージを出すなどして
<BR>
NANDではシステム側でFATALエラーが発動するので
FATALエラーとして扱ってください<BR>
ResultErrorInvalidFile<BR>
<BR>
<BR>
ResultErrorTooLargeFile<BR>
<BR>
<BR>
ResultErrorNotExistStorage<BR>
SDカードを認識していないのにSDカードへの要求が発生した場合に起こるエラーです<BR>
<BR>
NANDでは発生しません<BR>
ResultErrorWriteProtect
SDカードに対して書き込み処理が発生した場合に起
<BR>
<BR>
NANDでは発生しません<BR>
ResultErrorInsufficientStorageSpace<BR>
<BR>
<BR>
ResultErrorStopped<BR>
StopProcess()StopCollect()<BR>
<BR>
ResultErrorPermissionDenied<BR>
<BR>
<BR>
<BR>
ResultErrorReadOnlyDbFile<BR>
<BR>
<BR>
NANDでは発生しません<BR>
ResultErrorNotAvailableStorage<BR>
SDカードスロットに挿されているものが扱えないときに発生するエラーです<BR>
<BR>
*---------------------------------------------------------------------------*/
enum Result {
ResultSuccess = 0, //!< 成功
ResultError = 1, //!< エラー全般
ResultErrorInvalidParam = 2, //!< 無効なパラメータ
ResultErrorOverNumImages = 3, //!< 写真の管理上限を超えた
ResultErrorOverNumDcf = 4, //!< 写真のDCF規格の上限を超えた
ResultErrorFileOperationFailure = 5, //!< ファイル操作失敗
ResultErrorInvalidFile = 6, //!< 無効なファイル
ResultErrorTooLargeFile = 7, //!< ファイルサイズが大きすぎる
ResultErrorNotExistStorage = 8, //!< ストレージが存在しなかったSDカードが刺さっていない
ResultErrorWriteProtect = 9, //!< ライトプロテクトされているSDカードがロックされている
ResultErrorInsufficientStorageSpace = 10, //!< NANDやSDの空き不足
ResultErrorStopped = 11, //!< StopProcess()による中断
ResultErrorPermissionDenied = 12, //!< 権限がない
ResultErrorReadOnlyDbFile = 13, //!< 管理ファイルが読み取り専用属性になっている
ResultErrorNotAvailableStorage = 14, //!< 利用可能なストレージでない壊れたSDカードなど
// システム用エラー関連
ResultSysErrorNeedRestore = -1 //!< 管理ファイルの修復が必要(システム用エラー)
};
} // end of namespace imgdb
#endif // IMAGE_DB_RESULT_H_

View File

@ -0,0 +1,291 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbSearchObject.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_SEARCH_OBJECT_H_
#define IMAGE_DB_SEARCH_OBJECT_H_
#include <limits>
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbRecord.h"
namespace imgdb {
class ImageDatabase;
/*!--------------------------------------------------------------------------*
@brief
@details
使ImageDatabase::CreateSearchObject()
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ImageDbSearchObject : private nn::util::NonCopyable<ImageDbSearchObject>
{
friend class ImageDatabase;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ImageDbSearchObject();
/*!----------------------------------------------------------------------
@brief
@param[in] nNum
@details
nNumで予約数を指定すると
Search()
-----------------------------------------------------------------------*/
void ReserveRecord(int nNum);
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetNum())
@return
@details
-----------------------------------------------------------------------*/
const ImageDbRecordLink& GetRecord(int nIndex) const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void ClearRecord();
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetRecordNum())
-----------------------------------------------------------------------*/
void EraseRecord(int nIndex);
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetRecordNum()]
@details
使
nIndexがゼロ未満の場合は先頭GetRecordNum()
-----------------------------------------------------------------------*/
void InsertRecord(int nIndex, const ImageDbRecordLink& rLink);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetRecordNum() const;
/*!----------------------------------------------------------------------
@brief
@param[in] rLink
@return rLinkのインデックス
-----------------------------------------------------------------------*/
int FindRecord(const ImageDbRecordLink& rLink) const;
/*!----------------------------------------------------------------------
@brief
@param[in] rDTSecsStart DateTimeSeconds::GetMinSeconds()
@param[in] rDTSecsEnd DateTimeSeconds::GetMaxSeconds()
@param[in] eStoTypeBit StorageTypeBitAll
@param[in] eImgKindBit ImageKindBitKnownAll
@param[in] eShootTypeBit ShootingTypeAll
@param[in] eDisTypeBit DistinctionTypeBitNone
@param[in] nMinFaceNum 0
@param[in] nMaxFaceNum PictureDbFileRecord::c_nMaxFaceNum
@param[in] pred
@details
nSecStartにc_nSecondYoungestを指定すると最も古い映像からが対象になり
nSecEndにc_nSecondOldestを指定すると最も新しい映像が対象になります
[nSecStart, nSecEnd]
eDisTypeBitで特徴が無い映像も対象にしたい場合はDistinctionTypeBitNoneを
predを使用しますpredは関数オブジェクトで
bool operator()(const ImageDatabase&, const ImageDbRecordLink&)
truefalseを返すように
-----------------------------------------------------------------------*/
//@{
// フルスペック検索
void Search(
const DateTimeSeconds& rDTSecsStart, const DateTimeSeconds& rDTSecsEnd,
StorageTypeBit eStoTypeBit,
ImageKindBit eImgKindBit,
ShootingTypeBit eShootTypeBit,
DistinctionTypeBit eDisTypeBit,
int nMinFaceNum, int nMaxFaceNum);
// 撮影時間無視の全条件検索
void Search(
StorageTypeBit eStoTypeBit,
ImageKindBit eImgKindBit,
ShootingTypeBit eShootTypeBit,
DistinctionTypeBit eDisTypeBit,
int nMinFaceNum, int nMaxFaceNum);
// 撮影時間無視、撮影情報無視の検索
void Search(
StorageTypeBit eStoTypeBit,
ImageKindBit eImgKindBit);
// ストレージの映像すべて検索
void Search(StorageTypeBit eStoTypeBit);
// すべて検索
void Search();
// カスタム条件検索
template<typename Func>
void Search(Func pred);
//@}
/*!----------------------------------------------------------------------
@brief
@param[out] rSearch
@param[in] rDTSecsStart DateTimeSeconds::GetMinSeconds()
@param[in] rDTSecsEnd DateTimeSeconds::GetMaxSeconds()
@param[in] eStoTypeBit StorageTypeBitAll
@param[in] eImgKindBit ImageKindBitKnownAll
@param[in] eShootTypeBit ShootingTypeAll
@param[in] eDisTypeBit DistinctionTypeBitNone
@param[in] nMinFaceNum 0
@param[in] nMaxFaceNum PictureDbFileRecord::c_nMaxFaceNum
@param[in] pred
@details
predを使用しますpredは関数オブジェクトで
bool operator()(const ImageDatabase&, const ImageDbRecordLink&)
truefalseを返すように
-----------------------------------------------------------------------*/
//@{
// フルスペック絞り込み検索
void SearchRefinement(
ImageDbSearchObject& rSearch,
const DateTimeSeconds& rDTSecsStart, const DateTimeSeconds& rDTSecsEnd,
StorageTypeBit eStoTypeBit,
ImageKindBit eImgKindBit,
ShootingTypeBit eShootTypeBit,
DistinctionTypeBit eDisTypeBit,
int nMinFaceNum, int nMaxFaceNum) const;
// 撮影時間無視の全条件絞り込み検索
void SearchRefinement(
ImageDbSearchObject& rSearch,
StorageTypeBit eStoTypeBit,
ImageKindBit eImgKindBit,
ShootingTypeBit eShootTypeBit,
DistinctionTypeBit eDisTypeBit,
int nMinFaceNum, int nMaxFaceNum) const;
// 撮影時間無視、撮影情報無視の絞り込み検索
void SearchRefinement(
ImageDbSearchObject& rSearch,
StorageTypeBit eStoTypeBit,
ImageKindBit eImgKindBit) const;
// ストレージの映像すべて絞り込み検索
void SearchRefinement(
ImageDbSearchObject& rSearch,
StorageTypeBit eStoTypeBit) const;
// カスタム条件絞り込み検索
template<typename Func>
void SearchRefinement(ImageDbSearchObject& rSearch, Func pred) const;
//@}
private:
template<typename TList, typename Func>
void SearchInternal(
const ImageDatabase& rOwnerDb, const TList& rBaseList, Func pred);
private:
const ImageDatabase* m_pOwnerDb;
// ストレージとレコード種類の検索結果マスク
StorageTypeBit m_eStoTypeBit;
ImageKindBit m_eImgKindBit;
RecordLinkList m_lRecordLinkList;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
// カスタム検索
template<typename Func>
void ImageDbSearchObject::Search(Func pred)
{
NN_NULL_ASSERT(m_pOwnerDb);
SearchInternal(*m_pOwnerDb, m_pOwnerDb->m_lRecordLinkList, pred);
int nStoTypeBit = StorageTypeBitNone;
int nImgKindBit = ImageKindBitNone;
for(RecordLinkList::const_iterator it = m_lRecordLinkList.begin(); m_lRecordLinkList.end() != it; ++it){
const ImageDbRecordLink& rLink = *it;
nStoTypeBit |= 1 << rLink.GetStorageType();
nImgKindBit |= 1 << rLink.GetImageKind();
}
m_eStoTypeBit = static_cast<StorageTypeBit>(nStoTypeBit);
m_eImgKindBit = static_cast<ImageKindBit>(nImgKindBit);
}
/*---------------------------------------------------------------------------
---------------------------------------------------------------------------*/
// カスタム絞り込み検索
template<typename Func>
void ImageDbSearchObject::SearchRefinement(
ImageDbSearchObject& rSearch, Func pred) const
{
rSearch.SearchInternal(
*m_pOwnerDb, m_lRecordLinkList, pred);
const RecordLinkList& rRecLinkList = rSearch.m_lRecordLinkList;
int nStoTypeBit = StorageTypeBitNone;
int nImgKindBit = ImageKindBitNone;
for(RecordLinkList::const_iterator it = rRecLinkList.begin(); rRecLinkList.end() != it; ++it){
const ImageDbRecordLink& rLink = *it;
nStoTypeBit |= 1 << rLink.GetStorageType();
nImgKindBit |= 1 << rLink.GetImageKind();
}
rSearch.m_eStoTypeBit = static_cast<StorageTypeBit>(nStoTypeBit);
rSearch.m_eImgKindBit = static_cast<ImageKindBit>(nImgKindBit);
}
/*---------------------------------------------------------------------------
--------------------------------------------------------------------------*/
template<typename TList, typename Func>
void ImageDbSearchObject::SearchInternal(
const ImageDatabase& rOwnerDb, const TList& rBaseList, Func pred)
{
m_lRecordLinkList.clear();
m_lRecordLinkList.reserve(rBaseList.size());
// 合致するものだけをリストに登録していく
for(typename TList::const_iterator it = rBaseList.begin(); rBaseList.end() != it; ++it){
const ImageDbRecordLink& rLink = *it;
if(!pred(*m_pOwnerDb, rLink)){
continue;
}
// ここまで来たなら条件に合致したので記録する
m_lRecordLinkList.push_back(rLink);
}
m_pOwnerDb = &rOwnerDb;
}
} // end of namespace imgdb
#endif // IMAGE_DB_SEARCH_OBJECT_H_

View File

@ -0,0 +1,99 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbSingleton.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_SINGLETON_H_
#define IMAGE_DB_SINGLETON_H_
#include <nn/util.h>
#include "ImageDbAllocator.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
@details
NANDやSDカードに保存されている写真
TWLのTCLライブラリの管理ファイル操作関連に似せています
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
template<typename T>
class Singleton
{
public:
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
static void CreateInstance(Allocator* pAllocator=0){
if(0 == m_pInstance){
m_pAllocator = pAllocator;
if(0 == m_pAllocator){
m_pAllocator = GetAllocator();
}
NN_NULL_ASSERT(m_pAllocator);
m_pInstance = m_pAllocator->AllocAndConstruct<T>(1);
}
}
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
static void DestroyInstance(){
if(0 != m_pInstance){
T* pTmp = m_pInstance;
m_pInstance = 0;
NN_NULL_ASSERT(m_pAllocator);
m_pAllocator->DestructAndFree<T>(pTmp, 1);
}
}
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
static T* GetInstance(){ NN_ASSERT(IsExistInstance()); return m_pInstance; }
/*!----------------------------------------------------------------------
@brief
@return true
@details
CreateInstance()trueを返します
-----------------------------------------------------------------------*/
static bool IsExistInstance(){ return (0 != m_pInstance); }
protected:
virtual ~Singleton(){ NN_ASSERT(!IsExistInstance()); /*意図的に解放してもらうためのチェック*/ }
private:
static T* m_pInstance;
static Allocator* m_pAllocator;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
template<typename T>
T* Singleton<T>::m_pInstance = 0;
template<typename T>
Allocator* Singleton<T>::m_pAllocator = 0;
} // end of namespace imgdb
#endif // IMAGE_DB_SINGLETON_H_

View File

@ -0,0 +1,400 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbTypes.h
Picture
Movie
ImagePictureMovie
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_TYPES_H_
#define IMAGE_DB_TYPES_H_
#include <nn/types.h>
namespace imgdb {
//! ストレージタイプ
enum StorageType {
StorageTypeNand = 0, //!< NAND
StorageTypeSd, //!< SDカード
StorageTypeReserved2,
StorageTypeReserved3,
StorageTypeNum = StorageTypeReserved2
};
//! ストレージのビットフラグ
enum StorageTypeBit {
StorageTypeBitNone = 0,
StorageTypeBitNand = 1 << StorageTypeNand, //!< NAND
StorageTypeBitSd = 1 << StorageTypeSd, //!< SDカード
StorageTypeBitAll = StorageTypeBitNand
| StorageTypeBitSd
};
//! 映像データの種類
enum ImageKind {
ImageKindUnknown = 0, //!< 不明
ImageKindJpeg, //!< JPEG
ImageKindMp, //!< MP
ImageKindMJpeg, //!< モーションJPEG
ImageKindReserved4,
ImageKindReserved5,
ImageKindReserved6,
ImageKindReserved7,
ImageKindNum = ImageKindReserved4
};
//! 映像データの種類のビットフラグ
enum ImageKindBit {
ImageKindBitNone = 0,
ImageKindBitUnknown = 1 << ImageKindUnknown, //!< 不明
ImageKindBitJpeg = 1 << ImageKindJpeg, //!< JPEG
ImageKindBitMp = 1 << ImageKindMp, //!< MP
ImageKindBitMJpeg = 1 << ImageKindMJpeg, //!< モーションJPEG
//! 写真データ
ImageKindBitPicture = ImageKindBitJpeg
| ImageKindBitMp,
//! 動画データ
ImageKindBitMovie = ImageKindBitMJpeg,
//! 既知の種類すべて
ImageKindBitKnownAll = ImageKindBitPicture
| ImageKindBitMovie,
ImageKindBitAll = ImageKindBitUnknown
| ImageKindBitKnownAll
};
//! 撮影タイプ
enum ShootingType {
ShootingTypePhotoNormal = 0, //!< 写真 通常設定
ShootingTypePhotoFace, //!< 写真 顔合成
ShootingTypePhotoEffect, //!< 写真 エフェクト
ShootingTypePhotoDayDream, //!< 写真 白昼夢
ShootingTypePhotoToy, //!< 写真 トイカメラ
ShootingTypePhotoAfterimage, //!< 写真 残像
ShootingTypePhotoFramelate, //!< 写真 フレームレート(暗いとこ撮影)
ShootingTypePhotoQuestion, //!< 写真 ?ボックス
ShootingTypePhotoManual, //!< 写真 こだわり設定
ShootingTypeMovieNormal, //!< 動画 ノーマル
ShootingTypeMovieFramelate, //!< 動画 フレームレート(暗いとこ撮影)
ShootingTypeMovieManual, //!< 動画 こだわり
ShootingTypeReserve0, //!< 予約
ShootingTypeReserve1, //!< 予約
ShootingTypeReserve2, //!< 予約
ShootingTypeReserve3, //!< 予約
ShootingTypeNum
};
//! 撮影タイプのビットフラグ
enum ShootingTypeBit {
ShootingTypeBitPhotoNormal = 1 << ShootingTypePhotoNormal, //!< 写真 通常設定
ShootingTypeBitPhotoFace = 1 << ShootingTypePhotoFace, //!< 写真 顔合成
ShootingTypeBitPhotoEffect = 1 << ShootingTypePhotoEffect, //!< 写真 エフェクト
ShootingTypeBitPhotoDayDream = 1 << ShootingTypePhotoDayDream, //!< 写真 白昼夢
ShootingTypeBitPhotoToy = 1 << ShootingTypePhotoToy, //!< 写真 トイカメラ
ShootingTypeBitPhotoAfterimage = 1 << ShootingTypePhotoAfterimage, //!< 写真 残像
ShootingTypeBitPhotoFramelate = 1 << ShootingTypePhotoFramelate, //!< 写真 フレームレート(暗いとこ撮影)
ShootingTypeBitPhotoQuestion = 1 << ShootingTypePhotoQuestion, //!< 写真 ?ボックス
ShootingTypeBitPhotoManual = 1 << ShootingTypePhotoManual, //!< 写真 こだわり設定
ShootingTypeBitMovieNormal = 1 << ShootingTypeMovieNormal, //!< 動画 ノーマル
ShootingTypeBitMovieFramelate = 1 << ShootingTypeMovieFramelate, //!< 動画 フレームレート(暗いとこ撮影)
ShootingTypeBitMovieManual = 1 << ShootingTypeMovieManual, //!< 動画 こだわり
ShootingTypeBitReserve0 = 1 << ShootingTypeReserve0, //!< 予約
ShootingTypeBitReserve1 = 1 << ShootingTypeReserve1, //!< 予約
ShootingTypeBitReserve2 = 1 << ShootingTypeReserve2, //!< 予約
ShootingTypeBitReserve3 = 1 << ShootingTypeReserve3, //!< 予約
ShootingTypeBitPhotoAll = ShootingTypeBitPhotoNormal
| ShootingTypeBitPhotoFace
| ShootingTypeBitPhotoEffect
| ShootingTypeBitPhotoDayDream
| ShootingTypeBitPhotoToy
| ShootingTypeBitPhotoAfterimage
| ShootingTypeBitPhotoFramelate
| ShootingTypeBitPhotoQuestion
| ShootingTypeBitPhotoManual,
ShootingTypeBitMovieAll = ShootingTypeBitMovieNormal
| ShootingTypeBitMovieFramelate
| ShootingTypeBitMovieManual,
ShootingTypeBitAll = ShootingTypeBitPhotoAll
| ShootingTypeBitMovieAll
};
//! 写真特徴タイプ
enum DistinctionType {
DistinctionTypeNone = 0, // 0 特徴なし
DistinctionTypeMale, // 1 男性が含まれている
DistinctionTypeFemale, // 2 女性が含まれている
DistinctionTypeStranger, // 3 変な人が含まれている
DistinctionTypeMii, // 4 Miiが含まれている
DistinctionTypeDecorationShooting, // 5 デコレーション撮影
DistinctionTypeManualShooting, // 6 こだわり撮影
DistinctionTypeScreenShot, // 7 ゲーム画面
DistinctionTypeNum,
DistinctionTypeReserved8 = DistinctionTypeNum, // 8
DistinctionTypeReserved9, // 9
DistinctionTypeReserved10, // 10
DistinctionTypeReserved11, // 11
DistinctionTypeReserved12, // 12
DistinctionTypeReserved13, // 13
DistinctionTypeReserved14, // 14
DistinctionTypeReserved15, // 15 ここまでが限界
DistinctionTypeMax
};
//! 写真特徴タイプのビットフラグ
enum DistinctionTypeBit {
DistinctionTypeBitNone = 0,
DistinctionTypeBitMale = 1 << DistinctionTypeMale, // 男性が含まれている
DistinctionTypeBitFemale = 1 << DistinctionTypeFemale, // 女性が含まれている
DistinctionTypeBitStranger = 1 << DistinctionTypeStranger, // 変な人が含まれている
DistinctionTypeBitMii = 1 << DistinctionTypeMii, // Miiが含まれている
DistinctionTypeBitDecorationShooting = 1 << DistinctionTypeDecorationShooting, // デコレーション撮影
DistinctionTypeBitManualShooting = 1 << DistinctionTypeManualShooting, // こだわり撮影
DistinctionTypeBitScreenShot = 1 << DistinctionTypeScreenShot, // ゲーム画面
// 人物が含まれている
DistinctionTypeBitPerson = DistinctionTypeBitMale
| DistinctionTypeBitFemale
| DistinctionTypeBitStranger,
DistinctionTypeBitAll = DistinctionTypeBitPerson
| DistinctionTypeBitMii
| DistinctionTypeBitDecorationShooting
| DistinctionTypeBitManualShooting
| DistinctionTypeBitScreenShot
};
//! 保存過程タイプ列挙型
enum SaveProcessType
{
SaveProcessTypeUnknown = 0, // 0 不明
SaveProcessTypeSystemApp, // 1 システムアプリケーション3DSカメラ
SaveProcessTypeMenu, // 2 システムアプレット
SaveProcessTypeApplet, // 3 ライブラリアプレット
SaveProcessTypeLibrary, // 4 ImageDbライブラリ
SaveProcessTypeScreenshot, // 5 スクリーンショットAPI
SaveProcessTypeOther, // 6 その他
SaveProcessTypeNum,
SaveProcessTypeReserved7 = SaveProcessTypeNum, // 7
SaveProcessTypeReserved8, // 8
SaveProcessTypeReserved9, // 9
SaveProcessTypeReserved10, // 10
SaveProcessTypeReserved11, // 11
SaveProcessTypeReserved12, // 12
SaveProcessTypeReserved13, // 13
SaveProcessTypeReserved14, // 14
SaveProcessTypeReserved15, // 15 ここまでが限界
SaveProcessTypeMax
};
//! 保存過程タイプのビットフラグ列挙型
enum SaveProcessTypeBit
{
SaveProcessTypeBitUnknown = 1 << SaveProcessTypeUnknown,
SaveProcessTypeBitSystemApp = 1 << SaveProcessTypeSystemApp, // システムアプリケーション3DSカメラ
SaveProcessTypeBitMenu = 1 << SaveProcessTypeMenu, // システムアプレット
SaveProcessTypeBitApplet = 1 << SaveProcessTypeApplet, // ライブラリアプレット
SaveProcessTypeBitLibrary = 1 << SaveProcessTypeLibrary, // ImageDbライブラリ
SaveProcessTypeBitScreenshot = 1 << SaveProcessTypeScreenshot, // スクリーンショットAPI
SaveProcessTypeBitOther = 1 << SaveProcessTypeOther,
SaveProcessTypeBitAll = SaveProcessTypeBitUnknown
| SaveProcessTypeBitSystemApp
| SaveProcessTypeBitMenu
| SaveProcessTypeBitApplet
| SaveProcessTypeBitLibrary
| SaveProcessTypeBitScreenshot
| SaveProcessTypeBitOther
};
//! 本体IDタイプ列挙型
enum BodyIdType
{
BodyIdTypeShot = 0, // 0 撮影した本体ID
BodyIdTypeSend, // 1 送信した本体ID
BodyIdTypeReceive, // 2 受信した本体ID
BodyIdTypeEditor, // 3 最後に編集した本体ID
BodyIdTypeNum,
BodyIdTypeMax = BodyIdTypeNum
};
//! 本体IDタイプビット列挙型
enum BodyIdTypeBit
{
BodyIdTypeBitNone = 0,
BodyIdTypeBitShot = 1 << BodyIdTypeShot, // 撮影した本体ID
BodyIdTypeBitSend = 1 << BodyIdTypeSend, // 送信した本体ID
BodyIdTypeBitReceive = 1 << BodyIdTypeReceive, // 受信した本体ID
BodyIdTypeBitEditor = 1 << BodyIdTypeEditor, // 最後に編集した本体ID
BodyIdTypeBitAll = BodyIdTypeBitShot
| BodyIdTypeBitSend
| BodyIdTypeBitReceive
| BodyIdTypeBitEditor
};
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
enum HandleType
{
HandleTypeReserved0 = 0, // 0 予約
HandleTypeReserved1, // 1 予約
HandleTypePermitDistribute, // 2 配布許可
HandleTypeReserved3, // 3 予約
HandleTypeAdjustablePicture, // 4 焦点調整可能
HandleTypeNum,
HandleTypeReserved5 = HandleTypeNum,// 5
HandleTypeReserved6, // 6
HandleTypeReserved7, // 7 ここまでが限界
HandleTypeMax
};
//! 取り扱いビット列挙型
enum HandleTypeBit
{
HandleTypeBitNone = 0,
HandleTypeBitReserved0 = 1 << HandleTypeReserved0, // 予約
HandleTypeBitReserved1 = 1 << HandleTypeReserved1, // 予約
HandleTypeBitPermitDistribute = 1 << HandleTypePermitDistribute, // 配布許可
HandleTypeBitReserved3 = 1 << HandleTypeReserved3, // 予約
HandleTypeBitAdjustablePicture = 1 << HandleTypeAdjustablePicture, // 焦点調整可能
HandleTypeBitAll = HandleTypeBitReserved0
| HandleTypeBitReserved1
| HandleTypeBitPermitDistribute
| HandleTypeBitReserved3
| HandleTypeBitAdjustablePicture
};
//! レガシー 署名の鍵タイプTWL-SDKのTCLKeyType列挙型準拠
enum LegacyKeyType {
LegacyKeyTypeLauncher = 0, //!< ランチャー鍵
LegacyKeyTypeApplication, //!< 一般鍵
LegacyKeyTypeUnknown, //!< 不明鍵
LegacyKeyTypeNum
};
//! レガシー 署名の鍵タイプのビットフラグTWL-SDKのTCLKeyType列挙型準拠
enum LegacyKeyTypeBit {
LegacyKeyTypeBitLauncher = 1 << LegacyKeyTypeLauncher, //!< ランチャー鍵
LegacyKeyTypeBitApplication = 1 << LegacyKeyTypeApplication, //!< 一般鍵
LegacyKeyTypeBitUnknown = 1 << LegacyKeyTypeUnknown, //!< 不明鍵
LegacyKeyTypeBitKnownAll = LegacyKeyTypeBitLauncher
| LegacyKeyTypeBitApplication,
LegacyKeyTypeBitAll = LegacyKeyTypeBitUnknown
| LegacyKeyTypeBitKnownAll
};
//! レガシー 画像タイプTWL-SDKのTCLImageType列挙型準拠
enum LegacyImageType {
LegacyImageTypePicture = 0,
LegacyImageTypeFrame,
LegacyImageTypeComposite,
LegacyImageTypeUnknown,
LegacyImageTypeNum
};
//! レガシー お気に入りタイプTWL-SDKのTCLFavoriteType列挙型準拠
enum LegacyFavoriteType {
LegacyFavoriteTypeNone = 0,
LegacyFavoriteType1, //!< 星
LegacyFavoriteTypeStar = LegacyFavoriteType1,
LegacyFavoriteType2, //!< クローバー
LegacyFavoriteTypeClover = LegacyFavoriteType2,
LegacyFavoriteType3, //!< ハート
LegacyFavoriteTypeHeart = LegacyFavoriteType3,
LegacyFavoriteTypeNum
};
//! レガシー お気に入りタイプのビットフラグTWL-SDKのTCLFavoriteType列挙型準拠
enum LegacyFavoriteTypeBit {
LegacyFavoriteTypeBitNone = 1 << LegacyFavoriteTypeNone,
LegacyFavoriteTypeBit1 = 1 << LegacyFavoriteType1, //!< 星
LegacyFavoriteTypeBitStar = LegacyFavoriteTypeBit1,
LegacyFavoriteTypeBit2 = 1 << LegacyFavoriteType2, //!< クローバー
LegacyFavoriteTypeBitClover = LegacyFavoriteTypeBit2,
LegacyFavoriteTypeBit3 = 1 << LegacyFavoriteType3, //!< ハート
LegacyFavoriteTypeBitHeart = LegacyFavoriteTypeBit3,
// すべてのマーク
LegacyFavoriteTypeBitMarkAll = LegacyFavoriteTypeBit1
| LegacyFavoriteTypeBit2
| LegacyFavoriteTypeBit3,
LegacyFavoriteTypeBitAll = LegacyFavoriteTypeBitNone
| LegacyFavoriteTypeBitMarkAll
};
//! 妥当性状態
enum ValidityState {
ValidityStateUnknown = 0, // 不明
ValidityStateValid, // 有効
ValidityStateInvalid, // 無効
ValidityStateNum
};
} // end of namespace imgdb
#endif // IMAGE_DB_TYPES_H_

View File

@ -0,0 +1,23 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbUtility.h
ƒ<EFBFBD>[ƒeƒBƒŠƒeƒB
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_UTILITY_H_
#define IMAGE_DB_UTILITY_H_
#include "ImageDbMiscUtility.h"
#include "ImageDbPathUtility.h"
#include "ImageDbFileUtility.h"
#include "ImageDbImageUtility.h"
namespace imgdb {
namespace util {
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_DB_UTILITY_H_

View File

@ -0,0 +1,220 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDbValidityStateTable.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_VALIDITY_STATE_TABLE_H_
#define IMAGE_DB_VALIDITY_STATE_TABLE_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct ValidityStateTableHeader
{
public:
u16 nNumElements;
u16 reserved;
public:
/*!----------------------------------------------------------------------
@brief
@param[in] nRecordNum
@param[in] nExtAreaSize
-----------------------------------------------------------------------*/
void Initialize(int nRecordNum);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
int GetRecordNum() const{ return nNumElements; }
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
#pragma pack(push, 1)
struct ValidityStateTableRecord
{
public:
union {
u8 nValidityStatus;
struct {
u8 nThumbnailValidityState : 2; // ValidityState列挙型 サムネイル画像の妥当性状態
u8 nImageValidityState : 2; // ValidityState列挙型 本画像の妥当性状態
u8 nReserved : 4;
};
};
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
ValidityState GetThumbnailValidityState() const;
void SetThumbnailValidityState(ValidityState eState);
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
ValidityState GetImageValidityState() const;
void SetImageValidityState(ValidityState eState);
//@}
/*!----------------------------------------------------------------------
@brief
@return true
@details
trueを返します
-----------------------------------------------------------------------*/
bool IsStateValid() const;
/*!----------------------------------------------------------------------
@brief
@return true
@details
trueを返します
-----------------------------------------------------------------------*/
bool IsStateInvalid() const;
};
#pragma pack(pop)
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
ComputeTableSize()
SetInitialTableData()
使SetExistingTableData()
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class ValidityStateTable
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
ValidityStateTable();
/*!----------------------------------------------------------------------
@brief
@param[in] nRecordNum
@param[in] nExtAreaSize
@return
-----------------------------------------------------------------------*/
static std::size_t ComputeTableSize(int nRecordNum);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetTableData() const{ return m_pData; }
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetTableDataSize() const{ return m_nDataSize; }
/*!----------------------------------------------------------------------
@brief
@details
false
-----------------------------------------------------------------------*/
bool SetInitialTableData(void* pData, std::size_t nDataSize, int nRecordNum);
/*!----------------------------------------------------------------------
@brief
@details
調falseを返します
-----------------------------------------------------------------------*/
bool SetExistingTableData(void* pData, std::size_t nDataSize);
/*!----------------------------------------------------------------------
@brief
@return true
@details
CRCなどをチェックします
-----------------------------------------------------------------------*/
bool Validate() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
//@{
const ValidityStateTableHeader* GetHeader() const{
NN_NULL_ASSERT(m_pData);
return reinterpret_cast<const ValidityStateTableHeader*>(m_pData); }
ValidityStateTableHeader* GetHeader(){
return const_cast<ValidityStateTableHeader*>(static_cast<const ValidityStateTable&>(*this).GetHeader()); }
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRecordNum() const{ return GetHeader()->GetRecordNum(); }
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetRecordNum())
@return
-----------------------------------------------------------------------*/
//@{
const ValidityStateTableRecord* GetRecord(int nIndex) const{
NN_ASSERT(0 <= nIndex && nIndex < GetRecordNum());
return &GetTopRecord()[nIndex]; }
ValidityStateTableRecord* GetRecord(int nIndex){
return const_cast<ValidityStateTableRecord*>(static_cast<const ValidityStateTable&>(*this).GetRecord(nIndex)); }
//@}
private:
const ValidityStateTableRecord* GetTopRecord() const {
return reinterpret_cast<const ValidityStateTableRecord*>(
&reinterpret_cast<const u8*>(m_pData)[sizeof(ValidityStateTableHeader)]); }
private:
void* m_pData;
std::size_t m_nDataSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // IMAGE_DB_VALIDITY_STATE_TABLE_H_

View File

@ -0,0 +1,903 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: JpegMpDecoder.h
JPEG/MPデコーダ
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_DECODER_H_
#define JPEG_MP_DECODER_H_
#include <nn/types.h>
#include <nn/util.h>
#include <nn/fnd.h>
#include <nn/jpeg.h>
#include <nn/jpeg/ctr/jpeg_MpDecoderS.h>
#include "SysMakerNote.h"
#include "ImageDbTypes.h"
#include "ImageDbConst.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief JPEG/MPベースデコードクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class JpegMpBaseDecoder
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
explicit JpegMpBaseDecoder(nn::jpeg::CTR::JpegMpDecoderS& rNnDecoder);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegMpBaseDecoder() = 0;
/*-----------------------------------------------------------------------
EXIF関連
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@param[in] rDateTime
@return false
-----------------------------------------------------------------------*/
bool GetDateTime(nn::fnd::DateTime& rDateTime) const;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
const void* GetUserMakerNote() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
0
-----------------------------------------------------------------------*/
std::size_t GetUserMakerNoteSize() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
const char* GetSoftware() const;
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@return
@details
void*
SysMakerNote型にキャストす
-----------------------------------------------------------------------*/
const void* GetSysMakerNote() const;
/*!----------------------------------------------------------------------
@brief
@param[out] rSysNote
@return true
@details
-----------------------------------------------------------------------*/
bool GetSysMakerNote(SysMakerNote& rSysNote) const;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
u32 GetSysMakerNoteCode() const;
/*!----------------------------------------------------------------------
@brief
@details
DateTimeSeconds::GetMinSeconds()
-----------------------------------------------------------------------*/
DateTimeSeconds GetSysMakerNoteCreateSeconds() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@details
0
-----------------------------------------------------------------------*/
u32 GetSysMakerNoteTitleUniqueId() const;
/*!----------------------------------------------------------------------
@brief
@details
SaveProcessTypeUnknownを返します
-----------------------------------------------------------------------*/
SaveProcessType GetSysMakerNoteSaveProcessType() const;
/*!----------------------------------------------------------------------
@brief
@return HandleFlagBit列挙型の論理和
@details
-----------------------------------------------------------------------*/
HandleTypeBit GetSysMakerNoteHandleFlag() const;
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@param[in] eType IDのタイプ
@details
falseを返します
-----------------------------------------------------------------------*/
bool IsValidSysMakerNoteId(BodyIdType eType) const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@param[in] eType IDのタイプ
@details
-----------------------------------------------------------------------*/
u32 GetSysMakerNoteId(BodyIdType eType) const;
/*!----------------------------------------------------------------------
@brief MPファイル水平オフセットを取得する
@details
-----------------------------------------------------------------------*/
f32 GetSysMakerNoteMpOffsetH() const;
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
s32 GetSysMakerNoteLegacyFavoriteOrder() const;
/*!----------------------------------------------------------------------
@brief
@details
LegacyFavoriteTypeNoneを返します
-----------------------------------------------------------------------*/
LegacyFavoriteType GetSysMakerNoteLegacyFavoriteType() const;
/*!----------------------------------------------------------------------
@brief
@details
LegacyImageTypeUnknownを返します
-----------------------------------------------------------------------*/
LegacyImageType GetSysMakerNoteLegacyImageType() const;
/*!----------------------------------------------------------------------
@brief
@details
LegacyKeyTypeUnknownを返します
-----------------------------------------------------------------------*/
LegacyKeyType GetSysMakerNoteLegacyKeyType() const;
/*!----------------------------------------------------------------------
@brief
@details
falseを返します
-----------------------------------------------------------------------*/
bool IsSysMakerNoteLegacyDefaultFrame() const;
/*!----------------------------------------------------------------------
@brief
@details
ShootingTypePhotoNormalを返します
-----------------------------------------------------------------------*/
ShootingType GetSysMakerNoteShootingType() const;
/*!----------------------------------------------------------------------
@brief
@details
DistinctionTypeBitNoneを返します
-----------------------------------------------------------------------*/
DistinctionTypeBit GetSysMakerNoteDistinctionTypeBit() const;
/*!----------------------------------------------------------------------
@brief
@param[in,out] rShrinkWidth
@param[in,out] rShrinkHeight
@param[in] nLimitWidth
@param[in] nLimitHeight
@return
-----------------------------------------------------------------------*/
static int ComputeShrinkLevel(
int& rShrinkWidth, int& rShrinkHeight, int nLimitWidth, int nLimitHeight);
private:
// コーデック
nn::jpeg::CTR::JpegMpDecoderS& m_rNnDecoder;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief JPEGデコードクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class JpegDecoder : public JpegMpBaseDecoder, private nn::util::NonCopyable<JpegDecoder>
{
public:
// デフォルトの最小画像制限サイズ
static const int c_nDefaultMinImageLimitWidth = Const::c_nMinStandardPictureWidth;
static const int c_nDefaultMinImageLimitHeight = Const::c_nMinStandardPictureHeight;
// デフォルトの最大画像制限サイズ
static const int c_nDefaultMaxImageLimitWidth = Const::c_nMaxStandardPictureWidth;
static const int c_nDefaultMaxImageLimitHeight = Const::c_nMaxStandardPictureHeight;
// デフォルトの最大自動画像縮小レベル
static const int c_nDefaultMaxImageShrinkLevel = 2;
// デフォルトの自動画像縮小機能の有効フラグ
static const bool c_bDefaultEnableAutoImageShrinkFlag = true;
// デフォルトの最小サムネイル画像制限サイズ
static const int c_nDefaultMinThumbnailLimitWidth = Const::c_nMinStandardThumbnailWidth;
static const int c_nDefaultMinThumbnailLimitHeight = Const::c_nMinStandardThumbnailHeight;
// デフォルトの最大サムネイル画像制限サイズ
static const int c_nDefaultMaxThumbnailLimitWidth = Const::c_nMaxStandardThumbnailWidth;
static const int c_nDefaultMaxThumbnailLimitHeight = Const::c_nMaxStandardThumbnailHeight;
// デフォルトの最大自動サムネイル画像縮小レベル
static const int c_nDefaultMaxThumbnailShrinkLevel = 2;
// デフォルトの自動サムネイル画像縮小機能の有効フラグ
static const bool c_bDefaultEnableAutoThumbnailShrinkFlag = true;
public:
/*!----------------------------------------------------------------------
@brief
@param[in] pJpegData JPEGデータ
@param[in] nJpegSize JPEGデータのサイズ
@param[out] pRawData
@param[in] nRawDataSize
@details
pRawDataの指定を省略した場合は
-----------------------------------------------------------------------*/
//@{
JpegDecoder(
const void* pJpegData, std::size_t nJpegSize);
JpegDecoder(
const void* pJpegData, std::size_t nJpegSize,
void* pRawData, std::size_t nRawDataSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegDecoder();
/*!----------------------------------------------------------------------
@brief
@param[in] eRawFormat
@param[in] bThumbnail
-----------------------------------------------------------------------*/
//@{
bool Decode(nn::jpeg::CTR::PixelFormat eRawFormat);
bool Decode(nn::jpeg::CTR::PixelFormat eRawFormat, bool bThumbnail);
//@}
/*!----------------------------------------------------------------------
@brief
@note
使
-----------------------------------------------------------------------*/
void StopDecoder();
/*!----------------------------------------------------------------------
@brief Exifだけを展開する
@param[in] bThumbnail t展開フラグ
@details
GetWidth()GetRealWidth()GetShrinkLevel()
SetMinLimitWidth()SetMaxShrinkLevel()
ExtractExif()
-----------------------------------------------------------------------*/
//@{
bool ExtractExif();
bool ExtractExif(bool bThumbnail);
//@}
/*!----------------------------------------------------------------------
@brief
@details
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMinImageLimitWidth() const{ return m_nMinImageLimitWidth; }
void SetMinImageLimitWidth(int nWidth){ m_nMinImageLimitWidth = nWidth; }
int GetMinImageLimitHeight() const{ return m_nMinImageLimitHeight; }
void SetMinImageLimitHeight(int nHeight){ m_nMinImageLimitHeight = nHeight; }
int GetMaxImageLimitWidth() const{ return m_nMaxImageLimitWidth; }
void SetMaxImageLimitWidth(int nWidth){ m_nMaxImageLimitWidth = nWidth; }
int GetMaxImageLimitHeight() const{ return m_nMaxImageLimitHeight; }
void SetMaxImageLimitHeight(int nHeight){ m_nMaxImageLimitHeight = nHeight; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
Min側のサイズは自動画像縮小を行わないオリジナルのサイズでの比較でMax側の
Maxより大きな画像になることはありませんがMinより小さい画像にな
Min < Maxとも限りません
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMinThumbnailLimitWidth() const{ return m_nMinThumbnailLimitWidth; }
void SetMinThumbnailLimitWidth(int nWidth){ m_nMinThumbnailLimitWidth = nWidth; }
int GetMinThumbnailLimitHeight() const{ return m_nMinThumbnailLimitHeight; }
void SetMinThumbnailLimitHeight(int nHeight){ m_nMinThumbnailLimitHeight = nHeight; }
int GetMaxThumbnailLimitWidth() const{ return m_nMaxThumbnailLimitWidth; }
void SetMaxThumbnailLimitWidth(int nWidth){ m_nMaxThumbnailLimitWidth = nWidth; }
int GetMaxThumbnailLimitHeight() const{ return m_nMaxThumbnailLimitHeight; }
void SetMaxThumbnailLimitHeight(int nHeight){ m_nMaxThumbnailLimitHeight = nHeight; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
64×64256×256
-----------------------------------------------------------------------*/
//@{
int GetOutputBufferWidth() const{ return m_nOutputBufferWidth; }
void SetOutputBufferWidth(int nWidth){ m_nOutputBufferWidth = nWidth; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
0=1=1/22=1/4
[0,4]
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMaxImageShrinkLevel() const{ return m_nMaxImageShrinkLevel; }
void SetMaxImageShrinkLevel(int nLevel){ NN_ASSERT(0 <= nLevel && nLevel <= 4); m_nMaxImageShrinkLevel = nLevel; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
0=1=1/22=1/4
[0,4]
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMaxThumbnailShrinkLevel() const{ return m_nMaxThumbnailShrinkLevel; }
void SetMaxThumbnailShrinkLevel(int nLevel){ NN_ASSERT(0 <= nLevel && nLevel <= 4); m_nMaxThumbnailShrinkLevel = nLevel; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetMaxImageLimitWidth()GetMaxImageLimitHeight()
1/21/41/8
1/(1<<GetMaxImageShrinkLevel())
GetWidth()GetHeight()
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
bool GetEnableAutoImageShrinkFlag() const{ return m_bEnableAutoImageShrinkFlag; }
void SetEnableAutoImageShrinkFlag(bool bEnable){ m_bEnableAutoImageShrinkFlag = bEnable; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetMaxThumbnailLimitWidth()GetMaxThumbnailLimitHeight()
1/21/41/8
1/(1<<GetMaxThumbnailShrinkLevel())
GetWidth()GetHeight()
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
bool GetEnableAutoThumbnailShrinkFlag() const{ return m_bEnableAutoThumbnailShrinkFlag; }
void SetEnableAutoThumbnailShrinkFlag(bool bEnable){ m_bEnableAutoThumbnailShrinkFlag = bEnable; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const void* GetRawData() const{ return m_pRawData; }
void* GetRawData(){
return const_cast<void*>(static_cast<const JpegDecoder&>(*this).GetRawData()); }
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetRawSize() const{ return m_nRawSize; }
/*!----------------------------------------------------------------------
@brief
@return
@details
GetRealWidth(), GetRealHeight()GetShrinkLevel()
0
-----------------------------------------------------------------------*/
//@{
int GetWidth() const;
int GetHeight() const;
//@}
/*!----------------------------------------------------------------------
@brief
@return
@details
0
-----------------------------------------------------------------------*/
//@{
int GetRealWidth() const;
int GetRealHeight() const;
//@}
/*!----------------------------------------------------------------------
@brief
@return [0,4]
-----------------------------------------------------------------------*/
int GetShrinkLevel() const{ return m_nShrinkedLevel; }
private:
int GetMinLimitWidth(bool bThumbnail) const{ return bThumbnail ? GetMinThumbnailLimitWidth() : GetMinImageLimitWidth(); }
int GetMinLimitHeight(bool bThumbnail) const{ return bThumbnail ? GetMinThumbnailLimitHeight() : GetMinImageLimitHeight(); }
int GetMaxLimitWidth(bool bThumbnail) const{ return bThumbnail ? GetMaxThumbnailLimitWidth() : GetMaxImageLimitWidth(); }
int GetMaxLimitHeight(bool bThumbnail) const{ return bThumbnail ? GetMaxThumbnailLimitHeight() : GetMaxImageLimitHeight(); }
int GetMaxShrinkLevel(bool bThumbnail) const{ return bThumbnail ? GetMaxThumbnailShrinkLevel() : GetMaxImageShrinkLevel(); }
bool GetEnableAutoShrinkFlag(bool bThumbnail) const{ return bThumbnail ? GetEnableAutoThumbnailShrinkFlag() : GetEnableAutoImageShrinkFlag(); }
private:
// コーデック
nn::jpeg::CTR::JpegMpDecoderS m_NnDecoder;
void* m_pDecoderBuf;
// 変換前のデータ
const void* m_pJpegData;
std::size_t m_pJpegSize;
// 変換情報
int m_nMinImageLimitWidth;
int m_nMinImageLimitHeight;
int m_nMaxImageLimitWidth;
int m_nMaxImageLimitHeight;
int m_nMinThumbnailLimitWidth;
int m_nMinThumbnailLimitHeight;
int m_nMaxThumbnailLimitWidth;
int m_nMaxThumbnailLimitHeight;
int m_nOutputBufferWidth;
int m_nMaxImageShrinkLevel;
int m_nMaxThumbnailShrinkLevel;
bool m_bEnableAutoImageShrinkFlag;
bool m_bEnableAutoThumbnailShrinkFlag;
// 変換後のデータ
bool m_bFreeRawData;
u8* m_pRawData;
std::size_t m_nRawDataSize; // m_pRawDataのバッファサイズ
std::size_t m_nRawSize; // m_pRawDataに格納した生データサイズ
nn::jpeg::CTR::PixelFormat m_eRawFormat;
int m_nShrinkedLevel;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief MPデコードクラス
@note
MPデータを生データに変換します
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class MpDecoder : public JpegMpBaseDecoder, private nn::util::NonCopyable<MpDecoder>
{
public:
// デフォルトの最小画像制限サイズ
static const int c_nDefaultMinImageLimitWidth = Const::c_nMinStandardPictureWidth;
static const int c_nDefaultMinImageLimitHeight = Const::c_nMinStandardPictureHeight;
// デフォルトの最大画像制限サイズ
static const int c_nDefaultMaxImageLimitWidth = Const::c_nMaxStandardPictureWidth;
static const int c_nDefaultMaxImageLimitHeight = Const::c_nMaxStandardPictureHeight;
// デフォルトの最大自動画像縮小レベル
static const int c_nDefaultMaxImageShrinkLevel = 2;
// デフォルトの自動画像縮小機能の有効フラグ
static const bool c_bDefaultEnableAutoImageShrinkFlag = true;
// デフォルトの最小サムネイル画像制限サイズ
static const int c_nDefaultMinThumbnailLimitWidth = Const::c_nMinStandardThumbnailWidth;
static const int c_nDefaultMinThumbnailLimitHeight = Const::c_nMinStandardThumbnailHeight;
// デフォルトの最大サムネイル画像制限サイズ
static const int c_nDefaultMaxThumbnailLimitWidth = Const::c_nMaxStandardThumbnailWidth;
static const int c_nDefaultMaxThumbnailLimitHeight = Const::c_nMaxStandardThumbnailHeight;
// デフォルトの最大自動サムネイル画像縮小レベル
static const int c_nDefaultMaxThumbnailShrinkLevel = 2;
// デフォルトの自動サムネイル画像縮小機能の有効フラグ
static const bool c_bDefaultEnableAutoThumbnailShrinkFlag = true;
public:
/*!----------------------------------------------------------------------
@brief
@param[in] pMpData MPデータ
@param[in] nMpSize MPデータのサイズ
@param[out] pRawDataL
@param[out] pRawDataR
@param[in] nRawDataSize
@details
pRawDataLpRawDataRの指定を省略した場合は
nRawDataSizeはpRawDataLかpRawDataRの少ない方のサイズを指定してください
pRawDataLまたはpRawDataRにヌルを指定することで
pRawDataLのデータは必須ですpRawDataRの
pRawDataLの画像がpRawDataRにコピーされます
-----------------------------------------------------------------------*/
//@{
MpDecoder(
const void* pMpData, std::size_t nMpSize);
MpDecoder(
const void* pMpData, std::size_t nMpSize,
void* pRawDataL, void* pRawDataR, std::size_t nRawDataSize);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~MpDecoder();
/*!----------------------------------------------------------------------
@brief
@param[in] eRawFormat
@param[in] bThumbnail
@note
-----------------------------------------------------------------------*/
//@{
bool Decode(nn::jpeg::CTR::PixelFormat eRawFormat);
bool Decode(nn::jpeg::CTR::PixelFormat eRawFormat, bool bThumbnail);
//@}
/*!----------------------------------------------------------------------
@brief
@note
使
-----------------------------------------------------------------------*/
void StopDecoder();
/*!----------------------------------------------------------------------
@brief Exifだけを展開する
@param[in] bThumbnail t展開フラグ
@details
GetWidth()GetRealWidth()GetShrinkLevel()
SetMinLimitWidth()SetMaxShrinkLevel()
ExtractExif()
-----------------------------------------------------------------------*/
//@{
bool ExtractExif();
bool ExtractExif(bool bThumbnail);
//@}
/*!----------------------------------------------------------------------
@brief
@details
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMinImageLimitWidth() const{ return m_nMinImageLimitWidth; }
void SetMinImageLimitWidth(int nWidth){ m_nMinImageLimitWidth = nWidth; }
int GetMinImageLimitHeight() const{ return m_nMinImageLimitHeight; }
void SetMinImageLimitHeight(int nHeight){ m_nMinImageLimitHeight = nHeight; }
int GetMaxImageLimitWidth() const{ return m_nMaxImageLimitWidth; }
void SetMaxImageLimitWidth(int nWidth){ m_nMaxImageLimitWidth = nWidth; }
int GetMaxImageLimitHeight() const{ return m_nMaxImageLimitHeight; }
void SetMaxImageLimitHeight(int nHeight){ m_nMaxImageLimitHeight = nHeight; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
Min側のサイズは自動画像縮小を行わないオリジナルのサイズでの比較でMax側の
Maxより大きな画像になることはありませんがMinより小さい画像にな
Min < Maxとも限りません
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMinThumbnailLimitWidth() const{ return m_nMinThumbnailLimitWidth; }
void SetMinThumbnailLimitWidth(int nWidth){ m_nMinThumbnailLimitWidth = nWidth; }
int GetMinThumbnailLimitHeight() const{ return m_nMinThumbnailLimitHeight; }
void SetMinThumbnailLimitHeight(int nHeight){ m_nMinThumbnailLimitHeight = nHeight; }
int GetMaxThumbnailLimitWidth() const{ return m_nMaxThumbnailLimitWidth; }
void SetMaxThumbnailLimitWidth(int nWidth){ m_nMaxThumbnailLimitWidth = nWidth; }
int GetMaxThumbnailLimitHeight() const{ return m_nMaxThumbnailLimitHeight; }
void SetMaxThumbnailLimitHeight(int nHeight){ m_nMaxThumbnailLimitHeight = nHeight; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
64×64256×256
-----------------------------------------------------------------------*/
//@{
int GetOutputBufferWidth() const{ return m_nOutputBufferWidth; }
void SetOutputBufferWidth(int nWidth){ m_nOutputBufferWidth = nWidth; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
0=1=1/22=1/4
[0,4]
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMaxImageShrinkLevel() const{ return m_nMaxImageShrinkLevel; }
void SetMaxImageShrinkLevel(int nLevel){ NN_ASSERT(0 <= nLevel && nLevel <= 4); m_nMaxImageShrinkLevel = nLevel; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
0=1=1/22=1/4
[0,4]
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetMaxThumbnailShrinkLevel() const{ return m_nMaxThumbnailShrinkLevel; }
void SetMaxThumbnailShrinkLevel(int nLevel){ NN_ASSERT(0 <= nLevel && nLevel <= 4); m_nMaxThumbnailShrinkLevel = nLevel; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetMaxImageLimitWidth()GetMaxImageLimitHeight()
1/21/41/8
1/(1<<GetMaxImageShrinkLevel())
GetWidth()GetHeight()
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
bool GetEnableAutoImageShrinkFlag() const{ return m_bEnableAutoImageShrinkFlag; }
void SetEnableAutoImageShrinkFlag(bool bEnable){ m_bEnableAutoImageShrinkFlag = bEnable; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
GetMaxThumbnailLimitWidth()GetMaxThumbnailLimitHeight()
1/21/41/8
1/(1<<GetMaxThumbnailShrinkLevel())
GetWidth()GetHeight()
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
bool GetEnableAutoThumbnailShrinkFlag() const{ return m_bEnableAutoThumbnailShrinkFlag; }
void SetEnableAutoThumbnailShrinkFlag(bool bEnable){ m_bEnableAutoThumbnailShrinkFlag = bEnable; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const void* GetRawDataL() const { return m_pRawDataL; }
void* GetRawDataL(){
return const_cast<void*>(static_cast<const MpDecoder&>(*this).GetRawDataL()); }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const void* GetRawDataR() const { return m_pRawDataR; }
void* GetRawDataR(){
return const_cast<void*>(static_cast<const MpDecoder&>(*this).GetRawDataR()); }
//@}
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetRawSize() const { return m_nRawSize; }
/*!----------------------------------------------------------------------
@brief
@return
@details
GetRealWidth(), GetRealHeight()GetShrinkLevel()
0
-----------------------------------------------------------------------*/
//@{
int GetWidth() const;
int GetHeight() const;
//@}
/*!----------------------------------------------------------------------
@brief
@return
@details
0
-----------------------------------------------------------------------*/
//@{
int GetRealWidth() const;
int GetRealHeight() const;
//@}
/*!----------------------------------------------------------------------
@brief
@return [0,4]
-----------------------------------------------------------------------*/
int GetShrinkLevel() const{ return m_nShrinkedLevel; }
/*!----------------------------------------------------------------------
@brief MPからJPEGを取り出す
@param[out] pJpegData JPEGを格納するバッファ
@param[in] nJpegDataSize pJpegDataのバッファサイズ
@param[out] rJpegSize pJpegDataに格納したJPEGのサイズ
@return falseを返す
@note
JPEGを格納するバッファが足りない場合はfalseを返します
JPEGのExifはMPのExifに可能な限り揃えています
-----------------------------------------------------------------------*/
//@{
bool ExtractJpegL(void* pJpegData, std::size_t nJpegDataSize, std::size_t& rJpegSize);
bool ExtractJpegR(void* pJpegData, std::size_t nJpegDataSize, std::size_t& rJpegSize);
//@}
/*!----------------------------------------------------------------------
@brief MPからJPEGを取り出すのに必要なバッファサイズを求める
@return
@note
ExtractJpeg()
-----------------------------------------------------------------------*/
std::size_t ComputeExtractJpegSize();
private:
static const int c_nMaxShrinkLevel = 2;
private:
int GetMinLimitWidth(bool bThumbnail) const{ return bThumbnail ? GetMinThumbnailLimitWidth() : GetMinImageLimitWidth(); }
int GetMinLimitHeight(bool bThumbnail) const{ return bThumbnail ? GetMinThumbnailLimitHeight() : GetMinImageLimitHeight(); }
int GetMaxLimitWidth(bool bThumbnail) const{ return bThumbnail ? GetMaxThumbnailLimitWidth() : GetMaxImageLimitWidth(); }
int GetMaxLimitHeight(bool bThumbnail) const{ return bThumbnail ? GetMaxThumbnailLimitHeight() : GetMaxImageLimitHeight(); }
int GetMaxShrinkLevel(bool bThumbnail) const{ return bThumbnail ? GetMaxThumbnailShrinkLevel() : GetMaxImageShrinkLevel(); }
bool GetEnableAutoShrinkFlag(bool bThumbnail) const{ return bThumbnail ? GetEnableAutoThumbnailShrinkFlag() : GetEnableAutoImageShrinkFlag(); }
bool ExtractJpeg(
int nIndex, void* pJpegData, std::size_t nJpegDataSize, std::size_t& rJpegSize);
static std::size_t StartMpDecoderLR(
nn::jpeg::CTR::JpegMpDecoderS& rNnDec,
void* pDstL, void* pDstR, std::size_t nDstSize,
const void* pSrc, std::size_t nSrcSize,
int nMaxWidth, int nMaxHeight, int nOutputBufferWidth,
nn::jpeg::CTR::PixelFormat eDstPixelFormat, int nShrinkLevel);
static bool GetMpEntryIndexLR(
nn::jpeg::CTR::JpegMpDecoderS& rNnDec,
int& rIndexL, int& rIndexR,
const nn::jpeg::CTR::MpIndex& rMpIndex,
const void* pSrc, std::size_t nSrcSize);
static bool GetMpRegionsToBuildJpegData(
nn::jpeg::CTR::JpegMpDecoderS& rNnDec,
nn::jpeg::CTR::MpRegionsToBuildJpegData& rBuildJpegData,
const nn::jpeg::CTR::MpEntry& rMpEntry,
const void* pSrc, std::size_t nSrcSize);
static bool GetMpIndex(
nn::jpeg::CTR::JpegMpDecoderS& rNnDec, nn::jpeg::CTR::MpIndex& rMpIndex,
const void* pSrc, std::size_t nSrcSize);
static bool GetMpImageAddrByIndex(
nn::jpeg::CTR::JpegMpDecoderS& rNnDec,
const void*& rAddr, std::size_t& rSize,
const void* pSrc, std::size_t nSrcSize,
const nn::jpeg::CTR::MpIndex& rMpIndex, int nIndex);
private:
// コーデック
nn::jpeg::CTR::JpegMpDecoderS m_NnDecoder;
void* m_pDecoderBuf;
// 変換前のデータ
const void* m_pMpData;
std::size_t m_nMpSize;
// 変換情報
int m_nMinImageLimitWidth;
int m_nMinImageLimitHeight;
int m_nMaxImageLimitWidth;
int m_nMaxImageLimitHeight;
int m_nMinThumbnailLimitWidth;
int m_nMinThumbnailLimitHeight;
int m_nMaxThumbnailLimitWidth;
int m_nMaxThumbnailLimitHeight;
int m_nOutputBufferWidth;
int m_nMaxImageShrinkLevel;
int m_nMaxThumbnailShrinkLevel;
bool m_bEnableAutoImageShrinkFlag;
bool m_bEnableAutoThumbnailShrinkFlag;
// 変換後のデータ
bool m_bFreeRawData;
u8* m_pRawDataL;
u8* m_pRawDataR;
std::size_t m_nRawDataSize; // m_pRawDataのバッファサイズ
std::size_t m_nRawSize; // m_pRawDataに格納した生データサイズ
nn::jpeg::CTR::PixelFormat m_eRawFormat;
int m_nShrinkedLevel;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // JPEG_MP_DECODER_H_

View File

@ -0,0 +1,515 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: JpegMpEncoder.h
JPEG/MPエンコーダ
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_ENCODER_H_
#define JPEG_MP_ENCODER_H_
#include <nn/types.h>
#include <nn/util.h>
#include <nn/fnd.h>
#include <nn/jpeg.h>
#include "SysMakerNote.h"
#include "ImageDbTypes.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief JPEG/MPベースエンコードクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class JpegMpBaseEncoder
{
public:
// デフォルトのJPEGフォーマット
static const nn::jpeg::CTR::PixelSampling c_eDefaultFormat = nn::jpeg::CTR::PIXEL_SAMPLING_YUV422;
// デフォルトの品質
static const int c_nDefaultQuality = 80;
// デフォルトのサムネイル付加フラグ
static const int c_bDefaultAddThumbnailFlag = true;
// デフォルトのサムネイルのJPEGフォーマット
static const nn::jpeg::CTR::PixelSampling c_eDefaultThumbnailFormat = nn::jpeg::CTR::DEFAULT_THUMBNAIL_PIXEL_SAMPLING;
// デフォルトのサムネイルの幅
static const int c_nDefaultThumbnailWidth = nn::jpeg::CTR::DEFAULT_THUMBNAIL_WIDTH;
// デフォルトのサムネイルの高さ
static const int c_nDefaultThumbnailHeight = nn::jpeg::CTR::DEFAULT_THUMBNAIL_HEIGHT;
// デフォルトのサムネイルサイズ自動調整の有効フラグ
static const bool c_bDefaultAutoThumbnailSizeFlag = true;
// タイトルユーニークIDの文字数
static const int c_nTitleUniqueIdStringLength = 5;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
JpegMpBaseEncoder();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegMpBaseEncoder() = 0;
/*-----------------------------------------------------------------------
JPEG設定関連
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief JPEGのフォーマットを取得
-----------------------------------------------------------------------*/
//@{
nn::jpeg::CTR::PixelSampling GetJpegFormat() const { return m_eJpegFormat; }
void SetJpegFormat(nn::jpeg::CTR::PixelSampling eFormat){ m_eJpegFormat = eFormat; }
//@}
/*!----------------------------------------------------------------------
@brief JPEGの品質を取得
@details
1100
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetQuality() const { return m_nQuality; }
void SetQuality(int nQuality){ m_nQuality = nQuality; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
bool GetAddThumbnailFlag() const { return m_bAddThumbnailFlag; }
void SetAddThumbnailFlag(bool bAdd){ m_bAddThumbnailFlag = bAdd; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
nn::jpeg::CTR::PixelSampling GetThumbnailFormat() const { return m_eThumbnailFormat; }
void SetThumbnailFormat(nn::jpeg::CTR::PixelSampling eFormat){ m_eThumbnailFormat = eFormat; }
//@}
/*!----------------------------------------------------------------------
@brief
@details
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
int GetThumbnailWidth() const { return m_nThumbnailWidth; }
void SetThumbnailWidth(int nWidth){ m_nThumbnailWidth = nWidth; }
int GetThumbnailHeight() const { return m_nThumbnailHeight; }
void SetThumbnailHeight(int nHeight){ m_nThumbnailHeight = nHeight; }
//@}
/*!----------------------------------------------------------------------
@brief 調
@details
SetThumbnailWidth()SetThumbnailHeight()
c_nDefaultThumbnailWidth, c_nDefaultThumbnailHeight
ImageDb推奨値です
-----------------------------------------------------------------------*/
//@{
bool GetEnableAutoThumbnailSizeFlag() const { return m_bAutoThumbnailSizeFlag; }
void SetEnableAutoThumbnailSizeFlag(bool bEnable){ m_bAutoThumbnailSizeFlag = bEnable; }
//@}
/*!----------------------------------------------------------------------
@brief JPEGのフォーマットで要求される画像サイズの単位を取得する
-----------------------------------------------------------------------*/
//@{
int GetWidthUnit() const { return GetWidthUnit(GetJpegFormat()); }
int GetHeightUnit() const { return GetHeightUnit(GetJpegFormat()); }
static int GetWidthUnit(nn::jpeg::CTR::PixelSampling eFormat);
static int GetHeightUnit(nn::jpeg::CTR::PixelSampling eFormat);
//@}
/*-----------------------------------------------------------------------
EXIF関連
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
//@{
nn::fnd::DateTime GetDateTime() const{ return m_DateTime; }
void SetDateTime(const nn::fnd::DateTime& rDateTime){ m_DateTime = rDateTime; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const void* GetUserMakerNoteData() const;
std::size_t GetUserMakerNoteDataSize() const;
void SetUserMakerNoteData(const void* pData, std::size_t nSize);
//@}
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
//@{
const char* GetSoftware() const;
void SetSoftware(const char* pSoftware);
//@}
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@return true
@details
-----------------------------------------------------------------------*/
//@{
const SysMakerNote& GetSysMakerNote() const;
bool SetSysMakerNote(const void* pNote);
bool SetSysMakerNote(const SysMakerNote& rNote);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
u32 GetSysMakerNoteCode() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetSysMakerNoteCreateSecond() const;
void SetSysMakerNoteCreateSecond(const DateTimeSeconds& rDTSecs);
//@}
/*!----------------------------------------------------------------------
@brief IDをチェック
-----------------------------------------------------------------------*/
//@{
bool IsValidSysMakerNoteTitleUniqueId() const;
u32 GetSysMakerNoteTitleUniqueId() const;
void SetSysMakerNoteTitleUniqueId(u32 nUId);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
SaveProcessType GetSysMakerNoteSaveProcessType() const;
void SetSysMakerNoteSaveProcessType(SaveProcessType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
HandleTypeBit GetSysMakerNoteHandleFlag() const;
void SetSysMakerNoteHandleFlag(HandleTypeBit eFlag);
//@}
/*!----------------------------------------------------------------------
@brief IDの有効チェック
@param[in] eType IDのタイプ
-----------------------------------------------------------------------*/
//@{
bool IsValidSysMakerNoteBodyId(BodyIdType eType) const;
u32 GetSysMakerNoteBodyId(BodyIdType eType) const;
void SetSysMakerNoteBodyId(BodyIdType eType, u32 nId);
void ResetSysMakerNoteBodyId(BodyIdType eType);
//@}
/*!----------------------------------------------------------------------
@brief IDをローカルユニークIDで設定する
@param[in] eType IDのタイプ
@param[in] nLUId ID
-----------------------------------------------------------------------*/
//void SetSysMakerNoteIdByLocalUniqId(BodyIdType eType, u32 nLUId);
/*!----------------------------------------------------------------------
@brief MPファイル水平オフセット値を取得
-----------------------------------------------------------------------*/
//@{
f32 GetSysMakerNoteMpOffsetH() const;
void SetSysMakerNoteMpOffsetH(f32 fOfstH);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
s32 GetSysMakerNoteLegacyFavoriteOrder() const;
void SetSysMakerNoteLegacyFavoriteOrder(s32 nOrder);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyFavoriteType GetSysMakerNoteLegacyFavoriteType() const;
void SetSysMakerNoteLegacyFavoriteType(LegacyFavoriteType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyImageType GetSysMakerNoteLegacyImageType() const;
void SetSysMakerNoteLegacyImageType(LegacyImageType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyKeyType GetSysMakerNoteLegacyKeyType() const;
void SetSysMakerNoteLegacyKeyType(LegacyKeyType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
bool IsSysMakerNoteLegacyDefaultFrame() const;
void SetSysMakerNoteLegacyDefaultFrame(bool bDefault);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
ShootingType GetSysMakerNoteShootingType() const;
void SetSysMakerNoteShootingType(ShootingType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
DistinctionTypeBit GetSysMakerNoteDistinctionTypeBit() const;
void SetSysMakerNoteDistinctionTypeBit(DistinctionTypeBit eBit);
//@}
/*!----------------------------------------------------------------------
@brief IDを文字列に変換する
@param[out] pStr
@param[in] nSize
@param[in] nId ID
@details
c_nTitleUniqueIdStringLength+1
-----------------------------------------------------------------------*/
static void ConvTitleUniqueIdToString(char* pStr, int nSize, u32 nId);
/*!----------------------------------------------------------------------
@brief IDに変換する
@param[out] rId ID
@param[in] pStr
@return true
-----------------------------------------------------------------------*/
static bool ConvStringToTitleUniqueId(u32& rId, const char* pStr);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
static int GetPixelSamplingPixelPerBit(nn::jpeg::CTR::PixelSampling eJpegFormat);
protected:
const void* GetSystemMakerNoteData() const;
std::size_t GetSystemMakerNoteDataSize() const;
static int GetImageWidthAlign(nn::jpeg::CTR::PixelSampling eJpegFormat);
static int GetImageHeightAlign(nn::jpeg::CTR::PixelSampling eJpegFormat);
static void ComputeAutoThumbnailSize(
int& rThumbWidth, int& rThumbHeight,
int nImageWidth, int nImageHeight, nn::jpeg::CTR::PixelSampling eJpegFormat);
private:
// 変換情報
nn::jpeg::CTR::PixelSampling m_eJpegFormat;
int m_nQuality;
bool m_bAddThumbnailFlag;
nn::jpeg::CTR::PixelSampling m_eThumbnailFormat;
int m_nThumbnailWidth;
int m_nThumbnailHeight;
bool m_bAutoThumbnailSizeFlag;
nn::fnd::DateTime m_DateTime;
const void* m_pUserMakerNoteData;
std::size_t m_nUserMakerNoteDataSize;
const char* m_pSoftware;
SysMakerNote m_SysMakerNote;
bool m_bValidSysMakerNoteTitleUniqueId;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief JPEGエンコードクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class JpegEncoder : public JpegMpBaseEncoder, private nn::util::NonCopyable<JpegEncoder>
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] pRawData
@param[in] RawFormat
@param[in] nWidth
@param[in] nHeight
-----------------------------------------------------------------------*/
JpegEncoder(
const void* pRawData, nn::jpeg::CTR::PixelFormat eRawFormat,
int nWidth, int nHeight);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegEncoder();
/*!----------------------------------------------------------------------
@brief
@param[in] bTwlCompatible TWL互換フラグ
@details
bTwlCompatibleをtrueにするとTWLで扱えるJPEGとしてエンコードします
-----------------------------------------------------------------------*/
bool Encode(bool bTwlCompatible=false);
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief JPEGデータを取得する
-----------------------------------------------------------------------*/
//@{
const void* GetJpegData() const { return m_pJpegData; }
void* GetJpegData(){
return const_cast<void*>(static_cast<const JpegEncoder&>(*this).GetJpegData()); }
//@}
/*!----------------------------------------------------------------------
@brief JPEGデータのサイズを取得する
@return
-----------------------------------------------------------------------*/
std::size_t GetJpegSize() const { return m_nJpegSize; }
private:
static std::size_t ComputeJpegDataSize(
nn::jpeg::CTR::PixelSampling eJpegFormat,
int nWidth, int nHeight,
int nQuality, bool bTwlCompatible=false);
static int ComputeDownQuality(int nCurQuality);
private:
// 変換前のデータ
const void* m_pRawData;
nn::jpeg::CTR::PixelFormat m_eRawFormat;
int m_nWidth;
int m_nHeight;
// 変換後のデータ
u8* m_pJpegData;
std::size_t m_nJpegDataSize; // m_pJpegDataのバッファサイズ
std::size_t m_nJpegSize; // m_pJpegDataに格納したJPEGデータサイズ
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief MPエンコードクラス
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class MpEncoder : public JpegMpBaseEncoder, private nn::util::NonCopyable<MpEncoder>
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] pRawDataL
@param[in] pRawDataR
@param[in] RawFormat
@param[in] nWidth
@param[in] nHeight
-----------------------------------------------------------------------*/
MpEncoder(
const void* pRawDataL, const void* pRawDataR, nn::jpeg::CTR::PixelFormat eRawFormat,
int nWidth, int nHeight);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~MpEncoder();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool Encode();
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief MPデータを取得する
-----------------------------------------------------------------------*/
//@{
const void* GetMpData() const { return m_pMpData; }
void* GetMpData(){
return const_cast<void*>(static_cast<const MpEncoder&>(*this).GetMpData()); }
//@}
/*!----------------------------------------------------------------------
@brief MPデータのサイズを取得する
@return
-----------------------------------------------------------------------*/
std::size_t GetMpSize() const { return m_nMpSize; }
private:
static std::size_t ComputeMpDataSize(
nn::jpeg::CTR::PixelSampling eJpegFormat, int nWidth, int nHeight, int nQuality);
static int ComputeDownQuality(int nCurQuality, int nMpPass);
private:
// 変換前のデータ
const void* m_pRawDataL;
const void* m_pRawDataR;
nn::jpeg::CTR::PixelFormat m_eRawFormat;
int m_nWidth;
int m_nHeight;
// 変換後のデータ
u8* m_pMpData;
std::size_t m_nMpDataSize; // m_pMpDataのバッファサイズ
std::size_t m_nMpSize; // m_pMpDataに格納したMPデータサイズ
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // JPEG_MP_ENCODER_H_

View File

@ -0,0 +1,206 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: SysMakerNote.h
---------------------------------------------------------------------------*/
#ifndef SYS_MAKER_NOTE_H_
#define SYS_MAKER_NOTE_H_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbTypes.h"
#include "ImageDbDateTimeSeconds.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct SysMakerNote
{
u32 nCode; // フォーマット確認用コード
s32 nSaveProcess; // 保存過程の種類
DateTimeSeconds sCreateSeconds; // ファイル作成日時
u32 nTitleUniqueId; // タイトルユニークIDソフトウェアID
u16 nHandleFlags; // 取り扱いフラグ HandleTypeBit列挙型の論理和
u16 nValidBodyIdFlag; // 有効な本体IDのフラグ BodyIdTypeBit列挙型の論理和
u32 nBodyId[BodyIdTypeNum]; // 本体ID
f32 fMpOffsetH; // MPファイルの水平オフセット
s32 nFavoriteOrder; // DSi互換用レガシー
u32 nCharacterFlag; // 2 : LegacyFavoriteType列挙型レガシー
// 2 : LegacyImageType列挙型レガシー
// 2 : LegacyKeyType列挙型レガシー
// 1 : bool デフォルトフレーム(レガシー)
// 5 : ShootingType列挙型 撮影モード
// 16 : DistinctionTypeBit列挙型 写真特徴タイプ
// 4 : Reserved
u32 reserved[3];
//! フォーマット確認用コード
static const u32 c_nValidCode = 0x31534433; // '3DS1'
static const int c_nChaFlagLegacyFavoriteTypeBits = 2;
static const int c_nChaFlagLegacyFavoriteTypeShift = 0;
static const u32 c_nChaFlagLegacyFavoriteTypeMask = ((1UL<<c_nChaFlagLegacyFavoriteTypeBits)-1)<<c_nChaFlagLegacyFavoriteTypeShift;
static const int c_nChaFlagLegacyImageTypeBits = 2;
static const int c_nChaFlagLegacyImageTypeShift = c_nChaFlagLegacyFavoriteTypeBits + c_nChaFlagLegacyFavoriteTypeShift;
static const u32 c_nChaFlagLegacyImageTypeMask = ((1UL<<c_nChaFlagLegacyImageTypeBits)-1)<<c_nChaFlagLegacyImageTypeShift;
static const int c_nChaFlagLegacyKeyTypeBits = 2;
static const int c_nChaFlagLegacyKeyTypeShift = c_nChaFlagLegacyImageTypeBits + c_nChaFlagLegacyImageTypeShift;
static const u32 c_nChaFlagLegacyKeyTypeMask = ((1UL<<c_nChaFlagLegacyKeyTypeBits)-1)<<c_nChaFlagLegacyKeyTypeShift;
static const int c_nChaFlagLegacyDefaultFrameBits = 1;
static const int c_nChaFlagLegacyDefaultFrameShift = c_nChaFlagLegacyKeyTypeBits + c_nChaFlagLegacyKeyTypeShift;
static const u32 c_nChaFlagLegacyDefaultFrameMask = ((1UL<<c_nChaFlagLegacyDefaultFrameBits)-1)<<c_nChaFlagLegacyDefaultFrameShift;
static const int c_nChaFlagShootingTypeBits = 5;
static const int c_nChaFlagShootingTypeShift = c_nChaFlagLegacyDefaultFrameBits + c_nChaFlagLegacyDefaultFrameShift;
static const u32 c_nChaFlagShootingTypeMask = ((1UL<<c_nChaFlagShootingTypeBits)-1)<<c_nChaFlagShootingTypeShift;
static const int c_nChaFlagDistinctionTypeBitBits = 16;
static const int c_nChaFlagDistinctionTypeBitShift = c_nChaFlagShootingTypeBits + c_nChaFlagShootingTypeShift;
static const u32 c_nChaFlagDistinctionTypeBitMask = ((1UL<<c_nChaFlagDistinctionTypeBitBits)-1)<<c_nChaFlagDistinctionTypeBitShift;
/*!----------------------------------------------------------------------
@brief
@param[in] eImgKind
@details
eImgKindを省略すると写真として初期化されます
-----------------------------------------------------------------------*/
//@{
void Initialize();
void Initialize(ImageKind eImgKind);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
u32 GetCode() const{ return nCode; }
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
SaveProcessType GetSaveProcessType() const{ return static_cast<SaveProcessType>(nSaveProcess); }
void SetSaveProcessType(SaveProcessType eType){ nSaveProcess = eType; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const DateTimeSeconds& GetCreateSeconds() const{ return sCreateSeconds; }
void SetCreateSeconds(const DateTimeSeconds& rDTSecs){ sCreateSeconds = rDTSecs; }
//@}
/*!----------------------------------------------------------------------
@brief IDを取得
-----------------------------------------------------------------------*/
//@{
u32 GetTitleUniqueId() const{ return nTitleUniqueId; }
void SetTitleUniqueId(u32 nUId){ nTitleUniqueId = nUId; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
HandleTypeBit GetHandleTypeBit() const{ return static_cast<HandleTypeBit>(nHandleFlags); }
void SetHandleTypeBit(HandleTypeBit eBit){ nHandleFlags = eBit; }
//@}
/*!----------------------------------------------------------------------
@brief IDの有効チェック
@param[in] eType IDのタイプ
-----------------------------------------------------------------------*/
//@{
BodyIdTypeBit GetValidBodyIdBit() const{ return static_cast<BodyIdTypeBit>(nValidBodyIdFlag); }
bool IsValidBodyId(BodyIdType eType) const{ return (nValidBodyIdFlag & (1<<eType)); }
u32 GetBodyId(BodyIdType eType) const{ return nBodyId[eType]; }
void SetBodyId(BodyIdType eType, u32 nBodyId){ this->nBodyId[eType] = nBodyId; nValidBodyIdFlag |= 1<<eType; }
void ResetBodyId(BodyIdType eType){ nBodyId[eType] = 0; nValidBodyIdFlag &= ~(1<<eType); }
//@}
/*!----------------------------------------------------------------------
@brief MPファイルの水平オフセットを取得
-----------------------------------------------------------------------*/
//@{
f32 GetMpOffsetH() const{ return fMpOffsetH; }
void SetMpOffsetH(f32 fH){ fMpOffsetH = fH; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
s32 GetFavoriteOrder() const{ return nFavoriteOrder; }
void SetFavoriteOrder(s32 nOrder){ nFavoriteOrder = nOrder; }
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyFavoriteType GetLegacyFavoriteType() const;
void SetLegacyFavoriteType(LegacyFavoriteType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyImageType GetLegacyImageType() const;
void SetLegacyImageType(LegacyImageType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
LegacyKeyType GetLegacyKeyType() const;
void SetLegacyKeyType(LegacyKeyType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
bool IsLegacyDefaultFrame() const;
void SetLegacyDefaultFrame(bool bDefault);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
ShootingType GetShootingType() const;
void SetShootingType(ShootingType eType);
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
DistinctionTypeBit GetDistinctionTypeBit() const;
void SetDistinctionTypeBit(DistinctionTypeBit eBit);
//@}
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // SYS_MAKER_NOTE_H_

View File

@ -0,0 +1,222 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: SysMakerNoteRewriter.h
---------------------------------------------------------------------------*/
#ifndef SYS_MAKER_NOTE_REWRITER_H_
#define SYS_MAKER_NOTE_REWRITER_H_
#include "ImageDbRecord.h"
#if defined(IMGDB_ENABLE_MOVIE)
#include "ImageDbNmjPlayerConfig.h"
#include "../../Movie/nmjPlayer.h"
#endif // IMAGE_DB_IMAGE_UTILITY_H_
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class SysMakerNoteRewriterBase
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
SysMakerNoteRewriterBase();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~SysMakerNoteRewriterBase() = 0;
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
virtual bool Rewrite() = 0;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
bool IsStoredCreateSeconds() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
const DateTimeSeconds& GeCreateSeconds() const;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void SetCreateSeconds(const DateTimeSeconds& rDTSecs);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void ResetCreateSeconds();
/*!----------------------------------------------------------------------
@brief MPファイルの水平オフセットが設定されているかチェックする
-----------------------------------------------------------------------*/
bool IsStoredMpOffsetH() const;
/*!----------------------------------------------------------------------
@brief MPファイルの水平オフセットを取得する
-----------------------------------------------------------------------*/
f32 GetMpOffsetH() const;
/*!----------------------------------------------------------------------
@brief MPファイルの水平オフセットを設定する
-----------------------------------------------------------------------*/
void SetMpOffsetH(f32 fOfst);
/*!----------------------------------------------------------------------
@brief MPファイルの水平オフセットをリセットする
-----------------------------------------------------------------------*/
void ResetMpOffsetH();
protected:
void ResetStoredFlagAll();
bool IsNeedRewriteJpeg() const;
bool IsNeedRewriteMp() const;
bool IsNeedRewriteMJpeg() const;
protected:
// ファイル作成時間
bool m_bStoredCreateSeconds;
DateTimeSeconds m_sCreateSeconds;
// MPファイルの水平オフセット
bool m_bStoredMpOffsetH;
f32 m_fMpOffsetH;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
NANDのJPEGであればTWL側もMPであれば対となるJPEGも書き換えます
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class SysMakerNoteDbRecordRewriter : public SysMakerNoteRewriterBase
, private nn::util::NonCopyable<SysMakerNoteDbRecordRewriter>
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] rFileInfo
@param[in] rLink
@details
rLinkを渡すコンストラクタを使用してください
使rFileInfoを指定する方が処理が若干
rFileInfoを省略した場合はRewrite()
rFileInfoは内部でコピーされるため設定後は破棄しても構いません
-----------------------------------------------------------------------*/
//@{
explicit SysMakerNoteDbRecordRewriter(const ImageDbRecordLink& rLink);
#if defined(IMGDB_ENABLE_MOVIE)
SysMakerNoteDbRecordRewriter(const nmj::player::FileInfo& rFileInfo, const ImageDbRecordLink& rLink);
#endif // defined(IMGDB_ENABLE_MOVIE)
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~SysMakerNoteDbRecordRewriter();
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
virtual bool Rewrite();
private:
bool RewriteJpeg(const ImageInfo& rImgInfo, bool bTwlCompatible);
bool RewriteMp(const ImageInfo& rImgInfo);
#if defined(IMGDB_ENABLE_MOVIE)
bool RewriteMJpeg(
const nmj::player::FileInfo& rFileInfo, const ImageInfo& rImgInfo);
#endif // defined(IMGDB_ENABLE_MOVIE)
bool RewriteData(
StorageType eStoType, nn::fs::FileOutputStream& rStream,
int nOfst, const void* pData, std::size_t nDataSize) const;
private:
const ImageDbRecordLink m_Link;
#if defined(IMGDB_ENABLE_MOVIE)
nmj::player::FileInfo m_FInfoWork;
nmj::player::FileInfo* m_pFInfo;
// このメンバ変数はstaticを付けなくても、内部ではstaticな値を持って
// いるため排他で扱う必要があります。
static util::NmjPlayerConfig<Const::NmjPlayerConfigIdSysNoteRw> m_Config;
#endif // defined(IMGDB_ENABLE_MOVIE)
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief
@details
JPEG/MPデータを直接書き換えるクラスです
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_suppress 1301 // パディング警告の抑制
#pragma diag_suppress 2530 // パディング情報の抑制
class SysMakerNoteDataRewriter : public SysMakerNoteRewriterBase
, private nn::util::NonCopyable<SysMakerNoteDbRecordRewriter>
{
public:
/*!----------------------------------------------------------------------
@brief
@param[in] eImgKind
@param[io] pJpegMpData
@param[in] nJpegMpDataSize
-----------------------------------------------------------------------*/
SysMakerNoteDataRewriter(ImageKind eImgKind, void* pJpegMpData, std::size_t nJpegMpDataSize);
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~SysMakerNoteDataRewriter();
/*!----------------------------------------------------------------------
@brief
@details
-----------------------------------------------------------------------*/
virtual bool Rewrite();
private:
bool RewriteJpeg(void* pJpegData, std::size_t nJpegDataSize);
bool RewriteMp(void* pMpData, std::size_t nMpDataSize);
private:
ImageKind m_eImgKind;
void* m_pJpegMpData;
std::size_t m_nJpegMpDataSize;
};
#pragma diag_default 2530 // TODO #pragma push/popが修正され次第削除
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // SYS_MAKER_NOTE_REWRITER_H_

View File

@ -0,0 +1,88 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: UserMakerNote.h
PNOTEの写真に格納されるユーザーメーカーート
---------------------------------------------------------------------------*/
#ifndef USER_MAKER_NOTE_
#define USER_MAKER_NOTE_
#include <nn/types.h>
#include <nn/util.h>
#include "ImageDbFaceInfo.h"
#include "ImageDbConst.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct UserMakerNoteHeader
{
u16 nVersion; // バージョン番号
u16 nReserved0[3]; // 予約
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
u16 GetVersion() const{ return nVersion; }
void SetVersion(u16 nVer){ nVersion = nVer; }
//@}
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
/*!--------------------------------------------------------------------------*
@brief POD
*---------------------------------------------------------------------------*/
#pragma push
#pragma diag_error 1301 // パディングをエラーにする
struct UserMakerNote
{
UserMakerNoteHeader sHeader;
// 顔情報
FaceInfo sFaceInfo[Const::c_nMaxFaceInfoNum];
static const u16 c_nVersion = 0x0001;
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const UserMakerNoteHeader& GetHeader() const;
UserMakerNoteHeader& GetHeader();
//@}
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
//@{
const FaceInfo& GetFaceInfo(int nIndex) const;
FaceInfo& GetFaceInfo(int nIndex);
//@}
};
#pragma diag_default 1301 // TODO #pragma push/popが修正され次第削除
#pragma pop
} // end of namespace imgdb
#endif // USER_MAKER_NOTE_

View File

@ -0,0 +1,60 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageDb.h
ImageDatabaseƒ<EFBFBD>ƒƒwƒbƒ_ƒtƒ@ƒ
---------------------------------------------------------------------------*/
#ifndef IMAGE_DB_H_
#define IMAGE_DB_H_
#include "Core/ImageDbDebug.h"
#include "Core/ImageDbAllocator.h"
#include "Core/ImageDbDynamicArray.h"
#include "Core/ImageDbArchiveMounter.h"
#include "Core/ImageDbNmjPlayerConfig.h"
#include "Core/ImageDbNmjRecordingConfig.h"
#include "Core/ImageDbFaceInfo.h"
#include "Core/ImageDbCrc.h"
#include "Core/ImageDbDateTimeSeconds.h"
#include "Core/ImageDbTypes.h"
#include "Core/ImageDbResult.h"
#include "Core/ImageDbConst.h"
#include "Core/ImageDbImageInfo.h"
#include "Core/ImageDbValidityStateTable.h"
#include "Core/ImageDbRecord.h"
#include "Core/ImageDbLegacyTable.h"
#include "Core/ImageDbPictureTable.h"
#include "Core/ImageDbPictureDatabase.h"
#include "Core/ImageDatabase.h"
#include "Core/ImageDbInit.h"
#include "Core/ImageDbInitEx.h"
#include "Core/ImageDbDirectory.h"
#include "Core/ImageDbUtility.h"
#include "Core/ImageDbImageValidator.h"
#include "Core/ImageDbFileReader.h"
#include "Core/ImageDbFileWriter.h"
#include "Core/ImageDbRestore.h"
#include "Core/ImageDbSearchObject.h"
#include "Core/ImageDbFileDuplicator.h"
#include "Core/ImageDbRecordParam.h"
#include "Core/ImageDbImageSearcher.h"
#include "Core/ImageDbImageCollector.h"
#include "Core/JpegMpDecoder.h"
#include "Core/JpegMpEncoder.h"
#include "Core/SysMakerNote.h"
#include "Core/SysMakerNoteRewriter.h"
#include "Core/UserMakerNote.h"
#include "ImageIO/ImageIOTypes.h"
#include "ImageIO/ImageIOArchiveMount.h"
#include "ImageIO/JpegMpLoader.h"
#include "ImageIO/JpegMpSaver.h"
#include "ImageIO/JpegMpSaverEx.h"
#endif // IMAGE_DB_H_

View File

@ -0,0 +1,48 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageIO.h
ImageIO
---------------------------------------------------------------------------*/
#ifndef IMAGE_IO_H_
#define IMAGE_IO_H_
/*! @namespace imgdb
@brief ImageDb
@defgroup imgdb_root imgdb
@brief
*/
/*! @namespace imgdb::imgio
@brief ImageDb
*/
/*! @namespace imgdb::util
@brief ImageDb
*/
/*! @namespace imgdb::mnt
@brief ImageDb
*/
/*! @namespace imgdb::search
@brief ImageDb
*/
#include "Core/ImageDbInit.h"
#include "ImageIO/ImageIOTypes.h"
#include "ImageIO/ImageIOArchiveMount.h"
#include "ImageIO/ImageIOSearch.h"
#include "ImageIO/JpegMpLoader.h"
#include "ImageIO/JpegMpSaver.h"
#include "ImageIO/ImageIOUtility.h"
namespace imgdb {
} // end of namespace imgdb
#endif // IMAGE_IO_H_

View File

@ -0,0 +1,66 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageIOArchiveMount.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_IO_ARCHIVE_MOUNT_H_
#define IMAGE_IO_ARCHIVE_MOUNT_H_
#include "../Core/ImageDbResult.h"
namespace imgdb {
namespace mnt {
/*!----------------------------------------------------------------------
@brief ImageDbが利用するSDカードアーカイブがマウントされているかチェックする
@return true
@details
nn::fs::RegisterSdmcInsertedEvent等を使用し
-----------------------------------------------------------------------*/
bool IsMountSdmc();
/*!----------------------------------------------------------------------
@brief ImageDbが利用するSDカードアーカイブをマウントする
@return true
@details
falseを終了します<BR>
imgdb::Initialize()SDカードアーカイブはマウントされています
SDカードが挿されていれば SDカードが抜き差しされた場合は
<BR>
SDカードが挿されたらアプリ側で本関数を呼び出してマウントしてください
-----------------------------------------------------------------------*/
bool MountSdmc();
/*!----------------------------------------------------------------------
@brief ImageDbが利用するSDカードアーカイブをアンマウントする
@details
<BR>
imgdb::Finalize()SDカードアーカイブはアンマウントされますが
SDカードが抜き差しされた場合はアプリ側でマウントしなおす必要が
<BR>
SDカードが抜かれたらアプリ側で本関数を呼び出してアンマウントしてください
-----------------------------------------------------------------------*/
void UnmountSdmc();
/*!----------------------------------------------------------------------
@brief SDカードアーカイブの状態をチェックする
@return SDカードの状態結果
@details
SDカードの状態をチェックし<BR>
ResultSuccess<BR>
ResultErrorNotExistStorage<BR>
ResultErrorNotAvailableStorage<BR>
ResultErrorWriteProtect
-----------------------------------------------------------------------*/
Result CheckSdmcState();
} // end of namespace mnt
} // end of namespace imgdb
#endif // IMAGE_IO_ARCHIVE_MOUNT_H_

View File

@ -0,0 +1,106 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageIOSearch.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_IO_SEARCH_H_
#define IMAGE_IO_SEARCH_H_
#include <nn/fnd.h>
#include "ImageIOTypes.h"
namespace imgdb {
namespace search {
/*!----------------------------------------------------------------------
@brief
@details
<BR>
imgdb::Initialize()<BR>
Finalize() 24KB
-----------------------------------------------------------------------*/
void Initialize();
/*!----------------------------------------------------------------------
@brief
@details
imgdb::Finalize()
-----------------------------------------------------------------------*/
void Finalize();
/*!----------------------------------------------------------------------
@brief ImageDb
@details
ImageDb <BR>
GetTitleUniqueId() GetPath()
<BR>
<BR>
PC上でSDカードに直接写真を追加削除された場合などに
CollectPicture()<BR>
SDカードが存在しない
<BR>
<BR>
Get()
<BR>
SearchPicture() <BR>
SDカードが差されたとき<BR>
SDカードが抜かれたとき<BR>
JpegSaver/MpSaverで写真を保存したとき<BR>
DeletePicture()<BR>
CollectPicture()<BR>
HOMEメニューから戻ったときHOMEメニューカメラで撮影された可能性があるため
-----------------------------------------------------------------------*/
void SearchPicture();
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
int GetResultNum();
/*!----------------------------------------------------------------------
@brief IDを取得する
@param[in] nIndex [0, GetResultNum())
@return ID
-----------------------------------------------------------------------*/
u32 GetTitleUniqueId(int nIndex);
/*!----------------------------------------------------------------------
@brief
@param[out] pPath
@param[in] nSize
@param[in] nIndex [0, GetResultNum())
@details
pPathとnSizeはc_nMaxPathSize以上のバッファを指定する必要があります
-----------------------------------------------------------------------*/
void GetPath(wchar_t* pPath, int nSize, int nIndex);
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetResultNum())
@return
-----------------------------------------------------------------------*/
imgio::ImageKind GetImageKind(int nIndex);
/*!----------------------------------------------------------------------
@brief
@param[in] nIndex [0, GetResultNum())
@return
-----------------------------------------------------------------------*/
nn::fnd::DateTime GetDateTime(int nIndex);
} // end of namespace search
} // end of namespace imgdb
#endif // IMAGE_ENUMERATOR_H_

View File

@ -0,0 +1,30 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageIOTypes.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_IO_TYPES_H_
#define IMAGE_IO_TYPES_H_
namespace imgdb {
namespace imgio {
//! ファイルパスの格納に必要なバッファサイズ(文字数単位)
static const int c_nMaxPathSize = 44;
//! 映像データの種類を示す列挙型
enum ImageKind {
ImageKindJpeg = 0, //!< JPEGファイルのデータ
ImageKindMp, //!< MPファイルのデータ
ImageKindNum //!< 列挙型の要素数(使用しません)
};
} // end of namespace imgio
} // end of namespace imgdb
#endif // IMAGE_IO_TYPES_H_

View File

@ -0,0 +1,99 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: ImageIOUtility.h
---------------------------------------------------------------------------*/
#ifndef IMAGE_IO_UTILITY_H_
#define IMAGE_IO_UTILITY_H_
#include <nn/assert.h>
#include <nn/types.h>
#include "../Core/ImageDbResult.h"
namespace imgdb {
namespace util {
/*!----------------------------------------------------------------------
@brief
@return
@details
SDカードが認識できていない場合はゼロを返します
-----------------------------------------------------------------------*/
int GetRegisteredPictureNum();
/*!--------------------------------------------------------------------------*
@brief
@return
@details
3DSカメラと同じです
SDカードが認識できていない場合はゼロを返します
*---------------------------------------------------------------------------*/
int EstimateRemainPictureNum();
/*!--------------------------------------------------------------------------*
@brief IDが指定のIDと同じかチェックする
@param[in] pPath
@param[in] nUId ID
@return true
@details
pPathはJpeg/MpSaver
falseを返します
*---------------------------------------------------------------------------*/
bool IsSamePictureTitleUniqueId(const wchar_t* pPath, u32 nUId);
/*!--------------------------------------------------------------------------*
@brief
@param[in] pPath
@param[in] nUId ID
@return
@details
pPathはJpeg/MpSaver
nUIdにはアプリのタイトルユニークIDを指定します
IDと写真を比較し一致した
ResultErrorPermissionDeniedを返し削除に失敗します
*---------------------------------------------------------------------------*/
Result DeletePicture(const wchar_t* pPath, u32 nUId);
/*!----------------------------------------------------------------------
@brief ImageDb管理の写真にする
@return
@details
SDカードにある ImageDb ImageDb <BR>
<BR>
PC上でSDカードに直接写真を追加削除された場合などに
<BR>
<BR>
ImageDb
<BR>
<BR>
MP JPG <BR>
MP JPG <BR>
<BR>
SDカードの写真枚数によっては処理にかなりの時間が掛かります<BR>
StopCollect() 使
-----------------------------------------------------------------------*/
Result CollectPicture();
/*!----------------------------------------------------------------------
@brief
@details
CollectPicture() <BR>
CollectPicture()
-----------------------------------------------------------------------*/
void StopCollect();
} // end of namespace util
} // end of namespace imgdb
#endif // IMAGE_IO_UTILITY_H_

View File

@ -0,0 +1,637 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: JpegMpLoader.h
SDカードにあるJPEG/MPファイルを読み込み
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_LOADER_H_
#define JPEG_MP_LOADER_H_
#include <nn/types.h>
#include <nn/util.h>
#include <nn/jpeg.h>
#include "../Core/ImageDbResult.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief JPEG/MPベース読み込みクラス
*---------------------------------------------------------------------------*/
#pragma pack(push, 4)
class JpegMpBaseLoader
{
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
JpegMpBaseLoader();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegMpBaseLoader();
/*=======================================================================
Load()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
void* GetUserMakerNoteBuffer() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetUserMakerNoteBufferSize() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pBuf
@param[in] nSize
@details
4
-----------------------------------------------------------------------*/
void SetUserMakerNoteBuffer(void* pBuf, std::size_t nSize);
/*=======================================================================
Load()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@param[out] rDateTime
@return false
-----------------------------------------------------------------------*/
bool GetDateTime(nn::fnd::DateTime& rDateTime) const;
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@return
@details
SetUserMakerNoteBuffer()
-----------------------------------------------------------------------*/
std::size_t GetUserMakerNoteDataSize() const;
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
bool IsExistSysMakerNote() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
static std::size_t GetSysMakerNoteDataSize();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetSysMakerNoteData() const;
/*-----------------------------------------------------------------------
ID
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
IDとはアプリケーションが持つ20bitのユニークIDです
-----------------------------------------------------------------------*/
u32 GetTitleUniqueId() const;
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@retval true
@retval false
-----------------------------------------------------------------------*/
bool GetScreenshotFlag() const;
/*!----------------------------------------------------------------------
@brief 調
@return 調
-----------------------------------------------------------------------*/
bool GetAdjustablePictureFlag() const;
/*!----------------------------------------------------------------------
@brief
@return true
-----------------------------------------------------------------------*/
bool IsExistFace() const;
/*-----------------------------------------------------------------------
ID
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidShotBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetShotBodyId() const;
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidSendBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetSendBodyId() const;
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidReceiveBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetReceiveBodyId() const;
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidEditorBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetEditorBodyId() const;
/*=======================================================================
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@param[in] nHeight
@param[in] eFormat
@return
-----------------------------------------------------------------------*/
static std::size_t ComputeImageSize(
int nWidth, int nHeight, nn::jpeg::CTR::PixelFormat eFormat);
protected:
void SetDateTime(const nn::fnd::DateTime& rDateTime);
void ResetDateTime();
bool SetSysMakerNoteData(const void* pNote, std::size_t nSize);
void SetUserMakerNoteDataSize(std::size_t nSize);
void SetScreenshotFlag(bool bFlag);
void SetAdjustablePictureFlag(bool bFlag);
void SetShotBodyId(u32 nBodyId);
void ResetShotBodyId();
void SetSendBodyId(u32 nBodyId);
void ResetSendBodyId();
void SetReceiveBodyId(u32 nBodyId);
void ResetReceiveBodyId();
void SetEditorBodyId(u32 nBodyId);
void ResetEditorBodyId();
private:
bool GetHandleFlag(int nHandleType) const;
void SetHandleFlag(int nHandleType, bool bFlag);
bool IsValidBodyId(int nIdType) const;
u32 GetBodyId(int nIdType) const;
void SetBodyId(int nIdType, u32 nBodyId);
void ResetBodyId(int nIdType);
private:
void* m_pUserMakerNoteBuf;
std::size_t m_pUserMakerNoteBufSize;
nn::fnd::DateTime m_nDateTime;
bool m_bValidDateTime;
NN_PADDING3;
std::size_t m_nUserMakerNoteDataSize;
void* m_pSysMakerNoteData;
};
#pragma pack(pop)
/*!--------------------------------------------------------------------------*
@brief JPEG読み込みクラス
@details
JPEGを読み込むには最低限以下の関数を呼び出す必要があります<BR>
SetFilePath()<BR>
SetBuffer()<BR>
SetFormat()<BR>
Load()
*---------------------------------------------------------------------------*/
class JpegLoader : public JpegMpBaseLoader, private nn::util::NonCopyable<JpegLoader>
{
public:
//! 展開画像のピクセルフォーマットのデフォルト値
static const nn::jpeg::CTR::PixelFormat c_eDefaultRawFormat = nn::jpeg::CTR::PIXEL_FORMAT_CTR_RGB565;
//! サムネイル読み込みモードのデフォルト値
static const bool c_nDefaultThumbnailMode = false;
//! 展開した画像を格納するバッファの幅のデフォルト値
static const int c_nDefaultOutputWidth = 0;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
JpegLoader();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegLoader();
/*!----------------------------------------------------------------------
@brief JPEGファイルを読み込む
@return
@details
JPEG画像を読み込んで展開します<BR>
<BR>
ResultErrorInvalidParamが返ってきます<BR>
400KB
-----------------------------------------------------------------------*/
Result Load();
/*=======================================================================
Load()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief JPEGファイルのパスを取得する
@return
-----------------------------------------------------------------------*/
const wchar_t* GetFilePath() const;
/*!----------------------------------------------------------------------
@brief JPEGファイルのパスを設定する
@param[in] pPath
-----------------------------------------------------------------------*/
void SetFilePath(const wchar_t* pPath);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelFormat GetFormat() const;
/*!----------------------------------------------------------------------
@brief
@param[in] eFormat
-----------------------------------------------------------------------*/
void SetFormat(nn::jpeg::CTR::PixelFormat eFormat);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetOutputWidth();
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@details
64×64256×256
-----------------------------------------------------------------------*/
void SetOutputWidth(int nWidth);
/*!----------------------------------------------------------------------
@brief 調
@retval true
@retval false
-----------------------------------------------------------------------*/
bool IsThumbnailMode() const;
/*!----------------------------------------------------------------------
@brief
@param[in] bThumbMode
@details
bThumbModeにtrueを指定するとLoad()
-----------------------------------------------------------------------*/
void SetThumbnailMode(bool bThumbMode);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
void* GetBuffer() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetBufferSize() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pBuf
@param[in] nSize
@details
4
-----------------------------------------------------------------------*/
void SetBuffer(void* pBuf, std::size_t nSize);
/*=======================================================================
Load()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
int GetRawWidth() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
int GetRawHeight() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetRawDataSize() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRealWidth() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRealHeight() const;
private:
void ResetLoaded();
bool IsLoaded() const;
Result ValidateParam() const;
private:
const wchar_t* m_pFilePath;
int m_nOutputWidth;
nn::jpeg::CTR::PixelFormat m_eFormat;
bool m_bThumbMode;
NN_PADDING2;
void* m_pBuf;
std::size_t m_nBufSize;
int m_nRawWidth;
int m_nRawHeight;
std::size_t m_nRawDataSize;
int m_nRealWidth;
int m_nRealHeight;
};
/*!--------------------------------------------------------------------------*
@brief MP読み込みクラス
@details
MPを読み込むには最低限以下の関数を呼び出す必要があります<BR>
SetFilePath()<BR>
SetBuffer()<BR>
SetFormat()<BR>
Load()<BR>
GetOffsetH()
*---------------------------------------------------------------------------*/
class MpLoader : public JpegMpBaseLoader, private nn::util::NonCopyable<MpLoader>
{
public:
//! 展開画像のピクセルフォーマットのデフォルト値
static const nn::jpeg::CTR::PixelFormat c_eDefaultRawFormat = nn::jpeg::CTR::PIXEL_FORMAT_CTR_RGB565;
//! サムネイル読み込みモードのデフォルト値
static const bool c_nDefaultThumbnailMode = false;
//! 展開した画像を格納するバッファの幅のデフォルト値
static const int c_nDefaultOutputWidth = 0;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
MpLoader();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~MpLoader();
/*!----------------------------------------------------------------------
@brief MPファイルを読み込む
@return
@details
MP画像を読み込んで展開します<BR>
<BR>
ResultErrorInvalidParamが返ってきます<BR>
400KB
-----------------------------------------------------------------------*/
Result Load();
/*=======================================================================
Load()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief MPファイルのパスを取得する
@return
-----------------------------------------------------------------------*/
const wchar_t* GetFilePath() const;
/*!----------------------------------------------------------------------
@brief MPファイルのパスを設定する
@param[in] pPath
-----------------------------------------------------------------------*/
void SetFilePath(const wchar_t* pPath);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelFormat GetFormat() const;
/*!----------------------------------------------------------------------
@brief
@param[in] eFormat
-----------------------------------------------------------------------*/
void SetFormat(nn::jpeg::CTR::PixelFormat eFormat);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetOutputWidth();
/*!----------------------------------------------------------------------
@brief
@param[in] nWidth
@details
64×64256×256
-----------------------------------------------------------------------*/
void SetOutputWidth(int nWidth);
/*!----------------------------------------------------------------------
@brief 調
@retval true
@retval false
-----------------------------------------------------------------------*/
bool IsThumbnailMode() const;
/*!----------------------------------------------------------------------
@brief
@param[in] bThumbMode
@details
bThumbModeにtrueを指定するとLoad()
-----------------------------------------------------------------------*/
void SetThumbnailMode(bool bThumbMode);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
void* GetBufferL();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
void* GetBufferR();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetBufferSize() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pBufL
@param[in] pBufR
@param[in] nSize
@details
4<BR>
pBufRにヌルを指定することで<BR>
pBufRにも左側の画像が格納されます
-----------------------------------------------------------------------*/
void SetBuffer(void* pBufL, void* pBufR, std::size_t nSize);
/*=======================================================================
Load()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
int GetRawWidth() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
int GetRawHeight() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
std::size_t GetRawDataSize() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRealWidth() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRealHeight() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
0.0f <BR>
1.0f
11<BR>
<BR>
GetAdjustablePictureFlag() true 使false
0.0f
-----------------------------------------------------------------------*/
f32 GetOffsetH() const;
private:
void ResetLoaded();
bool IsLoaded() const;
Result ValidateParam() const;
private:
const wchar_t* m_pFilePath;
int m_nOutputWidth;
nn::jpeg::CTR::PixelFormat m_eFormat;
bool m_bThumbMode;
NN_PADDING2;
void* m_pBufL;
void* m_pBufR;
std::size_t m_nBufSize;
int m_nRawWidth;
int m_nRawHeight;
std::size_t m_nRawDataSize;
int m_nRealWidth;
int m_nRealHeight;
f32 m_fOfstH;
};
} // end of namespace imgdb
#endif // JPEG_MP_LOADER_H_

View File

@ -0,0 +1,604 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: JpegMpSaver.h
JPEG/MPにエンコードしSDカードへ保存します
3DSカメラで管理されます
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_SAVER_H_
#define JPEG_MP_SAVER_H_
#include <nn/types.h>
#include <nn/util.h>
#include <nn/jpeg.h>
#include "ImageIOTypes.h"
#include "../Core/ImageDbResult.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief JPEG/MPベース保存クラス
*---------------------------------------------------------------------------*/
class JpegMpBaseSaver
{
public:
//! スクリーンショットフラグのデフォルト値
static const bool c_bDefaultScreenshotFlag = false;
//! 配布許可フラグのデフォルト値
static const bool c_bDefaultPermitDistributeFlag = true;
//! 焦点調整範囲表示フラグのデフォルト値
static const bool c_bDefaultAdjustablePictureFlag = false;
//! 無効な本体ID
static const u32 c_nInvalidId = 0;
//! 撮影した本体IDの有効状態のデフォルト値
static const bool c_bDefaultValidShotId = true;
//! 送信した本体IDの有効状態のデフォルト値
static const bool c_bDefaultValidSendId = false;
//! 受信した本体IDの有効状態のデフォルト値
static const bool c_bDefaultValidReceiveId = false;
//! 最後に編集した本体IDの有効状態のデフォルト値
static const bool c_bDefaultValidEditorId = false;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
JpegMpBaseSaver();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegMpBaseSaver();
/*=======================================================================
Save()
=======================================================================*/
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
const void* GetUserMakerNoteData() const;
/*!----------------------------------------------------------------------
@brief
@return
@details
-----------------------------------------------------------------------*/
std::size_t GetUserMakerNoteDataSize() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pData
@param[in] nSize
@details
pDataにヌルnSizeにゼロを指定すると未設定の状態になります
-----------------------------------------------------------------------*/
void SetUserMakerNote(const void* pData, std::size_t nSize);
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
static std::size_t GetSysMakerNoteDataSize();
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetSysMakerNoteData() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pNote
@param[in] nSize
@return true
@details
IDや各種フラグなど
-----------------------------------------------------------------------*/
bool SetSysMakerNoteData(const void* pNote, std::size_t nSize);
/*-----------------------------------------------------------------------
ID
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
IDとはアプリケーションが持つ20bitのユニークIDです
-----------------------------------------------------------------------*/
u32 GetTitleUniqueId() const;
/*!----------------------------------------------------------------------
@brief IDを設定する
@param[in] nUId ID
@return true
@details
IDとはアプリケーションが持つ20bitのユニークIDです
-----------------------------------------------------------------------*/
void SetTitleUniqueId(u32 nUId);
/*-----------------------------------------------------------------------
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief
@retval true
@retval false
-----------------------------------------------------------------------*/
bool GetScreenshotFlag() const;
/*!----------------------------------------------------------------------
@brief
@param[in] bFlag
@details
-----------------------------------------------------------------------*/
void SetScreenshotFlag(bool bFlag);
/*!----------------------------------------------------------------------
@brief
@retval true
@retval false
-----------------------------------------------------------------------*/
bool GetPermitDistributeFlag() const;
/*!----------------------------------------------------------------------
@brief
@param[in] bFlag
-----------------------------------------------------------------------*/
void SetPermitDistributeFlag(bool bFlag);
/*!----------------------------------------------------------------------
@brief 調
@return 調
-----------------------------------------------------------------------*/
bool GetAdjustablePictureFlag() const;
/*!----------------------------------------------------------------------
@brief 調
@param[in] bFlag 調
@details
3DSカメラのブラウズで表示され
調
<BR>
400x2401024x768 <BR>
ULCD画面の中に収まるように
調
-----------------------------------------------------------------------*/
void SetAdjustablePictureFlag(bool bFlag);
/*-----------------------------------------------------------------------
ID
-----------------------------------------------------------------------*/
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidShotBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
CTRの本体IDが設定されています
-----------------------------------------------------------------------*/
u32 GetShotBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを設定する
@param[in] nBodyId ID
@details
IDを指定してください
-----------------------------------------------------------------------*/
void SetShotBodyId(u32 nBodyId);
/*!----------------------------------------------------------------------
@brief IDを自分の本体IDに設定する
@details
IDをSetShotBodyId()
-----------------------------------------------------------------------*/
void SetShotBodyIdByOwn();
/*!----------------------------------------------------------------------
@brief IDを無効状態にリセットする
-----------------------------------------------------------------------*/
void ResetShotBodyId();
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidSendBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetSendBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを設定する
@param[in] nBodyId ID
@details
IDを指定してください
IDを指定してください
-----------------------------------------------------------------------*/
void SetSendBodyId(u32 nBodyId);
/*!----------------------------------------------------------------------
@brief IDを自分の本体IDに設定する
@details
IDを指定してください
IDを指定してください
-----------------------------------------------------------------------*/
void SetSendBodyIdByOwn();
/*!----------------------------------------------------------------------
@brief IDを無効状態にリセットする
-----------------------------------------------------------------------*/
void ResetSendBodyId();
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidReceiveBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetReceiveBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを設定する
@param[in] nBodyId ID
@details
IDを指定してください
IDを指定してください
-----------------------------------------------------------------------*/
void SetReceiveBodyId(u32 nBodyId);
/*!----------------------------------------------------------------------
@brief IDを自分の本体IDに設定する
@details
IDを指定してください
IDを指定してください
-----------------------------------------------------------------------*/
void SetReceiveBodyIdByOwn();
/*!----------------------------------------------------------------------
@brief IDを無効状態にリセットする
-----------------------------------------------------------------------*/
void ResetReceiveBodyId();
/*!----------------------------------------------------------------------
@brief IDが有効かチェックする
@return true
-----------------------------------------------------------------------*/
bool IsValidEditorBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを取得する
@return ID
@details
-----------------------------------------------------------------------*/
u32 GetEditorBodyId() const;
/*!----------------------------------------------------------------------
@brief IDを設定する
@param[in] nBodyId ID
@details
CTRの本体IDを指定するか
SetEditorBodyIdByOwn()
IDを指定してください
-----------------------------------------------------------------------*/
void SetEditorBodyId(u32 nBodyId);
/*!----------------------------------------------------------------------
@brief IDを自分の本体IDに設定する
@details
IDを
SetEditorBodyId()
-----------------------------------------------------------------------*/
void SetEditorBodyIdByOwn();
/*!----------------------------------------------------------------------
@brief IDを無効状態にリセットする
-----------------------------------------------------------------------*/
void ResetEditorBodyId();
/* 削除予定 */
void SetPermitUploadFlag(bool ) { }
void SetPermitEditDistributeFlag(bool ) { }
void SetPermitSecondDistributeFlag(bool ) { }
protected:
bool IsValidTitleUniqueId() const;
bool GetHandleFlag(int nHandleType) const;
void SetHandleFlag(int nHandleType, bool bFlag);
bool IsValidBodyId(int nIdType) const;
u32 GetBodyId(int nIdType) const;
void SetBodyId(int nIdType, u32 nBodyId);
void ResetBodyId(int nIdType);
protected:
const void* m_pUserMakerNoteData;
std::size_t m_nUserMakerNoteDataSize;
void* m_pSysMakerNoteData;
bool m_bValidTitleUniqueId;
NN_PADDING3;
};
/*!--------------------------------------------------------------------------*
@brief JPEG保存クラス
@details
JPEGを保存するには最低限以下の関数を呼び出す必要があります<BR>
SetRaw()<BR>
SetTitleUniqueId()<BR>
Save()
*---------------------------------------------------------------------------*/
class JpegSaver : public JpegMpBaseSaver, private nn::util::NonCopyable<JpegSaver>
{
public:
//! JPEGの品質のデフォルト値
static const int c_nDefaultJpegQuality = 80;
//! JPEGのサンプリングフォーマットのデフォルト値
static const nn::jpeg::CTR::PixelSampling c_eDefaultJpegFormat = nn::jpeg::CTR::PIXEL_SAMPLING_YUV422;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
JpegSaver();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegSaver();
/*!----------------------------------------------------------------------
@brief JPEGファイルとして保存する
@return
@details
JPEGに変換して保存します<BR>
<BR>
ResultErrorInvalidParamが返ってきます<BR>
200KB
-----------------------------------------------------------------------*/
Result Save();
/*=======================================================================
Save()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief JPEGの品質を取得する
@return [1, 100]
-----------------------------------------------------------------------*/
int GetJpegQuality() const;
/*!----------------------------------------------------------------------
@brief JPEGの品質を設定する
@param[in] nQuality [1, 100]
-----------------------------------------------------------------------*/
void SetJpegQuality(int nQuality);
/*!----------------------------------------------------------------------
@brief JPEGのサンプリングフォーマットを取得する
@return
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelSampling GetJpegFormat() const;
/*!----------------------------------------------------------------------
@brief JPEGのサンプリングフォーマットを設定する
@param[in] eFormat
-----------------------------------------------------------------------*/
void SetJpegFormat(nn::jpeg::CTR::PixelSampling eFormat);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetRawData() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRawWidth() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRawHeight() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelFormat GetRawFormat() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pData
@param[in] nWidth
@param[in] nHeight
@param[in] eFormat
-----------------------------------------------------------------------*/
void SetRaw(
const void* pData, int nWidth, int nHeight,
nn::jpeg::CTR::PixelFormat eFormat);
/*=======================================================================
Save()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief JPEGのファイルパスを取得する
@return
@details
-----------------------------------------------------------------------*/
const wchar_t* GetSavedFilePath() const;
private:
Result ValidateParam() const;
void SetFilePathToVirtual(const wchar_t* pPath);
private:
int m_nJpegQuality;
nn::jpeg::CTR::PixelSampling m_eJpegFormat;
NN_PADDING3;
const void* m_pRawData;
int m_nRawWidth;
int m_nRawHeight;
nn::jpeg::CTR::PixelFormat m_eRawFormat;
NN_PADDING3;
wchar_t* m_pFilePath;
};
/*!--------------------------------------------------------------------------*
@brief MP保存クラス
@details
MPを保存するには最低限以下の関数を呼び出す必要があります<BR>
SetRaw()<BR>
SetTitleUniqueId()<BR>
Save()
*---------------------------------------------------------------------------*/
class MpSaver : public JpegMpBaseSaver, private nn::util::NonCopyable<MpSaver>
{
public:
//! JPEGの品質のデフォルト値
static const int c_nDefaultJpegQuality = 80;
//! JPEGのサンプリングフォーマットのデフォルト値
static const nn::jpeg::CTR::PixelSampling c_eDefaultJpegFormat = nn::jpeg::CTR::PIXEL_SAMPLING_YUV422;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
MpSaver();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~MpSaver();
/*!----------------------------------------------------------------------
@brief MPファイルとして保存する
@return
@details
MPに変換して保存します<BR>
<BR>
ResultErrorInvalidParamが返ってきます<BR>
400KB
-----------------------------------------------------------------------*/
Result Save();
/*=======================================================================
Save()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief JPEGの品質を取得する
@return [1, 100]
-----------------------------------------------------------------------*/
int GetJpegQuality() const;
/*!----------------------------------------------------------------------
@brief JPEGの品質を設定する
@param[in] nQuality [1, 100]
-----------------------------------------------------------------------*/
void SetJpegQuality(int nQuality);
/*!----------------------------------------------------------------------
@brief JPEGのサンプリングフォーマットを取得する
@return
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelSampling GetJpegFormat() const;
/*!----------------------------------------------------------------------
@brief JPEGのサンプリングフォーマットを設定する
@param[in] eFormat
-----------------------------------------------------------------------*/
void SetJpegFormat(nn::jpeg::CTR::PixelSampling eFormat);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetRawDataL() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
const void* GetRawDataR() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRawWidth() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
int GetRawHeight() const;
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
nn::jpeg::CTR::PixelFormat GetRawFormat() const;
/*!----------------------------------------------------------------------
@brief
@param[in] pDataL
@param[in] pDataR
@param[in] nWidth
@param[in] nHeight
@param[in] eFormat
-----------------------------------------------------------------------*/
void SetRaw(
const void* pDataL, const void* pDataR,
int nWidth, int nHeight, nn::jpeg::CTR::PixelFormat eFormat);
/*!----------------------------------------------------------------------
@brief
@return
-----------------------------------------------------------------------*/
f32 GetOffsetH() const;
/*!----------------------------------------------------------------------
@brief
@param[in] fOfstH
-----------------------------------------------------------------------*/
void SetOffsetH(f32 fOfstH);
/*=======================================================================
Save()
=======================================================================*/
/*!----------------------------------------------------------------------
@brief MPのファイルパスを取得する
@return
@details
-----------------------------------------------------------------------*/
const wchar_t* GetSavedFilePath() const;
private:
Result ValidateParam() const;
void SetFilePathToVirtual(const wchar_t* pPath);
private:
int m_nJpegQuality;
nn::jpeg::CTR::PixelSampling m_eJpegFormat;
NN_PADDING3;
const void* m_pRawDataL;
const void* m_pRawDataR;
int m_nRawWidth;
int m_nRawHeight;
nn::jpeg::CTR::PixelFormat m_eRawFormat;
NN_PADDING3;
f32 m_fOfstH;
wchar_t* m_pFilePath;
};
} // end of namespace imgdb
#endif // JPEG_MP_SAVER_H_

View File

@ -0,0 +1,89 @@
/*---------------------------------------------------------------------------
Project: ImageDb
File: JpegMpSaverEx.h
JpegMpSaverクラスに特殊用途向けの機能を追加したクラスです
---------------------------------------------------------------------------*/
#ifndef JPEG_MP_SAVER_EX_H_
#define JPEG_MP_SAVER_EX_H_
#include "JpegMpSaver.h"
namespace imgdb {
/*!--------------------------------------------------------------------------*
@brief JPEG保存クラス
*---------------------------------------------------------------------------*/
class JpegSaverEx : public JpegSaver, private nn::util::NonCopyable<JpegSaverEx>
{
public:
// 各種パラメータのデフォルト値
static const bool c_bDefaultMiiFlag = false;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
JpegSaverEx();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~JpegSaverEx();
/*!----------------------------------------------------------------------
@brief Mii特徴フラグを取得する
@return Mii特徴フラグ
-----------------------------------------------------------------------*/
bool GetMiiFlag() const;
/*!----------------------------------------------------------------------
@brief Mii特徴フラグを設定する
@param[in] bMii Mii特徴フラグ
@details
bMiiにtrueを指定するとMii属性が付与されPNOTEのスライドショーなどでMii
-----------------------------------------------------------------------*/
void SetMiiFlag(bool bMii);
};
/*!--------------------------------------------------------------------------*
@brief MP保存クラス
*---------------------------------------------------------------------------*/
class MpSaverEx : public MpSaver, private nn::util::NonCopyable<MpSaverEx>
{
public:
// 各種パラメータのデフォルト値
static const bool c_bDefaultMiiFlag = false;
public:
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
MpSaverEx();
/*!----------------------------------------------------------------------
@brief
-----------------------------------------------------------------------*/
virtual ~MpSaverEx();
/*!----------------------------------------------------------------------
@brief Mii特徴フラグを取得する
@return Mii特徴フラグ
-----------------------------------------------------------------------*/
bool GetMiiFlag() const;
/*!----------------------------------------------------------------------
@brief Mii特徴フラグを設定する
@param[in] bMii Mii特徴フラグ
@details
bMiiにtrueを指定するとMii属性が付与されPNOTEのスライドショーなどでMii
-----------------------------------------------------------------------*/
void SetMiiFlag(bool bMii);
};
} // end of namespace imgdb
#endif // JPEG_MP_SAVER_EX_H_