williamr@2: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #ifndef __VIDEOPLAYHWDEVICE_H__ williamr@2: #define __VIDEOPLAYHWDEVICE_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: /** williamr@2: A base class for all video playback (decoder and post-processor) hardware devices. williamr@2: Since both decoders and post-processors can implement post-processing functionality, williamr@2: this class includes all post-processing related methods. The main difference between decoder williamr@2: and post-processor devices is that decoders can input coded data and write decoded pictures williamr@2: to another device, while post-processor devices can accept decoded pictures from the client williamr@2: or from another device. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CMMFVideoPlayHwDevice : public CMMFVideoHwDevice williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Retrieves post-processing information about this hardware device. williamr@2: The device creates a CPostProcessorInfo structure, fills it with correct data, pushes it williamr@2: to the cleanup stack and returns it. The client will delete the object when it is no williamr@2: longer needed. williamr@2: williamr@2: @return "Post-processor information as a CPostProcessorInfo object. williamr@2: The object is pushed to the cleanup stack, and must be deallocated by the caller." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: */ williamr@2: virtual CPostProcessorInfo* PostProcessorInfoLC() = 0; williamr@2: williamr@2: /** williamr@2: Retrieves the list of the output formats that the device supports. The list is ordered in williamr@2: plug-in preference order, with the preferred formats at the beginning of the list. The list williamr@2: can depend on the device source format, and therefore SetSourceFormatL() must be called before williamr@2: calling this method. williamr@2: williamr@2: @param "aFormats" "An array for the result format list. The array must be created and destroyed by the caller." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method may only be called before the hwdevice has been initialized using Initialize()." williamr@2: */ williamr@2: virtual void GetOutputFormatListL(RArray& aFormats) = 0; williamr@2: williamr@2: /** williamr@2: Sets the device output format. williamr@2: williamr@2: @param "aFormat" "The format to use." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method may only be called before the hwdevice has been initialized using Initialize()." williamr@2: */ williamr@2: virtual void SetOutputFormatL(const TUncompressedVideoFormat &aFormat) = 0; williamr@2: williamr@2: /** williamr@2: Sets the clock source to use for video timing. If no clock source is set. video playback williamr@2: will not be synchronized, but will proceed as fast as possible, depending on input data williamr@2: and output buffer availability. williamr@2: williamr@2: @param "aClock" "The clock source to be used." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetClockSource(MMMFClockSource* aClock) = 0; williamr@2: williamr@2: /** williamr@2: Sets the device video output destination. The destination can be the screen (using direct williamr@2: screen access) or memory buffers. By default memory buffers are used. If data is written williamr@2: to another device, this method is ignored, and suitable memory buffers are always used. williamr@2: williamr@2: @param "aScreen" "True if video output destination is the screen, false if memory buffers." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetVideoDestScreenL(TBool aScreen) = 0; williamr@2: williamr@2: /** williamr@2: Sets the post-processing types to be used. williamr@2: williamr@2: @param "aPostProcCombination" "The post-processing steps to perform, a bitwise OR of values from TPostProcessType." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetPostProcessTypesL(TUint32 aPostProcCombination) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing options for input (pan-scan) cropping. williamr@2: williamr@2: @param "aRect" "The cropping rectangle to use." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetInputCropOptionsL(const TRect& aRect) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing options for YUV to RGB color space conversion. williamr@2: Specifies the input YUV and output RGB formats to use explicitly. SetSourceFormatL(), williamr@2: SetOutputFormatL(), and SetPostProcessTypesL() must be called before this method is used. williamr@2: williamr@2: @param "aOptions" "The conversion options to use." williamr@2: @param "aYuvFormat" "Conversion source YUV format" williamr@2: @param "aRgbFormat" "Conversion target RGB format" williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions, const TYuvFormat& aYuvFormat, TRgbFormat aRgbFormat) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing options for YUV to RGB color space conversion. williamr@2: Uses the device input and output formats. For decoder devices the default YUV format used is williamr@2: the format specified in the input bitstream. SetSourceFormatL(), SetOutputFormatL(), and williamr@2: SetPostProcessTypesL() must be called before this method is used. williamr@2: williamr@2: @param "aOptions" "The conversion options to use." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing options for rotation. SetPostProcessTypesL() must be called before williamr@2: this method is used. williamr@2: williamr@2: @param "aRotationType" "The rotation to perform." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetRotateOptionsL(TRotationType aRotationType) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing options for scaling. SetPostProcessTypesL() must be called before williamr@2: this method is used. williamr@2: williamr@2: @param "aTargetSize" "Scaling target size. If a fixed scale factor size is used, williamr@2: the new dimensions must be set to width=floor(factor*width), williamr@2: height=floor(factor*height). For example, scaling a williamr@2: QCIF (176x144) picture up by a factor of 4/3 yields a size williamr@2: of 234x192." williamr@2: @param "aAntiAliasFiltering" "True if anti-aliasing filtering should be used. williamr@2: If the post-processor does not support anti-aliased scaling, williamr@2: or supports anti-aliased scaling only, this argument is ignored." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetScaleOptionsL(const TSize& aTargetSize, TBool aAntiAliasFiltering) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing options for output cropping. SetPostProcessTypesL() must be called before williamr@2: this method is used. williamr@2: williamr@2: @param "aRect" "Output cropping area." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetOutputCropOptionsL(const TRect& aRect) = 0; williamr@2: williamr@2: /** williamr@2: Sets post-processing plug-in specific options. SetPostProcessTypesL() must be called before williamr@2: this method is used. williamr@2: williamr@2: @param "aOptions" "The options. The format is plug-in specific." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can be called either before or after the hwdevice has been initialized with Initialize(). williamr@2: If called after initialization, the change must only be committed when CommitL() is called." williamr@2: */ williamr@2: virtual void SetPostProcSpecificOptionsL(const TDesC8& aOptions) = 0; williamr@2: williamr@2: /** williamr@2: Initializes the device. This method is asynchronous, the device will call williamr@2: MMFVideoPlayProxy::MdvppInitializeComplete() after initialization has completed. After this williamr@2: method has successfully completed, further configuration changes are not possible except where williamr@2: separately noted. williamr@2: */ williamr@2: virtual void Initialize() = 0; williamr@2: williamr@2: /** williamr@2: Commit all changes since the last CommitL(), Revert() or Initialize() williamr@2: to the hardware device. This only applies to methods which can be called both williamr@2: before AND after DevVideoPlay has been initialized. williamr@2: williamr@2: @see SetPostProcessTypesL williamr@2: @see SetInputCropOptionsL williamr@2: @see SetYuvToRgbOptionsL williamr@2: @see SetRotateOptionsL williamr@2: @see SetScaleOptionsL williamr@2: @see SetOutputCropOptionsL williamr@2: @see SetPostProcSpecificOptionsL williamr@2: williamr@2: @leave "The method will leave if an error occurs." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void CommitL() = 0; williamr@2: williamr@2: /** williamr@2: Revert all changes since the last CommitL(), Revert() or Initialize() williamr@2: back to their previous settings. This only applies to methods which can williamr@2: be called both before AND after DevVideoPlay has been initialized. williamr@2: williamr@2: @see SetPostProcessTypesL williamr@2: @see SetInputCropOptionsL williamr@2: @see SetYuvToRgbOptionsL williamr@2: @see SetRotateOptionsL williamr@2: @see SetScaleOptionsL williamr@2: @see SetOutputCropOptionsL williamr@2: @see SetPostProcSpecificOptionsL williamr@2: williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void Revert() = 0; williamr@2: williamr@2: /** williamr@2: Starts writing output directly to the display frame buffer using Direct Screen Access. williamr@2: williamr@2: @param "aVideoRect" "The video output rectangle on screen." williamr@2: @param "aScreenDevice" "The screen device to use. The screen device object must be valid in the current thread." williamr@2: @param "aClipRegion" "Initial clipping region to use." williamr@2: williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void StartDirectScreenAccessL(const TRect& aVideoRect, williamr@2: CFbsScreenDevice& aScreenDevice, const TRegion& aClipRegion) = 0; williamr@2: williamr@2: /** williamr@2: Sets a new clipping region for Direct Screen Access. After the method returns, no video will williamr@2: be drawn outside of the region. If clipping is not supported, or the clipping region is too williamr@2: complex, either playback will pause or will resume without video display, depending on the williamr@2: current setting of SetPauseOnClipFail(), and the result can be verified with IsPlaying(). williamr@2: Clipping can be disabled by setting a new clipping region that includes the whole video window. williamr@2: williamr@2: @param "aRegion" "The new clipping region. After the method returns, no video will be drawn outside the region." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetScreenClipRegion(const TRegion& aRegion) = 0; williamr@2: williamr@2: /** williamr@2: Sets whether the system should pause playback when it gets a clipping region it cannot handle, williamr@2: or Direct Screen Access is aborted completely. If not, processing will proceed normally, but no williamr@2: video will be drawn. By default, playback is paused. williamr@2: williamr@2: @param "aPause" "True if playback should be paused when clipping fails, false if not. williamr@2: If playback is not paused, it will be continued without video display." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetPauseOnClipFail(TBool aPause) = 0; williamr@2: williamr@2: /** williamr@2: Aborts Direct Screen Access completely, to be called from MAbortDirectScreenAccess::AbortNow() williamr@2: and similar methods. DSA can be resumed by calling StartDirectScreenAccessL(). williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void AbortDirectScreenAccess() = 0; williamr@2: williamr@2: /** williamr@2: Indicates whether playback is proceeding. This method can be used to check whether playback was williamr@2: paused or not in response to a new clipping region or DSA abort. williamr@2: williamr@2: @return "ETrue if video is still being played (even if not necessarily displayed)." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TBool IsPlaying() = 0; williamr@2: williamr@2: /** williamr@2: Re-draws the latest video picture. Only available when DSA is being used. If DSA is aborted or a williamr@2: non-supported clipping region has been set, the request may be ignored. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void Redraw() = 0; williamr@2: williamr@2: williamr@2: /** williamr@2: Starts video playback, including decoding, post-processing, and rendering. Playback will proceed williamr@2: until it has been stopped or paused, or the end of the bitstream is reached. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void Start() = 0; williamr@2: williamr@2: /** williamr@2: Stops video playback. No new pictures will be decoded, post-processed, or rendered. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void Stop() = 0; williamr@2: williamr@2: /** williamr@2: Pauses video playback, including decoding, post-processing, and rendering. No pictures will be williamr@2: decoded, post-processed, or rendered until playback has been resumed. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void Pause() = 0; williamr@2: williamr@2: /** williamr@2: Resumes video playback after a pause. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void Resume() = 0; williamr@2: williamr@2: /** williamr@2: Changes to a new decoding and playback position, used for randomly accessing (seeking) the williamr@2: input stream. The position change flushes all input and output buffers. Pre-decoder and williamr@2: post-decoder buffering are handled as if a new bitstream was being decoded. If the device still has buffered williamr@2: pictures that precede the new playback position, they will be discarded. If playback is williamr@2: synchronized to a clock source, the client is responsible for setting the clock source to the williamr@2: new position. williamr@2: williamr@2: @param "aPlaybackPosition" "The new playback position in the video stream." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition) = 0; williamr@2: williamr@2: /** williamr@2: Freezes a picture on the screen. After the picture has been frozen, no new pictures are williamr@2: displayed until the freeze is released with ReleaseFreeze(). If the device output is being williamr@2: written to memory buffers or to another plug-in, instead of the screen, no decoded pictures williamr@2: will be delivered while the freeze is active, and they are simply discarded. williamr@2: williamr@2: @param "aTimestamp" "The presentation timestamp of the picture to freeze. The frozen picture williamr@2: will be the first picture with a timestamp greater than or equal to this williamr@2: parameter." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void FreezePicture(const TTimeIntervalMicroSeconds& aTimestamp) = 0; williamr@2: williamr@2: /** williamr@2: Releases a picture frozen with FreezePicture(). williamr@2: williamr@2: @param "aTimestamp" "The presentation timestamp of the picture to release. The first picture williamr@2: displayed after the release will be the first picture with a timestamp williamr@2: greater than or equal to this parameter. To release the freeze immediately, williamr@2: set the timestamp to zero." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void ReleaseFreeze(const TTimeIntervalMicroSeconds& aTimestamp) = 0; williamr@2: williamr@2: williamr@2: /** williamr@2: Returns the current playback position, i.e. the timestamp for the most recently displayed or williamr@2: virtually displayed picture. If the device output is written to another device, the most recent williamr@2: output picture is used. williamr@2: williamr@2: @return "Current playback position." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TTimeIntervalMicroSeconds PlaybackPosition() = 0; williamr@2: williamr@2: /** williamr@2: Returns the total amount of memory allocated for uncompressed pictures. This figure only williamr@2: includes the pictures actually allocated by the plug-in itself, so that the total number of williamr@2: bytes allocated in the system can be calculated by taking the sum of the values from all plug-ins. williamr@2: williamr@2: @return "Total number of bytes of memory allocated for uncompressed pictures." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TUint PictureBufferBytes() = 0; williamr@2: williamr@2: /** williamr@2: Reads various counters related to decoded pictures. The counters are reset when Initialize() williamr@2: or this method is called, and thus they only include pictures processed since the last call. williamr@2: williamr@2: Post-processor devices return the number of input pictures in iPicturesDecoded and williamr@2: iTotalPictures. If the decoded pictures are written to another plug-in, they are considered williamr@2: to be "virtually displayed". williamr@2: williamr@2: @param "aCounters" "The counter structure to fill." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetPictureCounters(CMMFDevVideoPlay::TPictureCounters& aCounters) = 0; williamr@2: williamr@2: williamr@2: /** williamr@2: Sets the computational complexity level to use. If separate complexity levels are not available, williamr@2: the method call is ignored. If the level specified is not available, the results are undefined. williamr@2: Typically the device will either ignore the request or use the nearest suitable level. williamr@2: williamr@2: The complexity level can be changed at any point during playback. williamr@2: williamr@2: @param "aLevel" "The computational complexity level to use. Level zero (0) is the most complex williamr@2: one, with the highest quality. Higher level numbers require less processing williamr@2: and may have lower quality." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetComplexityLevel(TUint aLevel) = 0; williamr@2: williamr@2: /** williamr@2: Gets the number of complexity levels available. williamr@2: williamr@2: @return "The number of complexity control levels available, or zero if the information is not williamr@2: available yet. The information may not be available if the number of levels depends on williamr@2: the input data, and enough input data has not been read yet. In that case, using level williamr@2: zero is safe." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TUint NumComplexityLevels() = 0; williamr@2: williamr@2: /** williamr@2: Gets information about a computational complexity level. This method can be called after williamr@2: NumComplexityLevels() has returned a non-zero value - at that point the information is guaranteed williamr@2: to be available. Some hardware device implementations may not be able to provide all values, williamr@2: in that case the values will be approximated. williamr@2: williamr@2: @param "aLevel" "The computational complexity level to query. The level numbers range from zero williamr@2: (the most complex) to NumComplexityLevels()-1." williamr@2: @param "aInfo" "The information structure to fill." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetComplexityLevelInfo(TUint aLevel, CMMFDevVideoPlay::TComplexityLevelInfo& aInfo) = 0; williamr@2: williamr@2: /** williamr@2: Returns a picture back to the device. This method is called by CMMFDevVideoPlay to return pictures williamr@2: from the client (after they have been written with NewPicture()), or by the output device when williamr@2: it has finished using a picture. williamr@2: williamr@2: @param "aPicture" "The picture to return. The device can re-use the memory for the picture." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void ReturnPicture(TVideoPicture* aPicture) = 0; williamr@2: williamr@2: /** williamr@2: Gets a copy of the latest picture sent to output. williamr@2: williamr@2: @param "aPictureData" "Target picture. The memory for the picture must be allocated by the williamr@2: caller, and initialized properly. The data formats must match the snapshot williamr@2: format requested." williamr@2: @param "aFormat" "The picture format to use for the snapshot." williamr@2: williamr@2: @return "ETrue if the snapshot was taken, EFalse if a picture is not available. The picture may not williamr@2: be available if decoding has not progressed far enough yet." williamr@2: williamr@2: @leave "The method will leave if an error occurs. Typical error codes used: williamr@2: * KErrNotSupported - The requested data format or picture size is not supported, or the williamr@2: plug-in does not support snapshots." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat) = 0; williamr@2: williamr@2: /** williamr@2: When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete() williamr@2: callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot williamr@2: request can be active at a time. williamr@2: williamr@2: @param "aPictureData" "Target picture. The memory for the picture must be allocated by williamr@2: the caller, and initialized properly. The data formats must match williamr@2: the snapshot format requested. The picture must remain valid until williamr@2: the snapshot has been taken or until the request has been cancelled williamr@2: with CancelTimedSnapshot()." williamr@2: @param "aFormat" "The picture format to use for the snapshot." williamr@2: @param "aPresentationTimestamp" "Presentation timestamp for the picture to copy." williamr@2: williamr@2: @leave "The method will leave if an error occurs. Typical error codes used: williamr@2: * KErrNotSupported - The requested data format or picture size is not supported or williamr@2: the plug-in does not support timed snapshots." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, williamr@2: const TTimeIntervalMicroSeconds& aPresentationTimestamp) = 0; williamr@2: williamr@2: /** williamr@2: When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete() williamr@2: callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot williamr@2: request can be active at a time. williamr@2: williamr@2: @param "aPictureData" "Target picture. The memory for the picture must be allocated by williamr@2: the caller, and initialized properly. The data formats must match williamr@2: the snapshot format requested. The picture must remain valid until williamr@2: the snapshot has been taken or until the request has been cancelled williamr@2: with CancelTimedSnapshot()." williamr@2: @param "aFormat" "The picture format to use for the snapshot." williamr@2: @param "aPictureId" "Picture identifier for the picture to copy." williamr@2: williamr@2: @leave "The method will leave if an error occurs. Typical error codes used: williamr@2: * KErrNotSupported - The requested data format or picture size is not supported or williamr@2: the plug-in does not support timed snapshots." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, williamr@2: const TPictureId& aPictureId) = 0; williamr@2: williamr@2: /** williamr@2: Cancels a timed snapshot request. williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void CancelTimedSnapshot() = 0; williamr@2: williamr@2: /** williamr@2: Gets a list of the supported snapshot picture formats. williamr@2: williamr@2: @param "aFormats" "An array for the result format list. The array must be created and destroyed by williamr@2: the caller." williamr@2: williamr@2: @leave "This method may leave with one of the standard error codes." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetSupportedSnapshotFormatsL(RArray& aFormats) = 0; williamr@2: williamr@2: williamr@2: /** williamr@2: williamr@2: Notifies the hardware device that the end of input data has been reached and no more input data williamr@2: will be written. The hardware device can use this signal to ensure that the remaining data gets williamr@2: processed, without waiting for new data. For example when the data type is not EDuCodedPicture, williamr@2: calling this method is necessary otherwise a hardware device implementation might be looking for williamr@2: the start code for the next picture to ensure it has a complete picture before starting to decode williamr@2: the previous one. williamr@2: williamr@2: williamr@2: After the remaining data has been processed (and displayed, if applicable), the hardware williamr@2: device must notify the proxy with the MdvppStreamEnd() callback. williamr@2: williamr@2: DevVideo clients are encouraged to call this method, but its use is not mandatory for synchronized williamr@2: processing. For synchronized playback, all video pictures are processed or discarded according to williamr@2: their timestamps, and so the client can easily infer when processing is complete. However, it williamr@2: should be noted that the last picture might not be displayed if this method is not called and the williamr@2: input data type is not EDuCodedPicture. williamr@2: williamr@2: For non-synchronized playback (e.g. file conversion), a client must call this method otherwise it williamr@2: will never find out when the hardware device has finished processing the data. williamr@2: williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void InputEnd() = 0; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: CMMFVideoDecodeHwDevice is the MSL video decoder hardware device interface. williamr@2: All video decoders must implement this interface. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CMMFVideoDecodeHwDevice : public CMMFVideoPlayHwDevice williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Creates a new video decoder hardware device object, based on the implementation UID. williamr@2: williamr@2: @param "aUid" "Decoder implementation UID." williamr@2: @param "aProxy" "The proxy implementation to use." williamr@2: @return "A new CMMFVideoDecodeHwDevice object." williamr@2: @leave "This method may leave with one of the system-wide error codes. williamr@2: */ williamr@2: IMPORT_C static CMMFVideoDecodeHwDevice* NewL(TUid aUid, MMMFDevVideoPlayProxy& aProxy); williamr@2: williamr@2: /** williamr@2: Creates a new video decoder hardware device adapter object, based on the Implementation Information of a Processing Unit. williamr@2: williamr@2: @param "aImplInfo" "The registration data relating to the Interface Implementation of the Processing Unit." williamr@2: @param "aProxy" "The proxy implementation to use." williamr@2: @return "A new CMMFVideoDecodeHwDevice object." williamr@2: @leave "This method will leave if an error occurs." williamr@2: */ williamr@2: IMPORT_C static CMMFVideoDecodeHwDevice* NewPuAdapterL(const CImplementationInformation& aImplInfo, MMMFDevVideoPlayProxy& aProxy); williamr@2: williamr@2: williamr@2: /** williamr@2: Destructor. williamr@2: */ williamr@2: IMPORT_C virtual ~CMMFVideoDecodeHwDevice(); williamr@2: williamr@2: williamr@2: /** williamr@2: Retrieves decoder information about this hardware device. The device creates a CVideoDecoderInfo williamr@2: structure, fills it with correct data, pushes it to the cleanup stack and returns it. The client williamr@2: will delete the object when it is no longer needed. williamr@2: williamr@2: @return "Decoder information as a CVideoDecoderInfo object. The object is pushed to the cleanup williamr@2: stack, and must be deallocated by the caller." williamr@2: @leave "This method may leave with one of the system-wide error codes." williamr@2: williamr@2: @see CVideoDecoderInfo williamr@2: */ williamr@2: virtual CVideoDecoderInfo* VideoDecoderInfoLC() = 0; williamr@2: williamr@2: /** williamr@2: Reads header information from a coded data unit. williamr@2: @param "aDataUnitType" "The type of the coded data unit that is contained in aDataUnit. If the data is a williamr@2: simple piece of bitstream, use EDuArbitraryStreamSection." williamr@2: @param "aEncapsulation" "The encapsulation type used for the coded data. If the data is a williamr@2: simple piece of bitstream, use EDuElementaryStream." williamr@2: @param "aDataUnit" "The coded data unit, contained in a TVideoInputBuffer." williamr@2: @return "Header information for the data unit, or NULL if the coded data unit did not contain williamr@2: enough data to parse the header. The header data must be returned to the device using williamr@2: ReturnHeader() before Initialize() is called or the decoder is destroyed. The data remains williamr@2: valid until it is returned." williamr@2: @leave "The method will leave if an error occurs. Running out of data is not considered an error, williamr@2: as described above. Typical error codes used: williamr@2: * KErrNotSupported - The data is not in a supported format. williamr@2: * KErrCorrupt - The data appears to be in a supported format, but is corrupted." williamr@2: */ williamr@2: virtual TVideoPictureHeader* GetHeaderInformationL(TVideoDataUnitType aDataUnitType, williamr@2: TVideoDataUnitEncapsulation aEncapsulation, TVideoInputBuffer* aDataUnit) = 0; williamr@2: williamr@2: williamr@2: /** williamr@2: Returns a header from GetHeaderInformationL() back to the decoder so that the memory can be freed. williamr@2: williamr@2: @param "aHeader" "The header to return." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void ReturnHeader(TVideoPictureHeader* aHeader) = 0; williamr@2: williamr@2: /** williamr@2: Sets the device input format to a compressed video format. williamr@2: williamr@2: @param "aFormat" "The input format to use." williamr@2: @param "aDataUnitType" "The data unit type for input data." williamr@2: @param "aEncapsulation" "The encapsulation type used for the coded data." williamr@2: @param "aDataInOrder" "ETrue if the input data is written in correct decoding order, williamr@2: EFalse if will be written in arbitrary order." williamr@2: @leave "The method will leave if an error occurs. Typical error codes used: williamr@2: * KErrNotSupported - The source format is not supported." williamr@2: williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetInputFormatL(const CCompressedVideoFormat& aFormat, williamr@2: TVideoDataUnitType aDataUnitType, TVideoDataUnitEncapsulation aEncapsulation, williamr@2: TBool aDataInOrder) = 0; williamr@2: williamr@2: /** williamr@2: Sets whether decoding should be synchronized to the current clock source, if any, or if pictures williamr@2: should instead be decoded as soon as possible. If decoding is synchronized, decoding timestamps williamr@2: are used if available, presentation timestamps are used if not. When decoding is not synchronized, williamr@2: pictures are decoded as soon as source data is available for them, and the decoder has a free williamr@2: output buffer. If a clock source is not available, decoding will not be synchronized. williamr@2: williamr@2: @param "aSynchronize" "True if decoding should be synchronized to a clock source." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SynchronizeDecoding(TBool aSynchronize) = 0; williamr@2: williamr@2: /** williamr@2: Sets decoder buffering options. See [3] for a description of the options available. williamr@2: williamr@2: @param "aOptions" "Buffering options." williamr@2: @leave "The method will leave if an error occurs. Typical error codes used: williamr@2: * KErrNotSupported - The specified buffering options are not supported. williamr@2: If the client receives this error code, it can call GetBufferOptions() williamr@2: to determine the options the decoder is able to support." williamr@2: williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetBufferOptionsL(const CMMFDevVideoPlay::TBufferOptions& aOptions) = 0; williamr@2: williamr@2: /** williamr@2: Gets the video decoder buffer options actually in use. This can be used before calling williamr@2: SetBufferOptions() to determine the default options, or afterwards to check the values williamr@2: actually in use (if some default values were used). williamr@2: williamr@2: @param "aOptions" "Buffering options structure to fill." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetBufferOptions(CMMFDevVideoPlay::TBufferOptions& aOptions) = 0; williamr@2: williamr@2: /** williamr@2: Indicates which HRD/VBV specification is fulfilled in the input stream and any related parameters. williamr@2: williamr@2: @param "aHrdVbvSpec" "The HRD/VBV specification fulfilled." williamr@2: @param "aHrdVbvParams" "HRD/VBV parameters. The data format depends on the parameters chosen. williamr@2: For 3GPP TS 26.234 parameters (aHrdVbvSpec=EHrdVbv3GPP), the data in the williamr@2: descriptor is a package of type TPckC williamr@2: (see T3gppHrdVbvParams). If no HRD/VBV parameters are used, the descriptor williamr@2: is zero length." williamr@2: @see THrdVbvSpecification williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetHrdVbvSpec(THrdVbvSpecification aHrdVbvSpec, const TDesC8& aHrdVbvParams) = 0; williamr@2: williamr@2: /** williamr@2: Sets the output post-processor device to use. If an output device is set, all decoded pictures williamr@2: are delivered to that device, and not drawn on screen or returned to the client. Pictures are williamr@2: written using CMMDVideoPostProcDevice::WritePictureL() or a custom interface after they have been williamr@2: decoded. The post-processor must then synchronize rendering to the clock source if necessary. williamr@2: williamr@2: @param "aDevice" "The output post-processor device to use." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetOutputDevice(CMMFVideoPostProcHwDevice* aDevice) = 0; williamr@2: williamr@2: /** williamr@2: Returns the current decoding position, i.e. the timestamp for the most recently decoded picture. williamr@2: williamr@2: @return "Current decoding position." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TTimeIntervalMicroSeconds DecodingPosition() = 0; williamr@2: williamr@2: /** williamr@2: Returns the current pre-decoder buffer size. williamr@2: williamr@2: @return "The number of bytes of data in the pre-decoder buffer." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TUint PreDecoderBufferBytes() = 0; williamr@2: williamr@2: /** williamr@2: Reads various counters related to the received input bitstream and coded data units. The counters williamr@2: are reset when Initialize() or this method is called, and thus they only include data processed williamr@2: since the last call. williamr@2: williamr@2: @param "aCounters" "The counter structure to fill." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void GetBitstreamCounters(CMMFDevVideoPlay::TBitstreamCounters& aCounters) = 0; williamr@2: williamr@2: /** williamr@2: Retrieves the number of free input buffers the decoder has available. williamr@2: williamr@2: @return "Number of free input buffers the decoder has available." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual TUint NumFreeBuffers() = 0; williamr@2: williamr@2: /** williamr@2: Retrieves an empty video input buffer from the decoder. After input data has been written to the williamr@2: buffer, it can be written to the decoder using WriteCodedDataL(). The number of buffers the decoder williamr@2: must be able to provide before expecting any back, and the maximum size for each buffer, are williamr@2: specified in the buffer options. williamr@2: williamr@2: The decoder maintains ownership of the buffers even while they have been retrieved by the client, williamr@2: and will take care of deallocating them. williamr@2: williamr@2: @param "aBufferSize" "Required buffer size, in bytes. The resulting buffer can be larger than williamr@2: this, but not smaller." williamr@2: @return "A new input data buffer. The buffer is at least as large as requested, but it may be williamr@2: larger. If no free buffers are available, the return value is NULL." williamr@2: @leave "The method will leave if an error occurs. Lack of free buffers is not considered an error." williamr@2: */ williamr@2: virtual TVideoInputBuffer* GetBufferL(TUint aBufferSize) = 0; williamr@2: williamr@2: /** williamr@2: Writes a piece of coded video data to the decoder. The data buffer must be retrieved from the williamr@2: decoder with GetBufferL(). williamr@2: williamr@2: @param "aBuffer" "The coded data unit to write." williamr@2: @leave "This method may leave with one of the system-wide error codes." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void WriteCodedDataL(TVideoInputBuffer* aBuffer) = 0; williamr@2: williamr@2: /** williamr@2: Configures the Decoder using header information known by the client. williamr@2: @param "aVideoPictureHeader" "Header information to configure the decoder with" williamr@2: @leave "The method will leave if an error occurs. Running out of data is not considered an error, williamr@2: as described above. williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void ConfigureDecoderL(const TVideoPictureHeader& aVideoPictureHeader); williamr@2: williamr@2: williamr@2: williamr@2: protected: williamr@2: /** williamr@2: Constructor. williamr@2: */ williamr@2: IMPORT_C CMMFVideoDecodeHwDevice(); williamr@2: williamr@2: /** williamr@2: Set the proxy implementation to be used. Called just after the object is constructed. williamr@2: @param "aProxy" "The proxy to use." williamr@2: */ williamr@2: virtual void SetProxy(MMMFDevVideoPlayProxy& aProxy) = 0; williamr@2: private: williamr@2: TUid iDtor_ID_Key; williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: CMMFVideoPostProcHwDevice is the MSL video post-processor plug-in interface. All MSL video williamr@2: post-processors must implement this interface. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CMMFVideoPostProcHwDevice : public CMMFVideoPlayHwDevice williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Creates a new video post-processor hardware device object, based on the implementation UID. williamr@2: williamr@2: @param "aUid" "Post-processor implementation UID." williamr@2: @param "aProxy" "The proxy implementation to use." williamr@2: @return "A new CMMFVideoPostProcHwDevice object." williamr@2: @leave "This method may leave with one of the system-wide error codes." williamr@2: */ williamr@2: IMPORT_C static CMMFVideoPostProcHwDevice* NewL(TUid aUid, MMMFDevVideoPlayProxy& aProxy); williamr@2: williamr@2: /** williamr@2: Destructor. williamr@2: */ williamr@2: IMPORT_C virtual ~CMMFVideoPostProcHwDevice(); williamr@2: williamr@2: /** williamr@2: Sets the device input format to an uncompressed video format. williamr@2: williamr@2: @param "aFormat" "The input format to use." williamr@2: @leave "The method will leave if an error occurs. Typical error codes used: williamr@2: * KErrNotSupported - The input format is not supported." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetInputFormatL(const TUncompressedVideoFormat& aFormat) = 0; williamr@2: williamr@2: /** williamr@2: Sets the decoder device that will write data to this post-processor. Decoded pictures will be williamr@2: written with WritePictureL() or through a custom interface. After pictures have been processed, williamr@2: they must be returned to the decoder using ReturnPicture(). williamr@2: williamr@2: @param "aDevice" "The decoder source plug-in to use." williamr@2: @pre "This method can only be called before the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void SetInputDevice(CMMFVideoDecodeHwDevice* aDevice) = 0; williamr@2: williamr@2: /** williamr@2: Writes an uncompressed video picture to the post-processor. The picture must be returned to the williamr@2: client or source plug-in after it has been used. williamr@2: williamr@2: @param "aPicture" "The picture to write." williamr@2: @leave "This method may leave with one of the system-wide error codes." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void WritePictureL(TVideoPicture* aPicture) = 0; williamr@2: protected: williamr@2: /** williamr@2: Constructor. williamr@2: */ williamr@2: IMPORT_C CMMFVideoPostProcHwDevice(); williamr@2: williamr@2: /** williamr@2: Set the proxy implementation to be used. Called just after the object is constructed. williamr@2: @param "aProxy" "The proxy to use." williamr@2: */ williamr@2: virtual void SetProxy(MMMFDevVideoPlayProxy& aProxy) = 0; williamr@2: private: williamr@2: TUid iDtor_ID_Key; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: A custom interface extending the functionality of CMMFVideoPlayHwDevice, adding support for the decoder to handle the williamr@2: copying of the bitstream data into the buffers, combining this with a scan of the data and support for the passing of williamr@2: information from the client to the decoder describing what part of a frame the data contains. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class MMMFVideoPlayHwDeviceExtensionScanCopy williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Writes a piece of coded video data to the decoder. The data buffer must be retrieved from the williamr@2: decoder with GetBufferL(). williamr@2: williamr@2: @param "aBuffer" "The coded data unit to write." williamr@2: @param "aPortion" "The portion of the frame that the data contains. Defaults to EFramePortionUnknown." williamr@2: @leave "This method may leave with one of the system-wide error codes." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void WriteCodedDataL(TVideoInputBuffer* aBuffer, TFramePortion aPortion = EFramePortionUnknown) = 0; williamr@2: /** williamr@2: Passes a pointer to a piece of coded video data to the decoder. The data buffer, which is left empty by the client, williamr@2: must be retrieved from the decoder with GetBufferL(). williamr@2: williamr@2: @param "aCodedData" "A pointer to the coded data unit to scan and copy." williamr@2: @param "aBuffer" "The empty data buffer." williamr@2: @param "aPortion" "The portion of the frame that the data contains. Defaults to EFramePortionUnknown." williamr@2: @leave "This method may leave with one of the system-wide error codes." williamr@2: @pre "This method can only be called after the hwdevice has been initialized with Initialize()." williamr@2: */ williamr@2: virtual void ScanAndCopyCodedDataL(TPtr8 aCodedData, TVideoInputBuffer* aBuffer, TInt& aConsumed, TFramePortion aPortion = EFramePortionUnknown) = 0; williamr@2: }; williamr@2: williamr@2: williamr@2: inline void CMMFVideoDecodeHwDevice::ConfigureDecoderL(const TVideoPictureHeader& /*aVideoPictureHeader*/) williamr@2: { williamr@2: User::Leave(KErrNotSupported); williamr@2: } williamr@2: williamr@2: williamr@2: williamr@2: #endif