diff -r 000000000000 -r 4e1aa6a622a0 accessoryservices/pluggeddisplay/edidparser/inc/cea861edidparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/accessoryservices/pluggeddisplay/edidparser/inc/cea861edidparser.h Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,562 @@ +/* +* Copyright (c) 2008,2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Declaration of CCea861EdidParser class. +* +*/ + +#ifndef C_CCEA861EDIDPARSER_H +#define C_CCEA861EDIDPARSER_H + +#include + +#include "ediddatatypes.h" +#include "cea861ediddatatypes.h" + + +/** + * CCea861EdidParser is the base class for parsing CEA 861 EDID extension data + * + * @lib edidparser.dll + * @since S60 v9.2 + */ +class CCea861EdidParser : public CBase + { + +public: + + /** + * Two-phased constructor. + * + * Creates an instance of CCea861EdidParser + * + * @param aData + * @return CCea861EdidParser* created instance of CCea861EdidParser + * + */ + IMPORT_C static CCea861EdidParser* NewL( const TExtDataBlock& aData ); + + /** + * Two-phased constructor. + * + * Creates an instance of CEdidParserBase + * + * @param aData + * @return CCea861EdidParser* created instance of CCea861EdidParser + * + */ + IMPORT_C static CCea861EdidParser* NewLC( const TExtDataBlock& aData ); + + /** + * Destructor. + */ + virtual ~CCea861EdidParser(); + + /** + * Parses extension block + * + * @param aData Extension data block. + * @return TInt + */ + IMPORT_C TInt ParseExtensionBlockL( const TExtDataBlock& aData ); + + /** + * Indicates whether or not extension data is parsed + * + * @param none + * @return TBool + */ + IMPORT_C TBool IsExtensionBlockParsed(); + + /** + * Gets VIC (Video Identification Code) from given video data block + * + * @param aNumber + * @return VIC. Returns -1 if aNumber > number of VICs + */ + IMPORT_C TInt8 GetVIC( TUint8 aNumber ); + + /** + * Indicates whether or not underscan is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool Underscan(); + + /** + * Indicates whether or not basic audio is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool BasicAudio(); + + /** + * Indicates whether or not YCbCr 4:4:4 color space is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool YCbCr444(); + + /** + * Indicates whether or not YCbCr 4:2:2 color space is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool YCbCr422(); + + /** + * Returns number of native formats. + * Section 2.2 in CEA-861-E.pdf describes native format as below: + * "A video format with native pixel layout and scanning method that the display device + * accepts and displays without any internal scaling, de-interlacing, interlacing or frame + * rate conversion" + * + * @param none + * @return number of native formats + */ + IMPORT_C TUint8 TotalNumberOfNativeFormats(); + + /** + * Indicates whether or not Audio Data Block is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool IsAudioDataBlockSupported(); + + /** + * Indicates whether or not Video Data Block is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool IsVideoDataBlockSupported(); + + /** + * Indicates whether or not Vendor Specific Data Block is supported + * + * @param none + * @return true/false + */ + IMPORT_C TBool IsVendorSpecificDataBlockSupported(); + + /** + * Indicates whether or not Speaker Allocation Data Block is supported + * + * + * @param none + * @return true/false + */ + IMPORT_C TBool IsSpeakerAllocationDataBlockSupported(); + + /** + * Returns parsed information. + * Ownership of the pointer is not transfered. + * + * @param none + * @return CCea861ExtEdidInformation* + */ + IMPORT_C CCea861ExtEdidInformation* GetParsedInformation(); + + /** + * Returns video latency from Vendor specific data block. + * Value is number of (milliseconds / 2) + 1 with a maximum allowed value of 251 (indicating + * 500 millisecond duration). A value of 0 indicates that the field is not valid + * or that the latency is unknown. A value of 255 indicates that no video is + * supported in this device or downstream. + * + * @param aVendorDataBlock + * @return video latency in ms + */ + IMPORT_C TUint8 GetVideoLatency(); + + /** + * Returns audio latency from Vendor specific data block. + * Value is number of (milliseconds / 2) + 1 with a maximum allowed value of 251 (indicating + * 500 millisecond duration). A value of 0 indicates that the field is not valid + * or that the latency is unknown. A value of 255 indicates that no audio is + * supported in this device or downstream. + * + * @param none + * @return audio latency in ms + */ + IMPORT_C TUint8 GetAudioLatency(); + + /** + * Returns interlaced video latency from Vendor specific data block. + * Value is number of (milliseconds / 2) + 1 with a maximum allowed value of 251 (indicating + * 500 millisecond duration). A value of 0 indicates that the field is not valid + * or that the latency is unknown. A value of 255 indicates that no video is + * supported in this device or downstream. + * + * @param aVendorDataBlock + * @return video latency in ms + */ + IMPORT_C TUint8 GetInterlacedVideoLatency(); + + /** + * Returns interlaced audio latency from Vendor specific data block. + * Value is number of (milliseconds / 2) + 1 with a maximum allowed value of 251 (indicating + * 500 millisecond duration). A value of 0 indicates that the field is not valid + * or that the latency is unknown. A value of 255 indicates that no audio is + * supported in this device or downstream. + * + * @param none + * @return audio latency in ms + */ + IMPORT_C TUint8 GetInterlacedAudioLatency(); + +private: + + /** + * Default constructor. + */ + CCea861EdidParser(); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( const TExtDataBlock& aData ); + + /** + * Reads CEA 861 extension v1 + * See table 36 in CEA-861-E.pdf + * + * @param aData + * @return TBool + */ + TInt ReadCeaVersion1L( const TExtDataBlock& aData, TInt aIndex ); + + /** + * Reads CEA 861 extension v2 + * See table 37 in CEA-861-E.pdf + * + * @param aData + * @return TBool + */ + TInt ReadCeaVersion2L( const TExtDataBlock& aData, TInt aIndex ); + + /** + * Reads CEA 861 extension v2 + * See table 38 in CEA-861-E.pdf + * + * @param aData + * @return TBool + */ + TInt ReadCeaVersion3L( const TExtDataBlock& aData, TInt aIndex ); + + /** + * Reads common parts of CEA 861 extension v2 and v3 + * See table 38 in CEA-861-E.pdf + * + * @param aData + * @return TBool + */ + TInt ReadCeaVersion2and3Common( const TExtDataBlock& aData, TInt& aIndex ); + + /** + * Gets EDID descriptor block + * + * @param aData + * @param aIndex + * @return TEdidDescriptorBlock + */ + TEdidDescriptorBlock GetDescriptorBlock( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets pixel clock from descriptor block + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetPixelClock( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Horizontal Addressable Video in pixels + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetHorizontalAddressableVideoPixels( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Horizontal Blanking in pixels + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetHorizontalBlanking( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Vertical Addressable Video in lines + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetVerticalAddressableVideoPixels( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Vertical Blanking in lines + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetVerticalBlanking( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Horizontal Front Porch in pixels + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetHorizontalFrontPorch( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Horizontal Sync Pulse Width in lines + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetHorizontalSyncPulseWidth( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Vertical Front Porch in lines + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetVerticalFrontPorch( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Vertical Sync Pulse Width in lines + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint8 GetVerticalSyncPulseWidth( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Horizontal Addressable Video Image Size in mm + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetHorizontalAddressableImageSizeInMm( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Vertical Addressable Video Image Size in mm + * + * @param aData + * @param aIndex + * @return TUint16 + */ + TUint16 GetVerticalAddressableImageSizeInMm( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Right Horizontal Border or Left Horizontal Border in Pixels + * + * @param aData + * @param aIndex + * @return TUint8 + */ + TUint8 GetHorizontalBorderSize( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets Top Vertical Border or Bottom Vertical Border in Lines + * + * @param aData + * @param aIndex + * @return TUint8 + */ + TUint8 GetVerticalBorderSize(const TExtDataBlock& aData, TInt& aIndex) const; + + /** + * Checks whether or not video is interlaced + * + * @param aData + * @param aIndex + * @return TBool + */ + TBool GetVideoIsInterlaced( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets stero support + * + * @param aData + * @param aIndex + * @return TEdidStereoViewingSupport + */ + TEdidStereoViewingSupport GetStereoViewingSupport( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets signal definitions + * + * @param aData + * @param aIndex + * @return TEdidSyncSignalDefinitions + */ + TEdidSyncSignalDefinitions GetSyncSignalDefinitions( const TExtDataBlock& aData, TInt& aIndex ) const; + + /** + * Gets analog sync signal definitions + * + * @param aByte17 + * @return TEdidSyncSignalDefinitions + */ + static TEdidSyncSignalDefinitions GetAnalogSyncSignalDefinitions( const TUint8 aByte17 ); + + /** + * Gets digital sync signal definitions + * + * @param aByte17 + * @return TEdidSyncSignalDefinitions + */ + static TEdidSyncSignalDefinitions GetDigitalSyncSignalDefinitions( const TUint8 aByte17 ); + + + /** + * CEA data block + **/ + + /** + * Reads CEA data block collection + * + * @param aData + * @param aIndex + * @return TInt + */ + TInt ReadCeaDataBlockCollectionL( const TExtDataBlock& aData, TInt& aIndex ); + + /** + * Reads CEA 861 short audio data block + * + * @param aData + * @param aIndex + * @param aLen + * @return none + */ + void ReadCea861ShortAudioDataBlockL( const TExtDataBlock& aData, TInt& aIndex, const TInt8 aLen ); + + /** + * Reads CEA 861 short video data block + * + * @param aData + * @param aIndex + * @param aLen + * + * @return none + */ + void ReadCea861ShortVideoDataBlockL( const TExtDataBlock& aData, TInt& aIndex, const TInt8 aLen ); + + /** + * Reads CEA 861 vendor data block + * + * @param aData + * @param aIndex + * @param aLen + * @return none + */ + void ReadCea861VendorSpecificDataBlockL( const TExtDataBlock& aData, TInt& aIndex, TInt8 aLen ); + + /** + * Reads CEA 861 speaker allocation data block + * + * @param aData + * @param aIndex + * @param aLen + * @return none + */ + void ReadCea861SpeakerAllocationDataBlock( const TExtDataBlock& aData, TInt& aIndex, const TInt8 aLen ); + + + /** + * Reads video capability block + * + * @param aData + * @param aIndex + * @param aLen + * @return none + */ + void ReadVideoCapabilityDataBlockL( const TExtDataBlock& aData, TInt& aIndex, const TInt8 aLen ); + + /** + * Reads unknwown data block to skip it + * + * @param aData + * @param aIndex + * @param aLen + * @return none + */ + void ReadUnknownTagCode( const TExtDataBlock& aData, TInt& aIndex, const TInt8 aLen ); + + /** + * Determines audio block information + * + * @param aAudioBlock + * @return none + */ + void CCea861EdidParser::DetermineAudioBlockInformation( TCEA861AudioDataBlock* aAudioBlock ); + + /** + * Check if Latency_Fields_Preset bit is set as specified in HDMISpecification13a.pdf. + * + * @param aByte Byte to check. + * @return ETrue if Latency_Fields_Present bit is set. + */ + TBool LatencyFieldsPresent( TUint8 aByte ) const; + + /** + * Check if I_Latency_Fields_Preset bit is set as specified in HDMISpecification13a.pdf. + * + * @param aByte Byte to check. + * @return ETrue if I_Latency_Fields_Present bit is set. + */ + TBool InterlacedLatencyFieldsPresent( TUint8 aByte ) const; + + /** + * Calculate the video/audio latency in mm seconds. + * + * @param aByte Byte containing the latency information. + * @return Latency information in ms. + */ + TUint8 LatencyInMs( TUint8 aByte ) const; + +private: // data + + TBool iParsed; // Indicates whether or not extension block is parsed + TExtDataBlock iExtensionData; // Extension data + CCea861ExtEdidInformation* iParsedInfo; // Contains Parsed information + TBool iAudioDataBlockSupported; + TBool iVideoDataBlockSupported; + TBool iVendorSpecificDataBlockSupported; + TBool iSpeakerAllocationDataBlockSupported; + + }; + + +#endif // C_CCEA861EDIDPARSER_H