Index Topic Contents | |||
Previous Topic: CBaseReferenceClock Class Next Topic: CBaseStreamControl Class |
CBaseRenderer Class
CBaseRenderer is the base renderer class for writing renderers. This class handles a single input pin, all state changes, and synchronization.
Protected Data Members
Name Description m_bAbort Stop rendering data. m_bEOS Indicator for whether there are more samples in the stream. m_bEOSDelivered Indicator for whether an EC_COMPLETE event has been delivered. m_bRepaintStatus Flag to determine if an EC_REPAINT message can be signaled. m_bStreaming Indicator for whether the filter graph is currently streaming. m_dwAdvise Timer advise token returned by the clock. m_EndOfStreamTimer Time that specifies the end of the stream. m_evComplete Event signaled when the pause state is complete. m_InterfaceLock Critical section for interfaces. m_pInputPin Renderer input pin object. m_pMediaSample Current media sample about to be, or being rendered. m_pPosition CRendererPosPassThru object for passing positioning data upstream. m_pQSink Quality control sink. m_RendererLock Controller for access to current media sample. m_RenderEvent Used to signal timer events. m_SignalTime Amount of time that must elapse before CBaseRenderer returns EC_COMPLETE. m_ThreadSignal Event signaled to release the source filter thread. Member Functions
Name Description Active Called when the state is switched to paused or running. Override to add functionality. CBaseRenderer Constructs a CBaseRenderer object. CheckReady Determines if the event is set. DisplayRendererState Displays the status of the video renderer. This function is available only in debug mode. GetRealState Retrieves the actual state of the renderer. GetRenderEvent Retrieves the event to render. IsEndOfStream Determines if the end of the stream has been reached. IsEndOfStreamDelivered Determines if the end of the stream has been delivered to the filter graph manager. IsStreaming Determines if the filter is currently rendering data. NotifyEndOfStream Sends an EC_COMPLETE event to the filter graph manager. NotReady Forces the m_evComplete event into a nonsignaled state. Ready Puts the m_evComplete event into a signaled state. ResetEndOfStreamTimer Sets the end of stream timer to zero. ScheduleSample Sets up an advise link with the clock. SendNotifyWindow Passes the notification window handle to the upstream filter. SendRepaint Conditionally signals an EC_REPAINT message to the filter graph. SetAbortSignal Sets the abort signal flag. SetRepaintStatus Resets the repaint status flag. SignalTimerFired Resets the current advise time to zero after a timer fires. TimerCallback Checks if it is time to signal the end of the current data stream. Overridable Member Functions
Name Description BeginFlush Signals the start of flushing on the input pin. BreakConnect Breaks the input pin connection and resets the end-of-stream flags. CancelNotification Cancels any currently scheduled notification with the clock. CheckMediaType Determines if the renderer will accept a given media type. ClearPendingSample Called to release the pending sample after it has been rendered. CompleteConnect Called as part of the connection protocol. Override to add functionality. CompleteStateChange Ensures that a sample is waiting before allowing a pause. DoRenderSample Called when a sample is ready to render. GetCurrentSample Retrieves the current sample waiting at the video renderer. GetPin Returns a CBasePin object to the renderer. GetPinCount Returns the number of input pins supported. EndFlush Called when the input pin receives an end-flush notification. EndOfStream Called when the input pin receives an end-of-stream notification. GetMediaPositionInterface Retrieves IMediaPosition and IMediaSeeking interfaces for the video renderer. GetSampleTimes Retrieves sample time information for this sample. HaveCurrentSample Determines if a sample is waiting at the renderer. Inactive Called when going into a stopped state. Override to add functionality. NonDelegatingQueryInterface Returns an interface and increments the reference count. OnReceiveFirstSample Provides derived classes with an opportunity to render static data. OnRenderEnd Notifies the derived class that a sample has just finished rendering. OnRenderStart Notifies the derived class that a sample is about to be rendered. OnStartStreaming Notifies the derived class that rendering has started. OnStopStreaming Notifies the derived class that rendering has stopped. OnWaitEnd Notifies the derived class that a wait for a rendering time has just ended. OnWaitStart Notifies the derived class that a wait for a rendering time is about to start. Pause Tells the renderer to transition to the new (paused) state. PrepareReceive Called to schedule a clock time when the renderer receives a sample. PrepareRender Allows derived classes to set themselves just before a sample is rendered. Receive Called by the source filter when a sample is available to render. Render Asks the derived class to render the sample. ResetEndOfStream Resets the end-of-stream flag. Run Transitions the renderer to State_Running if it is not already in this state. SendEndOfStream Sets the end-of-stream flag. SetMediaType Informs the derived class of the selected media type. ShouldDrawSampleNow Determines if the sample should be drawn between the start and stop times given. SourceThreadCanWait Sets or resets the thread event. StartStreaming Called to schedule any pending sample with the clock, and to display any timing information. Stop Tells the renderer to transition to the new (stopped) state. StopStreaming Sets an internal flag to indicate not to schedule arrival of any more samples. WaitForRenderTime Waits for either the time to arrive or for rendering to be stopped. Implemented IMediaFilter Methods
Name Description GetState Determines the state of the renderer. Implemented IBaseFilter Methods
Name Description FindPin Retrieves a pointer to the pin with the specified identifier. (There is only one pin.) Helper Function
Name Description WaitForReceiveToComplete Waits for the CBaseRenderer::Receive method to complete. CBaseRenderer Class
CBaseRenderer::ActiveCalled when the state is switched to paused or running.
virtual HRESULT Active(void);
Return Values
Returns an HRESULT value. Returns NOERROR by default.
Remarks
This member function does nothing by default. Derived classes can optionally override this member function to add functionality.
CBaseRenderer Class
CBaseRenderer::BeginFlushInforms the renderer that flushing has started.
virtual HRESULT BeginFlush(void);
Return Values
Returns an HRESULT value.
Remarks
This member function is called by CRendererInputPin::BeginFlush when informed of a flush from the upstream filter. It releases the source thread and signals the start of flushing on the input pin. Any samples received by the renderer when it is in a flushing state will be rejected.
CBaseRenderer Class
CBaseRenderer::BreakConnectCalled when a connection is broken.
virtual HRESULT BreakConnect(void);
Return Values
Returns an HRESULT value.
Remarks
This member function resets the end-of-stream flag and checks for a valid connection, or that the filter is in a stopped state. Override to customize.
CBaseRenderer Class
CBaseRenderer::CancelNotificationCancels any currently scheduled notification.
virtual HRESULT CancelNotification(void);
Return Values
Returns an HRESULT value.
Remarks
This member function is called when the renderer is told to stop streaming. If there is no timer link outstanding, calling this member function does nothing; otherwise, this function stops the advise link and resets the render event. The normal process when running is to receive a sample, wait until it is time to render it and then render it. The clock is given an event to signal when the desired time arrives.
CBaseRenderer Class
CBaseRenderer::CBaseRendererConstructs a CBaseRenderer object.
CBaseRenderer(
REFCLSID RenderClass,
TCHAR *pName,
LPUNKNOWN pUnk,
HRESULT *phr
);Parameters
- RenderClass
- Class identifier for this renderer.
- pName
- Name used for debugging purposes.
- pUnk
- Owner object.
- phr
- Pointer to the HRESULT return code.
Return Values
No return value.
CBaseRenderer Class
CBaseRenderer::CheckMediaTypeDetermines if the renderer will accept a given media type.
virtual HRESULT CheckMediaType(
const CMediaType * pmt
) PURE;Parameters
- pmt
- Pointer to a media type object that contains the proposed media type.
Return Values
Returns an HRESULT value.
Remarks
This member function must be overridden and implemented, typically to return the media type of the display. It is called from the CRendererInputPin::CheckMediaType member function during the connection process.
CBaseRenderer Class
CBaseRenderer::CheckReadyDetermines if the renderer is ready to process the next sample.
BOOL CheckReady(void);
Return Values
Returns TRUE if the m_evComplete event is currently set, but does not block.
Remarks
This member function calls the CAMEvent::Check member function. This is mainly used in transitioning to paused states. When a renderer is paused, it should not complete the state change until it has received some data. So although the call to IMediaFilter::Pause completes immediately, if the application calls IMediaFilter::GetState it will return VFW_S_STATE_INTERMEDIATE. When a sample arrives at the renderer, the event that is initially reset during the pause call will be signaled. At this point, an application calling IMediaFilter::GetState will return NOERROR. This process allows an application to pause a filter graph and then wait until data is actually queued and ready to be rendered.
CBaseRenderer Class
CBaseRenderer::ClearPendingSampleCalled to clear the pending sample when in a stopped or inactivated state.
virtual HRESULT ClearPendingSample(void);
Return Values
Returns an HRESULT value.
Remarks
This member function releases the IMediaSample interface. This allows the allocator to reuse it and allocate it to the upstream filter again. If the state is being changed to inactive, IMemAllocator::GetBuffer will return an error. This function also resets the current media sample to NULL to indicate that no data is now available.
CBaseRenderer Class
CBaseRenderer::CompleteConnectCalled as part of the connection protocol.
virtual HRESULT CompleteConnect(
IPin *pReceivePin
);Parameters
- pReceivePin
- Connecting pin.
Return Values
Returns an HRESULT value (NOERROR by default).
Remarks
This member function calls the SetRepaintStatus member function to set the m_bRepaintStatus data member to TRUE so that EC_REPAINT notifications can be sent in the future. (To prevent unnecessary EC_REPAINT notifications from being sent, m_bRepaintStatus is set to FALSE when an end-of-stream notification arrives.)
CBaseRenderer Class
CBaseRenderer::CompleteStateChangeEnsures that a sample is waiting before allowing a pause.
virtual HRESULT CompleteStateChange(
FILTER_STATE OldState
);Parameters
- OldState
- State prior to the transition.
Return Values
Returns S_OK if the filter can be paused; otherwise, returns S_FALSE.
Remarks
This member function is called from the CBaseRenderer::Pause member function. If the filter is being paused and there is no sample waiting, the transition is not completed and the function returns S_FALSE until the first sample arrives. However, if the m_bAbort flag has been set, all samples are rejected so there is no point waiting for one. If a sample is available, this member function returns NOERROR.
CBaseRenderer Class
CBaseRenderer::DisplayRendererStateDisplays the status of the video renderer. This function is available only in debug mode.
void CBaseRenderer::DisplayRendererState( );
Return Values
No return value.
Remarks
Use this function to monitor the activity of the video renderer. The following is a sample output of this function.
Timed out in WaitForRenderTime Signal sanity check 0 Filter state 1 Abort flag 0 Streaming flag 0 Clock advise link 0 Current media sample 0 EOS signalled 0 EOS delivered 0 Repaint status 1 End of stream timer 0 Deliver time 0x000000000 Flushing sanity check 0 Last run time 0x000000000 Clock time 0x22C2CD23430 Time difference 238875379msCBaseRenderer Class
CBaseRenderer::DoRenderSampleCalled when a sample is ready to render.
virtual HRESULT DoRenderSample(
IMediaSample *pMediaSample
) PURE;Parameters
- pMediaSample
- Media sample.
Return Values
Returns an HRESULT value.
Remarks
This member function must be overridden in the derived class. It is called by CBaseRenderer::Render.
The derived class should render the object at this time. For example, the sample video renderer (SAMPVID) calls its drawing object (a CDrawImage object):
// Have the drawing object render the current image HRESULT CVideoRenderer::DoRenderSample(IMediaSample *pMediaSample) { return m_DrawImage.DrawImage(pMediaSample); }CBaseRenderer Class
CBaseRenderer::EndFlushCalled when the input pin receives an end-flush notification.
virtual HRESULT EndFlush(void);
Return Values
Returns an HRESULT value.
Remarks
This member function is called from the CRendererInputPin::EndFlush member function. It calls CBaseRenderer::SourceThreadCanWait with a TRUE value to allow the upstream filter's thread to wait in CBaseRenderer::Receive again.
CBaseRenderer Class
CBaseRenderer::EndOfStreamCalled when the input pin receives an end-of-stream notification.
HRESULT EndOfStream(void);
Return Values
Returns an HRESULT value.
Remarks
If all received samples have been rendered, this member function notifies EC_COMPLETE. If samples have been received and not yet rendered, this function sets m_bEOS and checks for it on completing samples. If the filter is waiting to be paused, this function completes the transition to paused state by setting the state event.
CBaseRenderer Class
CBaseRenderer::FindPinRetrieves a pointer to the pin with the specified identifier.
HRESULT FindPin(
LPCWSTR Id,
IPin **ppPin
);Parameters
- Id
- Identifier of the pin.
- ppPin
- Pointer to the IPin interface for this pin after the renderer has been restored.
Return Values
Returns NOERROR if successful; otherwise, returns VFW_E_NOT_FOUND.
Remarks
This member function implements the IBaseFilter::FindPin method. It assumes that the default pin name is "In" and checks for this. If the pin is found, its reference count is incremented. The ppPin parameter is set to NULL if the identifier cannot be matched.
CBaseRenderer Class
CBaseRenderer::GetCurrentSampleRetrieves the current sample waiting at the video renderer, or NULL if there is not one.
virtual IMediaSample *GetCurrentSample(void);
Return Values
Returns a pointer to the sample.
Remarks
The reference count for the sample is incremented before returning. This is so that if the sample comes due for rendering, it is not added back to the allocator free list until the caller of this member function releases it.
CBaseRenderer Class
CBaseRenderer::GetMediaPositionInterfaceRetrieves IMediaPosition and IMediaSeeking interfaces for the video renderer.
virtual HRESULT GetMediaPositionInterface(
REFIID riid,
void **ppv
);Parameters
- riid
- Reference identifier.
- ppv
- Pointer to the interface.
Return Values
Returns an HRESULT value.
Remarks
A CRendererPosPassThru helper object is created dynamically when this is called to support passing the IMediaPosition or IMediaSeeking interface calls from the filter graph manager to the upstream filter.
CBaseRenderer Class
CBaseRenderer::GetPinReturns a CBasePin object on the renderer.
virtual CBasePin *GetPin(
int n
);Parameters
- n
- Number of the specified pin, which is always zero in the case of the renderer.
Return Values
Returns a pointer to the pin specified by the n parameter.
Remarks
This member function overrides CBaseFilter::GetPin. Only one pin is supported on the renderer; it is numbered zero. A call to this member function with n equal to zero will result in an input pin of type CRendererInputPin being returned. It will be created if it does not yet exist.
CBaseRenderer Class
CBaseRenderer::GetPinCountRetrieves the number of input pins supported.
virtual int GetPinCount(void);
Return Values
The default implementation returns one, since only one pin is supported. Override to support more than one pin. Because the base renderer class is specifically designed for single-pin operation, considerably more of the base class functionality would have to be changed to make a multipin renderer. Future versions of the SDK might provide this functionality.
Remarks
This member function overrides CBaseFilter::GetPinCount.
CBaseRenderer Class
CBaseRenderer::GetRealStateRetrieves the actual state of the renderer.
FILTER_STATE GetRealState(void);
Return Values
Returns m_State, the state flag for the renderer.
Remarks
This member function provides an internal way of getting the real state. Calling through the IBaseFilter interface to get the state would require the main filter critical section to be taken; this internal method does not do this.
CBaseRenderer Class
CBaseRenderer::GetRenderEventRetrieves the event to render.
CAMEvent *GetRenderEvent(void);
Return Values
Returns the value of m_RenderEvent.
CBaseRenderer Class
CBaseRenderer::GetSampleTimesRetrieves sample time information for this sample.
virtual HRESULT GetSampleTimes(
IMediaSample *pMediaSample,
REFERENCE_TIME *pStartTime,
REFERENCE_TIME *pEndTime
);Parameters
- pMediaSample
- Media sample.
- pStartTime
- Start time.
- pEndTime
- End time.
Return Values
Returns S_FALSE if the sample should be scheduled according to the times specified in the sample; returns S_OK to indicate that the sample should be rendered immediately.
Remarks
Note that the sample times are passed in by reference, not value.
CBaseRenderer Class
CBaseRenderer::GetStateDetermines the state of the renderer.
HRESULT GetState(
DWORD dwMilliSecsTimeout,
FILTER_STATE * State
);Parameters
- dwMilliSecsTimeout
- Duration of the time-out, in milliseconds.
- State
- Returned state of the renderer.
Return Values
Returns an HRESULT value. Returns VFW_S_STATE_INTERMEDIATE if paused and waiting for a sample; otherwise, returns NOERROR.
Remarks
This member function overrides the CBaseFilter::GetState member function. It returns the value of m_State. Because the renderer does not complete the full transition to the paused state until it has a sample to render, if the state is requested while it is waiting for a sample, it will return VFW_S_STATE_INTERMEDIATE along with the state.
CBaseRenderer Class
CBaseRenderer::HaveCurrentSampleDetermines if a sample is waiting at the renderer.
virtual BOOL HaveCurrentSample(void);
Return Values
Returns TRUE if a sample is ready to be rendered, or FALSE if no data is available.
CBaseRenderer Class
CBaseRenderer::InactiveCalled when going into a stopped state.
virtual HRESULT Inactive(void);
Return Values
Returns NOERROR by default; overriding member function should return a valid HRESULT value.
Remarks
This member function is a placeholder that derived classes can optionally override to add functionality when the filter is stopped.
CBaseRenderer Class
CBaseRenderer::IsEndOfStreamDetermines if the end of the stream has been reached.
BOOL IsEndOfStream(void);
Return Values
Returns TRUE if the stream's end has been reached, or FALSE if it hasn't.
Remarks
The default implementation returns m_bEOS.
CBaseRenderer Class
CBaseRenderer::IsEndOfStreamDeliveredDetermines if the end of the stream has been delivered to the filter graph manager.
BOOL IsEndOfStreamDelivered(void);
Return Values
Returns TRUE if the stream's end has been delivered, or FALSE if it hasn't.
Remarks
The default implementation returns m_bEOSDelivered. This is used by the base renderer class so that only one EC_COMPLETE message is sent to the filter graph manager each time it is run, regardless of the number of times EndOfStream is called.
CBaseRenderer Class
CBaseRenderer::IsStreamingDetermines if the filter is streaming data.
BOOL IsStreaming(void);
Return Values
Returns TRUE if the renderer is rendering, or FALSE if it isn't.
Remarks
The default implementation returns m_bStreaming. In the base renderer class, "streaming" and "rendering" are used in the same context as "running".
CBaseRenderer Class
CBaseRenderer::NonDelegatingQueryInterfaceRetrieves an interface and increments the reference count.
HRESULT NonDelegatingQueryInterface(
REFIID riid,
void ** ppv
);Parameters
- riid
- Reference identifier.
- ppv
- Pointer to the interface.
Return Values
Returns E_POINTER if ppv is invalid. Returns NOERROR if the query is successful or E_NOINTERFACE if it is not.
Remarks
This member function overrides CBaseFilter::NonDelegatingQueryInterface. It exposes the IMediaPosition and IMediaSeeking interfaces and then calls CBaseFilter::NonDelegatingQueryInterface for interfaces implemented in the base classes.
CBaseRenderer Class
CBaseRenderer::NotReadyForces the m_evComplete event into a nonsignaled state.
void NotReady(void);
Return Values
No return value.
Remarks
This member function calls the CAMEvent::Reset member function of the m_evComplete event object.
CBaseRenderer Class
CBaseRenderer::NotifyEndOfStreamSends an EC_COMPLETE event to the filter graph manager.
void NotifyEndOfStream(void);
Return Values
No return value.
CBaseRenderer Class
CBaseRenderer::OnReceiveFirstSampleProvides derived classes with an opportunity to render static data.
virtual void OnReceiveFirstSample(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
No return value.
Remarks
This member function is unimplemented. It is primarily used by video renderers. When they receive their first sample while paused, they typically draw the frame as a poster image. This virtual method is called by the base classes when the first sample arrives.
CBaseRenderer Class
CBaseRenderer::OnRenderEndNotifies the derived class that rendering has finished.
virtual void OnRenderEnd(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
No return value.
Remarks
This member function is available for quality management and performance measuring. It is called immediately after the sample is rendered.
Quality management implementations typically need to know how long it takes the renderer to render the data.
CBaseRenderer Class
CBaseRenderer::OnRenderStartNotifies the derived class that rendering is about to start.
virtual void OnRenderStart(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
No return value.
Remarks
This member function is available for quality management and performance measuring. It is called immediately before the sample is rendered.
Quality management implementations typically need to know how long it takes the renderer to render the data.
CBaseRenderer Class
CBaseRenderer::OnStartStreamingNotifies the derived class that streaming has started.
virtual HRESULT OnStartStreaming(void);
Return Values
Returns NOERROR in the default implementation.
Remarks
This member function is called from CBaseRenderer::StartStreaming. Override this in your derived class to provide special handling when streaming starts.
CBaseRenderer Class
CBaseRenderer::OnStopStreamingNotifies the derived class that streaming has stopped.
virtual HRESULT OnStopStreaming(void);
Return Values
Returns NOERROR in the default implementation.
Remarks
This member function is called from CBaseRenderer::StopStreaming. Override this in your derived class to provide special handling when streaming stops.
CBaseRenderer Class
CBaseRenderer::OnWaitEndNotifies the derived class that a wait for a rendering time has just ended.
virtual void OnWaitEnd(void);
Return Values
No return value.
Remarks
This member function is available for quality control and is called from CBaseRenderer::WaitForRenderTime just after waiting for the presentation time for a sample. Override this member function to obtain performance measurements in a derived class.
CBaseRenderer Class
CBaseRenderer::OnWaitStartNotifies the derived class that a wait for a rendering time is about to start.
virtual void OnWaitStart(void);
Return Values
No return value.
Remarks
This member function is available for quality control and is called from CBaseRenderer::WaitForRenderTime just before waiting for the presentation time for a sample. Override this member function to obtain performance measurements in a derived class.
CBaseRenderer Class
CBaseRenderer::PauseChanges the renderer to State_Paused if it isn't already.
HRESULT Pause(void);
Return Values
Returns an HRESULT value.
Remarks
The following steps comprise a pause operation.
- Commit the allocator used for the connection.
- Allow the thread for the upstream filter to wait in Receive.
- Cancel any outstanding clock advise links.
- Check to see if the renderer is connected and allow a state change.
- If a sample is available, complete the state change to State_Paused.
If the member function succeeds, DirectShow sets the filter's m_State member variable to State_Paused. If the renderer is in the State_Stopped state, DirectShow calls the CBasePin::Active member function for each of the renderer's connected pins.
This member function overrides CBaseFilter::Pause.
CBaseRenderer Class
CBaseRenderer::PrepareReceiveEnsures that a sample can be rendered.
virtual HRESULT PrepareReceive(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
Returns NOERROR if successful, VFW_E_SAMPLE_REJECTED if the delivered sample is later than the sample's timestamp, or E_UNEXPECTED if a renderable sample is already available.
Remarks
This member function is called when the upstream filter delivers a sample. If the upstream filter is running (streaming), the sample is scheduled with the reference clock. If the upstream filter is not streaming, a sample in paused mode has been received, so any state transition can be completed. On leaving this function, everything will be unlocked so an application thread can get in and change the state to stopped. In this case, it will also signal the thread event so that the wait call is stopped.
This function is typically called from the IMemInputPin::Receive method on the renderer's input pin. Although PrepareReceive returns VFW_E_SAMPLE_REJECTED if the sample was delivered too late to be useful, the IMemInputPin::Receive method should not pass the VFW_E_SAMPLE_REJECTED error on to the upstream filter in this case. Instead, IMemInputPin::Receive should return NOERROR, because no error occurred.
CBaseRenderer Class
CBaseRenderer::PrepareRenderProvides an opportunity for the derived class to prepare itself for rendering a sample.
virtual void PrepareRender(void);
Return Values
No return value.
Remarks
This member function is called from CBaseRenderer::Receive before rendering each frame. A derived class can take this opportunity to prepare itself for rendering. For example, a video renderer might realize its palette. This is not implemented in the base class.
CBaseRenderer Class
CBaseRenderer::ReadyPuts the m_evComplete event into a signaled state.
void Ready(void);
Return Values
No return value.
Remarks
This member function calls the m_evComplete CAMEvent object's Set member function.
CBaseRenderer Class
CBaseRenderer::ReceiveCalled by the upstream filter when a sample is available to render.
virtual HRESULT Receive(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
Returns an HRESULT value.
Remarks
This member function sets an advise link with the clock, waits for the time to arrive, and then renders the data by calling the pure virtual DoRenderSample member function that the derived class will have overridden. After rendering the sample, the end of stream can also be signaled if it was the last one sent before EndOfStream was called.
CBaseRenderer Class
CBaseRenderer::RenderAsks the derived class to render the sample.
virtual HRESULT Render(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
Returns an HRESULT value.
Remarks
This member function is called when the derived class should render the sample. The action taken is dependent on the nature of the renderer; a video renderer will typically draw the image in a window. This class calls the pure virtual DoRenderSample to be implemented by the derived class.
CBaseRenderer Class
CBaseRenderer::ResetEndOfStreamResets the end-of-stream flag.
virtual HRESULT ResetEndOfStream(void);
Return Values
Returns an HRESULT value.
Remarks
This member function is typically called when changing to stopped states. A renderer must keep track of when it gets told that no more data is going to arrive (this is done when the sourcing filter calls IPin::EndOfStream). At this point the renderer finishes rendering any data it has and then sends an EC_COMPLETE event to the filter graph manager.
However, when the filter is stopped, the whole state is cleared. When the filter is subsequently run, the source filter will signal the end of stream again if it has no data to send. In this case, the renderer should signal another EC_COMPLETE event to the filter graph manager. This member function resets the state so that when next requested it will send an EC_COMPLETE event.
CBaseRenderer Class
CBaseRenderer::ResetEndOfStreamTimerIf the end-of-stream timer is nonzero, this function sets it to zero.
void ResetEndOfStreamTimer(void);
Return Values
No return value.
CBaseRenderer Class
CBaseRenderer::RunTransitions the renderer to State_Running if it is not in this state already.
HRESULT Run(void);
Return Values
Returns an HRESULT value.
Remarks
If the renderer is in the State_Stopped state, the CBaseRenderer::Pause member function is called first to transition the renderer to the State_Paused state, which has the effect of activating any of the filter's connected pins. If this member function succeeds, the renderer's m_State member variable is set to State_Running.
This member function overrides CBaseFilter::Run.
CBaseRenderer Class
CBaseRenderer::ScheduleSampleSchedules the sample for rendering.
virtual BOOL ScheduleSample(
IMediaSample *pMediaSample
);Parameters
- pMediaSample
- Media sample.
Return Values
No return value.
Remarks
One of the main purposes of the renderer base class is to manage the timing and synchronization of the samples it is sent; that is, the timely presentation of data. It also must look after quality management, which might involve dropping samples or rendering them earlier than indicated in the time stamps on the sample. This method and its overrides in derived classes manage the setting up of advise links with the clock, so that the samples can be rendered at the appropriate time.
CBaseRenderer Class
CBaseRenderer::SendEndOfStreamSignals an EC_COMPLETE event to the filter graph manager.
virtual HRESULT SendEndOfStream(void);
Return Values
Returns an HRESULT value.
Remarks
When the renderer receives an end-of-stream notification, it will finish rendering any data it currently has and then send an EC_COMPLETE event to the filter graph manager.
CBaseRenderer Class
CBaseRenderer::SendNotifyWindowPasses the notification window handle to the upstream filter.
void SendNotifyWindow(
IPin *pPin,
HWND hwnd
);Parameters
- pPin
- IPin interface of the upstream pin.
- hwnd
- Handle of the notification window.
Return Values
No return value.
Remarks
If the output pin of the upstream filter supports the IMediaEventSink interface, this member function sends it the EC_NOTIFY_WINDOW event code with the window handle in hwnd.
CBaseRenderer Class
CBaseRenderer::SendRepaintSignals an EC_REPAINT message to the filter graph.
void SendRepaint(void);
Return Values
No return value.
Remarks
This should be used with some care. EC_REPAINT events are processed by the filter graph manager by setting the current position to the same position that the graph is currently in. This has the effect of sending the same data through the graph again, which is an expensive operation. Video renderers are the main users of this event, because they sometimes need the same image sent again to refresh the display.
CBaseRenderer Class
CBaseRenderer::SetAbortSignalSets the m_bAbort abort signal flag.
void SetAbortSignal(
BOOL bAbort
);Parameters
- bAbort
- Abort value to be set.
Return Values
Returns an HRESULT value.
CBaseRenderer Class
CBaseRenderer::SetMediaTypeInforms the derived class of the selected media type.
virtual HRESULT SetMediaType(
const CMediaType *pmt
);Parameters
- pmt
- Media type to be set.
Return Values
Returns NOERROR by default; the overriding member function should return a valid HRESULT value.
Remarks
This member function is called by the CRendererInputPin::SetMediaType member function and has no implementation in this class. Derived classes can optionally override to add functionality.
CBaseRenderer Class
CBaseRenderer::SetRepaintStatusResets the m_bRepaintStatus flag when EC_REPAINT has been signaled to the filter graph.
void SetRepaintStatus(
BOOL bRepaint
);Parameters
- bRepaint
- Boolean value assigned to the m_bRepaintStatus flag.
Return Values
No return value.
Remarks
The m_bRepaintStatus flag ensures that the filter graph is not flooded with redundant calls. Once one EC_REPAINT message has been sent, no more will be sent until the renderer receives some data.
CBaseRenderer Class
CBaseRenderer::ShouldDrawSampleNowDetermines if the sample should be drawn between the start and stop times given.
virtual HRESULT ShouldDrawSampleNow(
IMediaSample *pMediaSample,
REFERENCE_TIME *pStartTime,
REFERENCE_TIME *pEndTime
);Parameters
- pMediaSample
- Media sample.
- pStartTime
- Start time in question.
- pEndTime
- End time in question.
Return Values
Returns S_FALSE by default. The overriding member function can return S_OK to indicate that the sample should be drawn immediately instead of waiting for its scheduled time.
Remarks
This member function is used by the derived video renderer class for quality management.
CBaseRenderer Class
CBaseRenderer::SignalTimerFiredResets the current advise time to zero after a timer fires.
virtual void SignalTimerFired(void);
Return Values
No return value.
CBaseRenderer Class
CBaseRenderer::SourceThreadCanWaitSets or resets the thread event.
virtual HRESULT SourceThreadCanWait(
BOOL bCanWait
);Parameters
- bCanWait
- TRUE or FALSE, depending on intent.
Return Values
Returns an HRESULT value.
Remarks
In some states, such as paused or running, it is expected that the upstream filter's thread will be blocked in the call to the renderer's input pin Receive method. In other cases, such as when the renderer is stopped, the upstream filter should not be required to wait. This member function represents a manual reset event that sets this TRUE to wait, or FALSE to keep the thread from waiting.
CBaseRenderer Class
CBaseRenderer::StartStreamingCalled to schedule any pending sample with the clock, and to display timing information.
virtual HRESULT StartStreaming(void);
Return Values
Returns an HRESULT value.
Remarks
If no sample is available but an end-of-stream flag is queued, this member function sends an EC_COMPLETE message to the filter graph manager. If a sample is available, the EC_COMPLETE message will not be sent until it has been rendered.
CBaseRenderer Class
CBaseRenderer::StopTransitions the renderer to State_Stopped if it is not in this state already.
HRESULT Stop(void);
Return Values
Returns an HRESULT value.
Remarks
If the renderer is not in the State_Stopped state, the CRendererInputPin::Inactive member function is called for each of the renderer's connected pins. If this member function succeeds, the filter's m_State member variable is set to State_Stopped.
This member function overrides CBaseFilter::Stop.
CBaseRenderer Class
CBaseRenderer::StopStreamingSets the internal flag to indicate not to schedule arrival of any more samples.
virtual HRESULT StopStreaming(void);
Return Values
Returns an HRESULT value.
Remarks
Call this member function when streaming stops. The state change methods in the filter implementation take care of canceling any clock advise link that has been set up and clearing any pending sample.
CBaseRenderer Class
CBaseRenderer::TimerCallbackChecks if it is time to signal the end of the current data stream.
void TimerCallback(void);
Return Values
No return value.
Remarks
If the m_EndOfStreamTimer data member is nonzero, this function sets it to zero and calls CBaseRenderer::SendEndOfStream to signal the end of the current data stream.
CBaseRenderer Class
CBaseRenderer::WaitForReceiveToCompleteWaits for the CBaseRenderer::Receive method to complete.
void WaitForReceiveToComplete( );
Return Values
No return value.
Remarks
Use this method when you wish to avoid deadlock which occurs when CBaseRenderer::Stop is called and the CBaseRenderer::Receive hasn't completed.
CBaseRenderer Class
CBaseRenderer::WaitForRenderTimeWaits for either the due time for the current sample to arrive or for rendering to be stopped.
virtual HRESULT WaitForRenderTime(void);
Return Values
Returns an HRESULT value.
Remarks
The member function is virtual because derived classes might have more events that they also want to wait on, which might interrupt the waiting process. The base class has two events: m_RenderEvent and m_ThreadSignal. The former is signaled by the clock when the sample is due for rendering. The latter is signaled by the filter when it should give up waiting and abort (making the assumption that the filter was stopped).
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.