Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFTimecodeTranslate

IMFTimecodeTranslate

COM
IIDab9d8661-f7e8-4ef4-9861-89f334f94e74継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

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。

vtbl 3 HRESULT BeginConvertTimecodeToHNS(PROPVARIANT* pPropVarTimecode, IMFAsyncCallback* pCallback, IUnknown* punkState)

Society of Motion Picture and Television Engineers (SMPTE) タイムコードを 100 ナノ秒単位に変換する非同期呼び出しを開始します。

pPropVarTimecodePROPVARIANT*in変換する SMPTE タイムコード形式の時間。PROPVARIANT 構造体の vt メンバーは VT_I8 に設定されます。hVal.QuadPart メンバーには、2 進化 10 進数 (BCD) 形式の時間が格納されます。「解説」を参照してください。
pCallbackIMFAsyncCallback*inコールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元がこのインターフェイスを実装する必要があります。
punkStateIUnknown*in呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL でもかまいません。このオブジェクトを状態情報の保持に使用できます。コールバックが呼び出されるときに、オブジェクトが呼び出し元に返されます。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
E_INVALIDARG
pPropVarTimecodeVT_I8 ではありません。
MF_E_SHUTDOWN
オブジェクトの Shutdown メソッドが呼び出されました。
MF_E_BYTESTREAM_NOT_SEEKABLE
バイトストリームはシークできません。バイトストリームの末尾からタイムコードを読み取ることができません。

解説(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;
}
vtbl 4 HRESULT EndConvertTimecodeToHNS(IMFAsyncResult* pResult, LONGLONG* phnsTime)

Society of Motion Picture and Television Engineers (SMPTE) タイムコード形式の時間を 100 ナノ秒単位に変換する非同期要求を完了させます。

pResultIMFAsyncResult*inIMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが IMFAsyncCallback::Invoke メソッドで受け取ったものと同じポインターを渡します。
phnsTimeLONGLONG*out変換された時間を受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

IMFTimecodeTranslate::BeginConvertTimecodeToHNS メソッドが非同期に完了した後で、このメソッドを呼び出します。

vtbl 5 HRESULT BeginConvertHNSToTimecode(LONGLONG hnsTime, IMFAsyncCallback* pCallback, IUnknown* punkState)

100 ナノ秒単位の時間を Society of Motion Picture and Television Engineers (SMPTE) タイムコードに変換する非同期呼び出しを開始します。

hnsTimeLONGLONGin変換する時間 (100 ナノ秒単位)。
pCallbackIMFAsyncCallback*inコールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元がこのインターフェイスを実装する必要があります。
punkStateIUnknown*in呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL でもかまいません。このオブジェクトを状態情報の保持に使用できます。コールバックが呼び出されるときに、オブジェクトが呼び出し元に返されます。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
MF_E_SHUTDOWN
オブジェクトの Shutdown メソッドが呼び出されました。
MF_E_BYTESTREAM_NOT_SEEKABLE
バイトストリームはシークできません。バイトストリームの末尾からタイムコードを読み取ることができません。

解説(Remarks)

非同期メソッドが完了すると、コールバックオブジェクトの IMFAsyncCallback::Invoke メソッドが呼び出されます。その時点で、アプリケーションは IMFTimecodeTranslate::EndConvertHNSToTimecode を呼び出して非同期要求を完了させる必要があります。

vtbl 6 HRESULT EndConvertHNSToTimecode(IMFAsyncResult* pResult, PROPVARIANT* pPropVarTimecode)

100 ナノ秒単位の時間を Society of Motion Picture and Television Engineers (SMPTE) タイムコードに変換する非同期要求を完了させます。

pResultIMFAsyncResult*inIMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが IMFAsyncCallback::Invoke メソッドで受け取ったものと同じポインターを渡します。
pPropVarTimecodePROPVARIANT*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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。