IAMTimecodeReader is an interface that can be implemented to read SMPTE (Society of Motion Picture and Television Engineers) or MIDI timecode from an external device. It contains properties and methods that specify the timecode format that an external device should read and how it is embedded in the media. It is expected that you will use this interface with the IAMExtDevice and IAMExtTransport interfaces to control an external device, such as a VCR, which can read timecode data.
SMPTE timecode is a frame addressing system that identifies video and audio sources, makes automatic track synchronization possible, and provides a container for additional data related to the source material. SMPTE timecode's main purpose is to provide a machine-readable address for video and audio. It is displayed in hh:mm:ss:ff (hours, minutes, seconds, frames) format and is thoroughly defined in ANSI/SMPTE 12-1986.
For more information on SMPTE timecode see the Control an External Device in DirectShow overview article.
When to Implement
Implement this interface on an external device filter when you want to specify how an external device should read SMPTE/MIDI timecode information.
Expose the IMediaSeeking interface on your filter so that applications can convert timecode to DirectShow reference time (by using the IMediaSeeking::ConvertTimeFormat method).
Your external device must be able to read timecode and send it to the computer over its control interface. If this is not the case, you must either have a timecode reader card in your computer, or you can write a software decoder that converts VITC (Vertical Interval Timecode) in captured video frames or LTC (Linear Timecode) captured as an audio signal into DirectShow timecode samples.
When to Use
Use this interface when you need to read timecode information for controlling an external device, or when you want to use timecode information from an external device in applications that must refer to original program information.
Applications generally save timecode in one of two ways. It is either written to the capture file as an additional stream or as a discontinuity table stored in the extended AVI file index. It is commonly used to trigger capture or playback and to create edit decision lists that describes how source material is organized into a finished product.
If you intend to capture timecode, treat it as a separate stream that has its own media type. It can be consumed by an appropriate file-writing multiplexer filter. However, sometimes there are errors in reading the timecode off the tape because of dropouts and other mechanical tape problems. In such cases, the timecode source filter should simply drop samples and mark the next valid one with the discontinuity property.
If you intend to use timecodes to trigger capture or playback from a timecoded (or "striped") videotape, the sequence of events goes as follows:
You must consider discontinuous timecode, both during preroll and during the capture process; it is reasonable to demand that the timecode be continuous and monotonically increasing throughout the preroll and capture start point. This prevents a potentially ambiguous calculation of relative stream times by the IMediaSeeking::ConvertTimeFormat method. Also, the timecode need not be the only gating signal for triggered capture. Any time-stamped data stored in the vertical blanking interval, such as Intercast or Closed Caption data (XDS), can be used to start the streaming of video and audio data to disk.
Hardware Requirements
See the IAMExtTransport interface for hardware requirements.
Methods in Vtable Order
IUnknown methods | Description |
QueryInterface | Retrieves pointers to supported interfaces. |
AddRef | Increments the reference count. |
Release | Decrements the reference count. |
IAMTimecodeReader methods | Description |
GetTCRMode | Retrieves properties of the timecode reader. |
SetTCRMode | Sets the timecode reader properties. |
put_VITCLine | Specifies the vertical interval line that the timecode reader will use to read timecode. |
get_VITCLine | Retrieves the vertical interval line that the timecode reader is using to read timecode. |
GetTimecode | Retrieves the most recent timecode, userbits, and flag values available in the stream. |
Retrieves the timecode reader's properties.
HRESULT GetTCRMode(
long Param,
long *pValue
);
Value | Meaning |
ED_TCR_CT | Control track |
ED_TCR_LTC | Linear timecode |
ED_TCR_VITC | Vertical interval timecode |
Returns an HRESULT value that depends on the implementation of the interface.
Linear TimeCode is recorded on an analog audio track as a bi-phase mark-encoded signal. Each timecode frame is one video frame time in duration.
Vertical TimeCode is usually stored in two lines of a video signal's vertical interval, somewhere between lines 11 and 20.
Control Track is a once-per-frame signal recorded on a special track on a tape. The head and drive servo mechanisms use it to keep everything locked. It is also used to drive the counter on machines without timecode capability, and can optionally be used on machines equipped with a timecode reader.
Sets the timecode reader properties.
HRESULT SetTCRMode(
long Param,
long Value
);
Value | Meaning |
ED_TCR_CT | Control Track |
ED_TCR_LTC | Linear TimeCode |
ED_TCR_VITC | Vertical Interval TimeCode |
Returns an HRESULT value that depends on the implementation of the interface.
Linear TimeCode is recorded on an analog audio track as an NRZ bi-phase mark-encoded signal. Each timecode frame is one video frame time in duration.
Vertical TimeCode is usually stored in two lines of a video signal's vertical interval, somewhere between 10 and 20.
Control Track is a once-per-frame signal recorded on a special track on a tape. The head and drive servo mechanisms use it to keep everything locked. It is also used to drive the counter on machines without timecode capability, and can optionally be used on machines equipped with a timecode reader.
Specifies the vertical interval line that the timecode reader will use to read timecode.
HRESULT put_VITCLine(
long Line );
Returns an HRESULT value that depends on the implementation of the interface.
If VITC mode is specified in the IAMTimecodeReader::SetTCRMode method, you must specify which line or lines will contain timecode information. To read VITC on specific multiple lines, the caller would make successive calls to put_VITCLine, once for each line desired.
Set the hi bit to add to the list of lines for readers that test across multiple lines.
IAMTimecodeReader::get_VITCLine
Retrieves the vertical interval line that the timecode reader is using to read timecode.
HRESULT get_VITCLine(
long *pLine );
Returns an HRESULT value that depends on the implementation of the interface.
The hi bit indicates that multiple lines are used and successive calls will cycle through the line numbers.
IAMTimecodeReader::put_VITCLine
Retrieves the most recent timecode, userbit, and flag values available in the stream.
HRESULT GetTimecode(
PTIMECODE_SAMPLE pTimecodeSample
);
Returns an HRESULT value that depends on the implementation of the interface.
Use this method to monitor the timecode and to parse duplicates and discontinuities. The source filter supplying the timecode, or possibly a downstream filter, might want to parse for discontinuities or errors since you have to look at every sample to be able to retrieve the most recent timecode.
Applications can fill undefined bits in the timecode word to store syncronization information, or to encode original film and audio tape information. These undefined bits, or userbits, are retrieved by calling this method.
© 1997 Microsoft Corporation. All rights reserved. Terms of Use.