Creating a Timeline: Example Code
Microsoft DirectShow 9.0 |
Creating a Timeline: Example Code
The following code example shows how to create and preview a timeline in DES.
- **Note **For the sake of brevity, the sample code performs no error checking. In a real application, you should check the return values of method calls to make sure none has failed.
#include <dshow.h> #include <qedit.h> // Preview a timeline. void PreviewTL(IAMTimeline *pTL, IRenderEngine *pRender) { IGraphBuilder *pGraph = NULL; IMediaControl *pControl = NULL; IMediaEvent *pEvent = NULL; // Build the graph. pRender->SetTimelineObject(pTL); pRender->ConnectFrontEnd( ); pRender->RenderOutputPins( ); // Run the graph. pRender->GetFilterGraph(&pGraph); pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); pControl->Run(); long evCode; pEvent->WaitForCompletion(INFINITE, &evCode); pControl->Stop(); // Clean up. pEvent->Release(); pControl->Release(); pGraph->Release(); } void main( void ) { // Start by making an empty timeline. IAMTimeline *pTL = NULL; CoInitialize(NULL); CoCreateInstance(CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER, IID_IAMTimeline, (void**)&pTL); // GROUP: Add a video group to the timeline. IAMTimelineGroup *pGroup = NULL; IAMTimelineObj *pGroupObj = NULL; pTL->CreateEmptyNode(&pGroupObj, TIMELINE_MAJOR_TYPE_GROUP); pGroupObj->QueryInterface(IID_IAMTimelineGroup, (void **)&pGroup); // Set the group media type. This example sets the type to "video" and // lets DES pick the default settings. For a more detailed example, // see "Setting the Group Media Type." AM_MEDIA_TYPE mtGroup; ZeroMemory(&mtGroup, sizeof(AM_MEDIA_TYPE)); mtGroup.majortype = MEDIATYPE_Video; pGroup->SetMediaType(&mtGroup); pTL->AddGroup(pGroupObj); pGroupObj->Release(); // TRACK: Add a track to the group. IAMTimelineObj *pTrackObj; IAMTimelineTrack *pTrack; IAMTimelineComp *pComp = NULL; pTL->CreateEmptyNode(&pTrackObj, TIMELINE_MAJOR_TYPE_TRACK); pGroup->QueryInterface(IID_IAMTimelineComp, (void **)&pComp); pComp->VTrackInsBefore(pTrackObj, 0); pTrackObj->QueryInterface(IID_IAMTimelineTrack, (void **)&pTrack); pTrackObj->Release(); pComp->Release(); pGroup->Release(); // SOURCE: Add a source to the track. IAMTimelineSrc *pSource = NULL; IAMTimelineObj *pSourceObj; pTL->CreateEmptyNode(&pSourceObj, TIMELINE_MAJOR_TYPE_SOURCE); pSourceObj->QueryInterface(IID_IAMTimelineSrc, (void **)&pSource); // Set the times and the file name. pSourceObj->SetStartStop(0, 50000000); BSTR bstrFile = SysAllocString(OLESTR("C:\\example.avi")); pSource->SetMediaName(bstrFile); SysFreeString(bstrFile); pSource->SetMediaTimes(40000000, 140000000); pTrack->SrcAdd(pSourceObj); pSourceObj->Release(); pSource->Release(); pTrack->Release(); // Preview the timeline. IRenderEngine *pRenderEngine = NULL; CoCreateInstance(CLSID_RenderEngine, NULL, CLSCTX_INPROC_SERVER, IID_IRenderEngine, (void**) &pRenderEngine); PreviewTL(pTL, pRenderEngine); // Clean up. pRenderEngine->ScrapIt(); pRenderEngine->Release(); pTL->Release(); CoUninitialize(); }