epoc32/include/mmf/devvideo/videoplayhwdevice.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@2
     4
// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2
     5
// which accompanies this distribution, and is available
williamr@2
     6
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
//
williamr@2
    15
williamr@2
    16
#ifndef __VIDEOPLAYHWDEVICE_H__
williamr@2
    17
#define __VIDEOPLAYHWDEVICE_H__
williamr@2
    18
williamr@2
    19
#include <mmf/devvideo/devvideobase.h>
williamr@2
    20
#include <mmf/devvideo/devvideoplay.h>
williamr@2
    21
williamr@2
    22
/**
williamr@2
    23
A base class for all video playback (decoder and post-processor) hardware devices. 
williamr@2
    24
Since both decoders and post-processors can implement post-processing functionality, 
williamr@2
    25
this class includes all post-processing related methods. The main difference between decoder 
williamr@2
    26
and post-processor devices is that decoders can input coded data and write decoded pictures 
williamr@2
    27
to another device, while post-processor devices can accept decoded pictures from the client 
williamr@2
    28
or from another device.
williamr@2
    29
@publishedAll
williamr@2
    30
@released
williamr@2
    31
*/
williamr@2
    32
class CMMFVideoPlayHwDevice : public CMMFVideoHwDevice
williamr@2
    33
	{
williamr@2
    34
public:
williamr@2
    35
	/**
williamr@2
    36
	Retrieves post-processing information about this hardware device. 
williamr@2
    37
	The device creates a CPostProcessorInfo structure, fills it with correct data, pushes it 
williamr@2
    38
	to the cleanup stack and returns it. The client will delete the object when it is no 
williamr@2
    39
	longer needed.
williamr@2
    40
williamr@2
    41
	@return "Post-processor information as a CPostProcessorInfo object. 
williamr@2
    42
			The object is pushed to the cleanup stack, and must be deallocated by the caller."
williamr@2
    43
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
    44
	*/
williamr@2
    45
	virtual CPostProcessorInfo* PostProcessorInfoLC() = 0;
williamr@2
    46
williamr@2
    47
	/**
williamr@2
    48
	Retrieves the list of the output formats that the device supports. The list is ordered in 
williamr@2
    49
	plug-in preference order, with the preferred formats at the beginning of the list. The list 
williamr@2
    50
	can depend on the device source format, and therefore SetSourceFormatL() must be called before 
williamr@2
    51
	calling this method.
williamr@2
    52
williamr@2
    53
	@param "aFormats" "An array for the result format list. The array must be created and destroyed by the caller."
williamr@2
    54
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
    55
	@pre	"This method may only be called before the hwdevice has been initialized using Initialize()."
williamr@2
    56
	*/
williamr@2
    57
	virtual void GetOutputFormatListL(RArray<TUncompressedVideoFormat>& aFormats) = 0;
williamr@2
    58
williamr@2
    59
	/**
williamr@2
    60
	Sets the device output format.
williamr@2
    61
williamr@2
    62
	@param  "aFormat" "The format to use."
williamr@2
    63
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
    64
	@pre	"This method may only be called before the hwdevice has been initialized using Initialize()."
williamr@2
    65
	*/
williamr@2
    66
	virtual void SetOutputFormatL(const TUncompressedVideoFormat &aFormat) = 0;
williamr@2
    67
williamr@2
    68
	/**
williamr@2
    69
	Sets the clock source to use for video timing. If no clock source is set. video playback 
williamr@2
    70
	will not be synchronized, but will proceed as fast as possible, depending on input data 
williamr@2
    71
	and output buffer availability.	
williamr@2
    72
williamr@2
    73
	@param  "aClock" "The clock source to be used."
williamr@2
    74
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
    75
	*/
williamr@2
    76
	virtual void SetClockSource(MMMFClockSource* aClock) = 0;
williamr@2
    77
williamr@2
    78
	/**
williamr@2
    79
	Sets the device video output destination. The destination can be the screen (using direct 
williamr@2
    80
	screen access) or memory buffers. By default memory buffers are used. If data is written 
williamr@2
    81
	to another device, this method is ignored, and suitable memory buffers are always used.
williamr@2
    82
	
williamr@2
    83
	@param  "aScreen" "True if video output destination is the screen, false if memory buffers."
williamr@2
    84
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
    85
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
    86
	*/
williamr@2
    87
	virtual void SetVideoDestScreenL(TBool aScreen) = 0;
williamr@2
    88
williamr@2
    89
	/**
williamr@2
    90
	Sets the post-processing types to be used.
williamr@2
    91
williamr@2
    92
	@param  "aPostProcCombination" "The post-processing steps to perform, a bitwise OR of values from TPostProcessType."
williamr@2
    93
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
    94
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
    95
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
    96
	*/
williamr@2
    97
	virtual void SetPostProcessTypesL(TUint32 aPostProcCombination) = 0;
williamr@2
    98
williamr@2
    99
	/**
williamr@2
   100
	Sets post-processing options for input (pan-scan) cropping.
williamr@2
   101
williamr@2
   102
	@param  "aRect" "The cropping rectangle to use."
williamr@2
   103
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   104
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   105
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   106
	*/
williamr@2
   107
	virtual void SetInputCropOptionsL(const TRect& aRect) = 0;
williamr@2
   108
williamr@2
   109
	/**
williamr@2
   110
	Sets post-processing options for YUV to RGB color space conversion. 
williamr@2
   111
	Specifies the input YUV and output RGB formats to use explicitly. SetSourceFormatL(), 
williamr@2
   112
	SetOutputFormatL(), and SetPostProcessTypesL() must be called before this method is used.
williamr@2
   113
williamr@2
   114
	@param  "aOptions"		"The conversion options to use."
williamr@2
   115
	@param  "aYuvFormat"	"Conversion source YUV format"
williamr@2
   116
	@param  "aRgbFormat"	"Conversion target RGB format"
williamr@2
   117
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   118
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   119
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   120
	*/
williamr@2
   121
	virtual void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions, const TYuvFormat& aYuvFormat, TRgbFormat aRgbFormat) = 0;
williamr@2
   122
williamr@2
   123
	/**
williamr@2
   124
	Sets post-processing options for YUV to RGB color space conversion.
williamr@2
   125
	Uses the device input and output formats. For decoder devices the default YUV format used is 
williamr@2
   126
	the format specified in the input bitstream. SetSourceFormatL(), SetOutputFormatL(), and 
williamr@2
   127
	SetPostProcessTypesL() must be called before this method is used.
williamr@2
   128
williamr@2
   129
	@param  "aOptions"		"The conversion options to use."
williamr@2
   130
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   131
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   132
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   133
	*/
williamr@2
   134
	virtual void SetYuvToRgbOptionsL(const TYuvToRgbOptions& aOptions) = 0;
williamr@2
   135
williamr@2
   136
	/**
williamr@2
   137
	Sets post-processing options for rotation. SetPostProcessTypesL() must be called before 
williamr@2
   138
	this method is used.
williamr@2
   139
williamr@2
   140
	@param  "aRotationType" "The rotation to perform."	
williamr@2
   141
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   142
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   143
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   144
	*/
williamr@2
   145
	virtual void SetRotateOptionsL(TRotationType aRotationType) = 0;
williamr@2
   146
williamr@2
   147
	/**
williamr@2
   148
	Sets post-processing options for scaling. SetPostProcessTypesL() must be called before 
williamr@2
   149
	this method is used.
williamr@2
   150
	
williamr@2
   151
	@param  "aTargetSize"			"Scaling target size. If a fixed scale factor size is used, 
williamr@2
   152
									the new dimensions must be set to width=floor(factor*width), 
williamr@2
   153
									height=floor(factor*height). For example, scaling a 
williamr@2
   154
									QCIF (176x144) picture up by a factor of 4/3 yields a size 
williamr@2
   155
									of 234x192."
williamr@2
   156
	@param  "aAntiAliasFiltering"	"True if anti-aliasing filtering should be used. 
williamr@2
   157
									If the post-processor does not support anti-aliased scaling, 
williamr@2
   158
									or supports anti-aliased scaling only, this argument is ignored."
williamr@2
   159
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   160
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   161
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   162
	*/
williamr@2
   163
	virtual void SetScaleOptionsL(const TSize& aTargetSize, TBool aAntiAliasFiltering) = 0;
williamr@2
   164
williamr@2
   165
	/**
williamr@2
   166
	Sets post-processing options for output cropping. SetPostProcessTypesL() must be called before 
williamr@2
   167
	this method is used.
williamr@2
   168
	
williamr@2
   169
	@param  "aRect" "Output cropping area."
williamr@2
   170
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   171
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   172
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   173
	*/
williamr@2
   174
	virtual void SetOutputCropOptionsL(const TRect& aRect) = 0;
williamr@2
   175
williamr@2
   176
	/**
williamr@2
   177
	Sets post-processing plug-in specific options. SetPostProcessTypesL() must be called before 
williamr@2
   178
	this method is used.
williamr@2
   179
williamr@2
   180
	@param  "aOptions" "The options. The format is plug-in specific."
williamr@2
   181
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   182
	@pre	"This method can be called either before or after the hwdevice has been initialized with Initialize().
williamr@2
   183
			If called after initialization, the change must only be committed when CommitL() is called."
williamr@2
   184
	*/
williamr@2
   185
	virtual void SetPostProcSpecificOptionsL(const TDesC8& aOptions) = 0;
williamr@2
   186
williamr@2
   187
	/**
williamr@2
   188
	Initializes the device. This method is asynchronous, the device will call 
williamr@2
   189
	MMFVideoPlayProxy::MdvppInitializeComplete() after initialization has completed. After this 
williamr@2
   190
	method has successfully completed, further configuration changes are not possible except where 
williamr@2
   191
	separately noted.
williamr@2
   192
	*/
williamr@2
   193
	virtual void Initialize() = 0;
williamr@2
   194
williamr@2
   195
	/**
williamr@2
   196
	Commit all changes since the last CommitL(), Revert() or Initialize()
williamr@2
   197
	to the hardware device.  This only applies to methods which can be called both
williamr@2
   198
	before AND after DevVideoPlay has been initialized.
williamr@2
   199
williamr@2
   200
	@see	SetPostProcessTypesL
williamr@2
   201
	@see	SetInputCropOptionsL
williamr@2
   202
	@see	SetYuvToRgbOptionsL
williamr@2
   203
	@see	SetRotateOptionsL
williamr@2
   204
	@see	SetScaleOptionsL
williamr@2
   205
	@see	SetOutputCropOptionsL
williamr@2
   206
	@see	SetPostProcSpecificOptionsL
williamr@2
   207
williamr@2
   208
	@leave  "The method will leave if an error occurs."
williamr@2
   209
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   210
	*/
williamr@2
   211
	virtual void CommitL() = 0;
williamr@2
   212
williamr@2
   213
	/**
williamr@2
   214
	Revert all changes since the last CommitL(), Revert() or Initialize()
williamr@2
   215
	back to their previous settings.  This only applies to methods which can 
williamr@2
   216
	be called both before AND after DevVideoPlay has been initialized.
williamr@2
   217
williamr@2
   218
	@see	SetPostProcessTypesL
williamr@2
   219
	@see	SetInputCropOptionsL
williamr@2
   220
	@see	SetYuvToRgbOptionsL
williamr@2
   221
	@see	SetRotateOptionsL
williamr@2
   222
	@see	SetScaleOptionsL
williamr@2
   223
	@see	SetOutputCropOptionsL
williamr@2
   224
	@see	SetPostProcSpecificOptionsL
williamr@2
   225
williamr@2
   226
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   227
	*/
williamr@2
   228
	virtual void Revert() = 0;
williamr@2
   229
williamr@2
   230
	/**
williamr@2
   231
	Starts writing output directly to the display frame buffer using Direct Screen Access.
williamr@2
   232
williamr@2
   233
	@param  "aVideoRect"	"The video output rectangle on screen."
williamr@2
   234
	@param  "aScreenDevice"	"The screen device to use. The screen device object must be valid in the current thread."
williamr@2
   235
	@param  "aClipRegion"	"Initial clipping region to use."
williamr@2
   236
	
williamr@2
   237
	@leave  "This method may leave with one of the system-wide error codes.
williamr@2
   238
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   239
	*/
williamr@2
   240
	virtual void StartDirectScreenAccessL(const TRect& aVideoRect, 
williamr@2
   241
		CFbsScreenDevice& aScreenDevice, const TRegion& aClipRegion) = 0;
williamr@2
   242
williamr@2
   243
	/**
williamr@2
   244
	Sets a new clipping region for Direct Screen Access. After the method returns, no video will 
williamr@2
   245
	be drawn outside of the region. If clipping is not supported, or the clipping region is too 
williamr@2
   246
	complex, either playback will pause or will resume without video display, depending on the 
williamr@2
   247
	current setting of SetPauseOnClipFail(), and the result can be verified with IsPlaying(). 
williamr@2
   248
	Clipping can be disabled by setting a new clipping region that includes the whole video window.
williamr@2
   249
williamr@2
   250
	@param  "aRegion" "The new clipping region. After the method returns, no video will be drawn outside the region."
williamr@2
   251
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   252
	*/
williamr@2
   253
	virtual void SetScreenClipRegion(const TRegion& aRegion) = 0;
williamr@2
   254
williamr@2
   255
	/**
williamr@2
   256
	Sets whether the system should pause playback when it gets a clipping region it cannot handle, 
williamr@2
   257
	or Direct Screen Access is aborted completely. If not, processing will proceed normally, but no 
williamr@2
   258
	video will be drawn. By default, playback is paused.
williamr@2
   259
williamr@2
   260
	@param "aPause" "True if playback should be paused when clipping fails, false if not. 
williamr@2
   261
					If playback is not paused, it will be continued without video display."
williamr@2
   262
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   263
	*/
williamr@2
   264
	virtual void SetPauseOnClipFail(TBool aPause) = 0;
williamr@2
   265
williamr@2
   266
	/**
williamr@2
   267
	Aborts Direct Screen Access completely, to be called from MAbortDirectScreenAccess::AbortNow() 
williamr@2
   268
	and similar methods. DSA can be resumed by calling StartDirectScreenAccessL().
williamr@2
   269
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   270
	*/
williamr@2
   271
	virtual void AbortDirectScreenAccess() = 0;
williamr@2
   272
williamr@2
   273
	/**
williamr@2
   274
	Indicates whether playback is proceeding. This method can be used to check whether playback was 
williamr@2
   275
	paused or not in response to a new clipping region or DSA abort.
williamr@2
   276
williamr@2
   277
	@return "ETrue if video is still being played (even if not necessarily displayed)."
williamr@2
   278
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   279
	*/
williamr@2
   280
	virtual TBool IsPlaying() = 0;
williamr@2
   281
williamr@2
   282
	/**
williamr@2
   283
	Re-draws the latest video picture. Only available when DSA is being used. If DSA is aborted or a 
williamr@2
   284
	non-supported clipping region has been set, the request may be ignored.
williamr@2
   285
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   286
	*/
williamr@2
   287
	virtual void Redraw() = 0;
williamr@2
   288
williamr@2
   289
williamr@2
   290
	/**
williamr@2
   291
	Starts video playback, including decoding, post-processing, and rendering. Playback will proceed 
williamr@2
   292
	until it has been stopped or paused, or the end of the bitstream is reached.
williamr@2
   293
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   294
	*/
williamr@2
   295
	virtual void Start() = 0;
williamr@2
   296
williamr@2
   297
	/**
williamr@2
   298
	Stops video playback. No new pictures will be decoded, post-processed, or rendered.
williamr@2
   299
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   300
	*/
williamr@2
   301
	virtual void Stop() = 0;
williamr@2
   302
williamr@2
   303
	/**
williamr@2
   304
	Pauses video playback, including decoding, post-processing, and rendering. No pictures will be 
williamr@2
   305
	decoded, post-processed, or rendered until playback has been resumed.
williamr@2
   306
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   307
	*/
williamr@2
   308
	virtual void Pause() = 0;
williamr@2
   309
williamr@2
   310
	/**
williamr@2
   311
	Resumes video playback after a pause.
williamr@2
   312
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   313
	*/
williamr@2
   314
	virtual void Resume() = 0;
williamr@2
   315
williamr@2
   316
	/**
williamr@2
   317
	Changes to a new decoding and playback position, used for randomly accessing (seeking) the 
williamr@2
   318
	input stream. The position change flushes all input and output buffers. Pre-decoder and 
williamr@2
   319
	post-decoder buffering are handled as if a new bitstream was being decoded. If the device still has buffered 
williamr@2
   320
	pictures that precede the new playback position, they will be discarded. If playback is 
williamr@2
   321
	synchronized to a clock source, the client is responsible for setting the clock source to the 
williamr@2
   322
	new position.
williamr@2
   323
	
williamr@2
   324
	@param "aPlaybackPosition" "The new playback position in the video stream."
williamr@2
   325
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   326
	*/
williamr@2
   327
	virtual void SetPosition(const TTimeIntervalMicroSeconds& aPlaybackPosition) = 0;
williamr@2
   328
williamr@2
   329
	/**
williamr@2
   330
	Freezes a picture on the screen. After the picture has been frozen, no new pictures are 
williamr@2
   331
	displayed until the freeze is released with ReleaseFreeze(). If the device output is being 
williamr@2
   332
	written to memory buffers or to another plug-in, instead of the screen, no decoded pictures 
williamr@2
   333
	will be delivered while the freeze is active, and they are simply discarded.
williamr@2
   334
williamr@2
   335
	@param "aTimestamp" "The presentation timestamp of the picture to freeze. The frozen picture 
williamr@2
   336
						will be the first picture with a timestamp greater than or equal to this 
williamr@2
   337
						parameter."
williamr@2
   338
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   339
	*/
williamr@2
   340
	virtual void FreezePicture(const TTimeIntervalMicroSeconds& aTimestamp) = 0;
williamr@2
   341
williamr@2
   342
	/**
williamr@2
   343
	Releases a picture frozen with FreezePicture().
williamr@2
   344
williamr@2
   345
	@param "aTimestamp" "The presentation timestamp of the picture to release. The first picture 
williamr@2
   346
						displayed after the release will be the first picture with a timestamp 
williamr@2
   347
						greater than or equal to this parameter. To release the freeze immediately, 
williamr@2
   348
						set the timestamp to zero."
williamr@2
   349
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   350
	*/
williamr@2
   351
	virtual void ReleaseFreeze(const TTimeIntervalMicroSeconds& aTimestamp) = 0;
williamr@2
   352
williamr@2
   353
williamr@2
   354
	/**
williamr@2
   355
	Returns the current playback position, i.e. the timestamp for the most recently displayed or 
williamr@2
   356
	virtually displayed picture. If the device output is written to another device, the most recent 
williamr@2
   357
	output picture is used.
williamr@2
   358
williamr@2
   359
	@return "Current playback position."
williamr@2
   360
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   361
	*/
williamr@2
   362
	virtual TTimeIntervalMicroSeconds PlaybackPosition() = 0;
williamr@2
   363
williamr@2
   364
	/**
williamr@2
   365
	Returns the total amount of memory allocated for uncompressed pictures. This figure only 
williamr@2
   366
	includes the pictures actually allocated by the plug-in itself, so that the total number of 
williamr@2
   367
	bytes allocated in the system can be calculated by taking the sum of the values from all plug-ins.
williamr@2
   368
williamr@2
   369
	@return "Total number of bytes of memory allocated for uncompressed pictures."
williamr@2
   370
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   371
	*/
williamr@2
   372
	virtual TUint PictureBufferBytes() = 0;
williamr@2
   373
williamr@2
   374
	/**
williamr@2
   375
	Reads various counters related to decoded pictures. The counters are reset when Initialize() 
williamr@2
   376
	or this method is called, and thus they only include pictures processed since the last call.
williamr@2
   377
williamr@2
   378
	Post-processor devices return the number of input pictures in iPicturesDecoded and 
williamr@2
   379
	iTotalPictures. If the decoded pictures are written to another plug-in, they are considered 
williamr@2
   380
	to be "virtually displayed".
williamr@2
   381
williamr@2
   382
	@param "aCounters" "The counter structure to fill."
williamr@2
   383
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   384
	*/
williamr@2
   385
	virtual void GetPictureCounters(CMMFDevVideoPlay::TPictureCounters& aCounters) = 0;
williamr@2
   386
williamr@2
   387
williamr@2
   388
	/**
williamr@2
   389
	Sets the computational complexity level to use. If separate complexity levels are not available, 
williamr@2
   390
	the method call is ignored. If the level specified is not available, the results are undefined. 
williamr@2
   391
	Typically the device will either ignore the request or use the nearest suitable level.
williamr@2
   392
williamr@2
   393
	The complexity level can be changed at any point during playback.
williamr@2
   394
williamr@2
   395
	@param "aLevel" "The computational complexity level to use. Level zero (0) is the most complex 
williamr@2
   396
					one, with the highest quality. Higher level numbers require less processing 
williamr@2
   397
					and may have lower quality."
williamr@2
   398
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   399
	*/
williamr@2
   400
	virtual void SetComplexityLevel(TUint aLevel) = 0;
williamr@2
   401
williamr@2
   402
	/**
williamr@2
   403
	Gets the number of complexity levels available.
williamr@2
   404
	
williamr@2
   405
	@return "The number of complexity control levels available, or zero if the information is not 
williamr@2
   406
			available yet. The information may not be available if the number of levels depends on 
williamr@2
   407
			the input data, and enough input data has not been read yet. In that case, using level 
williamr@2
   408
			zero is safe."
williamr@2
   409
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   410
	*/
williamr@2
   411
	virtual TUint NumComplexityLevels() = 0;
williamr@2
   412
williamr@2
   413
	/**
williamr@2
   414
	Gets information about a computational complexity level. This method can be called after 
williamr@2
   415
	NumComplexityLevels() has returned a non-zero value - at that point the information is guaranteed 
williamr@2
   416
	to be available. Some hardware device implementations may not be able to provide all values, 
williamr@2
   417
	in that case the values will be approximated.
williamr@2
   418
williamr@2
   419
	@param "aLevel"	"The computational complexity level to query. The level numbers range from zero 
williamr@2
   420
					(the most complex) to NumComplexityLevels()-1."
williamr@2
   421
	@param "aInfo"	"The information structure to fill."
williamr@2
   422
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   423
	*/
williamr@2
   424
	virtual void GetComplexityLevelInfo(TUint aLevel, CMMFDevVideoPlay::TComplexityLevelInfo& aInfo) = 0;
williamr@2
   425
williamr@2
   426
	/**
williamr@2
   427
	Returns a picture back to the device. This method is called by CMMFDevVideoPlay to return pictures 
williamr@2
   428
	from the client (after they have been written with NewPicture()), or by the output device when 
williamr@2
   429
	it has finished using a picture.
williamr@2
   430
williamr@2
   431
	@param "aPicture" "The picture to return. The device can re-use the memory for the picture."
williamr@2
   432
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   433
	*/
williamr@2
   434
	virtual void ReturnPicture(TVideoPicture* aPicture) = 0;
williamr@2
   435
williamr@2
   436
	/**
williamr@2
   437
	Gets a copy of the latest picture sent to output.
williamr@2
   438
williamr@2
   439
	@param "aPictureData"	"Target picture. The memory for the picture must be allocated by the 
williamr@2
   440
							caller, and initialized properly. The data formats must match the snapshot 
williamr@2
   441
							format requested."
williamr@2
   442
	@param "aFormat"		"The picture format to use for the snapshot."
williamr@2
   443
williamr@2
   444
	@return "ETrue if the snapshot was taken, EFalse if a picture is not available. The picture may not 
williamr@2
   445
			be available if decoding has not progressed far enough yet."
williamr@2
   446
williamr@2
   447
	@leave	"The method will leave if an error occurs. Typical error codes used:
williamr@2
   448
			* KErrNotSupported - The requested data format or picture size is not supported, or the 
williamr@2
   449
			plug-in does not support snapshots."
williamr@2
   450
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   451
	*/
williamr@2
   452
	virtual TBool GetSnapshotL(TPictureData& aPictureData, const TUncompressedVideoFormat& aFormat) = 0;
williamr@2
   453
williamr@2
   454
	/**
williamr@2
   455
	When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete()
williamr@2
   456
	callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot 
williamr@2
   457
	request can be active at a time.
williamr@2
   458
williamr@2
   459
	@param "aPictureData"			"Target picture. The memory for the picture must be allocated by 
williamr@2
   460
									the caller, and initialized properly. The data formats must match 
williamr@2
   461
									the snapshot format requested. The picture must remain valid until 
williamr@2
   462
									the snapshot has been taken or until the request has been cancelled 
williamr@2
   463
									with CancelTimedSnapshot()."
williamr@2
   464
	@param "aFormat"				"The picture format to use for the snapshot."
williamr@2
   465
	@param "aPresentationTimestamp"	"Presentation timestamp for the picture to copy."
williamr@2
   466
williamr@2
   467
	@leave	"The method will leave if an error occurs. Typical error codes used:
williamr@2
   468
			* KErrNotSupported - The requested data format or picture size is not supported or 
williamr@2
   469
			the plug-in does not support timed snapshots."
williamr@2
   470
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   471
	*/
williamr@2
   472
	virtual void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, 
williamr@2
   473
		const TTimeIntervalMicroSeconds& aPresentationTimestamp) = 0;
williamr@2
   474
williamr@2
   475
	/**
williamr@2
   476
	When the snapshot is available, it will be returned to the client using the TimedSnapshotComplete()
williamr@2
   477
	callback. To cancel a timed snapshot request, use CancelTimedSnapshot(). Only one timed snapshot 
williamr@2
   478
	request can be active at a time.
williamr@2
   479
williamr@2
   480
	@param "aPictureData"			"Target picture. The memory for the picture must be allocated by 
williamr@2
   481
									the caller, and initialized properly. The data formats must match 
williamr@2
   482
									the snapshot format requested. The picture must remain valid until 
williamr@2
   483
									the snapshot has been taken or until the request has been cancelled 
williamr@2
   484
									with CancelTimedSnapshot()."
williamr@2
   485
	@param "aFormat"				"The picture format to use for the snapshot."
williamr@2
   486
	@param "aPictureId"				"Picture identifier for the picture to copy."
williamr@2
   487
williamr@2
   488
	@leave	"The method will leave if an error occurs. Typical error codes used:
williamr@2
   489
			* KErrNotSupported - The requested data format or picture size is not supported or 
williamr@2
   490
			the plug-in does not support timed snapshots."
williamr@2
   491
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   492
	*/
williamr@2
   493
	virtual void GetTimedSnapshotL(TPictureData* aPictureData, const TUncompressedVideoFormat& aFormat, 
williamr@2
   494
		const TPictureId& aPictureId) = 0;
williamr@2
   495
williamr@2
   496
	/**
williamr@2
   497
	Cancels a timed snapshot request.
williamr@2
   498
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   499
	*/
williamr@2
   500
	virtual void CancelTimedSnapshot() = 0;
williamr@2
   501
williamr@2
   502
	/**
williamr@2
   503
	Gets a list of the supported snapshot picture formats.
williamr@2
   504
williamr@2
   505
	@param "aFormats" "An array for the result format list. The array must be created and destroyed by 
williamr@2
   506
	the caller."
williamr@2
   507
williamr@2
   508
	@leave "This method may leave with one of the standard error codes."
williamr@2
   509
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   510
	*/
williamr@2
   511
	virtual void GetSupportedSnapshotFormatsL(RArray<TUncompressedVideoFormat>& aFormats) = 0;
williamr@2
   512
williamr@2
   513
williamr@2
   514
	/**
williamr@2
   515
williamr@2
   516
	Notifies the hardware device that the end of input data has been reached and no more input data 
williamr@2
   517
	will be written. The hardware device can use this signal to ensure that the remaining data gets 
williamr@2
   518
	processed, without waiting for new data. For example when the data type is not EDuCodedPicture,
williamr@2
   519
	calling this method is necessary otherwise a hardware device implementation might be looking for 
williamr@2
   520
	the start code for the next picture to ensure it has a complete picture before starting to decode
williamr@2
   521
	the previous one. 
williamr@2
   522
	
williamr@2
   523
	  
williamr@2
   524
	After the remaining data has been processed (and displayed, if applicable), the hardware 
williamr@2
   525
	device must notify the proxy with the MdvppStreamEnd() callback.
williamr@2
   526
williamr@2
   527
	DevVideo clients are encouraged to call this method, but its use is not mandatory for synchronized
williamr@2
   528
	processing.  For synchronized playback, all video pictures are processed or discarded according to 
williamr@2
   529
	their timestamps, and so the client can easily infer when processing is complete.  However, it 
williamr@2
   530
	should be noted that the last picture might not be displayed if this method is not called and the 
williamr@2
   531
	input data type is not EDuCodedPicture.
williamr@2
   532
williamr@2
   533
	For non-synchronized playback (e.g. file conversion), a client must call this method otherwise it
williamr@2
   534
	will never find out when the hardware device has finished processing the data.
williamr@2
   535
	
williamr@2
   536
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   537
	*/
williamr@2
   538
	virtual void InputEnd() = 0;
williamr@2
   539
	};
williamr@2
   540
williamr@2
   541
williamr@2
   542
williamr@2
   543
williamr@2
   544
/**
williamr@2
   545
CMMFVideoDecodeHwDevice is the MSL video decoder hardware device interface. 
williamr@2
   546
All video decoders must implement this interface.
williamr@2
   547
@publishedAll
williamr@2
   548
@released
williamr@2
   549
*/
williamr@2
   550
class CMMFVideoDecodeHwDevice : public CMMFVideoPlayHwDevice
williamr@2
   551
	{
williamr@2
   552
public:
williamr@2
   553
	/**
williamr@2
   554
	Creates a new video decoder hardware device object, based on the implementation UID.
williamr@2
   555
williamr@2
   556
	@param	"aUid"		"Decoder implementation UID."
williamr@2
   557
	@param	"aProxy"	"The proxy implementation to use."
williamr@2
   558
	@return	"A new CMMFVideoDecodeHwDevice object."
williamr@2
   559
	@leave	"This method may leave with one of the system-wide error codes.
williamr@2
   560
	*/
williamr@2
   561
	IMPORT_C static CMMFVideoDecodeHwDevice* NewL(TUid aUid, MMMFDevVideoPlayProxy& aProxy);
williamr@2
   562
	
williamr@2
   563
	/**
williamr@2
   564
	Creates a new video decoder hardware device adapter object, based on the Implementation Information of a Processing Unit.
williamr@2
   565
williamr@2
   566
	@param	"aImplInfo"	"The registration data relating to the Interface Implementation of the Processing Unit."
williamr@2
   567
	@param	"aProxy"	"The proxy implementation to use."
williamr@2
   568
	@return	"A new CMMFVideoDecodeHwDevice object."
williamr@2
   569
	@leave	"This method will leave if an error occurs."
williamr@2
   570
	*/
williamr@2
   571
	IMPORT_C static CMMFVideoDecodeHwDevice* NewPuAdapterL(const CImplementationInformation& aImplInfo, MMMFDevVideoPlayProxy& aProxy);
williamr@2
   572
williamr@2
   573
williamr@2
   574
	/**
williamr@2
   575
	Destructor.
williamr@2
   576
	*/
williamr@2
   577
	IMPORT_C virtual ~CMMFVideoDecodeHwDevice();
williamr@2
   578
williamr@2
   579
williamr@2
   580
	/**
williamr@2
   581
	Retrieves decoder information about this hardware device. The device creates a CVideoDecoderInfo 
williamr@2
   582
	structure, fills it with correct data, pushes it to the cleanup stack and returns it. The client 
williamr@2
   583
	will delete the object when it is no longer needed.
williamr@2
   584
	
williamr@2
   585
	@return	"Decoder information as a CVideoDecoderInfo object. The object is pushed to the cleanup 
williamr@2
   586
			stack, and must be deallocated by the caller."
williamr@2
   587
	@leave	"This method may leave with one of the system-wide error codes."
williamr@2
   588
williamr@2
   589
	@see CVideoDecoderInfo
williamr@2
   590
	*/
williamr@2
   591
	virtual CVideoDecoderInfo* VideoDecoderInfoLC() = 0;
williamr@2
   592
williamr@2
   593
	/**
williamr@2
   594
	Reads header information from a coded data unit.
williamr@2
   595
	@param	"aDataUnitType"		"The type of the coded data unit that is contained in aDataUnit. If the data is a 
williamr@2
   596
								simple piece of bitstream, use EDuArbitraryStreamSection."
williamr@2
   597
	@param	"aEncapsulation"	"The encapsulation type used for the coded data. If the data is a 
williamr@2
   598
								simple piece of bitstream, use EDuElementaryStream."
williamr@2
   599
	@param	"aDataUnit"			"The coded data unit, contained in a TVideoInputBuffer."
williamr@2
   600
	@return "Header information for the data unit, or NULL if the coded data unit did not contain 
williamr@2
   601
			enough data to parse the header. The header data must be returned to the device using 
williamr@2
   602
			ReturnHeader() before Initialize() is called or the decoder is destroyed. The data remains 
williamr@2
   603
			valid until it is returned."
williamr@2
   604
	@leave	"The method will leave if an error occurs. Running out of data is not considered an error, 
williamr@2
   605
			as described above. Typical error codes used:
williamr@2
   606
				* KErrNotSupported - The data is not in a supported format.
williamr@2
   607
				* KErrCorrupt - The data appears to be in a supported format, but is corrupted."
williamr@2
   608
	*/
williamr@2
   609
	virtual TVideoPictureHeader* GetHeaderInformationL(TVideoDataUnitType aDataUnitType, 
williamr@2
   610
		TVideoDataUnitEncapsulation aEncapsulation, TVideoInputBuffer* aDataUnit) = 0;
williamr@2
   611
williamr@2
   612
williamr@2
   613
	/**
williamr@2
   614
	Returns a header from GetHeaderInformationL() back to the decoder so that the memory can be freed.
williamr@2
   615
williamr@2
   616
	@param  "aHeader" "The header to return."
williamr@2
   617
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   618
	*/
williamr@2
   619
	virtual void ReturnHeader(TVideoPictureHeader* aHeader) = 0;
williamr@2
   620
williamr@2
   621
	/**
williamr@2
   622
	Sets the device input format to a compressed video format.
williamr@2
   623
williamr@2
   624
	@param	"aFormat"			"The input format to use."
williamr@2
   625
	@param	"aDataUnitType"		"The data unit type for input data."
williamr@2
   626
	@param	"aEncapsulation"	"The encapsulation type used for the coded data."
williamr@2
   627
	@param	"aDataInOrder"		"ETrue if the input data is written in correct decoding order, 
williamr@2
   628
								 EFalse if will be written in arbitrary order."
williamr@2
   629
	@leave	"The method will leave if an error occurs. Typical error codes used:
williamr@2
   630
				* KErrNotSupported - The source format is not supported."
williamr@2
   631
williamr@2
   632
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   633
	*/
williamr@2
   634
	virtual void SetInputFormatL(const CCompressedVideoFormat& aFormat, 
williamr@2
   635
		TVideoDataUnitType aDataUnitType, TVideoDataUnitEncapsulation aEncapsulation, 
williamr@2
   636
		TBool aDataInOrder) = 0;
williamr@2
   637
williamr@2
   638
	/**
williamr@2
   639
	Sets whether decoding should be synchronized to the current clock source, if any, or if pictures 
williamr@2
   640
	should instead be decoded as soon as possible. If decoding is synchronized, decoding timestamps 
williamr@2
   641
	are used if available, presentation timestamps are used if not. When decoding is not synchronized, 
williamr@2
   642
	pictures are decoded as soon as source data is available for them, and the decoder has a free 
williamr@2
   643
	output buffer. If a clock source is not available, decoding will not be synchronized.
williamr@2
   644
williamr@2
   645
	@param "aSynchronize" "True if decoding should be synchronized to a clock source."
williamr@2
   646
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   647
	*/
williamr@2
   648
	virtual void SynchronizeDecoding(TBool aSynchronize) = 0;
williamr@2
   649
williamr@2
   650
	/**
williamr@2
   651
	Sets decoder buffering options. See [3] for a description of the options available.
williamr@2
   652
	
williamr@2
   653
	@param "aOptions" "Buffering options."
williamr@2
   654
	@leave "The method will leave if an error occurs. Typical error codes used:
williamr@2
   655
			* KErrNotSupported - The specified buffering options are not supported. 
williamr@2
   656
			  If the client receives this error code, it can call GetBufferOptions() 
williamr@2
   657
			  to determine the options the decoder is able to support."
williamr@2
   658
williamr@2
   659
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   660
	*/
williamr@2
   661
	virtual void SetBufferOptionsL(const CMMFDevVideoPlay::TBufferOptions& aOptions) = 0;
williamr@2
   662
williamr@2
   663
	/**
williamr@2
   664
	Gets the video decoder buffer options actually in use. This can be used before calling 
williamr@2
   665
	SetBufferOptions() to determine the default options, or afterwards to check the values 
williamr@2
   666
	actually in use (if some default values were used).
williamr@2
   667
williamr@2
   668
	@param "aOptions" "Buffering options structure to fill."
williamr@2
   669
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   670
	*/
williamr@2
   671
	virtual void GetBufferOptions(CMMFDevVideoPlay::TBufferOptions& aOptions) = 0;
williamr@2
   672
williamr@2
   673
	/**
williamr@2
   674
	Indicates which HRD/VBV specification is fulfilled in the input stream and any related parameters.
williamr@2
   675
williamr@2
   676
	@param "aHrdVbvSpec"	"The HRD/VBV specification fulfilled."
williamr@2
   677
	@param "aHrdVbvParams"	"HRD/VBV parameters. The data format depends on the parameters chosen. 
williamr@2
   678
							For 3GPP TS 26.234 parameters (aHrdVbvSpec=EHrdVbv3GPP), the data in the 
williamr@2
   679
							descriptor is a package of type TPckC<T3gppHrdVbvParams> 
williamr@2
   680
							(see T3gppHrdVbvParams). If no HRD/VBV parameters are used, the descriptor 
williamr@2
   681
							is zero length."
williamr@2
   682
	@see THrdVbvSpecification
williamr@2
   683
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   684
	*/
williamr@2
   685
	virtual void SetHrdVbvSpec(THrdVbvSpecification aHrdVbvSpec, const TDesC8& aHrdVbvParams) = 0;
williamr@2
   686
williamr@2
   687
	/**
williamr@2
   688
	Sets the output post-processor device to use. If an output device is set, all decoded pictures 
williamr@2
   689
	are delivered to that device, and not drawn on screen or returned to the client. Pictures are 
williamr@2
   690
	written using CMMDVideoPostProcDevice::WritePictureL() or a custom interface after they have been 
williamr@2
   691
	decoded. The post-processor must then synchronize rendering to the clock source if necessary.
williamr@2
   692
williamr@2
   693
	@param "aDevice" "The output post-processor device to use."
williamr@2
   694
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   695
	*/
williamr@2
   696
	virtual void SetOutputDevice(CMMFVideoPostProcHwDevice* aDevice) = 0;
williamr@2
   697
williamr@2
   698
	/**
williamr@2
   699
	Returns the current decoding position, i.e. the timestamp for the most recently decoded picture.
williamr@2
   700
williamr@2
   701
	@return "Current decoding position."
williamr@2
   702
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   703
	*/
williamr@2
   704
	virtual TTimeIntervalMicroSeconds DecodingPosition() = 0;
williamr@2
   705
williamr@2
   706
	/**
williamr@2
   707
	Returns the current pre-decoder buffer size.
williamr@2
   708
williamr@2
   709
	@return "The number of bytes of data in the pre-decoder buffer."
williamr@2
   710
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   711
	*/
williamr@2
   712
	virtual TUint PreDecoderBufferBytes() = 0;
williamr@2
   713
williamr@2
   714
	/**
williamr@2
   715
	Reads various counters related to the received input bitstream and coded data units. The counters 
williamr@2
   716
	are reset when Initialize() or this method is called, and thus they only include data processed 
williamr@2
   717
	since the last call.
williamr@2
   718
williamr@2
   719
	@param "aCounters" "The counter structure to fill."
williamr@2
   720
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   721
	*/
williamr@2
   722
	virtual void GetBitstreamCounters(CMMFDevVideoPlay::TBitstreamCounters& aCounters) = 0;
williamr@2
   723
williamr@2
   724
	/**
williamr@2
   725
	Retrieves the number of free input buffers the decoder has available.
williamr@2
   726
williamr@2
   727
	@return "Number of free input buffers the decoder has available."
williamr@2
   728
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   729
	*/
williamr@2
   730
	virtual TUint NumFreeBuffers() = 0;
williamr@2
   731
williamr@2
   732
	/**
williamr@2
   733
	Retrieves an empty video input buffer from the decoder. After input data has been written to the 
williamr@2
   734
	buffer, it can be written to the decoder using WriteCodedDataL(). The number of buffers the decoder
williamr@2
   735
	must be able to provide before expecting any back, and the maximum size for each buffer, are 
williamr@2
   736
	specified in the buffer options.
williamr@2
   737
williamr@2
   738
	The decoder maintains ownership of the buffers even while they have been retrieved by the client, 
williamr@2
   739
	and will take care of deallocating them.
williamr@2
   740
williamr@2
   741
	@param	"aBufferSize"	"Required buffer size, in bytes. The resulting buffer can be larger than 
williamr@2
   742
							this, but not smaller."
williamr@2
   743
	@return "A new input data buffer. The buffer is at least as large as requested, but it may be 
williamr@2
   744
			larger. If no free buffers are available, the return value is NULL."
williamr@2
   745
	@leave  "The method will leave if an error occurs. Lack of free buffers is not considered an error."
williamr@2
   746
	*/
williamr@2
   747
	virtual TVideoInputBuffer* GetBufferL(TUint aBufferSize) = 0;
williamr@2
   748
williamr@2
   749
	/**
williamr@2
   750
	Writes a piece of coded video data to the decoder. The data buffer must be retrieved from the 
williamr@2
   751
	decoder with GetBufferL().
williamr@2
   752
williamr@2
   753
	@param "aBuffer" "The coded data unit to write."
williamr@2
   754
	@leave "This method may leave with one of the system-wide error codes."
williamr@2
   755
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   756
	*/
williamr@2
   757
	virtual void WriteCodedDataL(TVideoInputBuffer* aBuffer) = 0;
williamr@2
   758
	
williamr@2
   759
	/**
williamr@2
   760
	Configures the Decoder using header information known by the client.
williamr@2
   761
	@param	"aVideoPictureHeader"	"Header information to configure the decoder with"
williamr@2
   762
	@leave	"The method will leave if an error occurs. Running out of data is not considered an error, 
williamr@2
   763
			as described above.
williamr@2
   764
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   765
	*/
williamr@2
   766
	virtual void ConfigureDecoderL(const TVideoPictureHeader& aVideoPictureHeader);
williamr@2
   767
		
williamr@2
   768
williamr@2
   769
williamr@2
   770
protected:
williamr@2
   771
	/**
williamr@2
   772
	Constructor.
williamr@2
   773
	*/
williamr@2
   774
	IMPORT_C CMMFVideoDecodeHwDevice();
williamr@2
   775
williamr@2
   776
	/**
williamr@2
   777
	Set the proxy implementation to be used. Called just after the object is constructed.
williamr@2
   778
	@param	"aProxy"	"The proxy to use."
williamr@2
   779
	*/
williamr@2
   780
	virtual void SetProxy(MMMFDevVideoPlayProxy& aProxy) = 0;
williamr@2
   781
private:
williamr@2
   782
	TUid iDtor_ID_Key;
williamr@2
   783
	};
williamr@2
   784
williamr@2
   785
williamr@2
   786
/**
williamr@2
   787
CMMFVideoPostProcHwDevice is the MSL video post-processor plug-in interface. All MSL video 
williamr@2
   788
post-processors must implement this interface.
williamr@2
   789
@publishedAll
williamr@2
   790
@released
williamr@2
   791
*/
williamr@2
   792
class CMMFVideoPostProcHwDevice : public CMMFVideoPlayHwDevice
williamr@2
   793
	{
williamr@2
   794
public:
williamr@2
   795
	/**
williamr@2
   796
	Creates a new video post-processor hardware device object, based on the implementation UID.
williamr@2
   797
williamr@2
   798
	@param	"aUid"		"Post-processor implementation UID."
williamr@2
   799
	@param	"aProxy"	"The proxy implementation to use."
williamr@2
   800
	@return	"A new CMMFVideoPostProcHwDevice object."
williamr@2
   801
	@leave	"This method may leave with one of the system-wide error codes."
williamr@2
   802
	*/
williamr@2
   803
	IMPORT_C static CMMFVideoPostProcHwDevice* NewL(TUid aUid, MMMFDevVideoPlayProxy& aProxy);
williamr@2
   804
williamr@2
   805
	/**
williamr@2
   806
	Destructor.
williamr@2
   807
	*/
williamr@2
   808
	IMPORT_C virtual ~CMMFVideoPostProcHwDevice();
williamr@2
   809
williamr@2
   810
	/**
williamr@2
   811
	Sets the device input format to an uncompressed video format.
williamr@2
   812
williamr@2
   813
	@param	"aFormat"	"The input format to use."
williamr@2
   814
	@leave	"The method will leave if an error occurs. Typical error codes used:
williamr@2
   815
			* KErrNotSupported - The input format is not supported."	
williamr@2
   816
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   817
	*/
williamr@2
   818
	virtual void SetInputFormatL(const TUncompressedVideoFormat& aFormat) = 0;
williamr@2
   819
williamr@2
   820
	/**
williamr@2
   821
	Sets the decoder device that will write data to this post-processor. Decoded pictures will be 
williamr@2
   822
	written with WritePictureL() or through a custom interface. After pictures have been processed, 
williamr@2
   823
	they must be returned to the decoder using ReturnPicture().
williamr@2
   824
williamr@2
   825
	@param	"aDevice"	"The decoder source plug-in to use."
williamr@2
   826
	@pre	"This method can only be called before the hwdevice has been initialized with Initialize()."
williamr@2
   827
	*/
williamr@2
   828
	virtual void SetInputDevice(CMMFVideoDecodeHwDevice* aDevice) = 0;
williamr@2
   829
williamr@2
   830
	/**
williamr@2
   831
	Writes an uncompressed video picture to the post-processor. The picture must be returned to the 
williamr@2
   832
	client or source plug-in after it has been used.
williamr@2
   833
williamr@2
   834
	@param	"aPicture"	"The picture to write."
williamr@2
   835
	@leave	"This method may leave with one of the system-wide error codes."
williamr@2
   836
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   837
	*/
williamr@2
   838
	virtual void WritePictureL(TVideoPicture* aPicture) = 0;
williamr@2
   839
protected:
williamr@2
   840
	/**
williamr@2
   841
	Constructor.
williamr@2
   842
	*/
williamr@2
   843
	IMPORT_C CMMFVideoPostProcHwDevice();
williamr@2
   844
williamr@2
   845
	/**
williamr@2
   846
	Set the proxy implementation to be used. Called just after the object is constructed.
williamr@2
   847
	@param	"aProxy"	"The proxy to use."
williamr@2
   848
	*/
williamr@2
   849
	virtual void SetProxy(MMMFDevVideoPlayProxy& aProxy) = 0;
williamr@2
   850
private:
williamr@2
   851
	TUid iDtor_ID_Key;
williamr@2
   852
	};
williamr@2
   853
williamr@2
   854
williamr@2
   855
williamr@2
   856
/**
williamr@2
   857
A custom interface extending the functionality of CMMFVideoPlayHwDevice, adding support for the decoder to handle the 
williamr@2
   858
copying of the bitstream data into the buffers, combining this with a scan of the data and support for the passing of 
williamr@2
   859
information from the client to the decoder describing what part of a frame the data contains.
williamr@2
   860
@publishedAll
williamr@2
   861
@released
williamr@2
   862
*/
williamr@2
   863
class MMMFVideoPlayHwDeviceExtensionScanCopy
williamr@2
   864
	{
williamr@2
   865
public:
williamr@2
   866
	/**
williamr@2
   867
	Writes a piece of coded video data to the decoder. The data buffer must be retrieved from the
williamr@2
   868
	decoder with GetBufferL().
williamr@2
   869
williamr@2
   870
	@param	"aBuffer"	"The coded data unit to write."
williamr@2
   871
	@param	"aPortion"	"The portion of the frame that the data contains. Defaults to EFramePortionUnknown."
williamr@2
   872
	@leave	"This method may leave with one of the system-wide error codes."
williamr@2
   873
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   874
	*/
williamr@2
   875
	virtual void WriteCodedDataL(TVideoInputBuffer* aBuffer, TFramePortion aPortion = EFramePortionUnknown) = 0;
williamr@2
   876
	/**
williamr@2
   877
	Passes a pointer to a piece of coded video data to the decoder. The data buffer, which is left empty by the client,
williamr@2
   878
	must be retrieved from the decoder with GetBufferL().
williamr@2
   879
williamr@2
   880
	@param	"aCodedData"	"A pointer to the coded data unit to scan and copy."
williamr@2
   881
	@param	"aBuffer"		"The empty data buffer."
williamr@2
   882
	@param	"aPortion"		"The portion of the frame that the data contains. Defaults to EFramePortionUnknown."
williamr@2
   883
	@leave	"This method may leave with one of the system-wide error codes."
williamr@2
   884
	@pre	"This method can only be called after the hwdevice has been initialized with Initialize()."
williamr@2
   885
	*/
williamr@2
   886
	virtual void ScanAndCopyCodedDataL(TPtr8 aCodedData, TVideoInputBuffer* aBuffer, TInt& aConsumed, TFramePortion aPortion = EFramePortionUnknown) = 0;
williamr@2
   887
	};
williamr@2
   888
	
williamr@2
   889
williamr@2
   890
inline void CMMFVideoDecodeHwDevice::ConfigureDecoderL(const TVideoPictureHeader& /*aVideoPictureHeader*/) 
williamr@2
   891
	{
williamr@2
   892
	User::Leave(KErrNotSupported);
williamr@2
   893
	}
williamr@2
   894
		
williamr@2
   895
williamr@2
   896
williamr@2
   897
#endif