mmhais/videohai/devvideo/inc/devvideoplay.h
changeset 0 40261b775718
equal deleted inserted replaced
-1:000000000000 0:40261b775718
       
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #ifndef __DEVVIDEOPLAY_H__
       
    17 #define __DEVVIDEOPLAY_H__
       
    18 
       
    19 #include <e32std.h>
       
    20 #include <mmf/devvideo/devvideobase.h>
       
    21 
       
    22 class MMMFDevVideoPlayObserver;
       
    23 class CMMFVideoPlayHwDevice;
       
    24 class CMMFVideoDecodeHwDevice;
       
    25 class CMMFVideoPostProcHwDevice;
       
    26 
       
    27 
       
    28 /**
       
    29 MMMFDevVideoPlayProxy is the interface to the CMMFDevVideoPlay API implementation that the hardware devices 
       
    30 use to deliver data back to the client and report their progress to the API implementation.
       
    31 @publishedAll
       
    32 @released
       
    33 */
       
    34 class MMMFDevVideoPlayProxy
       
    35 	{
       
    36 public:
       
    37 	/**
       
    38 	Delivers a new decoded picture to the client. The CMMFDevVideoPlay implementation will maintain 
       
    39 	a list of decoded pictures and implement GetNewPictureInfo() and NextPictureL() based on those. 
       
    40 	The pictures will be returned back to the hardware device using ReturnPicture().
       
    41 
       
    42 	@param "aPicture" "The newly processed picture."
       
    43 	*/
       
    44 	virtual void MdvppNewPicture(TVideoPicture* aPicture) = 0;
       
    45 
       
    46 	/**
       
    47 	Notifies the client that one or more new empty input buffers are available. Called by the decoder 
       
    48 	hardware device.
       
    49 	*/
       
    50 	virtual void MdvppNewBuffers() = 0;
       
    51 
       
    52 	/**
       
    53 	Returns a used input video picture back to the caller. Called by a post-processor hardware device 
       
    54 	after the picture has been processed and the picture source was the client, not another plug-in.
       
    55 
       
    56 	@param "aPicture" "The picture to return."
       
    57 	*/
       
    58 	virtual void MdvppReturnPicture(TVideoPicture* aPicture) = 0;
       
    59 
       
    60 	/**
       
    61 	Delivers supplemental information from a decoder hardware device to the client. 
       
    62 	The information is codec-dependent. The method is synchronous - the client 
       
    63 	MMMFDevVideoPlayObserver::MdvppSupplementalInformation() method is called immediately, 
       
    64 	and the memory for the supplemental information can be re-used when the call returns.
       
    65 
       
    66 	@param "aData"		"The supplemental data."
       
    67 	@param "aTimestamp" "The presentation timestamp for the picture that the supplemental data is part of."
       
    68 	@param "aPictureId" "Picture identifier for the picture. If a picture ID is not available, 
       
    69 						aPictureId.iIdType is set to ENone."
       
    70 	*/
       
    71 	virtual void MdvppSupplementalInformation(const TDesC8& aData, 
       
    72 		const TTimeIntervalMicroSeconds& aTimestamp, const TPictureId& aPictureId) = 0;
       
    73 
       
    74 	/**
       
    75 	Back channel information, indicating a picture loss without specifying the lost picture.
       
    76 	*/
       
    77 	virtual void MdvppPictureLoss() = 0;
       
    78 
       
    79 	/**
       
    80 	Back channel information, indicating the pictures that have been lost.
       
    81 	
       
    82 	@param "aPictures"	"Picture identifiers for the lost pictures. The reference is only valid
       
    83 						until the method returns."
       
    84 	*/
       
    85 	virtual void MdvppPictureLoss(const TArray<TPictureId>& aPictures) = 0;
       
    86 
       
    87 	/**
       
    88 	Back channel information, indicating the loss of consecutive macroblocks in raster scan order.
       
    89 
       
    90 	@param "aFirstMacroblock"	"The first lost macroblock.  The macroblocks are numbered 
       
    91 								such that the macroblock in the upper left corner of the picture is 
       
    92 								considered macroblock number 1 and the number for each macroblock increases 
       
    93 								from left to right and then from top to bottom in raster-scan order."
       
    94 	@param "aNumMacroblocks"	"The number of lost macroblocks that are consecutive in raster-scan order."
       
    95 	@param "aPicture"			"The picture identifier for the picture where the macroblocks were lost.  
       
    96 								If the picture is not known, aPicture.iIdType is set to ENone.  The 
       
    97 								reference is only valid until the method returns."
       
    98 	*/
       
    99 	virtual void MdvppSliceLoss(TUint aFirstMacroblock, TUint aNumMacroblocks, const TPictureId& aPicture)= 0;
       
   100 
       
   101 	/**
       
   102 	Back channel information from the decoder, indicating a reference picture selection request. 
       
   103 	The request is delivered as a coding-standard specific binary message.  Reference picture selection
       
   104 	can be used to select a pervious correctly transmitted picture to use as a reference in case later 
       
   105 	pictures have been lost.
       
   106 	
       
   107 	@param "aSelectionData"	"The reference picture selection request message. The message format is 
       
   108 							coding-standard specific, and defined separately. The reference is only 
       
   109 							valid until the method returns."
       
   110 	*/
       
   111 	virtual void MdvppReferencePictureSelection(const TDesC8& aSelectionData)= 0;
       
   112 
       
   113 	/**
       
   114 	Delivers a timed snapshot result to the client. The memory reserved for the snapshot picture 
       
   115 	can no longer be used in the device.
       
   116 
       
   117 	@param "aError"					"An error code, KErrNone if no errors occurred. 
       
   118 									If an error occurred, the data in the snapshot may not be valid, 
       
   119 									but the memory can still be freed."
       
   120 	@param "aPictureData"			"The snapshot picture data."
       
   121 	@param "aPresentationTimestamp"	"The presentation timestamp for the snapshot picture."
       
   122 	@param "aPictureId"				"Picture identifier for the picture. If a picture ID is not 
       
   123 									available, aPictureId.iIdType is set to ENone."
       
   124 	*/
       
   125 	virtual void MdvppTimedSnapshotComplete(TInt aError, TPictureData* aPictureData, 
       
   126 		const TTimeIntervalMicroSeconds& aPresentationTimestamp, const TPictureId& aPictureId) = 0;
       
   127 
       
   128 	/**
       
   129 	Reports a fatal error to the client. The device must automatically stop processing 
       
   130 	video data when such errors occur, and may not do further processing before it has 
       
   131 	been deleted and re-created.
       
   132 
       
   133 	@param "aDevice" "The device that reported the error."
       
   134 	@param "aError"	 "The error code."	
       
   135 	*/
       
   136 	virtual void MdvppFatalError(CMMFVideoHwDevice* aDevice, TInt aError) = 0;
       
   137 
       
   138 	/**
       
   139 	Reports that an asynchronous Initialize() method has completed. 
       
   140 	The device is now ready for playback.
       
   141 
       
   142 	@param "aDevice" "The device that was initialzied."
       
   143 	@param "aError"	 "Initialization result error code, KErrNone if initialization was successful."	
       
   144 	*/
       
   145 	virtual void MdvppInitializeComplete(CMMFVideoHwDevice* aDevice, TInt aError) = 0;
       
   146 
       
   147 	/**
       
   148 	Reports that the input video stream end has been reached and all pictures have been processed. 
       
   149 	Called by each hardware device after their InputEnd() methods have been called and all data has 
       
   150 	been processed. The proxy implementation will notify the client about stream end when all 
       
   151 	hardware devices have called this method.
       
   152 	*/
       
   153 	virtual void MdvppStreamEnd() = 0;
       
   154 	};
       
   155 
       
   156 
       
   157 /**
       
   158 A buffer for compressed video data, contains one coded data unit. Video buffers are used for writing 
       
   159 video data to the API.
       
   160 
       
   161 @publishedAll
       
   162 @released
       
   163 */
       
   164 class TVideoInputBuffer
       
   165 	{
       
   166 public:
       
   167 	/**
       
   168 	Default constructor. Zeroes all members (including iData which will point to garbage until manually
       
   169 	set to point to the real video buffer memory data area by the user).
       
   170 	*/
       
   171 	IMPORT_C TVideoInputBuffer();
       
   172 
       
   173 public:
       
   174 	/**
       
   175 	 */
       
   176 	enum TVideoBufferOptions
       
   177 		{
       
   178 		/** The sequence number field is valid. */
       
   179 		ESequenceNumber	 = 0x00000001,
       
   180 		/** The decoding timestamp field is valid */
       
   181 		EDecodingTimestamp  = 0x00000002,
       
   182 		/** The presentation timestamp field is valid.*/
       
   183 		EPresentationTimestamp = 0x00000004,
       
   184 		/** Content protected pictures cannot be displayed on unprotected 
       
   185 		    external displays such as TV-out.
       
   186 		*/
       
   187 		EContentProtected = 0x00000008
       
   188 		};
       
   189 
       
   190 	/**
       
   191 	Pointer to the video data.
       
   192 	*/
       
   193 	TPtr8 iData;
       
   194 
       
   195 	/**
       
   196 	Data unit options. The value is a bitfield combined from values from TVideoBufferOptions.
       
   197 	@see TVideoBufferOptions
       
   198 	*/
       
   199 	TUint32 iOptions;
       
   200 
       
   201 	/**
       
   202 	Data unit decoding timestamp. Valid if EDecodingTimestamp is set in the options.
       
   203 	*/
       
   204 	TTimeIntervalMicroSeconds iDecodingTimestamp;
       
   205 
       
   206 	/**
       
   207 	Data unit presentation timestamp. Valid if EPresentationTimestamp is set in the options. 
       
   208 	If the input bitstream does not contain timestamp information, this field should be valid, 
       
   209 	otherwise pictures cannot be displayed at the correct time.   If the input bitstream contains 
       
   210 	timestamp information (such as the TR syntax element of H.263 bitstreams) and valid 
       
   211 	iPresentationTimestamp is provided, the value of iPresentationTimestamp is used in playback.
       
   212 	*/
       
   213 	TTimeIntervalMicroSeconds iPresentationTimestamp;
       
   214 
       
   215 	/**
       
   216 	True if the data is part of a pre-roll period and may not be drawn. The decoder may skip 
       
   217 	display-related operations, but must still decode normally since pre-roll may not end in a key 
       
   218 	frame.
       
   219 	*/
       
   220 	TBool iPreRoll;
       
   221 
       
   222 	/**
       
   223 	Data unit sequence number. Valid if ESequenceNumber is set in the options. If present, the 
       
   224 	sequence number is incremented once per coded data unit, a gap in the numbers indicates missing 
       
   225 	data.
       
   226 	*/
       
   227 	TUint iSequenceNumber;
       
   228 
       
   229 	/**
       
   230 	True if the data unit is known to contain erroneous data.
       
   231 	*/
       
   232 	TBool iError;
       
   233 
       
   234 	/**
       
   235 	A queue link used internally by the MSL API. The field must not be modified while the buffer is 
       
   236 	in the MSL API, but can be used by the client before the buffer has been written and after the 
       
   237 	buffer has been returned.
       
   238 	*/
       
   239 	TDblQueLink iLink;
       
   240 
       
   241 	/**
       
   242 	A pointer for free-form user data. The pointer is set by the module that created the buffer, and 
       
   243 	is usually used for memory management purposes.
       
   244 	*/
       
   245 	TAny* iUser;
       
   246 	};
       
   247 
       
   248 
       
   249 /**
       
   250 This class contains information about the post-processing functionality that a single post-processor 
       
   251 or decoder hardware device has. Although it mainly contains static data, it is defined as a complete 
       
   252 CBase-derived class since the data is relatively complex and proper memory management is necessary.
       
   253 
       
   254 The objects are created by the post-processor or decoder devices, and used by the MSL video client code.
       
   255 @publishedAll
       
   256 @released
       
   257 */
       
   258 class CPostProcessorInfo : public CBase
       
   259 	{
       
   260 public:
       
   261 	/**
       
   262 	Creates and returns a new CPostProcessorInfo object.
       
   263 
       
   264 	@param	"aUid"							"The UID of the post-processor."
       
   265 	@param	"aManufacturer"					"The manufacturer of the post-processor hw device."
       
   266 	@param	"aIdentifier"					"The post-processor hw device manufacturer-specific 
       
   267 											identifier."
       
   268 	@param	"aVersion"						"The post-processor version."
       
   269 	@param	"aSupportedFormats"				"The source formats supported by the post-processor."
       
   270 	@param	"aSupportedCombinations"		"The supported post-processing combinations.  An array of 
       
   271 											values created by the bitwise OR-ing of values from 
       
   272 											TPrePostProcessType."
       
   273 	@param	"aAccelerated"					"Whether the post processor is hardware-accelerated. 
       
   274 											Accelerated post-processors can run on an application DSP 
       
   275 											or dedicated hardware."
       
   276 	@param	"aSupportsDirectDisplay"		"Whether the hw device supports output directly to the 
       
   277 											screen."
       
   278 	@param	"aYuvToRgbCapabilities"			"The post-processor YUV to RGB conversion capabilities."
       
   279 	@param	"aSupportedRotations"			"A bitwise OR of values of TRotationType to indicate the 
       
   280 											supported rotation types."
       
   281 	@param	"aSupportArbitraryScaling"		"Whether the post-processor supports arbitrary scaling."
       
   282 	@param	"aSupportedScaleFactors"		"A list of the discrete scaling factors supported. If the
       
   283 											post-processor supports arbitrary scaling, this list should
       
   284 											be left zero-length."
       
   285 	@param	"aAntiAliasedScaling"			"Whether anti-aliasing filtering for scaling is supported."
       
   286 	@param	"aImplementationSpecificInfo"	"Implementation-specific information."
       
   287 
       
   288 	@return "A new CPostProcessorInfo object."
       
   289 	@leave	"This method may leave with one of the system-wide error codes."
       
   290 	*/
       
   291 	IMPORT_C static CPostProcessorInfo* NewL(TUid aUid,
       
   292 											 const TDesC& aManufacturer,
       
   293 											 const TDesC& aIdentifier,
       
   294 											 TVersion aVersion,
       
   295 											 const TArray<TUncompressedVideoFormat>& aSupportedFormats,
       
   296 											 const TArray<TUint32>& aSupportedCombinations,
       
   297 											 TBool aAccelerated,
       
   298 											 TBool aSupportsDirectDisplay,
       
   299 											 const TYuvToRgbCapabilities& aYuvToRgbCapabilities,
       
   300 											 TUint32 aSupportedRotations,
       
   301 											 TBool aSupportArbitraryScaling,
       
   302 											 const TArray<TScaleFactor>& aSupportedScaleFactors,
       
   303 											 TBool aAntiAliasedScaling,
       
   304 											 const TDesC8& aImplementationSpecificInfo = KNullDesC8);
       
   305 
       
   306 	/**
       
   307 	Destructor
       
   308 	*/
       
   309 	IMPORT_C ~CPostProcessorInfo();
       
   310 
       
   311 	/**
       
   312 	Returns the post-processor UID.
       
   313 	@return "Post-processor UID"
       
   314 	*/
       
   315 	IMPORT_C TUid Uid() const;
       
   316 
       
   317 	/**
       
   318 	Returns the post-processor hardware device manufacturer.
       
   319 	@return "The manufacturer name as a standard Symbian descriptor. The reference is valid until the 
       
   320 			CPostProcessorInfo object is destroyed."
       
   321 	*/
       
   322 	IMPORT_C const TDesC& Manufacturer() const;
       
   323 
       
   324 	/**
       
   325 	Returns the post-processor hardware device manufacturer-specific identifier. 
       
   326 	The combination of the manufacturer and identifier uniquely identifies the device.
       
   327 	@return "The identifier as a standard Symbian descriptor. The reference is valid until the 
       
   328 			CPostProcessorInfo object is destroyed."
       
   329 	*/
       
   330 	IMPORT_C const TDesC& Identifier() const;
       
   331 
       
   332 	/**
       
   333 	Returns the post-processor version.
       
   334 	@return "Post-processor version."
       
   335 	*/
       
   336 	IMPORT_C TVersion Version() const;
       
   337 
       
   338 	/**
       
   339 	Checks if the post-processor supports the given format as a source format.
       
   340 	@param	"aFormat"	"The format to check. The reference is not used after the method returns."
       
   341 	@return "ETrue if the post-processor supports the given format, EFalse if not."
       
   342 	*/
       
   343 	IMPORT_C TBool SupportsFormat(const TUncompressedVideoFormat& aFormat) const;
       
   344 
       
   345 	/**
       
   346 	Lists the source formats supported by the post-processor.
       
   347 	@return "A RArray table of supported video formats (TUncompressedVideoFormat). The reference is 
       
   348 			valid until the CPostProcessorInfo object is destroyed."
       
   349 	*/
       
   350 	IMPORT_C const RArray<TUncompressedVideoFormat>& SupportedFormats() const;
       
   351 
       
   352 	/**
       
   353 	Checks if the post-processor supports the given post-processing combination.
       
   354 	@param	"aCombination" "Post-processing combination, a bitwise OR of values from TPrePostProcessType."
       
   355 	@return "ETrue if the post-processing combination is supported, EFalse if not."
       
   356 	*/
       
   357 	IMPORT_C TBool SupportsCombination(TUint32 aCombination) const;
       
   358 
       
   359 	/**
       
   360 	Lists all supported post-processing combinations.
       
   361 	@return "A RArray table or post-processing combinations. Each value is a bitwise OR of values from 
       
   362 			TPrePostProcessType. The reference is valid until the CPostProcessorInfo object is destroyed."
       
   363 	*/
       
   364 	IMPORT_C const RArray<TUint32>& SupportedCombinations() const;
       
   365 
       
   366 	/**
       
   367 	Returns whether the hardware device is hardware-accelerated. Hardware-accelerated post-processors 
       
   368 	can run on an application DSP or dedicated hardware.
       
   369 	@return "ETrue if the device is hardware-accelerated."
       
   370 	*/
       
   371 	IMPORT_C TBool Accelerated() const;
       
   372 
       
   373 	/**
       
   374 	Returns whether the hardware device supports output directly to the screen. Output to memory buffers 
       
   375 	is always supported.
       
   376 	@return "ETrue if the post-processor supports direct screen output."
       
   377 	*/
       
   378 	IMPORT_C TBool SupportsDirectDisplay() const;
       
   379 
       
   380 	/**
       
   381 	Returns the post-processor YUV to RGB color conversion capabilities.
       
   382 	@return "The conversion capabilities as a TYuvToRgbCapabilities structure. The reference is valid 
       
   383 			until the CPostProcessorInfo object is destroyed. If the post-processor does not support 
       
   384 			YUV to RGB conversion, the contents are undefined."
       
   385 	*/
       
   386 	IMPORT_C const TYuvToRgbCapabilities& YuvToRgbCapabilities() const;
       
   387 
       
   388 	/**
       
   389 	Returns the rotation types the post-processor supports.
       
   390 	@return "The supported rotation types as a bitwise OR of TRotationType values. If the 
       
   391 			post-processor does not support rotation, the return value is zero."
       
   392 	*/
       
   393 	IMPORT_C TUint32 SupportedRotations() const;
       
   394 
       
   395 	/**
       
   396 	Returns whether the post-processor supports arbitrary scaling. If arbitrary scaling is not 
       
   397 	supported, a limited selection of scaling factors may still be available, use 
       
   398 	SupportedScaleFactors() to retrieve those.
       
   399 	@return "ETrue if the post-processor supports arbitrary scaling, EFalse if not."
       
   400 	*/
       
   401 	IMPORT_C TBool SupportsArbitraryScaling() const;
       
   402 
       
   403 	/**
       
   404 	Returns the scaling factors the post-processor supports. If the post-processor supports arbitrary 
       
   405 	scaling the list is empty - use SupportsArbitraryScaling() first.
       
   406 	@return "A RArray list of supported scale factors (TScaleFactor). The reference is valid until the 
       
   407 			CPostProcessorInfo object is destroyed. If the post-processor supports arbitrary scaling 
       
   408 			or no scaling at all, the list is empty."
       
   409 	*/
       
   410 	IMPORT_C const RArray<TScaleFactor>& SupportedScaleFactors() const;
       
   411 
       
   412 	/**
       
   413 	Returns whether the hardware device supports anti-aliasing filtering for scaling.
       
   414 	@return "True if anti-aliasing filtering is supported."
       
   415 	*/
       
   416 	IMPORT_C TBool AntiAliasedScaling() const;
       
   417 
       
   418 	/**
       
   419 	Returns implementation-specific information about the post-processor.
       
   420 	@return "Implementation- specific information about the post-processor. The data format is 
       
   421 			implementation-specific, and defined separately by the post-processor supplier. The 
       
   422 			reference is valid until the CPostProcessorInfo object is destroyed."
       
   423 	*/
       
   424 	IMPORT_C const TDesC8& ImplementationSpecificInfo() const;
       
   425 	
       
   426 	/**
       
   427 	Adds the screen number into the list of screens supported by the post processor.
       
   428 	@leave	"KErrNoMemory when there is no memory to expand the list of supported screens. 
       
   429 			 KErrNotSupported if the secondary screen display is not supported in Multimedia Framework."
       
   430 	*/
       
   431 	IMPORT_C void AddSupportedScreenL(TInt aScreenNo);
       
   432 	
       
   433 	/**
       
   434 	Lists the screens supported by the post processor.
       
   435 	@param	"aSupportedScreens"		"An array to retrieve the list of supported screens. 
       
   436 									 This method resets	the array before adding elements to it. 
       
   437 									 The array must be created and destroyed by the caller."
       
   438 	@leave "KErrNotSupported if the secondary screen display is not supported in Multimedia Framework.
       
   439 			KErrNoMemory when there is no memory to expand the list."
       
   440 	*/
       
   441 	IMPORT_C void GetSupportedScreensL(RArray<TInt>& aSupportedScreens) const;
       
   442 	
       
   443 	/** Sets a flag indicating whether the PostProcessor supports per picture content protection.
       
   444 	    E.g. Where content protection within a video stream can alter.
       
   445 	 @param "aSetting" "Set to TRUE to indicate PostProcessor supports content protection. 
       
   446 	 @See TVideoPicture::TVideoPictureOptions::EContentProtected 
       
   447 	 @See TVideoInputBuffer::TVideoBufferOptions::EContentProtected 
       
   448 	*/
       
   449 	IMPORT_C void SetSupportsContentProtected(const TBool aSetting);
       
   450 		
       
   451 	/** Returns whether the PostProcessor supports per picture content protection.
       
   452 	    E.g. Where content protection within a video stream can alter.
       
   453 	 @return "True if the PostProcessor supports Content Protection." 
       
   454 	 @See TVideoPicture::TVideoPictureOptions::EContentProtected
       
   455 	 @See TVideoInputBuffer::TVideoBufferOptions::EContentProtected
       
   456 	*/
       
   457 	IMPORT_C TBool SupportsContentProtected() const;
       
   458 	
       
   459 private:
       
   460 	CPostProcessorInfo(TUid aUid,
       
   461 					   TVersion aVersion,
       
   462 					   TBool aAccelerated,
       
   463 					   TBool aSupportDirectDisplay,
       
   464 					   const TYuvToRgbCapabilities& aYuvToRgbCapabilities,
       
   465 					   TUint32 aSupportedRotations,
       
   466 					   TBool aSupportArbitraryScaling,
       
   467 					   TBool aAntiAliasedScaling);
       
   468 
       
   469 	void ConstructL(const TDesC& aManufacturer,
       
   470 					const TDesC& aIdentifier,
       
   471 					const TArray<TUncompressedVideoFormat>& aSupportedFormats,
       
   472 					const TArray<TUint32>& aSupportedCombinations,
       
   473 					const TArray<TScaleFactor>& aSupportedScaleFactors,
       
   474 					const TDesC8& aImplementationSpecificInfo);
       
   475 private:
       
   476 	TUid iUid;
       
   477 	TVersion iVersion;
       
   478 	TBool iAccelerated;
       
   479 	TBool iSupportDirectDisplay;
       
   480 	TYuvToRgbCapabilities iYuvToRgbCapabilities;
       
   481 	TUint32 iSupportedRotations;
       
   482 	TBool iSupportArbitraryScaling;
       
   483 	TBool iAntiAliasedScaling;
       
   484 	HBufC* iManufacturer;
       
   485 	HBufC* iIdentifier;
       
   486 	HBufC8* iImplementationSpecificInfo;
       
   487  	RArray<TUncompressedVideoFormat> iSupportedFormats;
       
   488 	RArray<TUint32> iSupportedCombinations;
       
   489 	RArray<TScaleFactor> iSupportedScaleFactors;
       
   490 	RArray<TInt> iSupportedScreens;
       
   491 	TBool iSupportsContentProtected;
       
   492 	};
       
   493 
       
   494 
       
   495 /**
       
   496 This class contains information about a single video decoder. Although it mainly contains static data, 
       
   497 it is defined as a complete CBase-derived class since the data is relatively complex and proper memory 
       
   498 management is necessary.
       
   499 
       
   500 The objects are created by the video decoder hardware devices, and used by the MSL video client code.
       
   501 @publishedAll
       
   502 @released
       
   503 */
       
   504 class CVideoDecoderInfo : public CBase
       
   505 	{
       
   506 public:
       
   507 	/**
       
   508 	Creates and returns a new CVideoDecoderInfo object.
       
   509 
       
   510 	@param	"aUid"							"The uid of the decoder."
       
   511 	@param	"aManufacturer"					"The video decoder manufacturer."
       
   512 	@param	"aIdentifier"					"The manufacturer-specific identifier for this video decoder."
       
   513 	@param	"aVersion"						"The version of this video decoder."
       
   514 	@param	"aSupportedFormats"				"An array of the formats supported by the decoder. 
       
   515 											A copy will be taken of the array and the referenced 
       
   516 											CCompressedVideoFormat objects"
       
   517 	@param	"aAccelerated"					"Whether this decoder is accelerated or not."
       
   518 	@param	"aSupportsDirectDisplay"		"Whether this decoder supports direct display or not."
       
   519 	@param	"aMaxPictureSize"				"The maximum picture size supported by the decoder."
       
   520 	@param	"aMaxBitrate"					"The maximum bit rate supported by the decoder. Use KMaxTUint32 if there are no bit-rate restrictions."
       
   521 	@param	"aMaxPictureRates"				"An array of the maximum picture size/rate combinations supported by the decoder."
       
   522 	@param	"aSupportsPictureLoss"			"Whether the decoder supports picture loss indications."
       
   523 	@param	"aSupportsSliceLoss"			"Whether the decoder supports slice loss indications."
       
   524 	@param	"aCodingStandardSpecificInfo"	"Coding-standard specific information about the decoder."
       
   525 	@param	"aImplementationSpecificInfo"	"Implementation-specific information about the decoder."
       
   526 
       
   527 	@return "A new CVideoDecoderInfo object."
       
   528 	@leave	"This method may leave with one of the system-wide error codes."
       
   529 	*/
       
   530 	IMPORT_C static CVideoDecoderInfo* NewL(TUid aUid,
       
   531 											const TDesC& aManufacturer,
       
   532 											const TDesC& aIdentifier,
       
   533 											TVersion aVersion,
       
   534 											const TArray<CCompressedVideoFormat*>& aSupportedFormats,
       
   535 											TBool aAccelerated,
       
   536 											TBool aSupportsDirectDisplay,
       
   537 											const TSize& aMaxPictureSize,
       
   538 											TUint aMaxBitrate,
       
   539 											const TArray<TPictureRateAndSize>& aMaxPictureRates,
       
   540 											TBool aSupportsPictureLoss,
       
   541 											TBool aSupportsSliceLoss,
       
   542 											const TDesC8& aCodingStandardSpecificInfo = KNullDesC8,
       
   543 											const TDesC8& aImplementationSpecificInfo = KNullDesC8);
       
   544 
       
   545 	/**
       
   546 	Destructor.
       
   547 	*/
       
   548 	IMPORT_C ~CVideoDecoderInfo();
       
   549 
       
   550 	/**
       
   551 	Checks if the decoder supports the given format.
       
   552 	@param	"aFormat"	"The format to check. The reference is not used after the method returns."
       
   553 	@return "ETrue if the codec supports the given format, EFalse if not."
       
   554 	*/
       
   555 	IMPORT_C TBool SupportsFormat(const CCompressedVideoFormat& aFormat) const;
       
   556 
       
   557 	/**
       
   558 	Lists the video formats, including submodes, supported by the decoder.
       
   559 	@return "A RPointerArray table of supported video formats (CCompressedVideoFormat). The reference 
       
   560 			is valid until the CVideoDecoderInfo object is destroyed."
       
   561 	*/
       
   562 	IMPORT_C const RPointerArray<CCompressedVideoFormat>& SupportedFormats() const;
       
   563 
       
   564 	/**
       
   565 	Returns the codec device manufacturer.
       
   566 	@return "The manufacturer name as a standard Symbian descriptor. The reference is valid until the 
       
   567 	CVideoDecoderInfo object is destroyed."
       
   568 	*/
       
   569 	IMPORT_C const TDesC& Manufacturer() const;
       
   570 
       
   571 	/**
       
   572 	Returns the codec device manufacturer-specific identifier. The combination of the manufacturer 
       
   573 	and identifier uniquely identifies the hardware device.
       
   574 	@return "The identifier as a standard Symbian descriptor. The reference is valid until the 
       
   575 			CVideoDecoderInfo object is destroyed."
       
   576 	*/
       
   577 	IMPORT_C const TDesC& Identifier() const;
       
   578 
       
   579 	/**
       
   580 	Returns the decoder version.
       
   581 	@return "Decoder version."
       
   582 	*/
       
   583 	IMPORT_C TVersion Version() const;
       
   584 
       
   585 	/**
       
   586 	Returns the decoder UID.
       
   587 	@return "Decoder UID."
       
   588 	*/
       
   589 	IMPORT_C TUid Uid() const;
       
   590 
       
   591 	/**
       
   592 	Returns whether the decoder is hardware-accelerated. A hardware-accelerated decoder can run on 
       
   593 	an application DSP or dedicated hardware.
       
   594 	@return "True if the decoder is hardware-accelerated."
       
   595 	*/
       
   596 	IMPORT_C TBool Accelerated() const;
       
   597 
       
   598 	/**
       
   599 	Returns whether the hardware device supports output directly to the screen. Output to memory 
       
   600 	buffers is always supported.
       
   601 	@return "True if the hardware device supports direct screen output."
       
   602 	*/
       
   603 	IMPORT_C TBool SupportsDirectDisplay() const;
       
   604 
       
   605 	/**
       
   606 	Returns the maximum picture size the decoder supports.
       
   607 
       
   608 	Note that if the decoder reports that it supports a certain profile and level, then it 
       
   609 	shall support all bitstreams corresponding to that profile/level.  This method can be used 
       
   610 	to specify capabilities that are beyond the standard levels (for example some MPEG-4 bitstreams 
       
   611 	are encoded with picture sizes that are larger than those specified by the profile/level of the 
       
   612 	bitstream).
       
   613 
       
   614 	@return "The maximum picture size supported. The reference is valid until the CVideoDecoderInfo 
       
   615 			object is destroyed."
       
   616 	*/
       
   617 	IMPORT_C const TSize& MaxPictureSize() const;
       
   618 
       
   619 	/**
       
   620 	Returns the maximum bit-rate supported by the decoder.
       
   621 
       
   622 	Note that if the decoder reports that it supports a certain profile and level, then it shall 
       
   623 	support all bitstreams corresponding to that profile/level.  This method can be used to 
       
   624 	specify capabilities that are beyond the standard levels (for example some MPEG-4 bitstreams 
       
   625 	are encoded with bit rates that are higher than those specified by the profile/level of the
       
   626 	bitstream).
       
   627 
       
   628 	@return "Maximum bit-rate supported, in bits per second. KMaxTUint32 can be used if the decoder 
       
   629 			has no bit-rate restrictions."
       
   630 	*/
       
   631 	IMPORT_C TUint MaxBitrate() const;
       
   632 
       
   633 	/**
       
   634 	Returns the maximum picture size/rate combinations supported by the decoder.  
       
   635 	
       
   636 	Video decoders can have different maximum picture rate limitations depending on the picture size used.
       
   637 	Note that if the decoder reports that it supports a certain profile and level, then it shall 
       
   638 	support all bitstreams corresponding to that profile/level.  This method can be used to specify 
       
   639 	capabilities that are beyond the standard levels (for example some MPEG-4 bitstreams are encoded
       
   640 	with picture rates that are beyond those specified by the profile/level of the bitstream).
       
   641 
       
   642 	@return "A reference to an array of picture size/rate combinations.  The reference remains valid
       
   643 			until this object is deleted."
       
   644 	*/
       
   645 	IMPORT_C const RArray<TPictureRateAndSize>& MaxPictureRates() const;
       
   646 
       
   647 	/**
       
   648 	Returns whether the decoder supports picture loss indications. If true, the decoder indicates
       
   649 	lost pictures by calling MdvpoPictureLoss().
       
   650 
       
   651 	@return "True if the decoder supports picture loss indications."
       
   652 	*/
       
   653 	IMPORT_C TBool SupportsPictureLoss() const;
       
   654 
       
   655 	/**
       
   656 	Returns whether the decoder supports slice loss indications. If true, the decoder indicates 
       
   657 	lost macroblocks by calling MdvpoSliceLoss().
       
   658 
       
   659 	@return "True if the decoder supports slice loss indications."
       
   660 	*/
       
   661 	IMPORT_C TBool SupportsSliceLoss() const;
       
   662 
       
   663 	/**
       
   664 	Returns coding-standard specific information about the decoder.
       
   665 	@return "Coding-standard specific information about the decoder. The data format is coding-standard
       
   666 			specific, and defined separately. The reference is valid until the CVideoDecoderInfo object
       
   667 			is destroyed."
       
   668 	*/
       
   669 	IMPORT_C const TDesC8& CodingStandardSpecificInfo() const;
       
   670 
       
   671 	/**
       
   672 	Returns implementation-specific information about the decoder.
       
   673 	@return "Implementation- specific information about the decoder. The data format is 
       
   674 			implementation-specific, and defined separately by the decoder supplier. The reference 
       
   675 			is valid until the CVideoDecoderInfo object is destroyed."
       
   676 	*/
       
   677 	IMPORT_C const TDesC8& ImplementationSpecificInfo() const;
       
   678 	
       
   679 	/**
       
   680 	Adds the screen number into the list of screens supported by the decoder.
       
   681 	@leave	"KErrNoMemory when there is no memory to expand the list of supported screens. 
       
   682 			 KErrNotSupported if the secondary screen display is not supported in Multimedia Framework."
       
   683 	*/
       
   684 	IMPORT_C void AddSupportedScreenL(TInt aScreenNo);
       
   685 	
       
   686 	/**
       
   687 	Lists the screens supported by the decoder.
       
   688 	@param	"aSupportedScreens"		"An array to retrieve the list of supported screens. 
       
   689 									 This method resets	the array before adding elements to it. 
       
   690 									 The array must be created and destroyed by the caller."
       
   691 	@leave "KErrNotSupported if the secondary screen display is not supported in Multimedia Framework.
       
   692 			KErrNoMemory when there is no memory to expand the list."
       
   693 	*/
       
   694 	IMPORT_C void GetSupportedScreensL(RArray<TInt>& aSupportedScreens) const;
       
   695 
       
   696 	/** Sets a flag indicating whether the Decoder supports per picture content protection.
       
   697 	    E.g. Where content protection within a video stream can alter.
       
   698 	 @param "aSetting" "Set to TRUE to indicate decoder supports content protection. 
       
   699 	 @See TVideoPicture::TVideoPictureOptions::EContentProtected 
       
   700 	 @See TVideoInputBuffer::TVideoBufferOptions::EContentProtected 
       
   701 	*/
       
   702 	IMPORT_C void SetSupportsContentProtected(const TBool aSetting);
       
   703 		
       
   704 	/** Returns whether the Decoder supports per picture content protection.
       
   705 	    E.g. Where content protection within a video stream can alter.
       
   706 	 @return "True if the Decoder supports Content Protection." 
       
   707 	 @See TVideoPicture::TVideoPictureOptions::EContentProtected
       
   708 	 @See TVideoInputBuffer::TVideoBufferOptions::EContentProtected
       
   709 	*/
       
   710 	IMPORT_C TBool SupportsContentProtected() const;
       
   711 
       
   712 private:
       
   713 	CVideoDecoderInfo(TUid aUid,
       
   714 					  TVersion aVersion,
       
   715 					  TBool aAccelerated,
       
   716 					  TBool aSupportsDirectDisplay,
       
   717 					  const TSize& aMaxPictureSize,
       
   718 					  TUint aMaxBitrate,
       
   719 					  TBool aSupportsPictureLoss,
       
   720 					  TBool aSupportsSliceLoss);
       
   721 
       
   722 	void ConstructL(const TDesC& aManufacturer,
       
   723 					const TDesC& aIdentifier,
       
   724 					const TArray<CCompressedVideoFormat*>& aSupportedFormats,
       
   725 					const TArray<TPictureRateAndSize>& aMaxPictureRates,
       
   726 					const TDesC8& aCodingStandardSpecificInfo,
       
   727 					const TDesC8& aImplementationSpecificInfo);
       
   728 private:
       
   729 	TUid iUid;
       
   730 	TVersion iVersion;
       
   731 	TBool iAccelerated;
       
   732 	TBool iSupportsDirectDisplay;
       
   733 	TSize iMaxPictureSize;
       
   734 	TUint iMaxBitrate;
       
   735 	TBool iSupportsPictureLoss;
       
   736 	TBool iSupportsSliceLoss;
       
   737 	HBufC* iManufacturer;
       
   738 	HBufC* iIdentifier;
       
   739 	RPointerArray<CCompressedVideoFormat> iSupportedFormats;
       
   740 	RArray<TPictureRateAndSize> iMaxPictureRates;
       
   741 	HBufC8* iCodingStandardSpecificInfo;
       
   742 	HBufC8* iImplementationSpecificInfo;
       
   743 	RArray<TInt> iSupportedScreens;
       
   744 	TBool iSupportsContentProtected;
       
   745 	};
       
   746 
       
   747 
       
   748 
       
   749 
       
   750 /**
       
   751 CMMFDevVideoPlay is the main client API for DevVideoPlay.
       
   752 @publishedAll
       
   753 @released
       
   754 */
       
   755 class CMMFDevVideoPlay : public CBase, private MMMFDevVideoPlayProxy
       
   756 	{
       
   757 public:
       
   758 	/**
       
   759 	Picture statistic counters. Used for following playback progress. The counters can be retrieved 
       
   760 	using GetPictureCounters() and are reset after each call. The client must keep track of the 
       
   761 	cumulative values for counters and picture processing rates itself if necessary.
       
   762 	*/
       
   763 	class TPictureCounters
       
   764 		{
       
   765 	public:
       
   766 		/**
       
   767 		Default constructor.  Zeros all members.
       
   768 		*/
       
   769 		inline TPictureCounters();
       
   770 	public:
       
   771 		/**
       
   772 		The number of pictures skipped due to lack of processing power. This does not include pictures 
       
   773 		inside data bytes discarded due to buffer overflows, but includes all pictures skipped at 
       
   774 		picture decoding, post-processing and rendering phase.
       
   775 		*/
       
   776 		TUint iPicturesSkipped;
       
   777 
       
   778 		/**
       
   779 		The number of pictures decoded.
       
   780 		*/
       
   781 		TUint iPicturesDecoded;
       
   782 
       
   783 		/**
       
   784 		The number of pictures "virtually" displayed. "Virtually" displayed pictures are pictures 
       
   785 		that have been drawn on the screen, when using direct rendering, or pictures that have been 
       
   786 		decoded, processed, and delivered to the client when not using direct rendering.
       
   787 		*/
       
   788 		TUint iPicturesDisplayed;
       
   789 
       
   790 		/**
       
   791 		The total number of pictures in the input bitstream. This figure does not include pictures that 
       
   792 		have been lost due to transmission errors, since those have not been processed by the MSL 
       
   793 		hardware devices, but does include pictures that have been discarded by the HW devices due 
       
   794 		to buffer overflows or other reasons.
       
   795 		*/
       
   796 		TUint iTotalPictures;
       
   797 		};
       
   798 
       
   799 	/**
       
   800 	Bitstream statistic counters, used for following decoding progress. The counters can be retrieved 
       
   801 	using GetBitstreamCounters() and are reset after each call. The client must keep track of the 
       
   802 	cumulative values for counters itself if necessary.
       
   803 	*/
       
   804 	class TBitstreamCounters
       
   805 		{
       
   806 	public:
       
   807 		/**
       
   808 		Default constructor.  Zeros all members.
       
   809 		*/
       
   810 		inline TBitstreamCounters();
       
   811 	public:
       
   812 		/**
       
   813 		Number of lost packets.  This figure includes all packets that have been dropped by the hardware 
       
   814 		devices due to buffer overruns, but it does not include packets lost due to transmission errors.
       
   815 		*/
       
   816 		TUint iLostPackets;
       
   817 
       
   818 		/**
       
   819 		Total number of packets. This figure includes all the packets that have been received by the 
       
   820 		decoder, including packets that have been dropped due to buffer overruns.
       
   821 		*/
       
   822 		TUint iTotalPackets;
       
   823 		};
       
   824 
       
   825 	/**
       
   826 	Buffer options used with SetBufferOptionsL().
       
   827 	*/
       
   828 	class TBufferOptions
       
   829 		{
       
   830 	public:
       
   831 		/**
       
   832 		Default constructor.  Zeros all members.
       
   833 		*/
       
   834 		inline TBufferOptions();
       
   835 
       
   836 	public:
       
   837 		/**
       
   838 		Pre-decoder buffer size in bytes. Set to zero to use decoder default value.
       
   839 		*/
       
   840 		TUint iPreDecodeBufferSize;
       
   841 
       
   842 		/**
       
   843 		Maximum post-decoder buffer size in bytes. Set to zero to remove limitations.
       
   844 		*/
       
   845 		TUint iMaxPostDecodeBufferSize;
       
   846 
       
   847 		/**
       
   848 		Initial pre-decoder buffering period, the amount of coded data to be buffered before decoding 
       
   849 		starts. If the value is set to zero, decoding begins immediately when all data associated with 
       
   850 		the first decoding timestamp is received. Default value is zero.
       
   851 		*/
       
   852 		TTimeIntervalMicroSeconds iPreDecoderBufferPeriod;
       
   853 
       
   854 		/**
       
   855 		The amount of data buffered after the decoding before playback starts. If the value is zero, 
       
   856 		playback begins immediately when the first picture has been decoded. The default value is zero.
       
   857 		*/
       
   858 		TTimeIntervalMicroSeconds iPostDecoderBufferPeriod;
       
   859 
       
   860 		/**
       
   861 		The maximum input buffer size that the client will request. If the buffer options have been 
       
   862 		set successfully, the decoder must be able to supply buffers of this size. If no information 
       
   863 		is available about the bitstream, the client may have to set this value to a relatively large 
       
   864 		value, and thus the decoder should not by default allocate buffers of this size before they 
       
   865 		are explicitly requested.
       
   866 		*/
       
   867 		TUint iMaxInputBufferSize;
       
   868 
       
   869 		/**
       
   870 		The minimum number of input buffers the decoder needs to have available. This is the number of 
       
   871 		buffers the client can request through GetBufferL() before writing any back using 
       
   872 		WriteCodedDataL().
       
   873 		*/
       
   874 		TUint iMinNumInputBuffers;
       
   875 		};
       
   876 
       
   877 	/**
       
   878 	Information about a single computational complexity level.
       
   879 	*/
       
   880 	class TComplexityLevelInfo
       
   881 		{
       
   882 	public:
       
   883 		enum TOptions
       
   884 			{
       
   885 			/** The average picture rate field is valid. */
       
   886 			EAvgPictureRate	   = 0x00000001,
       
   887 			/** The picture size field is valid. */
       
   888 			EPictureSize		  = 0x00000002,
       
   889 			/** The relative image quality field is valid. */
       
   890 			ERelativeImageQuality = 0x00000004,
       
   891 			/** The required MIPS field is valid. */
       
   892 			ERequiredMIPS		 = 0x00000008,
       
   893 			/** The relative processing time field is valid. */
       
   894 			ERelativeProcessTime  = 0x00000010
       
   895 			};
       
   896 		/**
       
   897 		Structure options. The value is a bitfield combined from values from TOptions.
       
   898 		*/
       
   899 		TUint32 iOptions;
       
   900 
       
   901 		/**
       
   902 		The average picture rate, in pictures per second. Valid only if EAvgPictureRate is set in the
       
   903 		options. This value depends on the input bitstream, and may not be available if enough 
       
   904 		bitstream has not been read.
       
   905 		*/
       
   906 		TReal iAvgPictureRate;
       
   907 
       
   908 		/**
       
   909 		Picture size (spatial resolution), in pixels. Valid only if EPictureSize is set in the options.
       
   910 		*/
       
   911 		TSize iPictureSize;
       
   912 
       
   913 		/**
       
   914 		Relative image quality, compared to the best available level. 1.0 is the quality at the 
       
   915 		maximum quality level (level zero). Valid only if ERelativeImageQuality is set in the options.
       
   916 		*/
       
   917 		TReal iRelativeImageQuality;
       
   918 
       
   919 		/**
       
   920 		The number of MIPS required to process the data. Valid only if ERequiredMIPS is set in 
       
   921 		the options.
       
   922 		*/
       
   923 		TUint iRequiredMIPS;
       
   924 
       
   925 		/**
       
   926 		Relative amount of processing time needed compared to standard-compliant decoding of all data. 
       
   927 		1.0 is the processing time required for full processing, which usually corresponds to 
       
   928 		complexity level zero. Valid only if ERelativeProcessTime is set in the options.
       
   929 		*/
       
   930 		TReal iRelativeProcessTime;
       
   931 		};
       
   932 
       
   933 public:
       
   934 
       
   935 	/**
       
   936 	Constructs a new MSL video client instance. Each client instance supports a single video bitstream.
       
   937 
       
   938 	@param  aObserver
       
   939 	        The observer object to use.
       
   940 
       
   941 	@return A pointer to a new CMMFDevVideoPlay object.
       
   942 	@leave  This method may leave with one of the system-wide error codes.
       
   943 	*/
       
   944 	IMPORT_C static CMMFDevVideoPlay* NewL(MMMFDevVideoPlayObserver& aObserver);
       
   945 
       
   946 	/**
       
   947 	Destructor.
       
   948 	*/
       
   949 	IMPORT_C ~CMMFDevVideoPlay();
       
   950 
       
   951 	/**
       
   952 	Finds a common format from two lists of uncompressed video formats. Used typically to find a 
       
   953 	suitable intermediate format between a video decoder and a post-processor. If multiple common 
       
   954 	formats are available, the lowest-cost format is selected, assuming that the cost of each format 
       
   955 	is equal to its position in the input array.
       
   956 	@param	"aFormats1"		"The first format list."
       
   957 	@param	"aFormats2"		"The second format list."
       
   958 	@param	"aCommonFormat"	"The target variable where the common format found (if any) is stored."
       
   959 	@return	"True if a common format was found, false if not. If no common format was found, 
       
   960 			aCommonFormat is not modified."
       
   961 	*/
       
   962 	IMPORT_C static TBool FindCommonFormat(const TArray<TUncompressedVideoFormat>& aFormats1, 
       
   963 										   const TArray<TUncompressedVideoFormat>& aFormats2, 
       
   964 										   TUncompressedVideoFormat& aCommonFormat);
       
   965 
       
   966 	/**
       
   967 	Finds all available decoders for a given video type with support for certain post-processing 
       
   968 	operations. The video type is specified using its MIME type, which may include parameters 
       
   969 	specifying the supported level, version, and other information. Decoder HW devices can use 
       
   970 	wildcards when listing the supported video types in the ECom registration information, so it is 
       
   971 	possible that all the decoders returned do not support the specified submode, e.g. profile and 
       
   972 	level, unless aExactMatch is set.
       
   973 	The decoder capabilities can be checked with VideoCodecInfoLC().
       
   974  
       
   975 	@param	"aMimeType"		"The video type that will be decoded."
       
   976 	@param	"aPostProcType"	"The post-processing types that the decoder has to support, a binary OR 
       
   977 							of TPrePostProcessType values. If no post-processing support is needed, 
       
   978 							set this value to zero."
       
   979 	@param	"aDecoders"		"An array for the result decoder UIDs. The array must be created and 
       
   980 							destroyed by the caller."
       
   981 	@param	"aExactMatch"	"True if exact matching should be used. In this only decoders that support 
       
   982 							exactly the MIME-type given will be returned. Since verifying this may 
       
   983 							require loading the decoders into memory, this can be a fairly expensive 
       
   984 							operation, and if the user needs to verify their capabilities further in 
       
   985 							any case this parameter should be set to EFalse."
       
   986 	@leave	"This method may leave with one of the system-wide error codes. Typical error codes used:
       
   987 				* KErrNotFound:	No decoders were found matching the search parameters."
       
   988 	*/
       
   989 	IMPORT_C void FindDecodersL(const TDesC8& aMimeType, 
       
   990 								TUint32 aPostProcType, 
       
   991 								RArray<TUid>& aDecoders, 
       
   992 								TBool aExactMatch=ETrue);
       
   993 
       
   994 	/**
       
   995 	Finds all available post-processors for a given set of post-processing operations.
       
   996 	@param	"aPostProcType"		"The post-processing types that the hardware device has to support, 
       
   997 								a binary OR of TPrePostProcessType values."
       
   998 	@param	"aPostProcessors"	"An array for the result post-processor UIDs. The array must be 
       
   999 								created and destroyed by the caller."
       
  1000 	@leave	"This method may leave with one of the system-wide error codes. Typical error codes used:
       
  1001 				* KErrNotFound:	No post-processors were found matching the search parameters."
       
  1002 	*/
       
  1003 	IMPORT_C void FindPostProcessorsL(TUint32 aPostProcType, RArray<TUid>& aPostProcessors);
       
  1004 
       
  1005 	/**
       
  1006 	Retrieves a list of available video decoders in the system.
       
  1007 	@param	"aDecoders"	"An array for the result decoder UIDs. The array must be created and 
       
  1008 						destroyed by the caller."
       
  1009 	@leave	"This method may leave with one of the system-wide error codes.  Not finding any decoders 
       
  1010 			is not treated as an error condition: in this situation, aDecoders will be empty."
       
  1011 	*/
       
  1012 	IMPORT_C void GetDecoderListL(RArray<TUid>& aDecoders);
       
  1013 
       
  1014 	/**
       
  1015 	Retrieves a list of available video post-processors in the system.
       
  1016 
       
  1017 	@param  aPostProcessors
       
  1018 	        An array for the result post-processor UIDs. The array must be created and
       
  1019 	        destroyed by the caller.
       
  1020 
       
  1021 	@leave  This method may leave with one of the system-wide error codes.  Not finding any post-processors
       
  1022 	        is not treated as an error condition: in this situation, aDecoders will be empty.
       
  1023 	*/
       
  1024 	IMPORT_C void GetPostProcessorListL(RArray<TUid>& aPostProcessors);
       
  1025 
       
  1026 	/**
       
  1027 	Retrieves information about an installed video decoder. Note that this method will need to load 
       
  1028 	the codec hardware device into memory, and can thus be relatively expensive.
       
  1029 	@param	"aVideoDecoder"	"The video decoder to query."
       
  1030 	@return "Decoder information as a CVideoDecoderInfo object. The object is pushed to the cleanup
       
  1031 			stack, and must be deallocated by the caller."
       
  1032 	@leave  "This method may leave with one of the system-wide error codes."
       
  1033 	*/
       
  1034 	IMPORT_C CVideoDecoderInfo* VideoDecoderInfoLC(TUid aVideoDecoder);
       
  1035 
       
  1036 	/**
       
  1037 	Retrieves information about the post-processing capabilities of an installed post-processor or 
       
  1038 	decoder hardware device. Note that this method will need to load the device into memory, and can 
       
  1039 	thus be relatively expensive.
       
  1040 	@param	"aPostProcessor"	"The post-processor to query."
       
  1041 	@return "Post-processor information as a CPostProcessorInfo object. The object is pushed to the 
       
  1042 			cleanup stack, and must be deallocated by the caller."
       
  1043 	@leave  "This method may leave with one of the system-wide error codes."
       
  1044 	*/
       
  1045 	IMPORT_C CPostProcessorInfo* PostProcessorInfoLC(TUid aPostProcessor);
       
  1046 
       
  1047 	/**
       
  1048 	Selects the video decoder to be used. This method must be called before any other video decoder 
       
  1049 	related methods are used. The decoder to use can be changed by calling this method again before 
       
  1050 	the API has been initialized with Initialize().
       
  1051 	All video decoder settings are reset to their default values, which are up to the implementation 
       
  1052 	to decide if not specified in any of the MSL specifications. By default no post-processing is 
       
  1053 	performed.
       
  1054 
       
  1055 	@param  "aDecoder" "The video decoder to use."
       
  1056 	@return "Hardware device ID, used in other methods for configuring the decoder."
       
  1057 	@leave  "The method will leave if an error occurs. Typical error codes used:
       
  1058 			* KErrNotFound - No decoder was found with the given UID"
       
  1059 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1060 	*/
       
  1061 	IMPORT_C THwDeviceId SelectDecoderL(TUid aDecoder);
       
  1062 
       
  1063 	/**
       
  1064 	Selects the video post-processor to be used. This method must be called before any other 
       
  1065 	post-processor related methods are used. The post-processor to use can be changed by calling
       
  1066 	this method again before the API has been initialized with Initialize().
       
  1067 	All post-processor settings are reset to their default values, which are up to the implementation
       
  1068 	to decide if not specified in any of the MSL specifications.
       
  1069 
       
  1070 	@param  "aPostProcessor" "The post-processor to use."
       
  1071 	@return "Hardware device ID, used in other methods for configuring the post-processor."
       
  1072 	@leave  "The method will leave if an error occurs. Typical error codes used:
       
  1073 				* KErrNotFound - No post-processor was found with the given UID"
       
  1074 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1075 	*/
       
  1076 	IMPORT_C THwDeviceId SelectPostProcessorL(TUid aPostProcessor);
       
  1077 
       
  1078 	/**
       
  1079 	Reads header information from a coded data unit. [1 #59] This method can be called only after 
       
  1080 	SelectDecoderL().
       
  1081 	@param	"aDataUnitType"				"The type of coded data unit that is contained in aDataUnit. If the 
       
  1082 										data is a simple piece of bitstream, use 
       
  1083 										EDuArbitraryStreamSection."
       
  1084 	@param	"aDataUnitEncapsulation"	"The encapsulation type used for the coded data. If the data 
       
  1085 										is a simple piece of bitstream, use EDuElementaryStream."
       
  1086 	@param	"aDataUnit"					"The coded data unit, contained in a TVideoInputBuffer."
       
  1087 	@return "Header information for the data unit, or NULL if the coded data unit did not contain 
       
  1088 			enough data to parse the header. The header data must be returned to the API using 
       
  1089 			ReturnHeader() before the API is shut down or the decoder is changed. The data remains 
       
  1090 			valid until it is returned."
       
  1091 	@leave	"The method will leave if an error occurs. Running out of data is not considered an error, 
       
  1092 			as described above. Typical error codes used:
       
  1093 				* KErrNotSupported - The data is not in a supported format.
       
  1094 				* KErrCorrupt - The data appears to be in a supported format, but is corrupted."
       
  1095 	*/
       
  1096 	IMPORT_C TVideoPictureHeader* GetHeaderInformationL(TVideoDataUnitType aDataUnitType, 
       
  1097 														TVideoDataUnitEncapsulation aDataUnitEncapsulation, 
       
  1098 														TVideoInputBuffer* aDataUnit);
       
  1099 
       
  1100 	IMPORT_C void ConfigureDecoderL(const TVideoPictureHeader& aVideoPictureHeader);
       
  1101 
       
  1102 	/**
       
  1103 	Returns a header from GetHeaderInformationL() back to the decoder so that the memory can be freed.
       
  1104 	@param	"aHeader"	"The header to return."
       
  1105 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1106 	*/
       
  1107 	IMPORT_C void ReturnHeader(TVideoPictureHeader* aHeader);
       
  1108 
       
  1109 	/**
       
  1110 	Sets a hardware device input format to an uncompressed video format. Only post-processors support 
       
  1111 	uncompressed video input.
       
  1112 	@param	"aHwDevice"	"The hardware device to configure. The value is returned from
       
  1113 						SelectPostProcessorL() when the device is selected."
       
  1114 	@param	"aFormat"	"The input format to use."
       
  1115 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1116 				* KErrNotSupported - The input format is not supported."
       
  1117 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1118 	*/
       
  1119 	IMPORT_C void SetInputFormatL(THwDeviceId aHwDevice, const TUncompressedVideoFormat& aFormat);
       
  1120 
       
  1121 	/**
       
  1122 	Sets a hardware device Input format to a compressed video format. Only decoders support compressed 
       
  1123 	video input.
       
  1124 	@param	"aHwDevice"			"The hardware device to configure. The value is returned from 
       
  1125 								SelectDecoderL() when the device is selected."
       
  1126 	@param	"aFormat"			"The input format to use."
       
  1127 	@param	"aDataUnitType"		"The data unit type for input data."
       
  1128 	@param	"aEncapsulation"	"The encapsulation type used for the coded data."
       
  1129 	@param	"aDataInOrder"		"True if the input data is written in correct decoding order, false if 
       
  1130 								the input data may be written in arbitrary order."
       
  1131 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1132 				* KErrNotSupported - The input format is not supported."
       
  1133 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1134 	*/
       
  1135 	IMPORT_C void SetInputFormatL(THwDeviceId aHwDevice, 
       
  1136 								  const CCompressedVideoFormat& aFormat, 
       
  1137 								  TVideoDataUnitType aDataUnitType, 
       
  1138 								  TVideoDataUnitEncapsulation aEncapsulation, 
       
  1139 								  TBool aDataInOrder);
       
  1140 
       
  1141 	/**
       
  1142 	Retrieves the list of the output formats a hardware device supports. The list is ordered in 
       
  1143 	preference order, with the preferred formats at the beginning of the list. The list can depend 
       
  1144 	on the device source format, and therefore SetSourceFormatL() must be called for the device 
       
  1145 	before calling this method.
       
  1146 	@param	"aHwDevice"	"The hardware device to configure. The value is returned from SelectDecoderL() 
       
  1147 						or SelectPostProcessorL() when the device is selected."
       
  1148 	@param	"aFormats"	"An array for the result format list. The array must be created and destroyed 
       
  1149 						by the caller."
       
  1150 	@leave	"This method may leave with one of the system-wide error codes."
       
  1151 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1152 	*/
       
  1153 	IMPORT_C void GetOutputFormatListL(THwDeviceId aHwDevice, RArray<TUncompressedVideoFormat>& aFormats);
       
  1154 
       
  1155 	/**
       
  1156 	Sets the output format for a hardware device. If a decoder and a post-processor are used, the 
       
  1157 	decoder output format must match the post-processor source format.
       
  1158 
       
  1159     If direct screen access is being used, then it is not necessary to call this method on the 
       
  1160 	hwdevice performing the direct screen access.
       
  1161 	
       
  1162 	@param	"aHwDevice"	"The hardware device to configure. The value is returned from SelectDecoderL() 
       
  1163 						or SelectPostProcessorL() when the device is selected."
       
  1164 	@param	"aFormat"	"The format to use."
       
  1165 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1166 				* KErrNotSupported - The output format is not supported."
       
  1167 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1168 	*/
       
  1169 	IMPORT_C void SetOutputFormatL(THwDeviceId aHwDevice, const TUncompressedVideoFormat &aFormat);
       
  1170 
       
  1171 	/**
       
  1172 	Sets the clock source to use for video timing. When video playback is synchronized with audio, the 
       
  1173 	clock source is implemented by the audio playback subsystem, otherwise the clock source should get 
       
  1174 	the time from the system clock. If no clock source is set, video playback will not be synchronized,
       
  1175 	but will proceed as fast as possible, depending on input data and output buffer availability. This 
       
  1176 	method can be called after all hardware devices have been selected, but before calling Initialize().
       
  1177 
       
  1178 	All decoders must support synchronization with an external clock source, as well as unsynchronized 
       
  1179 	non-realtime operation. When a clock source is set, the decoder can skip pictures to maintain 
       
  1180 	synchronization. When non-realtime operation is used and no clock source has been set, pictures 
       
  1181 	may not be skipped unless a lower complexity level is used that requires this.
       
  1182 
       
  1183 	@param	"aClock"	"The clock source to use"
       
  1184 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1185 	*/
       
  1186 	IMPORT_C void SetClockSource(MMMFClockSource* aClock);
       
  1187 
       
  1188 	/**
       
  1189 	Sets the video output destination. The destination can be the screen (using direct screen access) 
       
  1190 	or memory buffers. By default memory buffers are used. This method must be called after the 
       
  1191 	decoder and post-processor have been selected and their options set, since support for direct 
       
  1192 	screen access can vary between hardware devices.
       
  1193 	@param	"aScreen"	"True if video output destination is the screen, false if memory buffers."
       
  1194 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1195 				* KErrNotSupported - The selected video destination is not supported with the 
       
  1196 				  current codec and post-processor settings."
       
  1197 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1198 	*/
       
  1199 	IMPORT_C void SetVideoDestScreenL(TBool aScreen);
       
  1200 
       
  1201 	/**
       
  1202 	Sets whether the decoder should synchronize decoding to the current clock source, if any, or 
       
  1203 	should decode all pictures as soon as possible. If decoding is synchronized, decoding timestamps 
       
  1204 	are used if available, presentation timestamps are used if not. When decoding is not synchronized, 
       
  1205 	pictures are decoded as soon as source data is available for them and the decoder has a free 
       
  1206 	output buffer. If a clock source is not available, decoding will not be synchronized.
       
  1207 
       
  1208 	@param	"aSynchronize"	"True if decoding should be synchronized to a clock source."
       
  1209 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1210 	*/
       
  1211 	IMPORT_C void SynchronizeDecoding(TBool aSynchronize);
       
  1212 
       
  1213 	/**
       
  1214 	Sets video decoder buffering options.
       
  1215 	@param	"aOptions"	"Buffering options."
       
  1216 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1217 				* KErrNotSupported - The specified buffering options are not supported. If the 
       
  1218 				  client receives this error code, it can call GetBufferOptions() to determine 
       
  1219 				  the options the decoder is able to support."
       
  1220 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1221 	*/
       
  1222 	IMPORT_C void SetBufferOptionsL(const TBufferOptions& aOptions);
       
  1223 
       
  1224 	/**
       
  1225 	Gets the video decoder buffer options actually in use. This can be used before calling 
       
  1226 	SetBufferOptionsL() to determine the default options, or afterwards to check the values actually 
       
  1227 	in use (if some default values were used).
       
  1228 	@param	"aOptions"	"Buffering options structure to fill."
       
  1229 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1230 	*/
       
  1231 	IMPORT_C void GetBufferOptions(TBufferOptions& aOptions);
       
  1232 
       
  1233 	/**
       
  1234 	Indicates which HRD/VBV specification is fulfilled in the input stream and any related parameters.
       
  1235 	@param	"aHrdVbvSpec"	"The HRD/VBV specification fulfilled, see the definition of 
       
  1236 							THrdVbvSpecification for details."
       
  1237 	@param	"aHrdVbvParams"	"HRD/VBV parameters. The data format depends on the parameters chosen. 
       
  1238 							For 3GPP TS 26.234 parameters (aHrdVbvSpec=EHrdVbv3GPP), the data in the 
       
  1239 							descriptor is a package of type TPckC<T3gppHrdVbvParams> 
       
  1240 							(see T3gppHrdVbvParams). If no HRD/VBV parameters are used, the descriptor 
       
  1241 							is empty."
       
  1242 	@pre	"This method can only be called before the API has been initialized with Initialize()."
       
  1243 	*/
       
  1244 	IMPORT_C void SetHrdVbvSpec(THrdVbvSpecification aHrdVbvSpec, const TDesC8& aHrdVbvParams);
       
  1245 
       
  1246 	/**
       
  1247 	Sets the post-processing types to be used. This method, like all post-processing configuration 
       
  1248 	methods, must be called before Initialize().
       
  1249 
       
  1250 	Post-processing operations are carried out in the following order:
       
  1251 		1. Input cropping
       
  1252 		2. Mirroring
       
  1253 		3. Rotating
       
  1254 		4. Scaling
       
  1255 		5. Output cropping
       
  1256 	Color space conversion can be performed at any point in the post-processing flow.
       
  1257 
       
  1258 	@param	"aHwDevice"				"The hardware device to configure. The value is returned from 
       
  1259 									SelectDecoderL() or SelectPostProcessorL() when the device is 
       
  1260 									selected."
       
  1261 	@param	"aPostProcCombination"	"The post-processing steps to perform, a bitwise OR of values 
       
  1262 									from TPrePostProcessType."
       
  1263 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1264 				* KErrNotSupported - The post-processing combination is not supported"
       
  1265 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1266 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1267 	*/
       
  1268 	IMPORT_C void SetPostProcessTypesL(THwDeviceId aHwDevice, TUint32 aPostProcCombination);
       
  1269 
       
  1270 	/**
       
  1271 	Sets post-processing options for input (pan-scan) cropping. SetPostProcessTypesL() must be called 
       
  1272 	before this method is used.
       
  1273 	@param	"aHwDevice"	"The hardware device to configure. The value is returned from SelectDecoderL()
       
  1274 						or SelectPostProcessorL() when the device is selected."
       
  1275 	@param	"aRect"		"The cropping rectangle to use."
       
  1276 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1277 				* KErrNotSupported - Pan-scan cropping is not supported"
       
  1278 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1279 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1280 	*/
       
  1281 	IMPORT_C void SetInputCropOptionsL(THwDeviceId aHwDevice, const TRect& aRect);
       
  1282 
       
  1283 	/**
       
  1284 	Sets post-processing options for YUV to RGB color space conversion. Specifies the input YUV and 
       
  1285 	output RGB formats to use explicitly. SetSourceFormatL() and SetOutputFormatL(), and 
       
  1286 	SetPostProcessTypesL() must be called before this method is used.
       
  1287 	@param	"aHwDevice"		"The hardware device to configure. The value is returned from 
       
  1288 							SelectDecoderL() or SelectPostProcessorL() when the device is selected."
       
  1289 	@param	"aOptions"		"The conversion options to use."
       
  1290 	@param	"aYuvFormat"	"Conversion source YUV format."
       
  1291 	@param	"aRgbFormat"	"Conversion target RGB format."
       
  1292 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1293 				* KErrNotSupported - The conversion options are not supported."
       
  1294 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1295 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1296 	*/
       
  1297 	IMPORT_C void SetYuvToRgbOptionsL(THwDeviceId aHwDevice, 
       
  1298 									  const TYuvToRgbOptions& aOptions, 
       
  1299 									  const TYuvFormat& aYuvFormat, 
       
  1300 									  TRgbFormat aRgbFormat);
       
  1301 
       
  1302 	/**
       
  1303 	Sets post-processing options for YUV to RGB color space conversion. Uses the device input and 
       
  1304 	output formats. For decoders the default YUV format used is the format specified in the input 
       
  1305 	bitstream. SetSourceFormatL() and SetOutputFormatL(), and SetPostProcessTypesL() must be called 
       
  1306 	before this method is used.
       
  1307 	@param	"aHwDevice"		"The hardware device to configure. The value is returned from 
       
  1308 							SelectDecoderL() or SelectPostProcessorL() when the device is selected."
       
  1309 	@param	"aOptions"		"The conversion options to use."
       
  1310 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1311 				* KErrNotSupported - The conversion options are not supported."
       
  1312 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1313 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1314 	*/
       
  1315 	IMPORT_C void SetYuvToRgbOptionsL(THwDeviceId aHwDevice, const TYuvToRgbOptions& aOptions);
       
  1316 
       
  1317 	/**
       
  1318 	Sets post-processing options for rotation. SetPostProcessTypesL() must be called before this 
       
  1319 	method is used.
       
  1320 	@param	"aHwDevice"		"The hardware device to configure. The value is returned from 
       
  1321 							SelectDecoderL() or SelectPostProcessorL() when the device is selected."
       
  1322 	@param	"aRotationType"	"The rotation to perform."
       
  1323 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1324 				* KErrNotSupported - The rotation options are not supported."
       
  1325 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1326 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1327 	*/
       
  1328 	IMPORT_C void SetRotateOptionsL(THwDeviceId aHwDevice, TRotationType aRotationType);
       
  1329 
       
  1330 	/**
       
  1331 	Sets post-processing options for scaling. SetPostProcessTypesL() must be called before this method 
       
  1332 	is used.
       
  1333 	@param	"aHwDevice"				"The hardware device to configure. The value is returned from 
       
  1334 									SelectDecoderL() or SelectPostProcessorL() when the device is 
       
  1335 									selected."
       
  1336 	@param	"aTargetSize"			"Scaling target size. If a fixed scale factor size is used, the 
       
  1337 									new dimensions must be set to width=floor(factor*width), 
       
  1338 									height=floor(factor*height). For example, scaling a QCIF (176x144) 
       
  1339 									picture up by a factor of 4/3 yields a size of 234x192."
       
  1340 	@param	"aAntiAliasFiltering"	"True if anti-aliasing filtering should be used. If the 
       
  1341 									post-processor does not support anti-aliased scaling, or supports 
       
  1342 									anti-aliased scaling only, this argument is ignored."
       
  1343 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1344 				* KErrNotSupported - The scale options are not supported."
       
  1345 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1346 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1347 	*/
       
  1348 	IMPORT_C void SetScaleOptionsL(THwDeviceId aHwDevice, 
       
  1349 								   const TSize& aTargetSize, 
       
  1350 								   TBool aAntiAliasFiltering);
       
  1351 
       
  1352 	/**
       
  1353 	Sets post-processing options for output cropping. SetPostProcessTypesL() must be called before this
       
  1354 	method is used.
       
  1355 	@param	"aHwDevice"	"The hardware device to configure. The value is returned from SelectDecoderL()
       
  1356 						# SelectPostProcessorL() when the device is selected."
       
  1357 	@param	"aRect"		"Output cropping area."
       
  1358 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1359 				* KErrNotSupported - Output cropping is not supported."
       
  1360 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1361 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1362 	*/
       
  1363 	IMPORT_C void SetOutputCropOptionsL(THwDeviceId aHwDevice, const TRect& aRect);
       
  1364 
       
  1365 	/**
       
  1366 	Sets post-processing hardware device specific options. SetPostProcessTypesL() must be called 
       
  1367 	before this method is used.
       
  1368 	@param	"aHwDevice"	"The hardware device to configure. The value is returned from SelectDecoderL()
       
  1369 						or SelectPostProcessorL() when the device is selected."
       
  1370 	@param	"aOptions"	"The options. The format is plug-in specific."
       
  1371 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1372 				* KErrNotSupported - The options are not supported."
       
  1373 	@pre	"This method can be called either before or after the API has been initialized with Initialize().
       
  1374 			If called after initialization, the change will only be committed once CommitL() is called."
       
  1375 	*/
       
  1376 	IMPORT_C void SetPostProcSpecificOptionsL(THwDeviceId aHwDevice, const TDesC8& aOptions);
       
  1377 
       
  1378 	/**
       
  1379 	Initializes the video device. This method is asynchronous, DevVideoPlay will call 
       
  1380 	MMMFDevVideoPlayObserver::MdvpoInitializeComplete() after initialization has completed. No 
       
  1381 	DevVideoPlay method may be called while initialization is in progress, the initialization process 
       
  1382 	can only be cancelled by destroying the DevVideoPlay object. After this initialization has been 
       
  1383 	successfully completed, further configuration changes are not possible except where separately 
       
  1384 	noted.
       
  1385 
       
  1386 	If initialization fails for any reason, the DevVideoPlay object must be destroyed and set up from
       
  1387 	scratch.
       
  1388 	*/
       
  1389 	IMPORT_C void Initialize();
       
  1390 
       
  1391 	/**
       
  1392 	Commit all configuration changes since the last CommitL(), Revert() or Initialize(). This only applies 
       
  1393 	to methods that can be called both before AND after DevVideoPlay has been initialized. 
       
  1394 	See the following methods for details.
       
  1395 
       
  1396 	@see	SetPostProcessTypesL
       
  1397 	@see	SetInputCropOptionsL
       
  1398 	@see	SetYuvToRgbOptionsL
       
  1399 	@see	SetRotateOptionsL
       
  1400 	@see	SetScaleOptionsL
       
  1401 	@see	SetOutputCropOptionsL
       
  1402 	@see	SetPostProcSpecificOptionsL
       
  1403 
       
  1404 	@leave  "The method will leave if an error occurs."
       
  1405 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1406 	*/
       
  1407 	IMPORT_C void CommitL();
       
  1408 
       
  1409 	/**
       
  1410 	Revert any configuration changes that have not yet been committed using CommitL().  This only applies 
       
  1411 	to methods that can be called both before AND after DevVideoPlay has been initialized. 
       
  1412 	See the following methods for details.
       
  1413 
       
  1414 	@see	SetPostProcessTypesL
       
  1415 	@see	SetInputCropOptionsL
       
  1416 	@see	SetYuvToRgbOptionsL
       
  1417 	@see	SetRotateOptionsL
       
  1418 	@see	SetScaleOptionsL
       
  1419 	@see	SetOutputCropOptionsL
       
  1420 	@see	SetPostProcSpecificOptionsL
       
  1421 
       
  1422 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1423 	*/
       
  1424 	IMPORT_C void Revert();
       
  1425 
       
  1426 	/**
       
  1427 	Starts video decoding directly to the display frame buffer using Direct Screen Access. 
       
  1428 	Playback to the display can start immediately.
       
  1429 	@param	"aVideoRect"	"The video output rectangle on screen. The rectangle size should be the 
       
  1430 							same as the output video size, otherwise results are undefined. Some 
       
  1431 							decoders may set limitations to the position and alignment of the 
       
  1432 							rectangle. The rectangle must be aligned to a 32-bit boundary on screen 
       
  1433 							(even X-coordinate on 12-bpp and 16-bpp displays) and must fit completely 
       
  1434 							on the screen."
       
  1435 	@param	"aScreenDevice"	"The screen device to use. The screen device will supply frame buffer 
       
  1436 							information, and is used to update the frame buffer to screen. The screen 
       
  1437 							device object must be valid in the current thread."
       
  1438 	@param	"aClipRegion"	"Initial clipping region to use."
       
  1439 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1440 				*KErrNotSupported - Direct Screen Access is not supported"
       
  1441 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1442 	*/
       
  1443 	IMPORT_C void StartDirectScreenAccessL(const TRect& aVideoRect, 
       
  1444 										   CFbsScreenDevice& aScreenDevice, 
       
  1445 										   const TRegion& aClipRegion);
       
  1446 
       
  1447 	/**
       
  1448 	Sets a new clipping region for Direct Screen Access. After the method returns, no video will be 
       
  1449 	drawn outside of the region. (Note that in Symbian OS clipping regions are "positive" - that is, 
       
  1450 	they define the legal area inside which an application may draw.) 
       
  1451 
       
  1452 	If clipping is not supported, or the clipping region is too complex, either playback will pause 
       
  1453 	or will resume without video display, depending on the current setting of SetPauseOnClipFail(), 
       
  1454 	and the result can be verified with IsPlaying(). Clipping can be disabled by setting a new 
       
  1455 	clipping region that includes the whole video window.
       
  1456 
       
  1457 	@param	"aRegion"	"The new clipping region. After the method returns, no video will be drawn 
       
  1458 						outside the region."
       
  1459 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1460 	*/
       
  1461 	IMPORT_C void SetScreenClipRegion(const TRegion& aRegion);
       
  1462 
       
  1463 	/**
       
  1464 	Sets whether the system should pause playback when it gets a clipping region it cannot handle, 
       
  1465 	or Direct Screen Access is aborted completely. If not, decoding will proceed normally, but no 
       
  1466 	video will be drawn. By default, playback is paused.
       
  1467 	@param	"aPause"	"True if playback should be paused when clipping fails, false if not. If 
       
  1468 						playback is not paused, it will be continued without video display."
       
  1469 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1470 	*/
       
  1471 	IMPORT_C void SetPauseOnClipFail(TBool aPause);
       
  1472 
       
  1473 	/**
       
  1474 	Aborts Direct Screen Access completely, to be called from MAbortDirectScreenAccess::AbortNow() and 
       
  1475 	similar methods. DSA can be resumed by calling StartDirectScreenAccessL().
       
  1476 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1477 	*/
       
  1478 	IMPORT_C void AbortDirectScreenAccess();
       
  1479 
       
  1480 	/**
       
  1481 	Indicates whether playback is proceeding. This method can be used to check whether playback was 
       
  1482 	paused or not in response to a new clipping region or DSA abort.
       
  1483 	@return "ETrue if video is still being played (even if not necessarily displayed)."
       
  1484 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1485 	*/
       
  1486 	IMPORT_C TBool IsPlaying();
       
  1487 
       
  1488 	/**
       
  1489 	Re-draws the latest video picture. Only available when DSA is being used. If DSA is aborted 
       
  1490 	or a non-supported clipping region has been set, the request may be ignored.
       
  1491 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1492 	*/
       
  1493 	IMPORT_C void Redraw();
       
  1494 
       
  1495 	/**
       
  1496 	Starts video playback, including decoding, post-processing, and rendering. Playback will proceed 
       
  1497 	until it has been stopped or paused, or the end of the bitstream is reached.
       
  1498 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1499 	*/
       
  1500 	IMPORT_C void Start();
       
  1501 
       
  1502 	/**
       
  1503 	Stops video playback. No new pictures will be decoded, post-processed, or rendered.
       
  1504 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1505 	*/
       
  1506 	IMPORT_C void Stop();
       
  1507 
       
  1508 	/**
       
  1509 	Pauses video playback, including decoding, post-processing, and rendering. No pictures will be 
       
  1510 	decoded, post-processed, or rendered until playback has been resumed. The client is responsible 
       
  1511 	for pausing the clock source (typically by pausing audio output) if necessary.
       
  1512 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1513 	*/
       
  1514 	IMPORT_C void Pause();
       
  1515 
       
  1516 	/**
       
  1517 	Resumes video playback after a pause. The client is responsible for restarting the clock source 
       
  1518 	if necessary.
       
  1519 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1520 	*/
       
  1521 	IMPORT_C void Resume();
       
  1522 
       
  1523 	/**
       
  1524 	Changes to a new decoding and playback position, used for randomly accessing (seeking) the input 
       
  1525 	stream. The position change flushes all input and output buffers. Pre-decoder and post-decoder 
       
  1526 	buffering are handled as if a new bitstream was started. If the MSL video subsystem still has 
       
  1527 	buffered pictures that precede the new playback position, they will be discarded. If playback is 
       
  1528 	synchronized to a clock source, the client is responsible for setting the clock source to the new 
       
  1529 	position.
       
  1530 	@param	"aPlaybackPosition"	"The new playback position in the video stream."
       
  1531 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1532 	*/
       
  1533 	IMPORT_C void SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition);
       
  1534 
       
  1535 	/**
       
  1536 	Freezes a picture on the screen. After the picture has been frozen, no picture is displayed until 
       
  1537 	the freeze is released with ReleaseFreeze(). If the video output is being written to memory 
       
  1538 	buffers, not the screen, decoded pictures will not be delivered to the client when a freeze is 
       
  1539 	active, but are simply discarded.
       
  1540 	@param	"aPlaybackPosition"	"The presentation timestamp of the picture to freeze. The frozen 
       
  1541 								picture will be the first picture with a timestamp greater than or 
       
  1542 								equal to this parameter."
       
  1543 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1544 	*/
       
  1545 	IMPORT_C void FreezePicture(const TTimeIntervalMicroSeconds& aPlaybackPosition);
       
  1546 
       
  1547 	/**
       
  1548 	Releases a picture frozen with FreezePicture().
       
  1549 	@param	"aPlaybackPosition"	"The presentation timestamp of the picture to release. The first 
       
  1550 								picture displayed after the release will be the first picture with a 
       
  1551 								timestamp greater than or equal to this parameter. To release the 
       
  1552 								freeze immediately, set the timestamp to zero."
       
  1553 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1554 	*/
       
  1555 	IMPORT_C void ReleaseFreeze(const TTimeIntervalMicroSeconds& aPlaybackPosition);
       
  1556 
       
  1557 	/**
       
  1558 	Returns the current decoding position, i.e. the timestamp for the most recently decoded picture.
       
  1559 	@return "Current decoding position."
       
  1560 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1561 	*/
       
  1562 	IMPORT_C TTimeIntervalMicroSeconds DecodingPosition();
       
  1563 
       
  1564 	/**
       
  1565 	Returns the current playback position, i.e. the timestamp for the most recently displayed or 
       
  1566 	virtually displayed picture.
       
  1567 	@return "Current playback position."
       
  1568 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1569 	*/
       
  1570 	IMPORT_C TTimeIntervalMicroSeconds PlaybackPosition();
       
  1571 	
       
  1572 	/**
       
  1573 	Returns the current pre-decoder buffer size.
       
  1574 	@return "The number of bytes of data in the pre-decoder buffer."
       
  1575 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1576 	*/
       
  1577 	IMPORT_C TUint PreDecoderBufferBytes();
       
  1578 
       
  1579 	/**
       
  1580 	Returns the total amount of memory allocated for uncompressed pictures.
       
  1581 	@return "Total number of bytes of memory allocated for uncompressed pictures."
       
  1582 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1583 	*/
       
  1584 	IMPORT_C TUint PictureBufferBytes();
       
  1585 
       
  1586 	/**
       
  1587 	Reads various counters related to decoded pictures. See the definition of TPictureCounters for a 
       
  1588 	description of the counters. The counters are reset when Initialize() or this method is called, 
       
  1589 	and thus they only include pictures processed since the last call.
       
  1590 	@param	"aCounters"	"The counter structure to fill."
       
  1591 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1592 	*/
       
  1593 	IMPORT_C void GetPictureCounters(TPictureCounters& aCounters);
       
  1594 
       
  1595 	/**
       
  1596 	Reads various counters related to the received input bitstream and coded data units. See the 
       
  1597 	definition of  TBitstreamCounters for a description about the counters. The counters are reset 
       
  1598 	when Initialize() or this method is called, and thus they only include data processed since the 
       
  1599 	last call.
       
  1600 	@param	"aCounters"	"The counter structure to fill."
       
  1601 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1602 	*/
       
  1603 	IMPORT_C void GetBitstreamCounters(TBitstreamCounters& aCounters);
       
  1604 
       
  1605 	/**
       
  1606 	Retrieves the number of free input buffers the decoder has available. If only a post-processor 
       
  1607 	is used, the return value is undefined.
       
  1608 	@return "Number of free input buffers the decoder has available."
       
  1609 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1610 	*/
       
  1611 	IMPORT_C TUint NumFreeBuffers();
       
  1612 
       
  1613 	/**
       
  1614 	Sets the computational complexity level to use. The level can be set separately for each hardware 
       
  1615 	device in use. If separate complexity levels are not available, the method call is ignored. If the 
       
  1616 	level specified is not available, the results are undefined. Typically the device will either 
       
  1617 	ignore the request or use the nearest suitable level.
       
  1618 
       
  1619 	The complexity level can be changed at any point during playback.
       
  1620 
       
  1621 	@param	"aHwDevice"	"The plug-in to control. The value is returned from SelectDecoderL()or 
       
  1622 						SelectPostProcessorL() when the device is selected."
       
  1623 	@param	"aLevel"	"The computational complexity level to use. Level zero (0) is the most 
       
  1624 						complex one, with the highest quality. Higher level numbers require less 
       
  1625 						processing and may have lower quality."
       
  1626 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1627 	*/
       
  1628 	IMPORT_C void SetComplexityLevel(THwDeviceId aHwDevice, TUint aLevel);
       
  1629 
       
  1630 	/**
       
  1631 	Gets the number of complexity levels available.
       
  1632 	@param	"aHwDevice"	"The plug-in to query. The value is returned from SelectDecoderL()or 
       
  1633 						SelectPostProcessorL() when the device is selected."
       
  1634 	@return	"The number of complexity control levels available, or zero if the information is not 
       
  1635 			available yet. The information may not be available if the number of levels depends on 
       
  1636 			the input data, and enough input data has not been read yet. In that case, using level 
       
  1637 			zero is safe."
       
  1638 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1639 	*/
       
  1640 	IMPORT_C TUint NumComplexityLevels(THwDeviceId aHwDevice);
       
  1641 
       
  1642 	/**
       
  1643 	Gets information about a computational complexity level. This method can be called after 
       
  1644 	NumComplexityLevels() has returned a non-zero value - at that point the information is guaranteed 
       
  1645 	to be available. Some hardware device implementations may not be able to provide all values, 
       
  1646 	in that case the values will be approximated.
       
  1647 	@param	"aHwDevice"	"The hw device to query. The value is returned from SelectDecoderL()or 
       
  1648 						SelectPostProcessorL() when the device is selected."
       
  1649 	@param	"aLevel"	"The computational complexity level to query. The level numbers range from 
       
  1650 						zero (the most complex) to NumComplexityLevels()-1."
       
  1651 	@param	"aInfo"		"The information structure to fill."
       
  1652 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1653 	*/
       
  1654 	IMPORT_C void GetComplexityLevelInfo(THwDeviceId aHwDevice, TUint aLevel, TComplexityLevelInfo& aInfo);
       
  1655 
       
  1656 	/**
       
  1657 	Retrieves an empty video input buffer from the decoder. After input data has been written to the 
       
  1658 	buffer, it can be written to the decoder using WriteCodedDataL(). The maximum number of buffers 
       
  1659 	the client can retrieve before returning any to the decoder is determined by the 
       
  1660 	TBufferOptions.iMinNumInputBuffers value set with SetBufferOptionsL().
       
  1661 
       
  1662 	If a buffer is not immediately available, the client can wait for a MdvpoNewBuffers() callback 
       
  1663 	before trying again, or poll for new buffer availability after a delay. Note that video decoding 
       
  1664 	may be performed in the same thread, in a separate active object, so the client must not block 
       
  1665 	the active scheduler while waiting for buffers to become available, otherwise the system can 
       
  1666 	deadlock. Assuming that the client does not keep too many buffers retrieved and playback is in 
       
  1667 	progress, new buffers will be available after some time.
       
  1668 
       
  1669 	The decoder maintains ownership of the buffers even while they have been retrieved by the client, 
       
  1670 	and will take care of deallocating them. The client must not destroy the buffer objects, even if 
       
  1671 	it has retrieved buffers and it is being shut down. The buffers will be destroyed by the decoder, 
       
  1672 	and will not be valid after the decoder has been shut down.
       
  1673 
       
  1674 	@param	"aBufferSize"	"Required buffer size, in bytes. The resulting buffer can be larger than 
       
  1675 							this, but not smaller"
       
  1676 	@return	"A new input data buffer. The buffer is at least as large as requested, but it may be 
       
  1677 			larger. If no free buffers are available, the return value is NULL."
       
  1678 	@leave	"The method will leave if an error occurs. Lack of free buffers is not considered an error."
       
  1679 	*/
       
  1680 	IMPORT_C TVideoInputBuffer* GetBufferL(TUint aBufferSize);
       
  1681 
       
  1682 	/**
       
  1683 	Writes a piece of coded video data. The data will be passed to the video decoder and 
       
  1684 	post-processor to be used in video playback. The data buffer must be retrieved from the decoder 
       
  1685 	with GetBufferL().
       
  1686 	@param	"aBuffer"	"The coded data unit to write."
       
  1687 	@leave	"The method will leave if an error occurs."
       
  1688 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1689 	*/
       
  1690 	IMPORT_C void WriteCodedDataL(TVideoInputBuffer* aBuffer);
       
  1691 
       
  1692 	/**
       
  1693 	Writes an uncompressed video picture. The picture must remain valid and unmodified until it is 
       
  1694 	returned with the MdvpoReturnPicture() callback.
       
  1695 	@param	"aPicture"	"The picture to write."
       
  1696 	@leave	"The method will leave if an error occurs."
       
  1697 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1698 	*/
       
  1699 	IMPORT_C void WritePictureL(TVideoPicture* aPicture);
       
  1700 
       
  1701 	/**
       
  1702 	Notifies the system that the end of input data has been reached.
       
  1703 	
       
  1704 	The decoder and post-processor can use this signal to ensure that the remaining data gets processed,
       
  1705 	without waiting for new data.  For example when the data type is not EDuCodedPicture, calling this
       
  1706 	method is necessary otherwise a decoder implementation might be waiting for the start code for the
       
  1707 	next picture to ensure it has a complete picture before starting to decode the previous one. 
       
  1708 	
       
  1709 	  
       
  1710 	After the remaining data has been processed (and displayed, if applicable), the client gets 
       
  1711 	notified with the MdvpoStreamEnd() callback.  The client must then call Stop() on the interface.
       
  1712 
       
  1713 	DevVideo clients are encouraged to call this method, but its use is not mandatory for synchronized 
       
  1714 	processing.  For synchronized playback, all video pictures are processed or discarded according to
       
  1715 	their timestamps, and so the client can easily infer when processing is complete.  However, it 
       
  1716 	should be noted that the last picture might not be displayed if this method is not called and the
       
  1717 	input data type is not EDuCodedPicture.
       
  1718 
       
  1719 	For non-synchronized playback (e.g. file conversion), a client must call this method otherwise it
       
  1720 	will never find out when the hardware device has finished processing the data.
       
  1721 
       
  1722 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1723 	*/
       
  1724 	IMPORT_C void InputEnd();
       
  1725 
       
  1726 	/**
       
  1727 	Gets information about new decoded pictures. "New decoded pictures" are pictures that have not 
       
  1728 	been returned to the caller using NextPicture(). This method can only be called if video 
       
  1729 	destination is memory buffers, i.e. Direct Screen Access is not used.
       
  1730 	@param	"aNumPictures"			"Target for the number of new decoded pictures. If no pictures are 
       
  1731 									available, the value written is zero, and the timestamps are not 
       
  1732 									valid."
       
  1733 	@param	"aEarliestTimestamp"	"Timestamp for the earliest available new decoded picture. If the 
       
  1734 									number of new decoded pictures (aNumPictures) is zero, the 
       
  1735 									timestamp is not valid."
       
  1736 	@param	"aLatestTimestamp"		"Timestamp for the latest available new decoded picture. If the 
       
  1737 									number of new decoded pictures (aNumPictures) is zero, the 
       
  1738 									timestamp is not valid."
       
  1739 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1740 	*/
       
  1741 	IMPORT_C void GetNewPictureInfo(TUint& aNumPictures, 
       
  1742 									TTimeIntervalMicroSeconds& aEarliestTimestamp, 
       
  1743 									TTimeIntervalMicroSeconds& aLatestTimestamp);
       
  1744 
       
  1745 	/**
       
  1746 	Gets the next (in displaying order) new decoded picture. Only one picture can be retrieved at a 
       
  1747 	time, the current picture must be returned with ReturnPicture() before a new one can be read.
       
  1748 	@return	"The next new decoded picture. The pointer and the related data is valid until the picture 
       
  1749 			is returned using ReturnPicture(), or the API is shut down. If no new picture is available,
       
  1750 			the method returns NULL."
       
  1751 	@leave	"The method will leave if an error occurs."
       
  1752 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1753 	*/
       
  1754 	IMPORT_C TVideoPicture* NextPictureL();
       
  1755 
       
  1756 	/**
       
  1757 	Returns a picture from NextPicture() back to the device. The picture data cannot be used afterwards.
       
  1758 	@param	"aPicture"	"The picture to return. After this method returns, the pointer is no longer
       
  1759 						valid and the picture data cannot be used."
       
  1760 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1761 	*/
       
  1762 	IMPORT_C void ReturnPicture(TVideoPicture* aPicture);
       
  1763 
       
  1764 	/**
       
  1765 	Gets a copy of the latest picture displayed.
       
  1766 	@param	"aPictureData"	"Target picture. The memory for the picture must be allocated by the 
       
  1767 							caller, and initialized properly. The data formats must match the snapshot 
       
  1768 							format requested."
       
  1769 	@param	"aFormat"		"The picture format to use for the snapshot."
       
  1770 	@return "ETrue if the snapshot was taken, EFalse if a picture is not available. The picture may not 
       
  1771 			be available if decoding has not progressed far enough yet."
       
  1772 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1773 				*KErrNotSupported - The requested data format or picture size is not supported."
       
  1774 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1775 	*/
       
  1776 	IMPORT_C TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat);
       
  1777 
       
  1778 	/**
       
  1779 	Gets a copy of a specified picture. Timed snapshots are required for implementing the video 
       
  1780 	telephony use-case. Simply using the latest picture may not work, since the latest picture 
       
  1781 	is typically not the one whose supplemental information is being processed.
       
  1782 
       
  1783 	The picture is specified using its presentation timestamp. The timestamp must match the timestamp 
       
  1784 	in the picture exactly, otherwise no snapshot will be taken. The timestamp must refer to the 
       
  1785 	currently displayed picture or a future picture. Typically the timestamp is received with 
       
  1786 	supplemental information (with the MdvpoSupplementalInformation() callback) indicating a snapshot 
       
  1787 	picture.
       
  1788 
       
  1789 	When the snapshot is available, it will be returned to the client using the 
       
  1790 	MdvpoTimedSnapshotComplete() callback. To cancel a timed snapshot request, use 
       
  1791 	CancelTimedSnapshot(). Only one timed snapshot request can be active at a time.
       
  1792 
       
  1793 	@param	"aPictureData"				"Target picture. The memory for the picture must be allocated 
       
  1794 										by the caller, and initialized properly. The data formats must 
       
  1795 										match the snapshot format requested. The picture must remain 
       
  1796 										valid until the snapshot has been taken or until the request 
       
  1797 										has been cancelled with CancelTimedSnapshot()."
       
  1798 	@param	"aFormat"					"The picture format to use for the snapshot."
       
  1799 	@param	"aPresentationTimestamp"	"Presentation timestamp for the picture to copy. The timestamp 
       
  1800 										must match the timestamp in the picture exactly"
       
  1801 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1802 				*KErrNotSupported - The requested data format or picture size is not supported."
       
  1803 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1804 	*/
       
  1805 	IMPORT_C void GetTimedSnapshotL(TPictureData* aPictureData, 
       
  1806 									const TUncompressedVideoFormat& aFormat, 
       
  1807 									const TTimeIntervalMicroSeconds& aPresentationTimestamp);
       
  1808 
       
  1809 	/**
       
  1810 	Gets a copy of a specified picture. Timed snapshots are required for implementing the video 
       
  1811 	telephony use-case. Simply using the latest picture may not work, since the latest picture 
       
  1812 	is typically not the one whose supplemental information is being processed.
       
  1813 
       
  1814 	The picture is specified using either its picture identifier. The id must refer to the currently 
       
  1815 	displayed picture or a future picture. Typically the picture ID is received with supplemental 
       
  1816 	information (with the MdvpoSupplementalInformation() callback) indicating a snapshot picture.
       
  1817 
       
  1818 	When the snapshot is available, it will be returned to the client using the 
       
  1819 	MdvpoTimedSnapshotComplete() callback. To cancel a timed snapshot request, use 
       
  1820 	CancelTimedSnapshot(). Only one timed snapshot request can be active at a time.
       
  1821 
       
  1822 	@param	"aPictureData"	"Target picture. The memory for the picture must be allocated by the 
       
  1823 							caller, and initialized properly. The data formats must match the snapshot 
       
  1824 							format requested. The picture must remain valid until the snapshot has been
       
  1825 							taken or until the request has been cancelled with CancelTimedSnapshot()."
       
  1826 	@param	"aFormat"		"The picture format to use for the snapshot."
       
  1827 	@param	"aPictureId"	"Picture identifier for the picture to copy."
       
  1828 	@leave	"The method will leave if an error occurs. Typical error codes used:
       
  1829 				*KErrNotSupported - The requested data format or picture size is not supported."
       
  1830 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1831 	*/
       
  1832 	IMPORT_C void GetTimedSnapshotL(TPictureData* aPictureData, 
       
  1833 									const TUncompressedVideoFormat& aFormat, 
       
  1834 									const TPictureId& aPictureId);
       
  1835 
       
  1836 	/**
       
  1837 	Cancels a timed snapshot request.
       
  1838 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1839 	*/
       
  1840 	IMPORT_C void CancelTimedSnapshot();
       
  1841 
       
  1842 	/**
       
  1843 	Gets a list of the supported snapshot picture formats.
       
  1844 	@param	"aFormats"	"An array for the result format list. The array must be created and destroyed by the caller."
       
  1845 	@leave	"The method will leave if an error occurs."
       
  1846 	@pre	"This method can only be called after the API has been initialized with Initialize()."
       
  1847 	*/
       
  1848 	IMPORT_C void GetSupportedSnapshotFormatsL(RArray<TUncompressedVideoFormat>& aFormats);
       
  1849 
       
  1850 	/**
       
  1851 	Retrieves a custom interface to the specified hardware device.
       
  1852 	@param	"aHwDevice"		"The hardware device from which the custom interface shall be requested. 
       
  1853 							The value is returned from SelectDecoderL() or SelectPostProcessorL() when
       
  1854 							the device is selected."
       
  1855 	@param  "aInterface"	"Interface UID, defined with the custom interface."
       
  1856 	@return "Pointer to the interface implementation, or NULL if the device does not 
       
  1857 			implement the interface requested. The return value must be cast to the 
       
  1858 			correct type by the user."
       
  1859 	*/
       
  1860 	IMPORT_C TAny* CustomInterface(THwDeviceId aHwDevice, TUid aInterface);
       
  1861 	
       
  1862 private:
       
  1863 	enum TInitializationState 
       
  1864 		{
       
  1865 		ENotInitialized = 0x01, 
       
  1866 		EInitializing = 0x02,
       
  1867 		EInitialized = 0x04,
       
  1868 		EInitializationFailed = 0x08
       
  1869 		};
       
  1870 private:
       
  1871 	CMMFDevVideoPlay(MMMFDevVideoPlayObserver& aObserver);
       
  1872 
       
  1873 	// Methods to check aHwDevice is valid and return the appropriate HwDevice
       
  1874 	CMMFVideoPlayHwDevice& VideoPlayHwDevice(THwDeviceId aHwDevice) const;
       
  1875 	CMMFVideoPlayHwDevice& RenderingHwDevice() const; //returns the last plugin in the chain
       
  1876 	CMMFVideoDecodeHwDevice& VideoDecodeHwDevice(THwDeviceId aHwDevice) const;// Checks that aHwDevice is valid
       
  1877 	CMMFVideoPostProcHwDevice& VideoPostProcHwDevice(THwDeviceId aHwDevice) const;// Checks that aHwDevice is valid
       
  1878 	CMMFVideoDecodeHwDevice& VideoDecodeHwDevice() const;
       
  1879 	CMMFVideoPostProcHwDevice& VideoPostProcHwDevice() const;
       
  1880 	CMMFVideoHwDevice& VideoHwDevice(THwDeviceId aHwDevice) const;
       
  1881 
       
  1882 	// Connects the plugins together
       
  1883 	void ConnectPlugins();
       
  1884 
       
  1885 	// Check that we are in a valid initialization state
       
  1886 	// Panics if iInitializationState is not one of aExpected
       
  1887 	void CheckInitializationState(TUint aExpected);
       
  1888 
       
  1889 	// Methods to handle init complete callbacks from the hw devices
       
  1890 	void HandlePostProcInitializeComplete(TInt aError);
       
  1891 	void HandleDecodeInitializeComplete(TInt aError);
       
  1892 		
       
  1893 	CMMFVideoDecodeHwDevice* CreateDecoderL(TUid aVideoDecoder);
       
  1894 
       
  1895 
       
  1896 	// From MMMFDevVideoPlayProxy
       
  1897 	virtual void MdvppNewPicture(TVideoPicture* aPicture);
       
  1898 	virtual void MdvppNewBuffers();
       
  1899 	virtual void MdvppReturnPicture(TVideoPicture* aPicture);
       
  1900 	virtual void MdvppSupplementalInformation(const TDesC8& aData, 
       
  1901 											  const TTimeIntervalMicroSeconds& aTimestamp, 
       
  1902 											  const TPictureId& aPictureId);
       
  1903 	virtual void MdvppPictureLoss();
       
  1904 	virtual void MdvppPictureLoss(const TArray<TPictureId>& aPictures);
       
  1905 	virtual void MdvppSliceLoss(TUint aFirstMacroblock, TUint aNumMacroblocks, const TPictureId& aPicture);
       
  1906 	virtual void MdvppReferencePictureSelection(const TDesC8& aSelectionData);
       
  1907 	virtual void MdvppTimedSnapshotComplete(TInt aError, 
       
  1908 											TPictureData* aPictureData, 
       
  1909 											const TTimeIntervalMicroSeconds& aPresentationTimestamp, 
       
  1910 											const TPictureId& aPictureId);
       
  1911 	virtual void MdvppFatalError(CMMFVideoHwDevice* aDevice, TInt aError);
       
  1912 	virtual void MdvppInitializeComplete(CMMFVideoHwDevice* aDevice, TInt aError);
       
  1913 	virtual void MdvppStreamEnd();
       
  1914 	
       
  1915 private:
       
  1916 	MMMFDevVideoPlayObserver& iObserver;
       
  1917 	CMMFVideoDecodeHwDevice* iVideoDecodeHwDevice;
       
  1918 	CMMFVideoPostProcHwDevice* iVideoPostProcHwDevice;
       
  1919 	TUint iInitializationState;
       
  1920 
       
  1921 	TDblQue<TVideoPicture> iVideoPictureQue;
       
  1922 	TDblQueIter<TVideoPicture> iVideoPictureQueIter;
       
  1923 	TUint iNumberOfVideoPictures;
       
  1924 	// Not to be used, but kept for BC purposes
       
  1925 	TInt iReserved;
       
  1926 
       
  1927 	TUint iNumberOfMdvppStreamEndCallbacks;
       
  1928 	TBool iIsDecodeComplete;
       
  1929 	
       
  1930 #ifdef SYMBIAN_MULTIMEDIA_CODEC_API
       
  1931 	RImplInfoPtrArray iPuImplementations;
       
  1932 	TBool iPuListCreated;
       
  1933 #endif // SYMBIAN_MULTIMEDIA_CODEC_API
       
  1934 	};
       
  1935 
       
  1936 
       
  1937 /**
       
  1938 The MMMFDevVideoPlayObserver mixin class defines a set of callback functions that the client using 
       
  1939 the MSL video API needs to implement. The callbacks are called in the context of the same thread that 
       
  1940 uses the API. DevVideo API methods can be safely called from the callbacks.
       
  1941 @publishedAll
       
  1942 @released
       
  1943 */
       
  1944 class MMMFDevVideoPlayObserver
       
  1945 	{
       
  1946 public:
       
  1947 	/**
       
  1948 	Notifies the client that one or more new empty input buffers are available. The client can fetch 
       
  1949 	the input buffer with GetBufferL().
       
  1950 	*/
       
  1951 	virtual void MdvpoNewBuffers() = 0;
       
  1952 
       
  1953 	/**
       
  1954 	Returns a used input video picture back to the caller. The picture memory can be re-used or freed.
       
  1955 	@param	"aPicture"	"The picture to return."
       
  1956 	*/
       
  1957 	virtual void MdvpoReturnPicture(TVideoPicture* aPicture) = 0;
       
  1958 
       
  1959 	/**
       
  1960 	Delivers supplemental information from a coded data unit. The information is codec-dependent.
       
  1961 	@param	"aData"			"The supplemental data. The reference is only valid until the method 
       
  1962 							returns, and thus the data must be processed or copied immediately."
       
  1963 	@param	"aTimestamp"	"The presentation timestamp for the picture that the supplemental data 
       
  1964 							is part of."
       
  1965 	@param	"aPictureId"	"Picture identifier for the picture. If a picture ID is not available, 
       
  1966 							aPictureId.iIdType is set to ENone."
       
  1967 	*/
       
  1968 	virtual void MdvpoSupplementalInformation(const TDesC8& aData, 
       
  1969 											  const TTimeIntervalMicroSeconds& aTimestamp, 
       
  1970 											  const TPictureId& aPictureId) = 0;
       
  1971 
       
  1972 	/**
       
  1973 	Back channel information from the decoder, indicating a picture loss without specifying the lost picture.
       
  1974 	*/
       
  1975 	virtual void MdvpoPictureLoss() = 0;
       
  1976 
       
  1977 	/**
       
  1978 	Back channel information from the decoder, indicating the pictures that have been lost.
       
  1979 
       
  1980 	@param "aPictures"	"Picture identifiers for the lost pictures. The reference is only valid until the 
       
  1981 						method returns, and thus the data must be processed or copied immediately."
       
  1982 	*/
       
  1983 	virtual void MdvpoPictureLoss(const TArray<TPictureId>& aPictures) = 0;
       
  1984 
       
  1985 	/**
       
  1986 	Back channel information from the decoder, indicating the loss of consecutive macroblocks in raster 
       
  1987 	scan order.
       
  1988 
       
  1989 	@param "aFirstMacroblock"	"The first lost macroblock.  The macroblocks are numbered such 
       
  1990 								that the macroblock in the upper left corner of the picture is considered 
       
  1991 								macroblock number 1 and the number for each macroblock increases from left 
       
  1992 								to right and then from top to bottom in raster-scan order."
       
  1993 	@param "aNumMacroblocks"	"The number of lost macroblocks that are consecutive in raster-scan order."
       
  1994 	@param "aPicture"			"The picture identifier for the picture where the macroblocks were lost.  
       
  1995 								If the picture is not known, aPicture.iIdType is set to ENone.  The reference 
       
  1996 								is only valid until the method returns."
       
  1997 	*/
       
  1998 	virtual void MdvpoSliceLoss(TUint aFirstMacroblock, TUint aNumMacroblocks, const TPictureId& aPicture)= 0;
       
  1999 
       
  2000 	/**
       
  2001 	Back channel information from the decoder, indicating a reference picture selection request. The 
       
  2002 	request is delivered as a coding-standard specific binary message.  Reference picture selection can 
       
  2003 	be used to select a pervious correctly transmitted picture to use as a reference in case later pictures 
       
  2004 	have been lost.
       
  2005 	
       
  2006 	@param "aSelectionData" "The reference picture selection request message. The message format is 
       
  2007 							coding-standard specific, and defined separately. The reference is only 
       
  2008 							valid until the method returns, and thus the data must be processed or 
       
  2009 							copied immediately."
       
  2010 	*/
       
  2011 	virtual void MdvpoReferencePictureSelection(const TDesC8& aSelectionData)= 0;
       
  2012 
       
  2013 	/**
       
  2014 	Called when a timed snapshot request has been completed. When this method is called, the snapshot 
       
  2015 	has been taken, and the memory reserved for the picture can be re-used or freed.
       
  2016 	@param	"aError"					"An error code, KErrNone if no errors occurred. If an error 
       
  2017 										occurred, the data in the snapshot may not be valid, but the 
       
  2018 										memory can still be freed."
       
  2019 	@param	"aPictureData"				"The snapshot picture data."
       
  2020 	@param	"aPresentationTimestamp"	"The presentation timestamp for the snapshot picture. "
       
  2021 	@param	"aPictureId"				"Picture identifier for the picture. If a picture ID is not
       
  2022 										available, aPictureId.iIdType is set to ENone."
       
  2023 	*/
       
  2024 	virtual void MdvpoTimedSnapshotComplete(TInt aError, 
       
  2025 											TPictureData* aPictureData, 
       
  2026 											const TTimeIntervalMicroSeconds& aPresentationTimestamp, 
       
  2027 											const TPictureId& aPictureId) = 0;
       
  2028 
       
  2029 	/**
       
  2030 	Notifies the client that one or more new output pictures are available. The client can then use 
       
  2031 	GetNewPictureInfo() and NextPicture() to fetch the pictures.
       
  2032 	*/
       
  2033 	virtual void MdvpoNewPictures() = 0;
       
  2034 
       
  2035 	/**
       
  2036 	Reports a fatal decoding or playback error to the client. When these errors
       
  2037 	occur, decoding and playback is stopped automatically. The client must
       
  2038 	destroy the CMMFDevVideoPlay object and create a new instance before
       
  2039 	attempting to continue. Note that scenarios have been identified where
       
  2040 	MdvpoFatalError may get referenced at some point during the execution of a
       
  2041 	CMMFDevVideoPlay procedure. Therefore CMMFDevVideoPlay object should be
       
  2042 	deleted outside of MdvpoFatalError context in order to avoid accidental
       
  2043 	access to de-allocated CMMFDevVideoPlay data members.
       
  2044 
       
  2045 	Note that running out of processing power or encountering corrupted
       
  2046 	bitstream data should not be classified as errors if the decoder and
       
  2047 	post-processor can recover automatically.
       
  2048 	
       
  2049 	@param	"aError"	"The error code."
       
  2050 	*/
       
  2051 	virtual void MdvpoFatalError(TInt aError) = 0;
       
  2052 
       
  2053 	/**
       
  2054 	Reports that DevVideoPlay initialization has completed. The interface can now be used for video 
       
  2055 	playback.
       
  2056 	@param	"aError"	"Initialization error code, KErrNone if no error occurred."
       
  2057 	*/
       
  2058 	virtual void MdvpoInitComplete(TInt aError) = 0;
       
  2059 
       
  2060 	/**
       
  2061 	Reports that the input video stream end has been reached and all pictures have been processed. 
       
  2062 	This method is only called after the client has called InputEnd(). No more output pictures will 
       
  2063 	be available.
       
  2064 	*/
       
  2065 	virtual void MdvpoStreamEnd() = 0;
       
  2066 	};
       
  2067 	
       
  2068 	
       
  2069 #include <mmf/devvideo/devvideoplay.inl>
       
  2070 
       
  2071 #endif