• R/O
  • SSH
  • HTTPS

iris-fmw:


File Info

Rev. 174
Size 11,835 bytes
Time 2011-08-10 17:48:34
Author shirayanagi
Log Message

リファクタリング

Content

//======================================================================
//-----------------------------------------------------------------------
/**
 * @file		WXMMAviStream.cpp
 * @brief		AviStream ファイル
 *
 * @author		t.sirayanagi
 * @version		1.0
 *
 * @par			copyright
 * Copyright (C) 2011 Takazumi Shirayanagi\n
 * The new BSD License is applied to this software.
 * see iris_LICENSE.txt
*/
//-----------------------------------------------------------------------
//======================================================================
#define INCG_IRIS_WXMMAviStream_CPP_

//======================================================================
// include
#include "WXMMAviStream.h"
#include "../os/modules/WXMAvifil.h"

namespace iris {
namespace wx
{


/**********************************************************************//**
 *
 * コンストラクタ
 *
*//***********************************************************************/
CMMAviStream::CMMAviStream(void)
: m_pStream(nullptr)
{
}

/**********************************************************************//**
 *
 * コピーコンストラクタ
 *
*//***********************************************************************/
CMMAviStream::CMMAviStream(const CMMAviStream& rhs)
: m_pStream(nullptr)
{
	Clone(rhs);
}

/**********************************************************************//**
 *
 * デストラクタ
 *
*//***********************************************************************/
CMMAviStream::~CMMAviStream(void)
{
	Close();
}

/**********************************************************************//**
 *
 * 開く
 *
 ----------------------------------------------------------------------
 * @param [in]	filename	= ファイル名
 * @param [in]	fccType		= ストリームタイプ
 * @param [in]	lParam		=
 * @param [in]	uMode		= ファイルオープンモード
 * @param [in]	lpHandler	=
 * @return	成否
*//***********************************************************************/
template<>
bool CMMAviStream::Open<CHAR>(LPCSTR	filename, DWORD fccType, LONG lParam, UINT uMode, LPCLSID lpHandler)
{
	if( FAILED( CAvifil::AVIStreamOpenFromFileA(&m_pStream, filename, fccType, lParam, uMode, lpHandler) ) ) return false;
	return IsValid();
}
template<>
bool CMMAviStream::Open<WCHAR>(LPCWSTR	filename, DWORD fccType, LONG lParam, UINT uMode, LPCLSID lpHandler)
{
	if( FAILED( CAvifil::AVIStreamOpenFromFileW(&m_pStream, filename, fccType, lParam, uMode, lpHandler) ) ) return false;
	return IsValid();
}

/**********************************************************************//**
 *
 * 開く
 *
 ----------------------------------------------------------------------
 * @param [in]	fccType		= ストリームタイプ
 * @param [in]	lParam		=
 * @return	成否
*//***********************************************************************/
bool CMMAviStream::Open(PAVIFILE pfile, DWORD fccType, LONG lParam)
{
	if( FAILED( CAvifil::AVIFileGetStream(pfile, &m_pStream, fccType, lParam) ) ) return false;
	return true;
}

/**********************************************************************//**
 *
 * 開いているかどうか
 *
 ----------------------------------------------------------------------
 * @return	真偽値
*//***********************************************************************/
bool CMMAviStream::IsValid(void) const
{
	if( m_pStream == nullptr ) return false;
	return true;
}

/**********************************************************************//**
 *
 * ファイルを閉じる
 *
*//***********************************************************************/
void CMMAviStream::Close(void)
{
	if( m_pStream != nullptr )
	{
		CAvifil::AVIStreamRelease(m_pStream);
		m_pStream = nullptr;
	}
}

/**********************************************************************//**
 *
 * クリップボードから作成
 *
 ----------------------------------------------------------------------
 * @param [in]	cfFormat	= クリップボードのフォーマット
 * @param [in]	hGlobal		= クリップボードメモリハンドル
 * @return	成否
*//***********************************************************************/
bool CMMAviStream::Create(UINT cfFormat, HANDLE hGlobal)
{
	Close();
	if( FAILED( CAvifil::AVIMakeStreamFromClipboard(cfFormat, hGlobal, &m_pStream) ) ) return false;
	return true;
}

/**********************************************************************//**
 *
 * ディープコピー
 *
 ----------------------------------------------------------------------
 * @param [in]	rhs		= コピー元
 * @return	成否
*//***********************************************************************/
bool CMMAviStream::Copy(const CMMAviStream& rhs, LPAVICOMPRESSOPTIONS lpOstions, LPCLSID lpHandler)
{
	Close();
	if( FAILED( CAvifil::AVIMakeCompressedStream(&m_pStream, rhs.m_pStream, lpOstions, lpHandler) ) ) return false;
	return true;
}

/**********************************************************************//**
 *
 * シャローコピー
 *
 ----------------------------------------------------------------------
 * @param [in]	rhs		= コピー元
*//***********************************************************************/
void CMMAviStream::Clone(const CMMAviStream& rhs)
{
	Close();
	if( rhs.m_pStream == nullptr ) return;
	m_pStream = rhs.m_pStream;
	CAvifil::AVIStreamAddRef(m_pStream);
}

/**********************************************************************//**
 *
 * 情報の取得
 *
 ----------------------------------------------------------------------
 * @param [out]	lpInfo		= 出力
 * @param [in]	lSize		= 出力バッファサイズ
 * @return 成否
*//***********************************************************************/
template<>
bool CMMAviStream::GetInfo(LPAVISTREAMINFOA lpInfo, s32 lSize) const
{
	if( lpInfo == nullptr ) return false;
	if( FAILED( CAvifil::AVIStreamInfoA(m_pStream, lpInfo, lSize) ) ) return false;
	return true;
}
template<>
bool CMMAviStream::GetInfo(LPAVISTREAMINFOW lpInfo, s32 lSize) const
{
	if( lpInfo == nullptr ) return false;
	if( FAILED( CAvifil::AVIStreamInfoW(m_pStream, lpInfo, lSize) ) ) return false;
	return true;
}

/**********************************************************************//**
 *
 * データの読み込み
 *
 ----------------------------------------------------------------------
 * @param [in]	lStart			= 読み取り開始位置
 * @param [in]	lSamples		= 読み取りサンプル数
 * @param [out]	lpBuffer		= 出力バッファ
 * @param [in]	lSize			= 出力バッファサイズ
 * @param [out]	lpReadBytes		= 読み取ったバイト数
 * @param [out]	lpReadSamples	= 読み取ったサンプル数
 * @return	成否
*//***********************************************************************/
bool CMMAviStream::Read(s32 lStart, s32 lSamples, LPVOID lpBuffer, s32 lSize, s32* lpReadBytes, s32* lpReadSamples) const
{
	if( !IsValid() ) return false;
	if( FAILED( CAvifil::AVIStreamRead(m_pStream, lStart, lSamples, lpBuffer, lSize, lpReadBytes, lpReadSamples) ) ) return false;
	return true;
}

/**********************************************************************//**
 *
 * フォーマットの読み込み
 *
 ----------------------------------------------------------------------
 * @param [in]	lStart		= 読み取り開始位置
 * @param [out]	lpFormat	= 出力バッファ
 * @param [in]	lpSize		= 出力バッファサイズ
 * @return	成否
*//***********************************************************************/
bool CMMAviStream::ReadFormat(s32 lStart, LPVOID lpFormat, s32* lpSize) const
{
	if( !IsValid() ) return false;
	if( FAILED( CAvifil::AVIStreamReadFormat(m_pStream, lStart, lpFormat, lpSize) ) ) return false;
	return true;
}

/**********************************************************************//**
 *
 * ストリームの先頭サンプルの番号
 *
 ----------------------------------------------------------------------
 * @return	ストリームの先頭サンプルの番号
*//***********************************************************************/
s32 CMMAviStream::GetStartSample(void) const
{
	if( !IsValid() ) return -1;
	return CAvifil::AVIStreamStart(m_pStream);
}

/**********************************************************************//**
 *
 * ミリ秒時間からサンプル番号に変換
 *
 ----------------------------------------------------------------------
 * @param [in]	time	= 時間
 * @return	サンプルの番号
*//***********************************************************************/
s32 CMMAviStream::TimeToSample(s32 time) const
{
	if( !IsValid() ) return -1;
	return CAvifil::AVIStreamTimeToSample(m_pStream, time);
}

/**********************************************************************//**
 *
 * サンプル番号からミリ秒時間に変換
 *
 ----------------------------------------------------------------------
 * @param [in]	sample	= 時間
 * @return	サンプルの番号
*//***********************************************************************/
s32 CMMAviStream::SampleToTime(s32 sample) const
{
	if( !IsValid() ) return -1;
	return CAvifil::AVIStreamSampleToTime(m_pStream, sample);
}

/**********************************************************************//**
 *
 * ストリームの長さを取得
 *
 ----------------------------------------------------------------------
 * @return	ストリームの長さ
*//***********************************************************************/
s32 CMMAviStream::GetLength(void) const
{
	if( !IsValid() ) return -1;
	return CAvifil::AVIStreamLength(m_pStream);
}


}	// end of namespace wx
}	// end of namespace iris

#if (defined(_IRIS_UNITTEST) || defined(_IRIS_MULTI_UNITTEST))
#include "../debug/unittest/WXDebugUnitTest.h"
#include "iris_tchar.h"
#include "iris_using.h"

//======================================================================
// test
IRIS_UNITTEST(CWXMMAviStreamTest, Info)
{
	CMMAviStream stream;

	TCHAR path[MAX_PATH];
#ifndef _IRIS_SUPPORT_AUTO_UNITTEST
	std::cout << "開くファイルを入力してください。" << std::endl;
	std::tcin >> path;
#endif

	if( !stream.Open(path, CMMAviStream::ALL, 0, OF_READ) )
	{
		_tprintf(path);
		_tprintf(IRIS_TEXT("\n"));
		std::cout << "ファイルオープンに失敗しました。" << std::endl;
		return;
	}

	AVISTREAMINFO asi;
	if( !stream.GetInfo(&asi, sizeof(asi)) ) return;

    _tprintf(IRIS_TEXT("dwCaps                = 0x%x\n")  , asi.dwCaps );
    _tprintf(IRIS_TEXT("dwEditCount           = %d\n")    , asi.dwEditCount );
    _tprintf(IRIS_TEXT("dwFlags               = 0x%x\n")  , asi.dwFlags );
	_tprintf(IRIS_TEXT("dwFormatChangeCount   = %d\n")    , asi.dwFormatChangeCount );
	_tprintf(IRIS_TEXT("dwInitialFrames       = 0x%x\n")  , asi.dwInitialFrames );
    _tprintf(IRIS_TEXT("dwLength              = 0x%x\n")  , asi.dwLength );
	_tprintf(IRIS_TEXT("dwQuality             = 0x%x\n")  , asi.dwQuality );
    _tprintf(IRIS_TEXT("dwRate                = 0x%x\n")  , asi.dwRate );
	_tprintf(IRIS_TEXT("dwSampleSize          = %d\n")    , asi.dwSampleSize );
    _tprintf(IRIS_TEXT("dwScale               = 0x%x\n")  , asi.dwScale );
    _tprintf(IRIS_TEXT("dwSuggestedBufferSize = 0x%x\n")  , asi.dwSuggestedBufferSize );
	_tprintf(IRIS_TEXT("fccHandler            = 0x%x\n")  , asi.fccHandler );
	_tprintf(IRIS_TEXT("fccType               = 0x%x\n")  , asi.fccType );
	_tprintf(IRIS_TEXT("rcFrame.left          = %d\n")    , asi.rcFrame.left );
	_tprintf(IRIS_TEXT("rcFrame.top           = %d\n")    , asi.rcFrame.top );
	_tprintf(IRIS_TEXT("rcFrame.right         = %d\n")    , asi.rcFrame.right );
	_tprintf(IRIS_TEXT("rcFrame.bottom        = %d\n")    , asi.rcFrame.bottom );
	_tprintf(IRIS_TEXT("szName                = %s\n")    , asi.szName );
	_tprintf(IRIS_TEXT("wLanguage             = 0x%x\n")  , asi.wLanguage );
	_tprintf(IRIS_TEXT("wPriority             = 0x%x\n")  , asi.wPriority );

}

#endif
Show on old repository browser