Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Getting Timecode from the Device

[The feature associated with this page, DirectShow, is a legacy feature. It has been superseded by MediaPlayer, IMFMediaEngine, and Audio/Video Capture in Media Foundation. Those features have been optimized for Windows 10 and Windows 11. Microsoft strongly recommends that new code use MediaPlayer, IMFMediaEngine and Audio/Video Capture in Media Foundation instead of DirectShow, when possible. Microsoft suggests that existing code that uses the legacy APIs be rewritten to use the new APIs if possible.]

While a DV tape is playing or is in record-pause mode, you can retrieve the SMPTE timecode or the absolute track number. To do this, call the IAMTimecodeReader::GetTimecode method. This method takes a pointer to a TIMECODE_SAMPLE structure, which describes the timecode. Before calling the method, initialize the dwFlags member of the structure. Use the value ED_DEVCAP_TIMECODE_READ to retrieve the timecode or the value ED_DEVCAP_ATN_READ to retrieve the absolute track number.

The timecode member of the TIMECODE_SAMPLE structure is a TIMECODE structure. When the method returns, the dwFrames member of the TIMECODE structure contains the timecode or track number. For timecode, the hours, minutes, seconds, and frames are packed into a DWORD as binary coded decimal (BCD) values, with the format hhmmssff. Use bitmasks to extract the individual values.

The following example retrieves the timecode and track number.

if (MyDevCap.bHasTimecode)
{
 TIMECODE_SAMPLE TimecodeSample;
 TimecodeSample.timecode.dwFrames = 0;
 char szBuf[32];

 TimecodeSample.dwFlags = ED_DEVCAP_TIMECODE_READ;
 if (hr = MyDevCap.pTimecode->GetTimecode(&TimecodeSample), SUCCEEDED(hr)) 
 {
 DWORD dwTime = TimecodeSample.timecode.dwFrames; // Packed BCD value.
 int hour = ((dwTime & 0x0F000000) >> 24) + 
 (10 * ((dwTime & 0xF0000000) >> 28));
 int min = ((dwTime & 0x0F0000) >> 16) + 
 (10 * ((dwTime & 0xF00000) >> 20));
 int sec = ((dwTime & 0x0F00) >> 8) + 
 (10 * ((dwTime & 0xF000) >> 12));
 int frame = (dwTime & 0x0F) + 
 (10 * ((dwTime & 0xF0) >> 4));
 }

 TimecodeSample.dwFlags = ED_DEVCAP_ATN_READ;
 if (hr = MyDevCap.pTimecode->GetTimecode(&TimecodeSample), SUCCEEDED(hr)) 
 {
 DWORD dwTrackNumber = TimecodeSample.timecode.dwFrames;
 }
}

Related topics

Controlling a DV Camcorder


Feedback

Was this page helpful?

Additional resources