IMFTimecodeTranslate
COM公式ドキュメント
Society of Motion Picture and Television Engineers (SMPTE) タイムコードと 100 ナノ秒単位の時間との間で変換を行います。
解説(Remarks)
オブジェクトがこのインターフェイスをサポートする場合、そのインターフェイスをサービスとして公開しなければなりません。インターフェイスへのポインターを取得するには、サービス識別子 MF_TIMECODE_SERVICE を指定して IMFGetService::GetService を呼び出します。
Advanced Streaming Format (ASF) メディアソースがこのインターフェイスを公開します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Society of Motion Picture and Television Engineers (SMPTE) タイムコードを 100 ナノ秒単位に変換する非同期呼び出しを開始します。
| pPropVarTimecode | PROPVARIANT* | in | 変換する SMPTE タイムコード形式の時間。PROPVARIANT 構造体の vt メンバーは VT_I8 に設定されます。hVal.QuadPart メンバーには、2 進化 10 進数 (BCD) 形式の時間が格納されます。「解説」を参照してください。 |
| pCallback | IMFAsyncCallback* | in | コールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元がこのインターフェイスを実装する必要があります。 |
| punkState | IUnknown* | in | 呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL でもかまいません。このオブジェクトを状態情報の保持に使用できます。コールバックが呼び出されるときに、オブジェクトが呼び出し元に返されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| pPropVarTimecode が VT_I8 ではありません。 | |
| オブジェクトの Shutdown メソッドが呼び出されました。 | |
| バイトストリームはシークできません。バイトストリームの末尾からタイムコードを読み取ることができません。 |
解説(Remarks)
非同期メソッドが完了すると、コールバックオブジェクトの IMFAsyncCallback::Invoke メソッドが呼び出されます。その時点で、アプリケーションは IMFTimecodeTranslate::EndConvertTimecodeToHNS を呼び出して非同期要求を完了させる必要があります。
pPropVarTimecode の値は、LONGLONG として型付けされた 64 ビットの符号なし値です。上位 DWORD にはレンジが格納されます。(レンジ とは、連続したタイムコードの一連の並びです。) 下位 DWORD には、16 進数 0xhhmmssff の形式でタイムコードが格納され、各 2 バイトのシーケンスは 10 進数値として読み取られます。
void CreateTimeCode(
DWORD dwFrames,
DWORD dwSeconds,
DWORD dwMinutes,
DWORD dwHours,
DWORD dwRange,
PROPVARIANT *pvar
)
{
ULONGLONG ullTimecode = ((ULONGLONG)dwRange) << 32;
ullTimecode += dwFrames % 10;
ullTimecode += (( (ULONGLONG)dwFrames ) / 10) << 4;
ullTimecode += (( (ULONGLONG)dwSeconds ) % 10) << 8;
ullTimecode += (( (ULONGLONG)dwSeconds ) / 10) << 12;
ullTimecode += (( (ULONGLONG)dwMinutes ) % 10) << 16;
ullTimecode += (( (ULONGLONG)dwMinutes ) / 10) << 20;
ullTimecode += (( (ULONGLONG)dwHours ) % 10) << 24;
ullTimecode += (( (ULONGLONG)dwHours ) / 10) << 28;
pvar->vt = VT_I8;
pvar->hVal.QuadPart = (LONGLONG)ullTimecode;
}
Society of Motion Picture and Television Engineers (SMPTE) タイムコード形式の時間を 100 ナノ秒単位に変換する非同期要求を完了させます。
| pResult | IMFAsyncResult* | in | IMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが IMFAsyncCallback::Invoke メソッドで受け取ったものと同じポインターを渡します。 |
| phnsTime | LONGLONG* | out | 変換された時間を受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IMFTimecodeTranslate::BeginConvertTimecodeToHNS メソッドが非同期に完了した後で、このメソッドを呼び出します。
100 ナノ秒単位の時間を Society of Motion Picture and Television Engineers (SMPTE) タイムコードに変換する非同期呼び出しを開始します。
| hnsTime | LONGLONG | in | 変換する時間 (100 ナノ秒単位)。 |
| pCallback | IMFAsyncCallback* | in | コールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元がこのインターフェイスを実装する必要があります。 |
| punkState | IUnknown* | in | 呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL でもかまいません。このオブジェクトを状態情報の保持に使用できます。コールバックが呼び出されるときに、オブジェクトが呼び出し元に返されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| オブジェクトの Shutdown メソッドが呼び出されました。 | |
| バイトストリームはシークできません。バイトストリームの末尾からタイムコードを読み取ることができません。 |
解説(Remarks)
非同期メソッドが完了すると、コールバックオブジェクトの IMFAsyncCallback::Invoke メソッドが呼び出されます。その時点で、アプリケーションは IMFTimecodeTranslate::EndConvertHNSToTimecode を呼び出して非同期要求を完了させる必要があります。
100 ナノ秒単位の時間を Society of Motion Picture and Television Engineers (SMPTE) タイムコードに変換する非同期要求を完了させます。
| pResult | IMFAsyncResult* | in | IMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが IMFAsyncCallback::Invoke メソッドで受け取ったものと同じポインターを渡します。 |
| pPropVarTimecode | PROPVARIANT* | out | 変換された時間を受け取る PROPVARIANT へのポインター。PROPVARIANT 構造体の vt メンバーは VT_I8 に設定されます。hVal.QuadPart メンバーには、変換された時間が 2 進化 10 進数 (BCD) 形式で格納されます。「解説」を参照してください。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IMFTimecodeTranslate::BeginConvertHNSToTimecode メソッドが非同期に完了した後で、このメソッドを呼び出します。
pPropVarTimecode の値は、LONGLONG として型付けされた 64 ビットの符号なし値です。上位 DWORD にはレンジが格納されます。(レンジ とは、連続したタイムコードの一連の並びです。) 下位 DWORD には、16 進数 0xhhmmssff の形式でタイムコードが格納され、各 2 バイトのシーケンスは 10 進数値として読み取られます。
HRESULT ParseTimeCode(
const PROPVARIANT& var,
DWORD *pdwRange,
DWORD *pdwFrames,
DWORD *pdwSeconds,
DWORD *pdwMinutes,
DWORD *pdwHours
)
{
if (var.vt != VT_I8)
{
return E_INVALIDARG;
}
ULONGLONG ullTimeCode = (ULONGLONG)var.hVal.QuadPart;
DWORD dwTimecode = (DWORD)(ullTimeCode & 0xFFFFFFFF);
*pdwRange = (DWORD)(ullTimeCode >> 32);
*pdwFrames = dwTimecode & 0x0000000F;
*pdwFrames += (( dwTimecode & 0x000000F0) >> 4 ) * 10;
*pdwSeconds = ( dwTimecode & 0x00000F00) >> 8;
*pdwSeconds += (( dwTimecode & 0x0000F000) >> 12 ) * 10;
*pdwMinutes = ( dwTimecode & 0x000F0000) >> 16;
*pdwMinutes += (( dwTimecode & 0x00F00000) >> 20 ) * 10;
*pdwHours = ( dwTimecode & 0x0F000000) >> 24;
*pdwHours += (( dwTimecode & 0xF0000000) >> 28 ) * 10;
return S_OK;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFTimecodeTranslate "{AB9D8661-F7E8-4EF4-9861-89F334F94E74}" #usecom global IMFTimecodeTranslate IID_IMFTimecodeTranslate "{}" #comfunc global IMFTimecodeTranslate_BeginConvertTimecodeToHNS 3 var,sptr,sptr #comfunc global IMFTimecodeTranslate_EndConvertTimecodeToHNS 4 sptr,var #comfunc global IMFTimecodeTranslate_BeginConvertHNSToTimecode 5 int64,sptr,sptr #comfunc global IMFTimecodeTranslate_EndConvertHNSToTimecode 6 sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFTimecodeTranslate "{AB9D8661-F7E8-4EF4-9861-89F334F94E74}" #usecom global IMFTimecodeTranslate IID_IMFTimecodeTranslate "{}" #comfunc global IMFTimecodeTranslate_BeginConvertTimecodeToHNS 3 sptr,sptr,sptr #comfunc global IMFTimecodeTranslate_EndConvertTimecodeToHNS 4 sptr,sptr #comfunc global IMFTimecodeTranslate_BeginConvertHNSToTimecode 5 int64,sptr,sptr #comfunc global IMFTimecodeTranslate_EndConvertHNSToTimecode 6 sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。