diff -r 666f914201fb -r 2fe1408b6811 epoc32/include/mmf/devvideo/devvideorecord.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/epoc32/include/mmf/devvideo/devvideorecord.h Tue Mar 16 16:12:26 2010 +0000 @@ -0,0 +1,1983 @@ +// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// 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 +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __DEVVIDEORECORD_H__ +#define __DEVVIDEORECORD_H__ + +#include <e32std.h> +#include <mmf/devvideo/devvideobase.h> + +class MMMFDevVideoRecordObserver; +class CMMFVideoRecordHwDevice; +class CMMFVideoEncodeHwDevice; +class CMMFVideoPreProcHwDevice; +class TVideoOutputBuffer; + +/** +MMMFDevVideoRecordProxy is the interface the CDevVideoRecord implementation provides for video recording +hardware devices. The hardware devices use this interface to report events and send used pictures and +new buffers to the client. +@publishedAll +@released +*/ +class MMMFDevVideoRecordProxy + { +public: + /** + Delivers a new coded data unit to the client. The CDevVideoRecord implementation will maintain a list + of buffers and implement NumDataBuffers() and NextBufferL() based on those. The buffers will be returned + back to the device using ReturnBuffer(). + + @param "aBuffer" "The buffer containing the data to send." + */ + virtual void MdvrpNewBuffer(TVideoOutputBuffer* aBuffer) = 0; + + /** + Returns a used input picture back to the client. Called by the encoder hardware device after the picture + has been encoded. + + @param "aPicture" "The picture to return." + */ + virtual void MdvrpReturnPicture(TVideoPicture* aPicture) = 0; + + /** + Sends a notification to the client that the current supplemental info send request has completed. + */ + virtual void MdvrpSupplementalInfoSent() = 0; + + /** + Reports a fatal error to the client. The device must automatically stop processing video data when + such errors occur, and may not do further processing before it has been deleted and re-created. + + @param "aDevice" "The device that reports the error." + @param "aError" "The error code." + */ + virtual void MdvrpFatalError(CMMFVideoHwDevice* aDevice, TInt aError) = 0; + + /** + Reports that an asynchronous Initialize() method has completed. The device is now ready for recording. + + @param "aDevice" "The device that was initialized." + @param "aError" "Initialization result error code, KErrNone if initialization was successful." + */ + virtual void MdvrpInitializeComplete(CMMFVideoHwDevice* aDevice, TInt aError) = 0; + + /** + Reports that the input video data end has been reached and all pictures have been processed. Called + by each hardware device after their InputEnd() methods have been called and all data has been processed. + The proxy implementation will notify the client about stream end when all hardware devices have called + this method. + */ + virtual void MdvrpStreamEnd() = 0; + }; + + +/** +A video output buffer for a single output coded data unit from the encoder. In practice the encoder is +likely to inherit its own buffer class from this class, adding its own internal bookkeeping data. +@publishedAll +@released +*/ +class TVideoOutputBuffer + { +public: + /** + Coded video data for this data unit. + */ + TPtrC8 iData; + + /** + Capture timestamp for this data unit. If a single picture is divided into multiple data units, + all data units have the same timestamp. + */ + TTimeIntervalMicroSeconds iCaptureTimestamp; + + /** + Identification number indicating the start of the spatial coverage of the data in the output buffer, + for example the first macroblock number. + */ + TUint iCoverageStartPosition; + + /** + End of the spatial coverage of the data in the buffer, for example the last macroblock number. + The idenfication numbers can be used to match data partitions with each other. + */ + TUint iCoverageEndPosition; + + /** + Order number of the output buffer having the same spatial coverage as an earlier output buffer + of the same picture. Used with video pictures or segments that do not fit into an output buffer. + The order number of the first output buffer of a particular spatial coverage area is 0. The order + number shall be incremented by 1 for each subsequent output buffer having the same coverage in the + same coded picture. + */ + TUint iOrderNumber; + + /** + Lowest unequal error protection level present in the buffer. Level 0 indicates that the buffer can + be discarded without causing temporal error propagation in the decoder, higher values indicate more + important buffers. If unequal error protection is not used, the value is set to 1. + */ + TUint iMinErrorProtectionLevel; + + /** + Highest unequal error protection level present in the buffer. If unequal error protection is not + used, the value is set to 1. + */ + TUint iMaxErrorProtectionLevel; + + /** + True if this buffer contains data that is required for decoding several pictures, for example the + only copy of a sequence header. A picture needed for motion compensated prediction is not considered + "required for decoding several pictures". + */ + TBool iRequiredSeveralPictures; + + /** + True if this buffer contains data that is required for decoding other parts of the same picture, + for example the only copy of the picture header. + */ + TBool iRequiredThisPicture; + + /** + The layer number for this picture if layered bit-rate scalability is used. If layers are not used, + the layer number is always zero. + */ + TUint iLayer; + + /** + Sub-sequence identifier of the output picture. A sub-sequence is a set of coded pictures within a + bit-rate scalability layer. A picture shall reside in one scalability layer and in one sub-sequence + only. A sub-sequence shall not depend on any other sub-sequence in the same or in a higher layer. + A sub-sequence in layer 0 can be decoded independently of any other sub-sequences. A sub-sequence + identifier labels the sub-sequence within a layer. Consecutive sub-sequences within a particular + layer in decoding order shall have a different sub-sequence identifier from each other. See Annex D + of H.264 | MPEG-4 AVC for further details. + */ + TUint iSubSeqId; + + /** + The in-layer scalability step for the data in the buffer if in-layer scalability is used. + If in-layer scalability is not in use, the step is set to zero. + */ + TUint iInLayerScalabilityStep; + + /** + iDataPartitionNumber equal to 0 indicates that data partitioning is not in use. Values of + iDataPartitionNumber greater than 0 indicate the data partition number in descending order of + importance, i.e. data partition 1 is the most important data partition subjectively. Data + partitioning can be used with multiple unequal error protection levels. + */ + TUint iDataPartitionNumber; + + /** + True if this buffer contains data for a random access point. + */ + TBool iRandomAccessPoint; + + /** + Updated HRD/VBV parameters, valid if HRD/VBV is in use and iRandomAccessPoint is true. + */ + TPtrC8 iHrdVbvParams; + + /** + Coding-standard specific data. + */ + TPtrC8 iCodingStandardSpecificData; + + /** + Implementation-specific data. + */ + TPtrC8 iImplementationSpecificData; + + /** + A queue link used internally by the MSL API. The field must not be modified while the buffer is + in the MSL API, but can be used by the client before the buffer has been written and after the + buffer has been returned. + */ + TDblQueLink iLink; + }; + + + +/** +This class contains information about the pre-processing capabilities that an encoder or a pre-processor +hardware has. Although it mainly contains static data, it is defined as a complete CBase-derived class +since the data is relatively complex and proper memory management is necessary. + +The objects are created by the pre-processor or encoder devices, and used by the MSL video client code. + +@publishedAll +@released +*/ +class CPreProcessorInfo : public CBase + { +public: + /** + Creates and returns a new CPreProcessorInfo object. All data passed into this method is copied. + @param "aUid" "The uid of the pre-processor." + @param "aManufacturer" "The manufacturer of the pre-processor." + @param "aIdentifier" "The manufacturer-specific identifier of the pre-processor." + @param "aVersion" "The version of the pre-processor." + @param "aAccelerated" "Whether the pre-processor is hw accelerated or not." + @param "aSupportsDirectCapture" "Whether the pre-processor supports direct capture." + @param "aInputFormats" "An array of the supported input formats." + @param "aOutputFormats" "An array of the supported output formats." + @param "aSupportedCombinations" "An array of the supported combinations." + @param "aSupportsArbitraryScaling" "Whether the pre-processor supports arbitrary scaling." + @param "aSupportsAntiAliasedScaling" "Whether the pre-processor supports anti-alias filtering on scaling."" + @param "aSupportedScaleFactors" "An array of the supported scale factors if arbitrary scaling isn't suported" + @param "aYuvToYuvCapabilities" "The yuv to yuv conversion capabilities of the pre-processor." + @param "aSupportedRgbRanges" "The supported rgb ranges." + @param "aSupportedRotations" "The supported rotations." + @param "aImplementationSpecificInfo" "Implementation-specific information." + @return"The newly created CPreProcessorInfo object." + @leave "This method may leave with one of the system-wide error codes. + */ + IMPORT_C static CPreProcessorInfo* NewL(TUid aUid, + const TDesC& aManufacturer, + const TDesC& aIdentifier, + TVersion aVersion, + TBool aAccelerated, + TBool aSupportsDirectCapture, + const TArray<TUncompressedVideoFormat>& aInputFormats, + const TArray<TUncompressedVideoFormat>& aOutputFormats, + const TArray<TUint32>& aSupportedCombinations, + TBool aSupportsArbitraryScaling, + TBool aSupportsAntiAliasedScaling, + const TArray<TScaleFactor>& aSupportedScaleFactors, + const TYuvToYuvCapabilities& aYuvToYuvCapabilities, + TUint32 aSupportedRgbRanges, + TUint32 aSupportedRotations, + const TDesC8& aImplementationSpecificInfo); + + /** + Destructor. + */ + IMPORT_C ~CPreProcessorInfo(); + + /** + Returns the pre-processor UID. + @return "Pre-processor UID." + */ + IMPORT_C TUid Uid() const; + + /** + Returns the hardware device manufacturer. + @return "The hardware device manufacturer. The reference is valid until this is destroyed." + */ + IMPORT_C const TDesC& Manufacturer() const; + + /** + Returns the hardware device manufacturer-specific identifier. The combination of the manufacturer + and identifier uniquely identifies the plug-in. + @return "The hardware device identifier. The reference is valid until this object is destroyed." + */ + IMPORT_C const TDesC& Identifier() const; + + /** + Returns the pre-processor version. + @return "Pre-processor version." + */ + IMPORT_C TVersion Version() const; + + /** + Returns whether the plug-in is hardware-accelerated. Hardware-accelerated pre-processors can run on + an application DSP or dedicated hardware. + @return "True if the pre-processor is hardware-accelerated." + */ + IMPORT_C TBool Accelerated() const; + + /** + Returns whether the hardware device supports direct capture. Pre-processors supporting direct capture + can get the input pictures directly from a camera, possibly using an efficient hardware-dependent data + path. + @return "True if the pre-processor supports direct capture." + */ + IMPORT_C TBool SupportsDirectCapture() const; + + /** + Returns whether the pre-processor supports the given input format. + @param "aFormat" "The format to be checked." + @return "True if the pre-processor supports the given input format." + */ + IMPORT_C TBool SupportsInputFormat(const TUncompressedVideoFormat& aFormat) const; + + /** + Returns the input formats that the pre-processor supports. + @return "An RArray table of supported video formats (TUncompressedVideoFormat). The reference is valid + until the CPreProcessorInfo object is destroyed." + */ + IMPORT_C const RArray<TUncompressedVideoFormat>& SupportedInputFormats() const; + + /** + Returns whether the pre-processor supports the given output format. + @param "aFormat" "The format to be checked." + @return "True if the pre-processor supports the given input format." + */ + IMPORT_C TBool SupportsOutputFormat(const TUncompressedVideoFormat& aFormat) const; + + /** + Returns the output formats that the pre-processor supports. + @return "An RArray table of supported video formats (TUncompressedVideoFormat). The reference is valid + until the CPreProcessorInfo object is destroyed." + */ + IMPORT_C const RArray<TUncompressedVideoFormat>& SupportedOutputFormats() const; + + /** + Returns whether the pre-processor supports the given pre-processing combination. + @param "aCombination" "Pre-processing combination, a bitwise OR of values from TPrePostProcessType." + @return "True if the pre-processing combination is supported." + */ + IMPORT_C TBool SupportsCombination(TUint32 aCombination) const; + + /** + Lists all supported pre-processing combinations. + @return "An RArray table of pre-processing combinations. Each value is a bitwise OR of values from + TPrePostProcessType. The reference is valid until the CPreProcessorInfo object is destroyed." + */ + IMPORT_C const RArray<TUint32>& SupportedCombinations() const; + + /** + Returns whether the pre-processor supports arbitrary scaling. + @return "True if arbitrary scaling is supported. If arbitrary scaling is not supported, some specific + scale factors can still be available." + */ + IMPORT_C TBool SupportsArbitraryScaling() const; + + /** + Returns whether the hardware device supports anti-aliasing filtering for scaling. + @return "True if anti-aliasing filtering is supported." + */ + IMPORT_C TBool SupportsAntiAliasedScaling() const; + + /** + Returns the scaling factors the plug-in supports. If the plug-in supports arbitrary scaling the list + is empty - use SupportsArbitraryScaling() first. + @return "An RArray list of supported scale factors (TScaleFactor). The reference is valid until the + CPreProcessorInfo object is destroyed. If the pre-processor supports arbitrary scaling or + no scaling at all, the list is empty." + */ + IMPORT_C const RArray<TScaleFactor>& SupportedScaleFactors() const; + + /** + Returns the YUV to YUV conversion capabilities for the pre-processor. + @return "The conversion capabilities, as a TYuvToYuvCapabilities structure. The reference is valid + until the CPreProcessorInfo object is destroyed." + */ + IMPORT_C const TYuvToYuvCapabilities& YuvToYuvCapabilities() const; + + /** + Returns RGB value ranges the hardware device supports for RGB to YUV conversion. + @return "The supported RGB ranges as a bitwise OR of TRgbRange values." + */ + IMPORT_C TUint32 SupportedRgbRanges() const; + + /** + Returns the rotation types the plug-in supports. + @return "The supported rotation types as a bitwise OR of TRotationType values. If the pre-processor + does not support rotation, the return value is zero." + */ + IMPORT_C TUint32 SupportedRotations() const; + + /** + Returns implementation-specific information about the pre-processor. + @return "Implementation- specific information about the pre-processor. The data format is + implementation-specific, and defined separately by the pre-processor supplier. The reference + is valid until the CPreProcessorInfo object is destroyed." + */ + IMPORT_C const TDesC8& ImplementationSpecificInfo() const; +private: + CPreProcessorInfo(TUid aUid, + TVersion aVersion, + TBool aAccelerated, + TBool aSupportsDirectCapture, + TBool aSupportsArbitraryScaling, + TBool aSupportsAntiAliasedScaling, + const TYuvToYuvCapabilities& aYuvToYuvCapabilities, + TUint32 aSupportedRgbRanges, + TUint32 aSupportedRotations); + + void ConstructL(const TDesC& aManufacturer, + const TDesC& aIdentifier, + const TArray<TUncompressedVideoFormat>& aInputFormats, + const TArray<TUncompressedVideoFormat>& aOutputFormats, + const TArray<TUint32>& aSupportedCombinations, + const TArray<TScaleFactor>& aSupportedScaleFactors, + const TDesC8& aImplementationSpecificInfo); +private: + TUid iUid; + HBufC* iManufacturer; + HBufC* iIdentifier; + TVersion iVersion; + TBool iAccelerated; + TBool iSupportsDirectCapture; + RArray<TUncompressedVideoFormat> iInputFormats; + RArray<TUncompressedVideoFormat> iOutputFormats; + RArray<TUint32> iSupportedCombinations; + TBool iSupportsArbitraryScaling; + TBool iSupportsAntiAliasedScaling; + RArray<TScaleFactor> iSupportedScaleFactors; + TYuvToYuvCapabilities iYuvToYuvCapabilities; + TUint32 iSupportedRgbRanges; + TUint32 iSupportedRotations; + HBufC8* iImplementationSpecificInfo; + }; + +/** +This class contains information about a video encoder hardware device and its capabilities. +Although it mainly contains static data, it is defined as a complete CBase-derived class since the +data is relatively complex and proper memory management is necessary. + +The objects are created by the encoder devices, and used by the MSL video client code. + +@publishedAll +@released +*/ +class CVideoEncoderInfo : public CBase + { +public: + /** + Creates and returns a new CVideoEncoderInfo object. + All data passed in is copied on construction of the object. + + @param aUid + The uid of the encoder. + @param aManufacturer + The video encoder manufacturer. + @param aIdentifier + The manufacturer-specific identifier for this encoder. + @param aVersion + The version of this encoder. + @param aAccelerated + Whether this encoder is accelerated. + @param aSupportsDirectCapture + Whether this encoder supports direct capture. + @param aSupportedInputFormats + An array of the supported input formats. + @param aSupportedOutputFormats + An array of the supported output formats. + @param aMaxPictureSize + The maximum supported picture size. + @param aSupportedDataUnitTypes + The supported data unit types. + @param aSupportedDataUnitEncapsulations + The supported data unit encapsulations. + @param aMaxBitrateLayers + The maximum number of bitrate layers supported. + @param aSupportsSupplementalEnhancementInfo + Whether supplemental enhancement info is supported. + @param aMaxUnequalErrorProtectionLevels + The maximum unequal error protection level supported. + @param aMaxBitRate + The maximum bit rate supported. + @param aMaxPictureRates + An array of the maximum picture size/rates supported. + @param aMaxInLayerScalabilitySteps + The maximum in-layer scalability steps supported. + @param aSupportedPictureOptions + The picture options supported. + @param aCodingStandardSpecificInfo + Coding standard specific info. + @param aImplementationSpecificInfo + Implementation specific info. + + @return A new CVideoEncoderInfo object. + @leave This method may leave with one of the system-wide error codes. + */ + IMPORT_C static CVideoEncoderInfo* NewL(TUid aUid, + const TDesC& aManufacturer, + const TDesC& aIdentifier, + TVersion aVersion, + TBool aAccelerated, + TBool aSupportsDirectCapture, + const TArray<TUncompressedVideoFormat>& aSupportedInputFormats, + const TArray<CCompressedVideoFormat*>& aSupportedOutputFormats, + const TSize& aMaxPictureSize, + TUint32 aSupportedDataUnitTypes, + TUint32 aSupportedDataUnitEncapsulations, + TUint aMaxBitrateLayers, + TBool aSupportsSupplementalEnhancementInfo, + TUint aMaxUnequalErrorProtectionLevels, + TUint aMaxBitRate, + const TArray<TPictureRateAndSize>& aMaxPictureRates, + TUint aMaxInLayerScalabilitySteps, + TUint32 aSupportedPictureOptions, + TBool aSupportsPictureLoss, + TBool aSupportsSliceLoss, + const TDesC8& aCodingStandardSpecificInfo, + const TDesC8& aImplementationSpecificInfo); + + /** + Destructor. + */ + IMPORT_C ~CVideoEncoderInfo(); + + /** + Returns the encoder UID. + @return "The encoder UID." + */ + IMPORT_C TUid Uid() const; + + /** + Returns the encoder version. + @return "The encoder version." + */ + IMPORT_C TVersion Version() const; + + /** + Returns the encoder hardware device manufacturer. + @return "The manufacturer name. The reference is valid until the CVideoEncoderInfo object is destroyed." + */ + IMPORT_C const TDesC& Manufacturer() const; + + /** + Returns the encoder hardware device manufacturer-specific identifier. The combination of the + manufacturer and identifier uniquely identifies the plug-in. + @return "The identifier. The reference is valid until the CVideoEncoderInfo object is destroyed." + */ + IMPORT_C const TDesC& Identifier() const; + + /** + Returns whether the encoder is hardware-accelerated. Hardware-accelerated encoders can run on an + application DSP or dedicated hardware. + @return "True if the encoder is hardware-accelerated." + */ + IMPORT_C TBool Accelerated() const; + + /** + Returns whether the encoder supports direct capture. Encoders supporting direct capture can get the + input pictures directly from a camera, possibly using an efficient hardware-dependent data path. + @return "True if the encoder supports direct capture." + */ + IMPORT_C TBool SupportsDirectCapture() const; + + /** + Returns whether the encoder supports the given input format. + @param "aFormat" "The format to check." + @return "True if the encoder supports the given input format." + */ + IMPORT_C TBool SupportsInputFormat(const TUncompressedVideoFormat& aFormat) const; + + /** + Returns the input formats that the encoder supports. + @return "An RArray table of supported video formats (TUncompressedVideoFormat). The reference is + valid until the CVideoEncoderInfo object is destroyed." + */ + IMPORT_C const RArray<TUncompressedVideoFormat>& SupportedInputFormats() const; + + /** + Returns whether the encoder supports the given output format. + @param "aFormat" "The format to check." + @return "True if the encoder supports the given output format." + */ + IMPORT_C TBool SupportsOutputFormat(const CCompressedVideoFormat& aFormat) const; + + /** + Returns the output formats that the encoder supports. + @return "An RArray table of supported video formats (CCompressedVideoFormat). The reference is + valid until the CVideoEncoderInfo object is destroyed." + */ + IMPORT_C const RPointerArray<CCompressedVideoFormat>& SupportedOutputFormats() const; + + /** + Returns the maximum picture size the encoder supports. + @return "The maximum picture size supported. The reference is valid until the CVideoEncoderInfo + object is destroyed." + */ + IMPORT_C const TSize& MaxPictureSize() const; + + /** + Returns the data unit types supported by the encoder. + @return "Supported data unit types. The value is a binary OR of values from TVideoDataUnitType." + */ + IMPORT_C TUint32 SupportedDataUnitTypes() const; + + /** + Returns the data unit encapsulation types that the encoder supports. + @return "Supported data unit encapsulation types. The value is a binary OR of values from + TVideoDataUnitEncapsulation." + */ + IMPORT_C TUint32 SupportedDataUnitEncapsulations() const; + + /** + Returns the maximum number of bit-rate scalability layers supported. + @return "Maximum number of bit-rate scalability layers supported, one (1) if layered scalability + is not supported." + */ + IMPORT_C TUint MaxBitrateLayers() const; + + /** + Returns whether the encoder implements SendSupplementalInfoL(). If SendSupplementalInfoL() is + implemented, the client can send supplemental enhancement information messages as binary strings + using that method. If SendSupplementalInfoL() is not implemented, this is not possible, but the + encoder can still generate and send coding standard or implementation specific supplemental + enhancement information automatically. + @return "True if the encoder supports supplemental enhancement information." + */ + IMPORT_C TBool SupportsSupplementalEnhancementInfo() const; + + /** + Returns the maximum number of unequal error protection levels supported. + @return "Maximum number of unequal error protection levels supported, one (1) if unequal error + protection is not supported." + */ + IMPORT_C TUint MaxUnequalErrorProtectionLevels() const; + + /** + Returns the maximum bit-rate supported by the encoder. + @return "Maximum bit-rate supported, in bits per second. KMaxTUint32 can be used if the encoder has no + bit-rate restrictions." + */ + IMPORT_C TUint MaxBitrate() const; + + /** + Returns the maximum picture size/rate combinations supported by the encoder. Video encoders can have + different maximum picture rate limitations depending on the picture size used. + @return "A reference to an array of picture size/rate combinations. The reference remains valid until + this object is deleted." + */ + IMPORT_C const RArray<TPictureRateAndSize>& MaxPictureRates() const; + + /** + Returns the maximum number of in-layer scalability steps supported. + @return "Maximum number of in-layer scalability steps supported, one (1) if in-layer scalability is + not supported." + */ + IMPORT_C TUint MaxInLayerScalabilitySteps() const; + + /** + Returns the input picture options that the encoder supports. + @return "Supported input picture options, a bitwise OR of values from TVideoPicture::TVideoPictureOptions." + */ + IMPORT_C TUint32 SupportedPictureOptions() const; + + /** + Returns whether the encoder supports picture loss indications. If true, the encoder implements + PictureLoss(), and recovers lost picture contents when it receives the indication. + @return "True if the encoder supports picture loss indications." + */ + IMPORT_C TBool SupportsPictureLoss() const; + + /** + Returns whether the encoder supports slice loss indications. If true, the encoder implements + SliceLoss(), and recovers lost or damaged macroblocks when it receives the indication. + @return "True if the encoder supports slice loss indications." + */ + IMPORT_C TBool SupportsSliceLoss() const; + + /** + Returns coding-standard specific information about the encoder. + @return "Coding-standard specific information about the encoder. The data format is coding-standard + specific, and defined separately. The reference is valid until the CVideoEncoderInfo object + is destroyed." + */ + IMPORT_C const TDesC8& CodingStandardSpecificInfo() const; + + /** + Returns implementation-specific information about the encoder. + @return "Implementation-specific information about the encoder. The data format is + implementation-specific, and defined separately by the encoder supplier. The reference is valid until + the CVideoEncoderInfo object is destroyed." + */ + IMPORT_C const TDesC8& ImplementationSpecificInfo() const; +private: + CVideoEncoderInfo(TUid aUid, + TVersion aVersion, + TBool aAccelerated, + TBool aSupportsDirectCapture, + const TSize& aMaxPictureSize, + TUint32 aSupportedDataUnitTypes, + TUint32 aSupportedDataUnitEncapsulations, + TUint aMaxBitrateLayers, + TBool aSupportsSupplementalEnhancementInfo, + TUint aMaxUnequalErrorProtectionLevels, + TUint aMaxBitRate, + TUint aMaxInLayerScalabilitySteps, + TUint32 aSupportedPictureOptions, + TBool aSupportsPictureLoss, + TBool aSupportsSliceLoss); + void ConstructL(const TDesC& aManufacturer, + const TDesC& aIdentifier, + const TArray<TUncompressedVideoFormat>& aSupportedInputFormats, + const TArray<CCompressedVideoFormat*>& aSupportedOutputFormats, + const TArray<TPictureRateAndSize>& aMaxPictureRates, + const TDesC8& aCodingStandardSpecificInfo, + const TDesC8& aImplementationSpecificInfo); +private: + TUid iUid; + TVersion iVersion; + HBufC* iManufacturer; + HBufC* iIdentifier; + TBool iAccelerated; + TBool iSupportsDirectCapture; + RArray<TUncompressedVideoFormat> iSupportedInputFormats; + RPointerArray<CCompressedVideoFormat> iSupportedOutputFormats; + TSize iMaxPictureSize; + TUint32 iSupportedDataUnitTypes; + TUint32 iSupportedDataUnitEncapsulations; + TUint iMaxBitrateLayers; + TBool iSupportsSupplementalEnhancementInfo; + TUint iMaxUnequalErrorProtectionLevels; + TUint iMaxBitRate; + RArray<TPictureRateAndSize> iMaxPictureRates; + TUint iMaxInLayerScalabilitySteps; + TUint32 iSupportedPictureOptions; + TBool iSupportsPictureLoss; + TBool iSupportsSliceLoss; + HBufC8* iCodingStandardSpecificInfo; + HBufC8* iImplementationSpecificInfo; + }; + + +/** +CMMFDevVideoRecord is the main client class of DevVideoRecord. +@publishedAll +@released +*/ +class CMMFDevVideoRecord : public CBase, private MMMFDevVideoRecordProxy + { +public: + /** + Class to define the picture counters available through GetPictureCounters. + @publishedAll + @released + */ + class TPictureCounters + { + public: + /** + Default constructor. Zeros all members. + */ + inline TPictureCounters(); + public: + /** The number of pictures skipped due to lack of output buffers. */ + TUint iPicturesSkippedBufferOverflow; + + /** The number of pictures skipped due to lack of processing power. */ + TUint iPicturesSkippedProcPower; + + /** The number of pictures skipped for bit-rate control purposes. */ + TUint iPicturesSkippedRateControl; + + /** The number of processed (i.e. pre-processed and encoded) input pictures. */ + TUint iPicturesProcessed; + + /** The total number of input pictures. When using direct capture, this is the total number of + pictures captured, otherwise it is the total number of input pictures written by the client. */ + TUint iInputPictures; + }; + + +public: + /** + Creates a new CMMFDevVideoRecord object. + @param "aObserver" "The observer object to use. The observer callbacks are used to return input buffers + back to the client." + @return "A new CMMFDevVideoRecord object. + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrHardwareNotAvailable - Not enough free video processing hardware resources + - KErrNoMemory - Not enough free memory available" + */ + IMPORT_C static CMMFDevVideoRecord* NewL(MMMFDevVideoRecordObserver& aObserver); + + /** + Destructor. + */ + IMPORT_C ~CMMFDevVideoRecord(); + + /** + Finds all available encoders for a given video type with support for certain pre-processing operations. + The video type is specified using its MIME type, which may include parameters specifying the supported + level, version, and other information. Encoder hardware devices can use wildcards when listing the + supported video types in the ECom registration information, so it is possible that all the encoders + returned do not support the specified submode, e.g. profile and level, unless aExactMatch is set. + + The encoder capabilities can be checked with VideoEncoderInfoLC(). + + @param "aMimeType" "The video type that will be encoded." + @param "aPreProcType" "The pre-processing types that the encoder has to support, a binary OR of + TPrePostProcessType values. If no pre-processing support is needed, set this + value to zero." + @param "aEncoders" "An array for the result encoder UIDs. The array must be created and destroyed + by the caller." + @param "aExactMatch" "True if exact matching should be used. In this case only encoders that support + exactly the MIME-type given will be returned. Since verifying this may require + loading the encoders into memory, this can be a fairly expensive operation, and + if the user needs to verify their capabilities further in any case this parameter + should be set to EFalse." + @leave "The method will leave if an error occurs. Typical error codes used: + -KErrNotFound - No encoders were found matching the search parameters." + */ + IMPORT_C void FindEncodersL(const TDesC8& aMimeType, + TUint32 aPreProcType, + RArray<TUid>& aEncoders, + TBool aExactMatch=ETrue); + + /** + Finds all available pre-processors for a given set of pre-processing operations. + + @param "aPreProcType" "The pre-processing types that the device has to support, a binary OR of + TPrePostProcessType values." + @param "aPreProcessors" "An array for the result pre-processor UIDs. The array must be created and + destroyed by the caller." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotFound - No pre-processors were found matching the search parameters." + */ + IMPORT_C void FindPreProcessorsL(TUint32 aPreProcType, RArray<TUid>& aPreProcessors); + + /** + Retrieves a list of available video encoders in the system. + @param "aEncoders" "An array for the result encoder UIDs. The array must be created and destroyed by + the caller." + @leave "The method will leave if an error occurs. Not finding any encoders is not treated as an error + condition: in this situation, aEncoders will be empty." + */ + IMPORT_C void GetEncoderListL(RArray<TUid>& aEncoders); + + /** + Retrieves a list of available video pre-processor hardware devices in the system. + @param "aPreProcessors" "An array for the result pre-processor UIDs. The array must be created and + destroyed by the caller." + @leave "The method will leave if an error occurs. Not finding any pre-processors is not treated as an + error condition: in this situation, aPreProcessors will be empty." + */ + IMPORT_C void GetPreProcessorListL(RArray<TUid>& aPreProcessors); + + /** + Retrieves information about an installed video encoder. Note that this method will need to load the + encoder hardware device into memory, and can thus be relatively expensive. + @param "aVideoEncoder" "The video encoder device to query." + @return "Encoder information as a CVideoEncoderInfo object. The object is pushed to the cleanup stack, + and must be deallocated by the caller." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotFound - No encoder was found with the given UID" + */ + IMPORT_C CVideoEncoderInfo* VideoEncoderInfoLC(TUid aVideoEncoder); + + /** + Retrieves information about the pre-processing capabilities of an installed pre-processor or encoder + hardware device. Note that this method will need to load the device into memory, and can thus be + relatively expensive. + @param "aPreProcessor" "The device to query." + @return "Pre-processor information as a CPreProcessorInfo object. The object is pushed to the cleanupstack, + and must be deallocated by the caller." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotFound - No pre-processor was found with the given UID" + */ + IMPORT_C CPreProcessorInfo* PreProcessorInfoLC(TUid aPreProcessor); + + /** + Selects the video encoder to be used. This method must be called before any other video encoder related + methods are used. The encoder can be changed by calling this method again before the system has been + initialized with Initialize(). + + All video encoder settings are reset to their default values. By default no pre-processing is performed. + + @param "aEncoder" "The video encoder to use." + @return "Hardware device ID, used in other methods for configuring the encoder." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotFound - No encoder was found with the given UID" + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C THwDeviceId SelectEncoderL(TUid aEncoder); + + /** + Selects the video pre-processor to be used. This method must be called before any other pre-processor + related methods are used. The pre-processor to use can be changed by calling this method again before + the API has been initialized with Initialize(). + + All pre-processor settings are reset to their default values. By default no pre-processing is performed. + + @param "aPreProcessor" "The pre-processor to use." + @return "Hardware device ID, used in other methods for configuring the pre-processor." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotFound - No pre-processor was found with the given UID" + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C THwDeviceId SelectPreProcessorL(TUid aPreProcessor); + + /** + Sets the input format for a hardware device. If both a pre-processor and an encoder are used, the + pre-processor output format and the encoder input format must be the same. The input format for the + first device in the system is the input format for video input data. + + The method has to be called for both direct capture as well as memory buffer input. The camera API + must be initialized by the device using it for capture, since there is no way to query the current + format from the camera API. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aFormat" "The input format to use." + @param "aPictureSize" "The input picture size in pixels." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The input format specified is not supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetInputFormatL(THwDeviceId aHwDevice, + const TUncompressedVideoFormat& aFormat, + const TSize& aPictureSize); + + /** + Sets the data source to be a camera, and sets the system to use direct capture for input. The first + hardware device (pre-processor if both encoder and pre-processor are used, encoder otherwise) must + support direct capture. + + @param "aCameraHandle" "A camera handle for the camera to use. The handle is passed to + CCamera::NewDuplicateL() in the camera API." + @param "aPictureRate" "Video capture picture rate." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - Direct capture is not supported or the picture rate specified is not + supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetSourceCameraL(TInt aCameraHandle, TReal aPictureRate); + + /** + Sets the data source to be memory buffers. + + @param "aMaxPictureRate" "The maximum picture rate for input pictures." + @param "aConstantPictureRate" "True if the input picture rate is constant. In that case, + aMaxPictureRate specifies the picture rate. If pictures may be skipped + in the input data due to performance reasons, this flag cannot be set." + @param "aProcessRealtime" "True if real-time processing is needed, false if not. Real-time + processing is typically needed for video recording applications, while + video conversion and off-line processing applications do not require it." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The picture rate specified is not supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetSourceMemoryL(TReal aMaxPictureRate, TBool aConstantPictureRate, TBool aProcessRealtime); + + /** + Sets the output format for a hardware device to a compressed video format. Only applicable for encoder + devices. The picture size depends on the input data format and possible scaling performed. + + @param "aHwDevice" "The hardware device to configure. The value is returned from + SelectEncoderL()when the device is selected." + @param "aFormat" "The video format to use." + @param "aDataUnitType" "The type of output coded data units." + @param "aDataEncapsulation" "Data encapsulation type for output encoded data units." + @param "aSegmentationAllowed" "True if a coded data unit can be segmented into multiple output buffers + if a single buffer is not large enough." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The format specified is not supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetOutputFormatL(THwDeviceId aHwDevice, + const CCompressedVideoFormat& aFormat, + TVideoDataUnitType aDataUnitType, + TVideoDataUnitEncapsulation aDataEncapsulation, + TBool aSegmentationAllowed=EFalse); + + /** + Sets the output format for a hardware device to an uncompressed video format. Only applicable for + pre-processor devices. The picture size depends on the input data format and possible scaling performed. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectPreProcessorL() + when the device is selected." + @param "aFormat" "The video format to use." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The format specified is not supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetOutputFormatL(THwDeviceId aHwDevice, const TUncompressedVideoFormat& aFormat); + + /** + Sets the clock source to use for video timing. When video recording is synchronized with audio, the clock + source is implemented by the audio playback subsystem, otherwise the clock source should get the time + from the system clock. This method can be called after all hardware devices have been selected, but + before calling Initialize(). + + If no clock source is set, video recording will not be synchronized, but will proceed as fast as + possible, depending on input data and output buffer availability. If direct capturing is used without a + clock source, the timestamps in the output data may not be valid. All encoders must support + synchronization with an external clock source, as well as unsynchronized non-realtime operation. + + @param "aClock" "The clock source to use." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetClockSource(MMMFClockSource* aClock); + + /** + Sets pre-processing options for RGB to YUV color space conversion. By default, input RGB data is + assumed to use the full value range ([0…255]), and the output YUV format is the hardware device + output format, so typically calling this method is not necessary. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aRgbRange" "Input RGB data range" + @param "aOutputFormat" "Conversion output YUV format." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The formats specified are not supported" + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetRgbToYuvOptionsL(THwDeviceId aHwDevice, TRgbRange aRgbRange, const TYuvFormat& aOutputFormat); + + /** + Sets pre-processing options for YUV to YUV data format conversion. By default, the hardware device + input and output data formats are used. For encoder devices, the device input format and the closest + matching format supported by the encoding process are used. Typically calling this method is not + necessary. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aInputFormat" "Conversion input format." + @param "aOutputFormat" "Conversion output format." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The formats specified are not supported" + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetYuvToYuvOptionsL(THwDeviceId aHwDevice, + const TYuvFormat& aInputFormat, + const TYuvFormat& aOutputFormat); + + /** + Sets the number of bit-rate scalability layers to use. Set to 1 to disable layered scalability. + + Bit-rate scalability refers to the ability of a coded stream to be decoded at different bit-rates. + Scalable video is typically ordered into hierarchical layers of data. A base layer contains an + individual representation of a video stream and enhancement layers contain refinement data in + addition to the base layer. The quality of the encoded video stream progressively improves as + enhancement layers are added to the base layer. + + @param "aNumLayers" "The number of bit-rate scalability layers to use, set to 1 to disable + scalability." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The scalability layers are not supported or too many layers specified." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetNumBitrateLayersL(TUint aNumLayers); + + /** + Sets the scalability type for a bit-rate scalability layer. + + @param "aLayer" "Layer number. Layers are numbered [0…n-1], where n is the number of layers + available. The first layer is the base layer, it can be decoded independently + from the other layers, and it has the lowest total bitrate." + @param "aScalabilityType" "Layer scalability type." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The scalability layers or the specified scalability type are not supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetScalabilityLayerTypeL(TUint aLayer, TScalabilityType aScalabilityType); + + + /** + Sets the reference picture options to be used for all scalability layers. The settings can be + overridden for an individual scalability layer by using SetLayerReferenceOptions(). + + @param "aMaxReferencePictures" "The maximum number of reference pictures to be used. More than one + reference frame can be used in the H.264 | MPEG-4 AVC and in some + advanced profiles of MPEG-4 Part 2 and H.263. The minimum value is one." + @param "aMaxPictureOrderDelay" "The maximum picture order delay, in number of pictures. This specifies + the maximum number of pictures that precede any picture in the sequence + in decoding order and follow the picture in presentation order. Pictures + may be coded/decoded in different order from their capture/display order. + Thus, decoded pictures have to be buffered to order them in correct + display order. For example, if one conventional B picture is coded + between P pictures, a one-picture display ordering delay has to be + applied in the decoder. The minimum value is zero, which indicates that + pictures must be coded in capture/display order." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetGlobalReferenceOptions(TUint aMaxReferencePictures, TUint aMaxPictureOrderDelay); + + /** + Sets the reference picture options to be used for a single scalability layer. These settings override + those set with SetGlobalReferenceOptions(). + + @param "aLayer" "Layer number." + @param "aMaxReferencePictures" "The maximum number of reference pictures to be used." + @param "aMaxPictureOrderDelay" "The maximum picture order delay, in number of pictures." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetLayerReferenceOptions(TUint aLayer, TUint aMaxReferencePictures, TUint aMaxPictureOrderDelay); + + /** + Sets encoder buffering options. + + @param "aOptions" "The buffering options." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified settings are not supported." + @pre "This method can only be called before the API has been initialized with Initialize()." + */ + IMPORT_C void SetBufferOptionsL(const TEncoderBufferOptions& aOptions); + + /** + Sets the encoder output rectangle for encoded video output. This rectangle specifies the part of the + input and output pictures which is displayed after encoding. Many video codecs process data in 16x16 + pixel units but enable specifying and coding the decoder output rectangle for image sizes that are not + multiple of 16 pixels (e.g 160x120). + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + when the device is selected." + @param "aRect" "The encoder output rectangle." + @leave "The method will leave if an error occurs." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetOutputRectL(THwDeviceId aHwDevice, const TRect& aRect); + + /** + Sets the pre-processing types to be used in a hardware device. [1 #191] If separate encoder and + pre-processor devices are used, both can be configured to perform different pre-processing operations. + + Pre-processing operations are carried out in the following order: + + 1. Frame stabilisation + 2. Input cropping + 3. Mirroring + 4. Rotating + 5. Scaling + 6. Output cropping + 7. Output padding + + Color space conversion and color enhancement can be performed at any point in the pre-processing flow. + + @param "aHwDevice" "The hardware device to configure. The value is returned from + SelectEncoderL() or SelectPreProcessorL() when the device is selected." + @param "aPreProcessTypes" "The pre-processing steps to perform, a bitwise OR of values from + TPrePostProcessType." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The pre-processing combination is not supported" + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetPreProcessTypesL(THwDeviceId aHwDevice, TUint32 aPreProcessTypes); + + /** + Sets pre-processing options for rotation. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aRotationType" "The rotation to perform." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The rotation type is not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetRotateOptionsL(THwDeviceId aHwDevice, TRotationType aRotationType); + + /** + Sets pre-processing options for scaling. + + @param "aHwDevice" "The hardware device to configure. The value is returned from + SelectEncoderL() or SelectPreProcessorL() when the device is selected." + @param "aTargetSize" "Target picture size. If a fixed scale factor size is used, the new + dimensions must be set to: + width=floor(factor*width), height=floor(factor*height). + For example, scaling a QCIF (176x144) picture up by a factor of 4/3 + yields a size of 234x192." + @param "aAntiAliasFiltering" "True if anti-aliasing filtering should be used. If the pre-processor + does not support anti-aliased scaling, or supports anti-aliased scaling + only, this argument is ignored." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified target size is not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetScaleOptionsL(THwDeviceId aHwDevice, const TSize& aTargetSize, TBool aAntiAliasFiltering); + + /** + Sets pre-processing options for input cropping. Input cropping is typically used for digital zooming. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() or + SelectPreProcessorL() when the device is selected." + @param "aRect" "The input cropping rectangle specifying the area of the picture to use. The + rectangle must fit completely inside the input picture." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified cropping rectangle is not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetInputCropOptionsL(THwDeviceId aHwDevice, const TRect& aRect); + + /** + Sets pre-processing options for output cropping. Output cropping is performed after other pre-processing + operations but before output padding. Output cropping and padding can be used in combination to prepare + the picture size to suit the encoder, typically video encoders only support picture sizes that are + multiples of 16 pixels. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() or + SelectPreProcessorL() when the device is selected." + @param "aRect" "The output cropping rectangle specifying the area of the picture to use. The + rectangle must fit completely inside the picture." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified cropping rectangle is not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetOutputCropOptionsL(THwDeviceId aHwDevice, const TRect& aRect); + + /** + Sets pre-processing options for output padding. Output padding is performed as the last pre-processing + operation, and typically used to prepare the picture size to suit the encoder. The image is padded with + black pixels. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aOutputSize" "The padded output picture size. The output size must be large enough for the + picture in its new position." + @param "aPicturePos" "The position for the original picture in the new padded picture. The original + picture in its new position must fit completely inside the new picture." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified padding settings are not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetOutputPadOptionsL(THwDeviceId aHwDevice, const TSize& aOutputSize, const TPoint& aPicturePos); + + /** + Sets color enhancement pre-processing options. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aOptions" "Color enchancement options." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified settings are not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetColorEnhancementOptionsL(THwDeviceId aHwDevice, const TColorEnhancementOptions& aOptions); + + /** + Sets frame stabilisation options. + + Frame stabilisation is performed as the first pre-processing operation in the hardware device. The + stabilisation process gets the complete hardware device input picture as its input, and it produces a + smaller stabilised output picture. The rest of the processing in the hardware device is done using the + stabilisation output picture. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aOutputSize" "Output picture size. The output picture must size must be smaller than + or equal to the hardware device input picture size." + @param "aFrameStabilisation" "True if frame stabilisation should be used. By default stabilisation + is not used." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified settings are not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetFrameStabilisationOptionsL(THwDeviceId aHwDevice, + const TSize& aOutputSize, + TBool aFrameStabilisation); + + /** + Sets custom implementation-specific pre-processing options. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() + or SelectPreProcessorL() when the device is selected." + @param "aOptions" "Post-processing options. The data format is implementation-specific." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The options are not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetCustomPreProcessOptionsL(THwDeviceId aHwDevice, const TDesC8& aOptions); + + /** + Sets whether bit errors or packets losses can be expected in the video transmission channel. The + video encoder can use this information to optimize the bitstream. + + @param "aBitErrors" "True if bit errors can be expected." + @param "aPacketLosses" "True if packet losses can be expected." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetErrorsExpected(TBool aBitErrors, TBool aPacketLosses); + + /** + Sets the minimum frequency (in time) for instantaneous random access points in the bitstream. + An instantaneous random access point is such where the encoder can achieve a full output picture + immediately by encoding data starting from the random access point. The random access point frequency + may be higher than signalled, if the sequence contains scene cuts which typically cause a coding of + a random access point. + + @param "aRate" "Random access point rate, in pictures per second. For example, to request a random + access point every ten seconds, set the value to 0.1." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetMinRandomAccessRate(TReal aRate); + + /** + Sets coding-standard specific encoder options. + + @param "aOptions" "The options to use. The data format for the options is coding-standard specific, + and defined seperately." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified settings are not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetCodingStandardSpecificOptionsL(const TDesC8& aOptions); + + /** + Sets implementation-specific encoder options. + + @param "aOptions" "The options to use. The data format for the options is specific to the encoder + implementation, and defined separately by the encoder implementor." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified settings are not supported." + @pre "This method can be called either before or after the API has been initialized with Initialize(). + If called after initialization, the change will only be committed once CommitL() is called." + */ + IMPORT_C void SetImplementationSpecificEncoderOptionsL(const TDesC8& aOptions); + + /** + Initializes the video devices, and reserves hardware resources. This method is asynchronous, + DevVideoRecord will call MMMFDevVideoRecordObserver::MdvroInitializeComplete() after initialization has + completed. If direct capture is used, this method also prepares the camera API for capture by calling + PrepareVideoCaptureL(). No DevVideoRecord method may be called while initialization is in progress, the + initialization process can only be cancelled by destroying the DevVideoRecord object. + + After initialization has successfully been completed, video capturing and encoding can be started with + Start() with a relatively low delay since the hardware has already been set up. + + If Initialize() fails, the DevVideoRecord object must be destroyed, and set up from scratch. + + Error handling: Errors are reported using the MdvroInitializeComplete() callback method. Typical error + codes used: + - KErrHardwareNotAvailable - Not enough free video processing hardware resources + - KErrNotSupported - The current configuration is not supported. + + @pre "This method can only be called before the API has been initialized." + */ + IMPORT_C void Initialize(); + + /** + Commit all configuration changes since the last CommitL(), Revert() or Initialize(). This only applies + to methods that can be called both before AND after DevVideoRecord has been initialized. + See the following methods for details. + + @see SetOutputRectL + @see SetPreProcessTypesL + @see SetRotateOptionsL + @see SetScaleOptionsL + @see SetInputCropOptionsL + @see SetOutputCropOptionsL + @see SetOutputPadOptionsL + @see SetColorEnhancementOptionsL + @see SetFrameStabilisationOptionsL + @see SetCustomPreProcessOptionsL + @see SetCodingStandardSpecificOptionsL + @see SetImplementationSpecificEncoderOptionsL + + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void CommitL(); + + /** + Revert any configuration changes that have not yet been committed using CommitL(). This only applies + to methods that can be called both before AND after DevVideoRecord has been initialized. + See the following methods for details. + + @see SetOutputRectL + @see SetPreProcessTypesL + @see SetRotateOptionsL + @see SetScaleOptionsL + @see SetInputCropOptionsL + @see SetOutputCropOptionsL + @see SetOutputPadOptionsL + @see SetColorEnhancementOptionsL + @see SetFrameStabilisationOptionsL + @see SetCustomPreProcessOptionsL + @see SetCodingStandardSpecificOptionsL + @see SetImplementationSpecificEncoderOptionsL + + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void Revert(); + + /** + Returns coding-standard specific initialization output from the encoder. The information can contain, + for example, the MPEG-4 VOL header. This method can be called after Initialize() has been called. + + @return "Coding-standard specific initialization output. The data format is coding-standard specific + and defined separately. The buffer is pushed to the cleanup stack, and the caller is responsible + for deallocating it." + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C HBufC8* CodingStandardSpecificInitOutputLC(); + + /** + Returns implementation-specific initialization output from the encoder. This method can be called after + Initialize() has been called. + + @return "Implementation-specific initialization output. The data format is specific to the encoder + implementation, and defined by the encoder supplier. The buffer is pushed to the cleanup stack, + and the caller is responsible for deallocating it." + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C HBufC8* ImplementationSpecificInitOutputLC(); + + /** + Sets the number of unequal error protection levels. By default unequal error protection is not used. + + @param "aNumLevels" "The number of unequal error protection levels. To disable unequal error + protection, set this value to one. When unequal error protection is used, + the encoder should code pictures so that they can be divided into number of + unequal error protection levels having an ascending order of importance in + the quality of decoded pictures, with level zero indicating the least important level. + The encoder should map the requested bit-rate scalability layers and in-layer + bit-rate scalability steps to the unequal error protection levels. In + addition, the encoder may use coded sub-pictures to divide coded pictures + to different regions of interest or data partitions to divide coded segments + into pieces of different importance." + @param "aSeparateBuffers" "True if each unequal error protection level of a coded data unit shall be + encapsulated in its own output buffer. Ignored if unequal error protection + is not used. If each unequal error protection level (e.g. a data partition) + of coded data unit is encapsulated in its own output buffer, the caller can + transmit the output buffers in different logical channels or can apply a + different amount of application-level forward error coding for different + output buffers. If all unequal error protection levels (e.g. data partitions) + of coded data unit are encapsulated in the same output buffer, the caller can + apply a forward error control mechanism that protects the beginning of the + output buffer better than the remaining of the output buffer." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - Unequal error protection is not supported." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetErrorProtectionLevelsL(TUint aNumLevels, TBool aSeparateBuffers); + + /** + Sets up an unequal error protection level. If unequal error protection is not used, this method can be + used to control settings for the whole encoded bitstream. + + @param "aLevel" "Error protection level number. This argument is ignored if unequal error + protection is not in use." + @param "aBitrate" "Target bit-rate for this error protection level." + @param "aStrength" "Forward error control strength for this error protection level. The strength can be + specified using values from TErrorControlStrength (EFecStrengthNone, EFecStrengthLow, + EFecStrengthNormal, EFecStrengthHigh), or with intermediate values between those + constants." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - The specified bit-rate cannot be supported. " + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetErrorProtectionLevelL(TUint aLevel, TUint aBitrate, TUint aStrength); + + /** + Sets the expected or prevailing channel conditions for an unequal error protection level, in terms of + expected packet loss rate. The video encoder can use this information to optimize the generated + bitstream. + + @param "aLevel" "Error protection level number. This argument is ignored if unequal error + protection is not in use." + @param "aLossRate" "Packet loss rate, in number of packets lost per second. Set to 0.0 if + packet losses are not expected." + @param "aLossBurstLength" "Expected average packet loss burst length. Set to zero if the information + is not available." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetChannelPacketLossRate(TUint aLevel, TReal aLossRate, TTimeIntervalMicroSeconds32 aLossBurstLength); + + /** + Sets the expected or prevailing channel conditions for an unequal error protection level, in terms of + expected bit error rate. The video encoder can use this information to optimize the generated bitstream. + + @param "aLevel" "Error protection level number. This argument is ignored if unequal error + protection is not in use." + @param "aErrorRate" "Expected bit error rate, as a fraction of the total bits transmitted. Set + to 0.0 if bit errors are not expected." + @param "aStdDeviation" "Expected bit error rate standard deviation." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetChannelBitErrorRate(TUint aLevel, TReal aErrorRate, TReal aStdDeviation); + + /** + Sets the target size of each coded video segment. The segment target size can be specified in terms + of number of bytes per segment, number of macroblocks per segment, or both. + + @param "aLayer" "Layer number. Layers are numbered [0…n-1], where n is the number of layers + available. Use zero if layered bit-rate scalability is not used." + @param "aSizeBytes" "Segment target size in bytes. Set to zero to use unlimited segment size. The + segment size in bytes should include all data that is typically stored or + transmitted for each segment in the format currently in use. This includes all + related headers." + @param "aSizeMacroblocks" "Segment target size in number of macroblocks per segment. Set to zero to + use unlimited segment size." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetSegmentTargetSize(TUint aLayer, TUint aSizeBytes, TUint aSizeMacroblocks); + + /** + Sets the bit-rate control options for a layer. If layered bit-rate scalability is not used, the options + are set for the whole bitstream. + + @param "aLayer" "Layer number. Layers are numbered [0…n-1], where n is the number of layers available. + Use zero if layered bit-rate scalability is not used." + @param "aOptions" "Bit-rate control options." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetRateControlOptions(TUint aLayer, const TRateControlOptions& aOptions); + + /** + Sets in-layer scalability options for a layer. In-layer bit-rate scalability refers to techniques where + a specific part of a single-layer coded stream can be decoded correctly without decoding the leftover + part. For example, B-pictures can be used for this. By default in-layer scalability is not used. + + @param "aLayer" "Layer number. Layers are numbered [0…n-1], where n is the number of layers + available. Use zero if layered bit-rate scalability is not used." + @param "aNumSteps" "The number of in-layer scalability steps to use. Set to one to disable + in-layer scalability." + @param "aScalabilityType" "The scalability type to use. See the definition of TInLayerScalabilityType + for more information." + @param "aBitrateShare" "Bit-rate share for each scalability step. The bit-rate shares are defined + as fractions of total layer bit-rate, with the share for one layer being + aBitrateShare[i]/sum(aBitrateShare). For example, to use 2/3 of the total + bitrate for the first layer and the remaining 1/3 for the second, the array + contents would be {2,1}." + @param "aPictureShare" "Picture rate share for each scalability step. The picture rate shares are + defined similarly to the bit-rate shares. For example, a client wishing to + use two B-pictures between each pair of reference pictures should set the + array contents to {1,2}." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - In-layer scalability is not supported. + - KErrArgument - Some of the arguments are out of range. For example, it is not possible + to use the specified in-layer scalability setup due to other + constraints (such as the maximum picture order delay)." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetInLayerScalabilityL(TUint aLayer, + TUint aNumSteps, + TInLayerScalabilityType aScalabilityType, + const TArray<TUint>& aBitrateShare, + const TArray<TUint>& aPictureShare); + + /** + Sets the period for layer promotions points for a scalability layer. A layer promotion point is a + picture where it is possible to start encoding this enhancement layer if only the lower layers were + encoded earlier. + + @param "aLayer" "Layer number." + @param "aPeriod" "Layer promotion point period. A value of one signals that each picture should be a + layer promotion point, value two that there is one picture between each promotion + point etc." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetLayerPromotionPointPeriod(TUint aLayer, TUint aPeriod); + + /** + Returns coding-standard specific settings output from the encoder. The information can contain, for + example, some bitstream headers that can change based on settings modified while encoding is in progress. + + @return "Coding-standard specific output. The data format is coding-standard specific and defined + separately. The buffer is pushed to the cleanup stack, and the caller is responsible for + deallocating it." + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C HBufC8* CodingStandardSpecificSettingsOutputLC(); + + /** + Returns implementation-specific settings output from the encoder. The information can contain, for + example, some bitstream headers that can change based on settings modified while encoding is in progress. + + @return "Implementation-specific initialization output. The data format is implementation-specific and + defined separately by the encoder supplier. The buffer is pushed to the cleanup stack, and the + caller is responsible for deallocating it." + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C HBufC8* ImplementationSpecificSettingsOutputLC(); + + /** + Writes an uncompressed input picture. The picture must remain valid and unmodified until it is returned + with the MdvroReturnPicture() callback. This method must not be called if direct capture is used. + + @param "aPicture" "The picture to write." + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void WritePictureL(TVideoPicture* aPicture); + + /** + Requests the encoder to sends supplemental information in the bitstream. The information data format is + coding-standard dependent. Only one supplemental information send request can be active at a time. + This variant encodes the information to the next possible picture. + + @param "aData" "Supplemental information data to send. The buffer can be reused immediately after the + method returns." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - Supplemental information is not supported" + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SendSupplementalInfoL(const TDesC8& aData); + + /** + Requests the encoder to send supplemental information in the bitstream. The information data format is + coding-standard dependent. Only one supplemental information send request can be active at a time. This + variant encodes the information to the picture whose presentation timestamp is equal to or greater than + and closest to the value of aTimestamp. + + @param "aData" "Supplemental information data to send. The buffer can be reused immediately + after the method returns." + @param "aTimestamp" "Timestamp for the picture in which the supplemental information should be + included. If the timestamp is in the past, the supplemental information will + not be sent." + @leave "The method will leave if an error occurs. Typical error codes used: + - KErrNotSupported - Supplemental information is not supported" + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SendSupplementalInfoL(const TDesC8& aData, const TTimeIntervalMicroSeconds& aTimestamp); + + /** + Cancels the current supplemental information send request. The memory buffer reserved for supplemental + information data can be reused or deallocated after the method returns. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void CancelSupplementalInfo(); + + /** + Notifies the system that the end of input data has been reached. No more input data can be written + through the API. The encoder and pre-processor can use this signal to ensure that the remaining data + gets processed, without waiting for new data. After the remaining data has been processed, the client + gets notified by the MdvroStreamEnd() callback. + + This method is mainly useful for file-to-file conversions and other non-realtime processing. For + real-time recording all pictures are processed or discarded according to their timestamps. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void InputEnd(); + + /** + Starts recording video. This includes capturing pictures from the camera (if direct capture is used), + pre-processing and encoding. Recording will proceed until it is stopped or paused. Initally recording + is stopped. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void Start(); + + /** + Stops recording video. No new pictures will be captured, pre-processed, or encoded. If input pictures + are written while recording is stopped, they will be returned immediately. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void Stop(); + + /** + Pauses video recording. Recording can be resumed using Resume(). + + While video is paused, new pictures are not captured, and input pictures written using WritePictureL() + are discarded. Timestamps are not incremented - the encoder assumes that the clock source is paused as + well, and input picture timestamps are adjusted accordingly. Pause is typically used in video recording + applications to pause recording, conversational applications should use Freeze() instead. + + Note: The client has to ensure that the clock source is paused properly. If the paused picture should + be shown longer than normal, the client should either adjust input picture timestamps, or start + recording (when using direct capture) some time after restarting the clock source. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void Pause(); + + /** + Resumes video recording after a pause. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void Resume(); + + /** + Freezes the input picture. Freezing is similar to a pause, except that timestamps are incremented + normally during a freeze. Normal encoding can be continued using ReleaseFreeze(). + + Freeze is typically used in video telephony applications to stop sending new pictures. In that situation + the audio encoding can still continue normally, and thus the clock source timestamps are incremented + normally. When the freeze is released, the encoder assumes that input picture timestamps have been + incremented normally. If direct capture is used, the picture timestamps are updated as if encoding had + been going on throughout the freeze. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void Freeze(); + + /** + Releases a frozen input picture. Video capturing and encoding continues normally. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void ReleaseFreeze(); + + /** + Returns the current recording position. The position is the capture timestamp from the latest input + picture, or the capture timestamp for the latest picture captured from the camera when direct capture + is used. + + @return "The current recording position." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C TTimeIntervalMicroSeconds RecordingPosition(); + + /** + Gets the current output buffer status. The information includes the number of free output buffers and + the total size of free buffers in bytes. + + @param "aNumFreeBuffers" "Target for the number of free output buffers." + @param "aTotalFreeBytes" "Target for the total free buffer size in bytes." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void GetOutputBufferStatus(TUint& aNumFreeBuffers, TUint& aTotalFreeBytes); + + /** + Reads various counters related to processed video pictures. See the definition of TPictureCounters + for a description of the counters. The counters are reset when Initialize() or this method is called, + and thus they only include pictures processed since the last call. + + @param "aCounters" "The counter structure to fill." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void GetPictureCounters(TPictureCounters& aCounters); + + /** + Reads the frame stabilisation output picture position. This information can be used for positioning + the viewfinder. The position returned is the stabilisation result for the most recent input picture. + + @param "aHwDevice" "The hardware device to query. The value is returned from SelectEncoderL() or + SelectPreProcessorL() when the device is selected." + @param "aRect" "The position of the stabilisation output picture inside the input picture. If + frame stabilisation is not used, the rectangle is set to cover the entire input + picture." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void GetFrameStabilisationOutput(THwDeviceId aHwDevice, TRect& aRect); + + /** + Returns the number of output buffers currently containing valid output data. + + @return "The number of output buffers with valid output data." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C TUint NumDataBuffers(); + + /** + Retrieves the next output buffer, in coding order. The buffer must be returned using ReturnBuffer() when + it is no longer used. The maximum amount of buffers that the caller can keep in its use is controlled by + the iMinNumOutputBuffers and iMinTotalOutputBufferSize fields in the TEncoderBufferOptions settings. + + @return "The next output buffer, in coding order. If no new buffers are available, the return value + is NULL." + @leave "The method will leave if an error occurs." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C TVideoOutputBuffer* NextBufferL(); + + /** + Returns a used output buffer back to the encoder. The buffer can no longer be used by the client. + + @param "aBuffer" "The buffer to return." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void ReturnBuffer(TVideoOutputBuffer* aBuffer); + + /** + Indicates a picture loss to the encoder, without specifying the lost picture. The encoder can react to + this by transmitting an intra-picture. + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void PictureLoss(); + + /** + Indicates to the encoder the pictures that have been lost. The encoder can react to this by + transmitting an intra-picture. + + @param "aPictures" "Picture identifiers for the lost pictures. See [6] for a definition of TPictureId." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void PictureLoss(const TArray<TPictureId>& aPictures); + + /** + Indicates a loss of consecutive macroblocks in raster scan order to the encoder. + + @param "aFirstMacroblock" "The first lost macroblock. The macroblocks are numbered such + that the macroblock in the upper left corner of the picture is considered + macroblock number 1 and the number for each macroblock increases from left + to right and then from top to bottom in raster-scan order." + @param "aNumMacroblocks" "The number of lost macroblocks that are consecutive in raster scan order." + @param "aPicture" "The picture number for the picture where the macroblocks were lost. + If the picture is not known, aPicture.iIdType is set to ENone." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SliceLoss(TUint aFirstMacroblock, TUint aNumMacroblocks, const TPictureId& aPicture); + + /** + Sends a reference picture selection request to the encoder. The request is delivered as a coding-standard + specific binary message. Reference picture selection can be used to select a previous correctly + transmitted picture to use as a reference in case later pictures have been lost. + + @param "aSelectionData" "The reference picture selection request message. The message format is + coding-standard specific, and defined separately." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void ReferencePictureSelection(const TDesC8& aSelectionData); + + /** + Retrieves the number of complexity control levels available for a hardware device. Devices can support + processing the same input data with different computational complexity levels. The complexity level + can affect, for example, the motion vector search range used in an encoder. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() or + SelectPreProcessorL() when the device is selected." + @return "The number of complexity control levels available, one if multiple levels are not supported." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C TUint NumComplexityLevels(THwDeviceId aHwDevice); + + /** + Sets the complexity level to use for video processing in a hardware device. The level can be changed at + any time. + + @param "aHwDevice" "The hardware device to configure. The value is returned from SelectEncoderL() or + SelectPreProcessorL() when the device is selected." + @param "aLevel" "The computational complexity level to use. Level zero (0) is the most complex one, + with the highest quality. Higher level numbers require less processing and may have + lower quality." + @pre "This method can only be called after the API has been initialized with Initialize()." + */ + IMPORT_C void SetComplexityLevel(THwDeviceId aHwDevice, TUint aLevel); + + /** + Retrieves a custom interface to the specified hardware device. + @param "aHwDevice" "The hardware device from which the custom interface shall be requested. + The value is returned from SelectDecoderL() or SelectPostProcessorL() when + the device is selected." + @param "aInterface" "Interface UID, defined with the custom interface." + @return "Pointer to the interface implementation, or NULL if the device does not + implement the interface requested. The return value must be cast to the + correct type by the user." + */ + IMPORT_C TAny* CustomInterface(THwDeviceId aHwDevice, TUid aInterface); + +private: + enum TInitializationState + { + ENotInitialized = 0x01, + EInitializing = 0x02, + EInitialized = 0x04, + EInitializationFailed = 0x08 + }; + +private: + CMMFDevVideoRecord(MMMFDevVideoRecordObserver& aObserver); + + // Methods to check aHwDevice is valid and return the appropriate HwDevice + CMMFVideoRecordHwDevice& VideoRecordHwDevice(THwDeviceId aHwDevice) const; + CMMFVideoRecordHwDevice& CapturingHwDevice() const; //returns the first plugin in the chain + CMMFVideoEncodeHwDevice& VideoEncodeHwDevice(THwDeviceId aHwDevice) const;// Checks that aHwDevice is valid + CMMFVideoPreProcHwDevice& VideoPreProcHwDevice(THwDeviceId aHwDevice) const;// Checks that aHwDevice is valid + CMMFVideoEncodeHwDevice& VideoEncodeHwDevice() const; + CMMFVideoPreProcHwDevice& VideoPreProcHwDevice() const; + CMMFVideoHwDevice& VideoHwDevice(THwDeviceId aHwDevice) const; + + // Connects the plugins together + void ConnectPlugins(); + + // Check that we are in a valid initialization state + // Panics if iInitializationState is not one of aExpected + void CheckInitializationState(TUint aExpected); + + // Methods to handle init complete callbacks from the hw devices + void HandlePreProcInitializeComplete(TInt aError); + void HandleEncoderInitializeComplete(TInt aError); + + CMMFVideoEncodeHwDevice* CreateEncoderL(TUid aVideoEncoder); + + // from MMMFDevVideoRecordProxy + virtual void MdvrpNewBuffer(TVideoOutputBuffer* aBuffer); + virtual void MdvrpReturnPicture(TVideoPicture* aPicture); + virtual void MdvrpSupplementalInfoSent(); + virtual void MdvrpFatalError(CMMFVideoHwDevice* aDevice, TInt aError); + virtual void MdvrpInitializeComplete(CMMFVideoHwDevice* aDevice, TInt aError); + virtual void MdvrpStreamEnd(); + +private: + MMMFDevVideoRecordObserver& iObserver; + CMMFVideoEncodeHwDevice* iVideoEncodeHwDevice; + CMMFVideoPreProcHwDevice* iVideoPreProcHwDevice; + TUint iInitializationState; + TUint iNumberOfMdvrpStreamEndCallbacks; + + TDblQue<TVideoOutputBuffer> iVideoOutputBufferQue; + TDblQueIter<TVideoOutputBuffer> iVideoOutputBufferQueIter; + TUint iNumberOfVideoOutputBuffers; + TBool iIsPreProcComplete; + +#ifdef SYMBIAN_MULTIMEDIA_CODEC_API + TBool iPuListCreated; + RImplInfoPtrArray iPuImplementations; +#endif // SYMBIAN_MULTIMEDIA_CODEC_API + }; + + +/** +The MMMFDevVideoObserver class defines the observer mixin-interface that any client using CMMFDevVideoRecord +must implement. +@publishedAll +@released +*/ +class MMMFDevVideoRecordObserver + { +public: + /** + Returns a used input video picture back to the caller. The picture memory can be re-used or freed. + @param "aPicture" "The picture to return." + */ + virtual void MdvroReturnPicture(TVideoPicture* aPicture) = 0; + + /** + Signals that the supplemental info send request has completed. The buffer used for supplemental + information can be re-used or freed. + */ + virtual void MdvroSupplementalInfoSent() = 0; + + /** + Notifies the client that one or more new output buffers are available. The client can then use + NextBufferL() and related methods to fetch the data. + */ + virtual void MdvroNewBuffers() = 0; + + /** + Reports a fatal encoding or capturing error to the client. When these + errors occur, capturing and encoding is stopped automatically. The client + must destroy the CMMFDevVideoRecord object and create a new instance before + attempting to continue. Note that scenarios have been identified where + MdvroFatalError may get referenced at some point during the execution of a + CMMFDevVideoRecord procedure. Therefore CMMFDevVideoRecord object should be + deleted outside of MdvroFatalError context in order to avoid accidental + access to de-allocated CMMFDevVideoRecord data members. + @param "aError" "The error code." + */ + virtual void MdvroFatalError(TInt aError) = 0; + + /** + Reports that DevVideoRecord initialization has completed. The interface can now be used for video + recording. + @param "aError" "Initialization error code, KErrNone if no error occurred." + */ + virtual void MdvroInitializeComplete(TInt aError) = 0; + + /** + Reports that the input video data end has been reached and all pictures have been processed. This + method is only called after the client has called InputEnd(). No more output data will be available. + */ + virtual void MdvroStreamEnd() = 0; + }; + + +#include <mmf/devvideo/devvideorecord.inl> + +#endif