mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcHwDevice.h
changeset 58 b6dbf97aba93
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mdfdevvideoextensions/nga_mdf_postprocessor_shai/inc/NGAPostProcHwDevice.h	Thu Sep 16 18:57:38 2010 +0100
@@ -0,0 +1,1161 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef __NGAPOSTPROCHWDEVICE_H__
+#define __NGAPOSTPROCHWDEVICE_H__
+
+#include <e32std.h> 
+#include <w32std.h>
+#include <e32base.h>
+#include <e32def.h>
+#include <e32cmn.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include <mmf/devvideo/videoplayhwdevice.h>
+#include <mmf/devvideo/devvideostandardcustominterfaces.h>
+#include <mmf/devvideo/devvideovideosurfacecustominterface.h>
+#include <graphics/surfacemanager.h> //RSurfaceManager
+#include <graphics/surface.h> //TSurfaceId
+#include <mmf/common/mmfvideo.h> //TVideoAspectRatio
+//TBC++
+//#include <mmf/devvideo/devvideosurfacehandlecustominterface.h>
+#include "devvideosurfacehandlecustominterface.h"
+#include "postinitializeci.h"
+//TBC--
+#include <mmf/devvideo/devvideoplayratecustominterface.h>  
+#include <surface_hints.h>
+#include <secureoutputci.h>
+#include <advancedsecureoutputci.h>
+#include <graphics/suerror.h>
+
+#include "fetchframecustominterface.h"
+#include "MdfRDebug.h"
+#include "NGAPostProcHwDevice_UID.hrh"
+#include "NGAPostProcSessionManagerObserver.h"
+#include "common.h"
+
+class CNGAPostProcSessionManager;
+class CNGAPostProcSurfaceHandler;
+class CNGAPostProcTimer;
+class RWsSession;
+
+class CNGAPostProcHwDevice: public CMMFVideoPostProcHwDevice,
+							public MMmfVideoBufferManagement,
+							public MNGAPostProcSessionManagerObserver,
+							public MMMFVideoSurfaceSupport,
+							public MMmfVideoPropertiesObserver,
+							public MMmfVideoResourceObserver,
+							public MMmfVideoSurfaceHandleControl,
+							public MMmfVideoPropertiesNotifier,
+							public MMmfVideoPlayRateControl,
+							public MMmfVideoSecureOutput,
+							public MMmfAdvancedVideoSecureOutput,
+							public MMmfPostInitializeRequest
+{
+
+public: 
+    //  === Constructors and destructor ===
+    /**
+    * Two-phased constructor.   
+    * @return pointer to an instance of CMMFVideoPostProcHwDevice
+    */
+    static CMMFVideoPostProcHwDevice* NewL();
+
+    /**
+    * Destructor.
+    */
+    ~CNGAPostProcHwDevice();
+
+public: 
+    
+    // === CMMFVideoPostProcHwDevice ===
+    
+    /**
+    Sets the device input format to an uncompressed video format.
+
+    @param  "aFormat"   "The input format to use."
+    @leave  "The method will leave if an error occurs. Typical error codes used:
+            * KErrNotSupported - The input format is not supported."    
+    @pre    "This method can only be called before the hwdevice has been initialized with Initialize()."
+    */
+    void SetInputFormatL(const TUncompressedVideoFormat& aFormat);
+
+    /**
+    Sets the decoder device that will write data to this post-processor. Decoded pictures will be 
+    written with WritePictureL() or through a custom interface. After pictures have been processed, 
+    they must be returned to the decoder using ReturnPicture().
+
+    @param  "aDevice"   "The decoder source plug-in to use."
+    @pre    "This method can only be called before the hwdevice has been initialized with Initialize()."
+    */
+    void SetInputDevice(CMMFVideoDecodeHwDevice* aDevice);
+
+    /**
+    Writes an uncompressed video picture to the post-processor. The picture must be returned to the 
+    client or source plug-in after it has been used.
+
+    @param  "aPicture"  "The picture to write."
+    @leave  "This method may leave with one of the system-wide error codes."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void WritePictureL(TVideoPicture* aPicture);    
+
+    /**
+    Retrieves post-processing information about this hardware device. 
+    The device creates a CPostProcessorInfo structure, fills it with correct data, pushes it 
+    to the cleanup stack and returns it. The client will delete the object when it is no 
+    longer needed.
+
+    @return "Post-processor information as a CPostProcessorInfo object. 
+            The object is pushed to the cleanup stack, and must be deallocated by the caller."
+    @leave  "This method may leave with one of the system-wide error codes.
+    */
+    CPostProcessorInfo* PostProcessorInfoLC();
+
+    /**
+    Retrieves the list of the output formats that the device supports. The list is ordered in 
+    plug-in preference order, with the preferred formats at the beginning of the list. The list 
+    can depend on the device source format, and therefore SetSourceFormatL() must be called before 
+    calling this method.
+
+    @param "aFormats" "An array for the result format list. The array must be created and destroyed by the caller."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method may only be called before the hwdevice has been initialized using Initialize()."
+    */
+    void GetOutputFormatListL(RArray<TUncompressedVideoFormat>& aFormats);
+
+    /**
+    Sets the device output format.
+
+    @param  "aFormat" "The format to use."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method may only be called before the hwdevice has been initialized using Initialize()."
+    */
+    void SetOutputFormatL(const TUncompressedVideoFormat &aFormat);
+
+    /**
+    Sets the clock source to use for video timing. If no clock source is set. video playback 
+    will not be synchronized, but will proceed as fast as possible, depending on input data 
+    and output buffer availability. 
+
+    @param  "aClock" "The clock source to be used."
+    @pre    "This method can only be called before the hwdevice has been initialized with Initialize()."
+    */
+    void SetClockSource(MMMFClockSource* aClock);
+
+    /**
+    Sets the device video output destination. The destination can be the screen (using direct 
+    screen access) or memory buffers. By default memory buffers are used. If data is written 
+    to another device, this method is ignored, and suitable memory buffers are always used.
+    
+    @param  "aScreen" "True if video output destination is the screen, false if memory buffers."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can only be called before the hwdevice has been initialized with Initialize()."
+    */
+    void SetVideoDestScreenL(TBool aScreen);
+
+    /**
+    Sets the post-processing types to be used.
+
+    @param  "aPostProcCombination" "The post-processing steps to perform, a bitwise OR of values from TPostProcessType."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetPostProcessTypesL(TUint32 aPostProcCombination);
+
+    /**
+    Sets post-processing options for input (pan-scan) cropping.
+
+    @param  "aRect" "The cropping rectangle to use."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetInputCropOptionsL(const TRect& aRect);
+
+    /**
+    Sets post-processing options for YUV to RGB color space conversion. 
+    Specifies the input YUV and output RGB formats to use explicitly. SetSourceFormatL(), 
+    SetOutputFormatL(), and SetPostProcessTypesL() must be called before this method is used.
+
+    @param  "aOptions"      "The conversion options to use."
+    @param  "aYuvFormat"    "Conversion source YUV format"
+    @param  "aRgbFormat"    "Conversion target RGB format"
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions, const TYuvFormat& aYuvFormat, 
+                                TRgbFormat aRgbFormat);
+
+    /**
+    Sets post-processing options for YUV to RGB color space conversion.
+    Uses the device input and output formats. For decoder devices the default YUV format used is 
+    the format specified in the input bitstream. SetSourceFormatL(), SetOutputFormatL(), and 
+    SetPostProcessTypesL() must be called before this method is used.
+
+    @param  "aOptions"      "The conversion options to use."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions);
+
+    /**
+    Sets post-processing options for rotation. SetPostProcessTypesL() must be called before 
+    this method is used.
+
+    @param  "aRotationType" "The rotation to perform."  
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetRotateOptionsL(TRotationType aRotationType);
+
+    /**
+    Sets post-processing options for scaling. SetPostProcessTypesL() must be called before 
+    this method is used.
+    
+    @param  "aTargetSize"           "Scaling target size. If a fixed scale factor size is used, 
+                                    the new dimensions must be set to width=floor(factor*width), 
+                                    height=floor(factor*height). For example, scaling a 
+                                    QCIF (176x144) picture up by a factor of 4/3 yields a size 
+                                    of 234x192."
+    @param  "aAntiAliasFiltering"   "True if anti-aliasing filtering should be used. 
+                                    If the post-processor does not support anti-aliased scaling, 
+                                    or supports anti-aliased scaling only, this argument is ignored."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetScaleOptionsL(const TSize& aTargetSize, TBool aAntiAliasFiltering);
+
+    /**
+    Sets post-processing options for output cropping. SetPostProcessTypesL() must be called before 
+    this method is used.
+    
+    @param  "aRect" "Output cropping area."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetOutputCropOptionsL(const TRect& aRect);
+
+    /**
+    Sets post-processing plug-in specific options. SetPostProcessTypesL() must be called before 
+    this method is used.
+
+    @param  "aOptions" "The options. The format is plug-in specific."
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can be called either before or after the hwdevice has been initialized with Initialize().
+            If called after initialization, the change must only be committed when CommitL() is called."
+    */
+    void SetPostProcSpecificOptionsL(const TDesC8& aOptions);
+
+    /**
+    Initializes the device. This method is asynchronous, the device will call 
+    MMFVideoPlayProxy::MdvppInitializeComplete() after initialization has completed. After this 
+    method has successfully completed, further configuration changes are not possible except where 
+    separately noted.
+    */
+    void Initialize();
+
+    /**
+    Commit all changes since the last CommitL(), Revert() or Initialize()
+    to the hardware device.  This only applies to methods which can be called both
+    before AND after DevVideoPlay has been initialized.
+
+    @see    SetPostProcessTypesL
+    @see    SetInputCropOptionsL
+    @see    SetYuvToRgbOptionsL
+    @see    SetRotateOptionsL
+    @see    SetScaleOptionsL
+    @see    SetOutputCropOptionsL
+    @see    SetPostProcSpecificOptionsL
+
+    @leave  "The method will leave if an error occurs."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void CommitL();
+
+    /**
+    Revert all changes since the last CommitL(), Revert() or Initialize()
+    back to their previous settings.  This only applies to methods which can 
+    be called both before AND after DevVideoPlay has been initialized.
+
+    @see    SetPostProcessTypesL
+    @see    SetInputCropOptionsL
+    @see    SetYuvToRgbOptionsL
+    @see    SetRotateOptionsL
+    @see    SetScaleOptionsL
+    @see    SetOutputCropOptionsL
+    @see    SetPostProcSpecificOptionsL
+
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void Revert();
+
+    /**
+    Starts writing output directly to the display frame buffer using Direct Screen Access.
+
+    @param  "aVideoRect"    "The video output rectangle on screen."
+    @param  "aScreenDevice" "The screen device to use. The screen device object must be valid in the current thread."
+    @param  "aClipRegion"   "Initial clipping region to use."
+    
+    @leave  "This method may leave with one of the system-wide error codes.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void StartDirectScreenAccessL(const TRect& aVideoRect, 
+        CFbsScreenDevice& aScreenDevice, const TRegion& aClipRegion);
+
+    /**
+    Sets a new clipping region for Direct Screen Access. After the method returns, no video will 
+    be drawn outside of the region. If clipping is not supported, or the clipping region is too 
+    complex, either playback will pause or will resume without video display, depending on the 
+    current setting of SetPauseOnClipFail(), and the result can be verified with IsPlaying(). 
+    Clipping can be disabled by setting a new clipping region that includes the whole video window.
+
+    @param  "aRegion" "The new clipping region. After the method returns, no video will be drawn outside the region."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void SetScreenClipRegion(const TRegion& aRegion);
+
+    /**
+    Sets whether the system should pause playback when it gets a clipping region it cannot handle, 
+    or Direct Screen Access is aborted completely. If not, processing will proceed normally, but no 
+    video will be drawn. By default, playback is paused.
+
+    @param "aPause" "True if playback should be paused when clipping fails, false if not. 
+                    If playback is not paused, it will be continued without video display."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void SetPauseOnClipFail(TBool aPause);
+
+    /**
+    Aborts Direct Screen Access completely, to be called from MAbortDirectScreenAccess::AbortNow() 
+    and similar methods. DSA can be resumed by calling StartDirectScreenAccessL().
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void AbortDirectScreenAccess();
+
+    /**
+    Indicates whether playback is proceeding. This method can be used to check whether playback was 
+    paused or not in response to a new clipping region or DSA abort.
+
+    @return "ETrue if video is still being played (even if not necessarily displayed)."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    TBool IsPlaying();
+
+    /**
+    Re-draws the latest video picture. Only available when DSA is being used. If DSA is aborted or a 
+    non-supported clipping region has been set, the request may be ignored.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void Redraw();
+
+
+    /**
+    Starts video playback, including decoding, post-processing, and rendering. Playback will proceed 
+    until it has been stopped or paused, or the end of the bitstream is reached.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void Start();
+
+    /**
+    Stops video playback. No new pictures will be decoded, post-processed, or rendered.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void Stop();
+
+    /**
+    Pauses video playback, including decoding, post-processing, and rendering. No pictures will be 
+    decoded, post-processed, or rendered until playback has been resumed.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void Pause();
+
+    /**
+    Resumes video playback after a pause.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void Resume();
+
+    /**
+    Changes to a new decoding and playback position, used for randomly accessing (seeking) the 
+    input stream. The position change flushes all input and output buffers. Pre-decoder and 
+    post-decoder buffering are handled as if a new bitstream was being decoded. If the device still
+    has buffered pictures that precede the new playback position, they will be discarded. If playback
+    is synchronized to a clock source, the client is responsible for setting the clock source to the 
+    new position.
+    
+    @param "aPlaybackPosition" "The new playback position in the video stream."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition);
+
+    /**
+    Freezes a picture on the screen. After the picture has been frozen, no new pictures are 
+    displayed until the freeze is released with ReleaseFreeze(). If the device output is being 
+    written to memory buffers or to another plug-in, instead of the screen, no decoded pictures 
+    will be delivered while the freeze is active, and they are simply discarded.
+
+    @param "aTimestamp" "The presentation timestamp of the picture to freeze. The frozen picture 
+                        will be the first picture with a timestamp greater than or equal to this 
+                        parameter."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void FreezePicture(const TTimeIntervalMicroSeconds& aTimestamp);
+
+    /**
+    Releases a picture frozen with FreezePicture().
+
+    @param "aTimestamp" "The presentation timestamp of the picture to release. The first picture 
+                        displayed after the release will be the first picture with a timestamp 
+                        greater than or equal to this parameter. To release the freeze immediately, 
+                        set the timestamp to zero."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void ReleaseFreeze(const TTimeIntervalMicroSeconds& aTimestamp);
+
+
+    /**
+    Returns the current playback position, i.e. the timestamp for the most recently displayed or 
+    virtually displayed picture. If the device output is written to another device, the most recent 
+    output picture is used.
+
+    @return "Current playback position."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    TTimeIntervalMicroSeconds PlaybackPosition();
+
+    /**
+    Returns the total amount of memory allocated for uncompressed pictures. This figure only 
+    includes the pictures actually allocated by the plug-in itself, so that the total number of 
+    bytes allocated in the system can be calculated by taking the sum of the values from all plug-ins.
+
+    @return "Total number of bytes of memory allocated for uncompressed pictures."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    TUint PictureBufferBytes();
+
+    /**
+    Reads various counters related to decoded pictures. The counters are reset when Initialize() 
+    or this method is called, and thus they only include pictures processed since the last call.
+
+    Post-processor devices return the number of input pictures in iPicturesDecoded and 
+    iTotalPictures. If the decoded pictures are written to another plug-in, they are considered 
+    to be "virtually displayed".
+
+    @param "aCounters" "The counter structure to fill."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void GetPictureCounters(CMMFDevVideoPlay::TPictureCounters& aCounters);
+
+
+    /**
+    Sets the computational complexity level to use. If separate complexity levels are not available, 
+    the method call is ignored. If the level specified is not available, the results are undefined. 
+    Typically the device will either ignore the request or use the nearest suitable level.
+
+    The complexity level can be changed at any point during playback.
+
+    @param "aLevel" "The computational complexity level to use. Level zero (0) is the most complex 
+                    one, with the highest quality. Higher level numbers require less processing 
+                    and may have lower quality."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void SetComplexityLevel(TUint aLevel);
+
+    /**
+    Gets the number of complexity levels available.
+    
+    @return "The number of complexity control levels available, or zero if the information is not 
+            available yet. The information may not be available if the number of levels depends on 
+            the input data, and enough input data has not been read yet. In that case, using level 
+            zero is safe."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    TUint NumComplexityLevels();
+
+    /**
+    Gets information about a computational complexity level. This method can be called after 
+    NumComplexityLevels() has returned a non-zero value - at that point the information is guaranteed 
+    to be available. Some hardware device implementations may not be able to provide all values, 
+    in that case the values will be approximated.
+
+    @param "aLevel" "The computational complexity level to query. The level numbers range from zero 
+                    (the most complex) to NumComplexityLevels()-1."
+    @param "aInfo"  "The information structure to fill."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void GetComplexityLevelInfo(TUint aLevel, CMMFDevVideoPlay::TComplexityLevelInfo& aInfo);
+
+    /**
+    Returns a picture back to the device. This method is called by CMMFDevVideoPlay to return pictures 
+    from the client (after they have been written with NewPicture()), or by the output device when 
+    it has finished using a picture.
+
+    @param "aPicture" "The picture to return. The device can re-use the memory for the picture."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void ReturnPicture(TVideoPicture* aPicture);
+
+    /**
+    Gets a copy of the latest picture sent to output.
+
+    @param "aPictureData"   "Target picture. The memory for the picture must be allocated by the 
+                            caller, and initialized properly. The data formats must match the snapshot 
+                            format requested."
+    @param "aFormat"        "The picture format to use for the snapshot."
+
+    @return "ETrue if the snapshot was taken, EFalse if a picture is not available. The picture may not 
+            be available if decoding has not progressed far enough yet."
+
+    @leave  "The method will leave if an error occurs. Typical error codes used:
+            * KErrNotSupported - The requested data format or picture size is not supported, or the 
+            plug-in does not support snapshots."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+//  TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat) {return EFalse;};
+    TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat);
+
+    /**
+    When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete()
+    callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot 
+    request can be active at a time.
+
+    @param "aPictureData"           "Target picture. The memory for the picture must be allocated by 
+                                    the caller, and initialized properly. The data formats must match 
+                                    the snapshot format requested. The picture must remain valid until 
+                                    the snapshot has been taken or until the request has been cancelled 
+                                    with CancelTimedSnapshot()."
+    @param "aFormat"                "The picture format to use for the snapshot."
+    @param "aPresentationTimestamp" "Presentation timestamp for the picture to copy."
+
+    @leave  "The method will leave if an error occurs. Typical error codes used:
+            * KErrNotSupported - The requested data format or picture size is not supported or 
+            the plug-in does not support timed snapshots."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    //void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, 
+    //                        const TTimeIntervalMicroSeconds& aPresentationTimestamp){};
+    void GetTimedSnapshotL(TPictureData*, const TUncompressedVideoFormat&, const TTimeIntervalMicroSeconds&){};
+
+
+    /**
+    When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete()
+    callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot 
+    request can be active at a time.
+
+    @param "aPictureData"           "Target picture. The memory for the picture must be allocated by 
+                                    the caller, and initialized properly. The data formats must match 
+                                    the snapshot format requested. The picture must remain valid until 
+                                    the snapshot has been taken or until the request has been cancelled 
+                                    with CancelTimedSnapshot()."
+    @param "aFormat"                "The picture format to use for the snapshot."
+    @param "aPictureId"             "Picture identifier for the picture to copy."
+
+    @leave  "The method will leave if an error occurs. Typical error codes used:
+            * KErrNotSupported - The requested data format or picture size is not supported or 
+            the plug-in does not support timed snapshots."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+//    void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, 
+//                            const TPictureId& aPictureId){};
+    void GetTimedSnapshotL(TPictureData*, const TUncompressedVideoFormat&, const TPictureId& ){};
+
+    /**
+    Cancels a timed snapshot request.
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void CancelTimedSnapshot(){};
+
+    /**
+    Gets a list of the supported snapshot picture formats.
+
+    @param "aFormats" "An array for the result format list. The array must be created and destroyed by 
+    the caller."
+
+    @leave "This method may leave with one of the standard error codes."
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void GetSupportedSnapshotFormatsL(RArray<TUncompressedVideoFormat>&){};
+
+
+    /**
+
+    Notifies the hardware device that the end of input data has been reached and no more input data 
+    will be written. The hardware device can use this signal to ensure that the remaining data gets 
+    processed, without waiting for new data. For example when the data type is not EDuCodedPicture,
+    calling this method is necessary otherwise a hardware device implementation might be looking for 
+    the start code for the next picture to ensure it has a complete picture before starting to decode
+    the previous one. 
+    
+      
+    After the remaining data has been processed (and displayed, if applicable), the hardware 
+    device must notify the proxy with the MdvppStreamEnd() callback.
+
+    DevVideo clients are encouraged to call this method, but its use is not mandatory for synchronized
+    processing.  For synchronized playback, all video pictures are processed or discarded according to 
+    their timestamps, and so the client can easily infer when processing is complete.  However, it 
+    should be noted that the last picture might not be displayed if this method is not called and the 
+    input data type is not EDuCodedPicture.
+
+    For non-synchronized playback (e.g. file conversion), a client must call this method otherwise it
+    will never find out when the hardware device has finished processing the data.
+    
+    @pre    "This method can only be called after the hwdevice has been initialized with Initialize()."
+    */
+    void InputEnd();
+
+    /**
+    Retrieves a custom interface to the device.
+    @param  "aInterface"    "Interface UID, defined with the custom interface."
+    @return "Pointer to the interface implementation, or NULL if the device does not 
+            implement the interface requested. The return value must be cast to the 
+            correct type by the user."
+    */
+    TAny* CustomInterface(TUid aInterface);  
+    
+    // === MNGAPostProcSessionManagerObserver ===
+    /**
+    Set the proxy implementation to be used. Called just after the object is constructed.
+    @param  "aProxy"    "The proxy to use."
+    */
+    void BufferAvailable(TInt aBufId, TInt aStatus);
+    
+public: 
+
+    // === MMmfVideoBufferManagement ===
+    
+    /** 
+     * Sets the observer object to use. The observer gets notified
+     * when new buffers are available and when buffers need to be
+     * released back to the media device.
+     *
+     * This method can only be called before the media device has
+     * been Initialized with InitializeL().
+     * 
+     * @param aObserver The observer object to use.
+     */
+    void MmvbmSetObserver(MMmfVideoBufferManagementObserver* aObserver);
+    
+    /** 
+     * Enables input buffer management mode. In buffer management mode
+     * the target media device allocates memory for input buffers and
+     * the client can only use input buffers allocated with
+     * MmvbmGetBufferL().
+     *
+     * This method can only be called before the media device has been
+     * Initialized with InitializeL(). This method must be called if
+     * the client uses MmvbmGetBufferL().
+     * 
+     * @param aEnable ETrue if input buffer management mode is used.
+     */
+    void MmvbmEnable(TBool aEnable);
+    
+    /** 
+     * Sets the buffer options to use. The client can request the
+     * number of input buffers that should be available, but typically
+     * only few (one or two) buffers can be used.
+     *
+     * This method can only be called before the media device has been
+     * Initialized with InitializeL().
+     * 
+     * @param aOptions The buffer options to use, see TBufferOptions.
+     *
+     * @leave KErrNotSupported The requested buffer options are not
+     *   supported. Typically the client has requested too many input
+     *   buffers.
+     */
+    void MmvbmSetBufferOptionsL(const TBufferOptions& aOptions);
+    
+    /** 
+     * Gets the buffer options currently in use.
+     *
+     * This method can only be called before the media device has been
+     * Initialized with InitializeL().
+     * 
+     * @param aOptions Target buffer options data structure.
+     */
+    void MmvbmGetBufferOptions(TBufferOptions& aOptions);
+    
+    /** 
+     * Gets a new input picture buffer. The client can then write data
+     * into the buffer and write it back to the media device with
+     * WritePictureL().
+     *
+     * This method can only be called after the media device has been
+     * Initialized with InitializeL(). This method can only be called
+     * in buffer management mode, i.e. if the client has called
+     * MmvbmEnable(ETrue).
+     *
+     * Note that target-allocated and client-allocated input buffers
+     * cannot be mixed. In buffer management mode only input buffers
+     * allocated with this method can be sent to the media device.
+     *
+     * If a client has retrieved buffers with MmvbmGetBufferL(), it
+     * must be prepated to release them synchronously at any point if
+     * MmmfBufferManagementObserver::MmvbmoReleaseBuffers() is
+     * called. This may happen if the target media device suddenly
+     * loses access to the buffers due to DSA abort, resource
+     * management conflict, or media device destruction.
+     * 
+     * @param aSize The requested buffer size, in pixels. The buffer
+     *   size should match the picture size set at initialisation phase,
+     *   or otherwise suitable buffer may not be available. If the size
+     *   is smaller than the size set at initialisation phase, the
+     *   allocated buffer may be larger than requested.
+     * 
+     * @return A new input picture buffer. If no free buffers are
+     * available, the return value is NULL.
+     *
+     * @leave General The method will leave if an error occurs. Lack
+     * of free buffers is not considered an error.
+     */
+    TVideoPicture* MmvbmGetBufferL(const TSize& aSize);
+    
+    /** 
+     * Releases an input buffer back to the media device without using
+     * it. This method is mainly used as a response to a
+     * MmvbmReleaseBuffers() callback.
+     * 
+     * @param aBuffer The buffer to release.
+     */
+    void MmvbmReleaseBuffer(TVideoPicture* aBuffer);    
+    
+public:
+    
+     // === MMMFVideoSurfaceSupport ===
+    
+	/** 
+    Requests the media device to use graphics surfaces for video rendering. 
+    The client must call this method before Initialize() to ensure the media 
+    device allocates the right types of resources for rendering.
+    */
+    void MmvssUseSurfaces();
+         
+    /** 
+    Sets a new video surface support observer to receive surface management events 
+    from the media device.
+     
+    @param aObserver New observer object to use.
+    */
+    void MmvssSetObserver(MMMFVideoSurfaceObserver& aObserver);
+    
+    /** 
+    Retrieves surface parameters for a display. The client typically calls this in response 
+    to a MmvsoSurfaceCreated() or MmvsoSurfaceParametersUpdated() observer callback.
+     
+    @param  aSurfaceId
+	        Surface ID for the display.
+	@param  aCropRect
+	        Cropping rectangle within the surface. The crop rectangle identifies the area of 
+	        the surface that should be shown on the screen.
+	@param  aPixelAspectRatio
+	        Video picture pixel aspect ratio.
+
+	@leave KErrNotReady if no surface is available for the display.
+    */
+    
+    void MmvssGetSurfaceParametersL(TSurfaceId& aSurfaceId, TRect& aCropRect, 
+    					TVideoAspectRatio& aPixelAspectRatio);
+    /** 
+    Indicates that the surface is no longer in use and can be destroyed. The client typically calls
+    this in response to MmvsoSurfaceCreated() (while old surface is already in use and the current
+    should be removed) or MmvsoRemoveSurface() observer callback.  
+         
+    @param aSurfaceId Surface ID that is no longer in use
+    
+    @leave KErrNotFound if the surface does not exist
+    */
+    void MmvssSurfaceRemovedL(const TSurfaceId& aSurfaceId);    
+
+public:    
+
+    // === MMmfVideoPropertiesObserver ===
+    
+    /** 
+    Decoded video properties updated. The media device implementing the
+    MMmfVideoPropertiesNotifier extension will call this method immediately
+    before outputting a picture with the updated properties.
+    
+    When the extension is used between a decoder and a post-processor media
+    device, the post-processor can associate the changed properties with the
+    correct picture, since the next incoming picture after this call will
+    be the first updated one. 
+    
+    When the extension is used between a DevVideoPlay client and a
+    post-processor media device, the client can synchronously reconfigure
+    video display options using SetScaleOptionsL() and related methods. This
+    lets the client reconfigure the display for the correct picture.
+    
+    @param aYuvFormat Updated YUV format parameters. The updated fields are
+                      iAspectRatioDenom, iAspectRatioNum, and iCoefficients     
+    @param aPictureSize	Updated picture size. This size will be the true
+                       	picture display size, excluding any padding that
+                       	the codec might use.
+    */
+    virtual void MmvpoUpdateVideoProperties(const TYuvFormat& aYuvFormat, const TSize& aPictureSize);
+    
+public:
+
+    // === MMmfVideoResourceObserver ===
+    
+    /** 
+    Indicates that a media device has lost its resources. The client must
+    synchronously pause or stop processing before returning from this method
+    so that the media device can release its resources to the system. If
+    the client does not pause or stop, resource loss will be handled as a
+    fatal error.
+     
+    The client may start again or resume after receiving a
+    MvroResourcesRestored() callback.
+     
+    @param aMediaDevice UID for the media device that lost resources. The
+                        client can use this e.g. to determine whether the
+                        decoder or the post-processor lost resources. This
+                        is typically not required though since the client
+                        must pause DevVideo entirely.
+    */
+    virtual void MmvroResourcesLost(TUid aMediaDevice);
+
+    /** 
+    Indicates that a media device has regained its resources after a
+    previous resource loss. The client can restart or resume processing.
+    This can be done either synchronously or asynchronously.
+     
+    @param aMediaDevice UID for the media device that regained resources.
+    */
+    virtual void MmvroResourcesRestored(TUid aMediaDevice);
+            
+    
+    // === MMmfVideoSurfaceHandleControl ===
+    
+    /** 
+    Sets an external surface ID. This should be called as soon as external surface is created.    
+     
+    @param aSurfaceID external surface ID.
+        
+    */
+    
+    virtual void MmvshcSetSurfaceHandle(const TSurfaceId& aSurfaceHandle);
+    
+    /** 
+    Sets a redraw buffer to be used during resource loss.    
+     
+    @param aRedrawBuffer redraw buffer.
+        
+    */
+     virtual void MmvshcRedrawBufferToSurface(TPtrC8& aRedrawBuffer);
+     
+     /**
+      * Creates a surface and maps the surface with the chunk handle passed in.
+      * @param aAttributes
+      * @param aHandle is the Chunk handle for the data.
+      * @param aSurfaceId returns the surfaceId that was just created
+      * 
+      * @return error code
+      */
+         
+     virtual TInt MmvshcCreateSurface(const RSurfaceManager::TSurfaceCreationAttributes& aAttributes, TInt aHandle, TSurfaceId& aSurfaceId);
+   
+public:
+	// === MMmfVideoPropertiesNotifier ===
+    /** 
+    Sets a new video properties observer. This method can be called at any
+    time after the media device has been instantiated.
+     
+    @param aObserver New observer object.
+    */
+    virtual void MmvpnSetObserver(MMmfVideoPropertiesObserver* aObserver);
+
+public:
+	
+	void ReturnPicToDecoder(TVideoPicture* aPic);
+	TInt AttemptToPost();
+	
+public:
+    //=== MMdfTrickPlayControl === =     
+    /**        
+     * Query the Direction capabilities from the MDF decoders and       
+     * post processor.       
+     *        
+    */       
+    virtual void MmvprcGetPlayRateCapabilitiesL(TVideoPlayRateCapabilities& aCapabilities);
+
+    /**       
+     * Sets the playback speed. A negative rate means play backward.       
+     * +/- percentage.       
+     *        
+     */       
+    virtual void MmvprcSetPlayRateL(const TInt aRate);
+
+    /**       
+     * Gets the playback speed. A negative rate means play backward.       
+     * +/- percentage.       
+     *        
+     */       
+    virtual TInt MmvprcPlayRateL();
+
+    /**       
+     * Sets the step frame number in frame step mode       
+     * +/- frames       
+     */       
+    virtual void MmvprcStepFrameL(const TInt aStep);
+
+    /**       
+     * Registers the observer       
+     */       
+    virtual void MmvprcSetObserver(MMmfVideoPlayRateObserver& aObserver); 
+
+public: 
+     
+    // === MMmfVideoSecureOutput ===
+    /**
+     * Notifies the media device if the content can only be sent to a
+     * secure output. The device display is typically considered a
+     * secure output, but a high-quality unprotected analog or digital
+     * video output connector is not. By default all content can be
+     * sent to both secure and insecure outputs.
+     *
+     * This method can only be called before the media device has been
+     * initialised with InitializeL().
+     *
+     * @param aSecure Set to ETrue if the content can only be sent to
+     *     a secure output, EFalse if both secure and unsecure outputs can
+     *     be used.
+     *
+     * @leave KErrNotSupported Insecure outputs cannot be
+     * disabled. The client should not play protected content.
+     */    
+     virtual void MmvsoSetSecureOutputL(TBool aSecure);
+
+public:
+     //=== AdvancedVideoSecureOutput === =     
+     virtual void MmavsoSetAllowedOutputL(TUint aAllowedOutputMask);
+    
+public:
+     // === MMmfPostInitializeRequest ===
+     virtual void MmpirPostInitializeRequest(MMmfPostInitializeResponse& aResponse);
+     
+protected: 
+
+    // === CMMFVideoPostProcHwDevice ===
+    /**
+    Set the proxy implementation to be used. Called just after the object is constructed.
+    @param  "aProxy"    "The proxy to use."
+    */
+    void SetProxy(MMMFDevVideoPlayProxy& aProxy);
+    
+protected:
+
+    /**
+     *  Symbian 2nd phase constructor .
+     */
+    void ConstructL();
+    
+private:    
+	TInt IsTimeToPost(TVideoPicture* frame, TInt64& delta);
+	TVideoPicture* CreateBuffersL(TInt aBufId);
+    void CreateVBMBuffersL();
+    TInt SetupExternalSurface(const TSurfaceId &aSurfaceID);
+    void ReleaseInputQ();
+    void ReleaseProcessQ();
+    void ReleasePicture(TVideoPicture *pic);
+    void PublishSurfaceCreated();
+    void PublishSurfaceUpdated();
+    TInt SetupSurface();
+    void SetSurfaceAttributes(const TSize& aSize, TInt aNumBuf);
+    TInt GetID(TVideoPicture *aPicture);
+    TInt GetExternalBufferID(TVideoPicture *aPicture);
+    TInt RegisterSurface(const TSurfaceId& aSurfaceId);
+    TInt IsGceReady();
+    void SetTimer(TInt64 aDelta);
+    TInt ConvertPostProcBuffer(TVideoPicture* pSrc, TVideoPicture* pDest);
+    void AddPictureToVBMQ(TVideoPicture *pic);
+    void AddPictureToColorConversionQ(TVideoPicture *pic);
+    void ResetCountingBuffer();
+    void PicturesSkipped();
+    TVideoPicture* DoColorConvert(TVideoPicture* aPicture);
+
+    /**       
+     Adds a picture to the Input queue. Based on the timestamp of the picture,
+     it is either appeneded at the end of the queue or inserted at the 
+     appropriate position. The queue is arranged in the ascending order. 
+     The ret value indicates if the head of the queue was changed or not.         
+    */  
+    TInt AddToQ(TVideoPicture* aPicture);
+    
+    /**       
+     Removes a picture from Input queue based on the playrate.
+     If the playrate is +ve ie forward playback head will be removed
+     and if the playrate is -ve ie backward playback tail
+     will be removed.         
+    */  
+    void RemoveFromQ();
+    
+    /**       
+     Returns a picture from Input queue based on the playrate.
+     If the playrate is +ve ie forward playback head will be returned
+     and if the playrate is -ve ie backward playback tail  
+     will be returned.       
+    */  
+    TVideoPicture* PeekQ();
+
+    /**
+    Adds a surface hint to a video surface. If there is any hint already added, 
+    the surface is updated with the new hint. 
+    */		
+    TInt AddHints();
+    
+	#ifdef _DUMP_YUV_FRAMES
+    void captureYuv(TVideoPicture* aPicture);
+    #endif
+    
+    TInt SetSourceFormat();
+    TInt SetSourceRange();
+    TInt ColorConvert(tBaseVideoFrame* aInputFrame, TUint8* aDestPtr, tWndParam* aInputCropWindow, tWndParam* aOutputCropWindow);
+
+private:
+
+    //
+    // C++ default constructor.  
+    //
+    CNGAPostProcHwDevice();
+
+    //
+    // State of post processor
+    //
+    enum TPPState
+    {
+        EInitializing,
+        EInitialized,
+        EPlaying,
+        EPaused,
+        EStopped
+    };
+    
+    enum TTimeToPost
+    {
+        ESkipIt = -1,
+        EPostIt = 0,
+        EDelayIt = 1,
+    };
+    
+private: 
+
+    MMMFDevVideoPlayProxy*      				iProxy;															
+    CMMFVideoDecodeHwDevice*    				iInputDecoderDevice;															
+    RArray<TVideoPicture*>              		iInputQ;															
+    RArray<TVideoPicture*>              		iProcessQ;															
+    MMMFClockSource*            				iClockSource;															
+    TTimeIntervalMicroSeconds					iCurrentPlaybackPosition;															
+    TPPState        							iPPState;															
+    CNGAPostProcSurfaceHandler*					iSurfaceHandler;
+    CNGAPostProcSessionManager*					iSessionManager;
+	
+	RSurfaceManager::TSurfaceCreationAttributesBuf	iAttributes;
+	RChunk										iChunk;
+	RSurfaceManager::TInfoBuf 					iInfo;
+	TSurfaceId									iSurfaceId;
+	TBool           							iIsInputEnded;
+	CNGAPostProcTimer*							iPostingTimer;
+	CMMFDevVideoPlay::TPictureCounters  		iPictureCounters;
+	TBool 										iFirstPictureUpdated;
+	TBool 										iUsingExternalSurface;
+    TBool           							iIsColorConversionNeeded;
+    RArray<TVideoPicture*>              		iColorConversionQ;
+    TBool 										iSurfaceCreatedEventPublished;
+    TInt                                		iOverflowPictureCounter;
+    TInt 								    	iVideoFrameBufSize;	
+    TBool 										iResourceLost;
+    TBool 										iRedrawDone;
+	// Flag to indicate that the redraw surface has been created, and
+	// can be used in a subsequent call ro Redraw()
+	TBool										iRedrawSurfaceInUse;
+
+    //-- members for buffer management --
+    MMmfVideoBufferManagementObserver*  		iVBMObserver;
+    TBufferOptions                      		iVBMBufferOptions;
+    RArray<TVideoPicture*>              		iVBMBufferReferenceQ;
+    RArray<TVideoPicture*>              		iVBMBufferQ;
+    TBool                               		iVBMEnabled;
+    RArray<TUncompressedVideoFormat>    		iSupportedInputFormats;
+    TInt										count;
+    
+    //-- members for Surface Hints --
+    RSurfaceManager::THintPair					iHint;
+    TUint 										iSurfaceMask;
+    TUid										iSurfaceKey;
+            
+    //-- members for Surface support --
+    MMMFVideoSurfaceObserver*					iVideoSurfaceObserver;
+	MMmfVideoPropertiesObserver*				iVPObserver;
+	RWsSession									iWsSession;
+	TSize										iPicSize;
+	TUint										iAspectRatioNum;
+	TUint										iAspectRatioDenom;
+	//-- members for Trickplay support --
+	TInt                                iStepFrameCount;
+    TInt                                iPlayRate;       
+    TBool                               iKeyFrameMode;       
+    MMmfVideoPlayRateObserver*          iFPObserver;       
+    TUint8                              iSkippedFramesCountingBuffer[64];       
+    TUint8                              iSkippedFramesInLast64Frames;       
+    TUint8                              iCurrentPosInFramesCountingBuffer; 
+	TUncompressedVideoFormat 			iVideoFormat;
+        //---------- utility variables -------
+	// Image source format
+	TUint8 								iSourceFormat;
+
+	//Image range
+	TUint8		 						iSourceRange;
+
+    //-- members for PostInitializeRequest support --
+    MMmfPostInitializeResponse* iPostInitializeResponse;
+    TBool iIsExternalChunk;
+};    
+
+/**
+ * Timer of Posting
+ */
+
+class CNGAPostProcTimer: public CTimer
+    {
+public:
+    static CNGAPostProcTimer* NewL( CNGAPostProcHwDevice& aParent );
+    ~CNGAPostProcTimer();
+    
+protected:    
+    void RunL();
+    
+private:
+    CNGAPostProcTimer( CNGAPostProcHwDevice& aParent );
+    void ConstructL();
+    
+private:
+    CNGAPostProcHwDevice& iParent;
+};
+
+#endif //__NGAPOSTPROCHWDEVICE_H__
+