videoeditorengine/vedengine/src/vedcodecchecker.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/vedengine/src/vedcodecchecker.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,962 @@
+/*
+* Copyright (c) 2010 Ixonos Plc.
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the "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:
+* Ixonos Plc
+*
+* Description:  
+*
+*/
+
+
+// Include Files
+#include <mp4lib.h>
+#include "ctrtranscoder.h"
+#include "ctrtranscoderobserver.h"
+#include "VedVideoClip.h"
+#include "vedvideosettings.h"
+#include "vedvolreader.h"
+#include "vedcodecchecker.h"
+#include "vedavcedit.h"
+
+// Constants
+const TUint KVOLHeaderBufferSize = 256;
+const TUint KAVCDCRBufferSize = 16384;
+const TUint KSubQCIFWidth = 128;
+const TUint KQCIFWidth = 176;
+const TUint KCIFWidth = 352;
+const TUint KQVGAWidth = 320;
+const TUint KVGAWidth = 640;
+//WVGA task
+const TUint KWVGAWidth = 864;
+
+// An assertion macro wrapper to clean up the code a bit
+#define CCASSERT(x) __ASSERT_DEBUG(x, User::Panic(_L("CVedCodecChecker"), -5000))
+
+// Print macro
+#ifdef _DEBUG
+#include <e32svr.h>
+#define PRINT(x) RDebug::Print x
+#else
+#define PRINT(x)
+#endif
+
+// Near-dummy observer class for temporary transcoder instance. In practice is only used to provide input framerate
+// to the transcoder
+class CTrObs : public CBase, public MTRTranscoderObserver
+    {
+public:
+    /* Constructor & destructor */
+    
+    inline CTrObs(TReal aFrameRate) : iInputFrameRate(aFrameRate) 
+        {
+        };
+    inline ~CTrObs()
+        {
+        };
+
+    // Dummy methods from MTRTranscoderObserver, just used to complete the observer class
+    inline void MtroInitializeComplete(TInt /*aError*/)
+        {
+        };
+    inline void MtroFatalError(TInt /*aError*/)
+        {
+        };
+    inline void MtroReturnCodedBuffer(CCMRMediaBuffer* /*aBuffer*/) 
+        {
+        };
+    // method to provide clip input framerate to transcoder
+    inline void MtroSetInputFrameRate(TReal& aRate)
+        {
+        aRate = iInputFrameRate;
+        };
+    inline void MtroAsyncStopComplete()
+        {
+        };
+        
+    inline void MtroSuspend()
+        {
+        };
+        
+    inline void MtroResume()
+        {
+        };
+        
+private:// data
+
+        // clip input framerate (fps)
+        TReal iInputFrameRate;
+    
+    };
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CVedCodecChecker* CVedCodecChecker::NewL() 
+    {
+    PRINT(_L("CVedCodecChecker::NewL in"));
+    
+    CVedCodecChecker* self = NewLC();
+    CleanupStack::Pop(self);
+    
+    PRINT(_L("CVedCodecChecker::NewL out"));
+    return self;
+    }
+
+CVedCodecChecker* CVedCodecChecker::NewLC()
+    {
+    PRINT(_L("CVedCodecChecker::NewLC in"));
+    
+    CVedCodecChecker* self = new (ELeave) CVedCodecChecker();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    PRINT(_L("CVedCodecChecker::NewLC out"));
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::CVedCodecChecker
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVedCodecChecker::CVedCodecChecker() : iOutputFormatsChecked(EFalse)
+    {    
+    }
+    
+// -----------------------------------------------------------------------------
+// CSizeEstimate::~CSizeEstimate
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CVedCodecChecker::~CVedCodecChecker()
+    {
+
+    // free all memory
+    for (TInt i = 0; i < KNumCodecs; i++)
+    {
+        if (iInputCodecsAndResolutions[i] != 0)
+            delete [] iInputCodecsAndResolutions[i];                    
+        
+        iInputCodecsAndResolutions[i] = 0;
+        
+        if (iOutputCodecsAndResolutions[i] !=  0)
+            delete [] iOutputCodecsAndResolutions[i];                    
+        
+        iOutputCodecsAndResolutions[i] = 0;
+    }
+    
+        
+    }
+
+// -----------------------------------------------------------------------------
+// CSizeEstimate::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVedCodecChecker::ConstructL()
+    {
+    
+    PRINT(_L("CVedCodecChecker::ConstructL in"));
+    
+    TInt i;
+    
+    // reset pointer tables
+    for (i = 0; i < KNumCodecs; i++)
+    {
+        iInputCodecsAndResolutions[i] = 0;
+        iOutputCodecsAndResolutions[i] = 0;
+    }
+    
+    // allocate resolution tables
+    for (i = 0; i < KNumCodecs; i++)
+    {                        
+        TBool* temp =  new ( ELeave ) TBool[KNumResolutions];
+        for (TInt j = 0; j < KNumResolutions; j++)
+            temp[j] = 0;            
+        
+        iInputCodecsAndResolutions[i] = temp;        
+        
+        temp =  new ( ELeave ) TBool[KNumResolutions];
+        for (TInt j = 0; j < KNumResolutions; j++) 
+            temp[j] = 0;            
+        
+        iOutputCodecsAndResolutions[i] = temp;
+    }
+        
+    // check supported input codecs / resolutions
+    GetSupportedInputFormatsL();
+    
+    PRINT(_L("CVedCodecChecker::ConstructL out"));
+        
+    }
+
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::GetSupportedInputFormatsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void CVedCodecChecker::GetSupportedInputFormatsL()
+    {        
+
+    PRINT(_L("CVedCodecChecker::GetSupportedInputFormatsL in"));
+
+    const TSize KResolutions[KNumResolutions] = { KVedResolutionSubQCIF, 
+                                                  KVedResolutionQCIF, 
+                                                  KVedResolutionCIF, 
+                                                  KVedResolutionQVGA, 
+                                                  KVedResolutionVGA16By9,
+                                                  KVedResolutionVGA,
+                                                  //WVGA task
+                                                  KVedResolutionWVGA };
+
+    const TPtrC8 KCodecs[KNumCodecs] = { _L8("video/H263-2000; profile=0; level=10"),
+                                         _L8("video/H263-2000; profile=0; level=45"),
+                                         _L8("video/mp4v-es; profile-level-id=8"),
+                                         _L8("video/mp4v-es; profile-level-id=9"),
+                                         _L8("video/mp4v-es; profile-level-id=1"),
+                                         _L8("video/mp4v-es; profile-level-id=2"),
+                                         _L8("video/mp4v-es; profile-level-id=3"),
+                                         _L8("video/mp4v-es; profile-level-id=4"),                                         
+                                         _L8("video/H264; profile-level-id=42800A"),
+                                         _L8("video/H264; profile-level-id=42900B"),
+                                         _L8("video/H264; profile-level-id=42800B"),
+                                         _L8("video/H264; profile-level-id=42800C"), 
+                                         _L8("video/H264; profile-level-id=42800D"), 
+                                         _L8("video/H264; profile-level-id=428014"), 
+                                         //WVGA task
+                                         _L8("video/H264; profile-level-id=428015"),
+                                         _L8("video/H264; profile-level-id=428016"), 
+                                         _L8("video/H264; profile-level-id=42801E"), 
+                                         _L8("video/H264; profile-level-id=42801F")  };   
+
+    TTRVideoFormat inputFormat;
+    TTRVideoFormat outputFormat;      
+    
+    inputFormat.iDataType = CTRTranscoder::ETRDuCodedPicture;
+    outputFormat.iDataType = CTRTranscoder::ETRYuvRawData420;        
+    
+    for (TInt i = 0; i < KNumCodecs; i++)
+    {    
+    
+        PRINT((_L("GetSupportedInputFormatsL - testing codec %d"), i));
+    
+        // create temporary transcoder observer object, with input framerate as parameter, since it is asked by the transcoder
+        CTrObs* tmpObs = new (ELeave) CTrObs(15.0);
+        CleanupStack::PushL(tmpObs);
+    
+        // create temporary transcoder instance
+        CTRTranscoder* tmpTranscoder = CTRTranscoder::NewL(*tmpObs);
+        CleanupStack::PushL(tmpTranscoder);
+    
+        // check if codec supported at all    
+        if ( tmpTranscoder->SupportsInputVideoFormat(KCodecs[i]) )
+        {
+            TInt error = KErrNone;
+            // check all resolutions
+            for (TInt j = 0; j < KNumResolutions; j++)
+            {                            
+            
+                if ( (i < ECodecMPEG4VSPLevel0) && (j > EResolutionQCIF) )
+                {
+                    // Do not allow larger resolutions than QCIF for H.263
+                    CleanupStack::PopAndDestroy(tmpTranscoder);
+                    CleanupStack::PopAndDestroy(tmpObs);     
+                    PRINT((_L("GetSupportedInputFormatsL - break")));
+                    break;
+                }
+                
+                PRINT((_L("GetSupportedInputFormatsL - testing (%d, %d)"), i, j));
+
+                inputFormat.iSize = outputFormat.iSize = KResolutions[j];
+                
+                TRAP( error, tmpTranscoder->OpenL(reinterpret_cast<MCMRMediaSink*>(1),//the sink will not be used, hence this is acceptable 
+                                     CTRTranscoder::EDecoding,
+                                     KCodecs[i],
+                                     KNullDesC8,
+                                     inputFormat, 
+                                     outputFormat, 
+                                     EFalse ) );
+                                     
+                if (error == KErrNone)
+                {
+                    PRINT((_L("GetSupportedInputFormatsL - (%d, %d) supported"), i, j));
+                    iInputCodecsAndResolutions[i][j] = ETrue;
+                } 
+                else if (error == KErrNotSupported)
+                {
+                    PRINT((_L("GetSupportedInputFormatsL - (%d, %d) not supported"), i, j));
+                    iInputCodecsAndResolutions[i][j] = EFalse;                    
+                } 
+                else
+                    User::Leave(error);
+                
+                CleanupStack::PopAndDestroy(tmpTranscoder);
+                CleanupStack::PopAndDestroy(tmpObs);     
+                
+                if ( j < (KNumResolutions - 1) )
+                {                                    
+                    tmpObs = new (ELeave) CTrObs(15.0);
+                    CleanupStack::PushL(tmpObs);
+                                
+                    // create temporary transcoder instance
+                    tmpTranscoder = CTRTranscoder::NewL(*tmpObs);
+                    CleanupStack::PushL(tmpTranscoder);  
+                }
+            }
+        } 
+        else
+        {
+            // all resolutions unsupported
+            for (TInt j=0; j < KNumResolutions; j++)
+            {            
+                iInputCodecsAndResolutions[i][j] = EFalse;
+            }
+            
+            CleanupStack::PopAndDestroy(tmpTranscoder);
+            CleanupStack::PopAndDestroy(tmpObs);
+                 
+        }    
+    }   
+    
+    PRINT(_L("CVedCodecChecker::GetSupportedInputFormatsL out"));
+
+    }
+
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::GetSupportedOutputFormatsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+void CVedCodecChecker::GetSupportedOutputFormatsL()
+    {        
+    
+    PRINT(_L("CVedCodecChecker::GetSupportedOutputFormatsL in"));
+
+    const TSize KResolutions[KNumResolutions] = { KVedResolutionSubQCIF, 
+                                                  KVedResolutionQCIF, 
+                                                  KVedResolutionCIF, 
+                                                  KVedResolutionQVGA, 
+                                                  KVedResolutionVGA16By9,
+                                                  KVedResolutionVGA };
+
+    const TPtrC8 KCodecs[KNumCodecs] = { _L8("video/H263-2000; profile=0; level=10"),
+                                         _L8("video/H263-2000; profile=0; level=45"),
+                                         _L8("video/mp4v-es; profile-level-id=8"),
+                                         _L8("video/mp4v-es; profile-level-id=9"),
+                                         _L8("video/mp4v-es; profile-level-id=1"),
+                                         _L8("video/mp4v-es; profile-level-id=2"),
+                                         _L8("video/mp4v-es; profile-level-id=3"),
+                                         _L8("video/mp4v-es; profile-level-id=4"),                                          
+                                         _L8("video/H264; profile-level-id=42800A"),
+                                         _L8("video/H264; profile-level-id=42900B"),
+                                         _L8("video/H264; profile-level-id=42800B"),
+                                         _L8("video/H264; profile-level-id=42800C"), 
+
+                                         //WVGA task
+                                         //(TPtrC8&)KNullDesC8,  // level 1.3 not supported in output
+                                         //(TPtrC8&)KNullDesC8,   // level 2 not supported in output  
+                                         _L8("video/H264; profile-level-id=42800D"),
+                                         _L8("video/H264; profile-level-id=428014"),                                          
+                                         _L8("video/H264; profile-level-id=428015"),
+                                         _L8("video/H264; profile-level-id=428016"), 
+                                         _L8("video/H264; profile-level-id=42801E"), 
+                                         _L8("video/H264; profile-level-id=42801F")                                      
+                                       }; 
+                                       
+                                       
+
+    TTRVideoFormat inputFormat;
+    TTRVideoFormat outputFormat;
+    
+    inputFormat.iDataType = CTRTranscoder::ETRYuvRawData420;
+    outputFormat.iDataType = CTRTranscoder::ETRDuCodedPicture;
+    
+    for (TInt i = 0; i < KNumCodecs; i++)
+    {        
+        PRINT((_L("GetSupportedOutputFormatsL - testing codec %d"), i));
+    
+        // create temporary transcoder observer object, with input framerate as parameter, since it is asked by the transcoder
+        CTrObs* tmpObs = new (ELeave) CTrObs(15.0);
+        CleanupStack::PushL(tmpObs);
+    
+        // create temporary transcoder instance
+        CTRTranscoder* tmpTranscoder = CTRTranscoder::NewL(*tmpObs);
+        CleanupStack::PushL(tmpTranscoder);
+        
+        //WVGA task
+        // AVC levels 3.1 and higher are not supported in output
+        if (i >= ECodecAVCBPLevel3_1)
+        {
+            CleanupStack::PopAndDestroy(tmpTranscoder);
+            CleanupStack::PopAndDestroy(tmpObs);
+            PRINT((_L("GetSupportedOutputFormatsL - break AVC check")));   
+            break;
+        }
+       
+    
+        // check if codec supported at all    
+        if ( tmpTranscoder->SupportsOutputVideoFormat(KCodecs[i]) )
+        {
+            TInt error = KErrNone;
+            // check all resolutions
+            for (TInt j = 0; j < KNumResolutions; j++)
+            {
+            
+                if ( (i < ECodecMPEG4VSPLevel0) && (j > EResolutionQCIF) )
+                {
+                    // Do not allow larger resolutions than QCIF for H.263
+                    CleanupStack::PopAndDestroy(tmpTranscoder);
+                    CleanupStack::PopAndDestroy(tmpObs);     
+                    PRINT((_L("GetSupportedOutputFormatsL - break")));
+                    break;
+                }
+                
+                PRINT((_L("GetSupportedOutputFormatsL - testing (%d, %d)"), i, j));            
+
+                inputFormat.iSize = outputFormat.iSize = KResolutions[j];
+                
+                TRAP( error, tmpTranscoder->OpenL(reinterpret_cast<MCMRMediaSink*>(1),//the sink will not be used, hence this is acceptable 
+                                     CTRTranscoder::EEncoding,
+                                     KNullDesC8,
+                                     KCodecs[i],                                     
+                                     inputFormat, 
+                                     outputFormat, 
+                                     EFalse ) );
+                                     
+                if (error == KErrNone)
+                {
+                    PRINT((_L("GetSupportedOutputFormatsL - (%d, %d) supported"), i, j));
+                    iOutputCodecsAndResolutions[i][j] = ETrue;
+                } 
+                else if (error == KErrNotSupported)
+                {
+                    PRINT((_L("GetSupportedOutputFormatsL - (%d, %d) not supported"), i, j));
+                    iOutputCodecsAndResolutions[i][j] = EFalse;                    
+                } 
+                else
+                    User::Leave(error);
+                
+                CleanupStack::PopAndDestroy(tmpTranscoder);
+                CleanupStack::PopAndDestroy(tmpObs);     
+                
+                if ( j < (KNumResolutions - 1) )
+                {                                    
+                    tmpObs = new (ELeave) CTrObs(15.0);
+                    CleanupStack::PushL(tmpObs);
+                                
+                    // create temporary transcoder instance
+                    tmpTranscoder = CTRTranscoder::NewL(*tmpObs);
+                    CleanupStack::PushL(tmpTranscoder);  
+                }
+            }
+        } 
+        else
+        {
+            // all resolutions unsupported
+            for (TInt j=0; j < KNumResolutions; j++)
+            {            
+                iOutputCodecsAndResolutions[i][j] = EFalse;
+            }
+            
+            CleanupStack::PopAndDestroy(tmpTranscoder);
+            CleanupStack::PopAndDestroy(tmpObs);
+                 
+        }    
+    }   
+    
+    PRINT(_L("CVedCodecChecker::GetSupportedOutputFormatsL out"));
+
+    }
+
+
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::IsSupportedInputClip
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//    
+TBool CVedCodecChecker::IsSupportedInputClipL(CVedVideoClip* aClip)
+    {
+    
+    PRINT(_L("CVedCodecChecker::IsSupportedInputClipL in"));
+
+    if ( (aClip->Info()->VideoType() != EVedVideoTypeH263Profile0Level10) && 
+         (aClip->Info()->VideoType() != EVedVideoTypeH263Profile0Level45) && 
+         (aClip->Info()->VideoType() != EVedVideoTypeMPEG4SimpleProfile) &&
+         (aClip->Info()->VideoType() != EVedVideoTypeAVCBaselineProfile)
+        )
+    {
+        return KErrNotSupported;
+    }
+        
+    TResolution resolution = MapResolution( aClip->Info()->Resolution() );
+
+    if ( resolution == EResolutionUnsupported )
+        return EFalse;
+    
+    if ( aClip->Info()->VideoType() == EVedVideoTypeH263Profile0Level10 )
+    {
+        return iInputCodecsAndResolutions[ECodecH263BPLevel10][resolution];
+    } 
+    
+    if ( aClip->Info()->VideoType() == EVedVideoTypeH263Profile0Level45 )
+    {
+        return iInputCodecsAndResolutions[ECodecH263BPLevel45][resolution];
+    }        
+    
+#ifndef VIDEOEDITORENGINE_AVC_EDITING        
+    if ( aClip->Info()->VideoType() == EVedVideoTypeAVCBaselineProfile )
+    {
+        return EFalse;
+    }        
+#endif
+
+    // clip is MPEG-4 or AVC
+            
+    // create parser to fetch codec specific info    
+    MP4Handle mp4Handle = 0;
+    MP4Err mp4Error;
+    if (!aClip->Info()->FileHandle())
+    {        
+        TBuf<258> tempFileName(aClip->Info()->FileName());
+        tempFileName.ZeroTerminate();			
+                
+        MP4FileName name = reinterpret_cast<MP4FileName>( const_cast<TUint16*>(tempFileName.Ptr()) );
+        mp4Error = MP4ParseOpen(&mp4Handle, name);
+    } 
+    else
+    {
+        mp4Error = MP4ParseOpenFileHandle(&mp4Handle, aClip->Info()->FileHandle());
+    }
+    
+    if (mp4Error != MP4_OK)
+    {
+        if (mp4Handle)
+            MP4ParseClose(mp4Handle);
+        mp4Handle = 0;
+    
+        if (mp4Error == MP4_OUT_OF_MEMORY)
+            User::Leave(KErrNoMemory);
+        else
+            User::Leave(KErrGeneral);
+    }
+            
+    TInt bufSize = 0;
+    
+    if (aClip->Info()->VideoType() == EVedVideoTypeMPEG4SimpleProfile)
+        bufSize = KVOLHeaderBufferSize;
+    else
+        bufSize = KAVCDCRBufferSize;
+        
+    HBufC8* tmpBuffer = (HBufC8*) HBufC8::NewLC(bufSize);
+    
+    TPtr8 tmpPtr = tmpBuffer->Des();
+    mp4_u32 infoSize = 0;
+    
+    // get info
+    mp4Error = MP4ParseReadVideoDecoderSpecificInfo( mp4Handle, 
+                                                    (mp4_u8*)(tmpPtr.Ptr()),
+                                                    bufSize,
+                                                    &infoSize );
+                                                    
+    MP4ParseClose(mp4Handle);                                                    
+                                                    
+    if ( mp4Error != MP4_OK )
+    {
+        User::Leave(KErrGeneral);
+    }   
+
+    tmpPtr.SetLength(infoSize);
+    
+    TCodec codec = ECodecUnsupported;
+    
+    if (aClip->Info()->VideoType() == EVedVideoTypeMPEG4SimpleProfile)
+    {
+        // Parse profile-level-id
+        CVedVolReader* tmpVolReader = CVedVolReader::NewL();
+        CleanupStack::PushL(tmpVolReader);
+
+        tmpVolReader->ParseVolHeaderL(tmpPtr);
+
+        TInt profileLevelId = tmpVolReader->ProfileLevelId();
+        
+        codec = MapProfileLevelId(profileLevelId);
+    }     
+    
+#ifdef VIDEOEDITORENGINE_AVC_EDITING    
+    else    
+    {
+        CVedAVCEdit* tmpAvcEdit = CVedAVCEdit::NewL();
+        CleanupStack::PushL(tmpAvcEdit);
+    
+        // this leaves with KErrNotSupported if clip is not supported
+        tmpAvcEdit->SaveAVCDecoderConfigurationRecordL(tmpPtr, EFalse);
+    
+        // Parse level    
+        TInt level = 0;
+        User::LeaveIfError( tmpAvcEdit->GetLevel(tmpPtr, level) );
+        
+        codec = MapAVCLevel(level);
+    }
+#endif
+    
+    CleanupStack::PopAndDestroy(2);
+	
+    if (codec == ECodecUnsupported)
+        return EFalse;
+
+    PRINT(_L("CVedCodecChecker::IsSupportedInputClipL out"));
+
+    return iInputCodecsAndResolutions[codec][resolution];
+    
+    }
+
+
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::IsSupportedOutputFormatL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//   
+TBool CVedCodecChecker::IsSupportedOutputFormatL(const TPtrC8& aMimeType, TSize aResolution)
+    {
+    
+    PRINT(_L("CVedCodecChecker::IsSupportedOutputFormatL in"));
+    
+    if (aMimeType == KNullDesC8)
+    {
+        User::Leave(KErrArgument);
+    }
+    
+    if ( !iOutputFormatsChecked )
+    {   
+        // check supported output formats
+        GetSupportedOutputFormatsL();
+        iOutputFormatsChecked = ETrue;
+    }        
+    
+    TResolution resolution = MapResolution(aResolution);
+    
+    if (resolution == EResolutionUnsupported)
+        return EFalse;
+    
+    TCodec codec = ParseMimeType(aMimeType, aResolution);
+    
+    if (codec == ECodecUnsupported)
+        return EFalse;    
+    
+    PRINT(_L("CVedCodecChecker::IsSupportedOutputFormatL out"));
+    
+    return iOutputCodecsAndResolutions[codec][resolution];
+    
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::MapResolution
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//   
+TResolution CVedCodecChecker::MapResolution(TSize aResolution)
+    {
+
+    if ( aResolution == KVedResolutionSubQCIF )
+        return EResolutionSubQCIF;
+    
+    else if ( aResolution == KVedResolutionQCIF )
+        return EResolutionQCIF;
+    
+    else if ( aResolution == KVedResolutionCIF )
+        return EResolutionCIF;
+    
+    else if ( aResolution == KVedResolutionQVGA )
+        return EResolutionQVGA;
+    
+    else if ( aResolution == KVedResolutionVGA16By9 )
+        return EResolutionVGA16By9;
+    
+    else if ( aResolution == KVedResolutionVGA )
+        return EResolutionVGA;
+    //WVGA task       
+    else if ( aResolution == KVedResolutionWVGA )
+        return EResolutionWVGA;
+    
+    return EResolutionUnsupported;
+    }
+
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::MapProfileLevelId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//   
+TCodec CVedCodecChecker::MapProfileLevelId(TInt aProfileLevelId)
+    {
+
+    if ( aProfileLevelId == 8 )
+        return ECodecMPEG4VSPLevel0;
+    
+    if ( aProfileLevelId == 9 )
+        return ECodecMPEG4VSPLevel0B;
+    
+    if ( aProfileLevelId == 1 )
+        return ECodecMPEG4VSPLevel1;
+    
+    if ( aProfileLevelId == 2 )
+        return ECodecMPEG4VSPLevel3;
+    
+    if ( aProfileLevelId == 3 )
+        return ECodecMPEG4VSPLevel3;
+    
+    if ( aProfileLevelId == 4 )
+        return ECodecMPEG4VSPLevel4;
+    
+    return ECodecUnsupported;
+
+    }
+    
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::MapAVCLevel
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//   
+TCodec CVedCodecChecker::MapAVCLevel(TInt aLevel)
+    {
+    
+    if ( aLevel == 10 )
+        return ECodecAVCBPLevel1;
+    
+    if ( aLevel == 101 )
+        return ECodecAVCBPLevel1B;
+    
+    if ( aLevel == 11 )
+        return ECodecAVCBPLevel1_1;
+    
+    if ( aLevel == 12 )
+        return ECodecAVCBPLevel1_2;
+    
+    if ( aLevel == 13 )
+        return ECodecAVCBPLevel1_3;
+    
+    if ( aLevel == 20 )
+        return ECodecAVCBPLevel2;    
+    //WVGA task
+    if ( aLevel == 21 )
+        return ECodecAVCBPLevel2_1;
+    
+    if ( aLevel == 22 )
+        return ECodecAVCBPLevel2_2;
+    
+    if ( aLevel == 30 )
+        return ECodecAVCBPLevel3;
+    
+    if ( aLevel == 31 )
+        return ECodecAVCBPLevel3_1; 
+    
+    return ECodecUnsupported;
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// CVedCodecChecker::ParseMimeType
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//   
+TCodec CVedCodecChecker::ParseMimeType(const TPtrC8& aMimeType, TSize aResolution)
+    {
+
+    // figure out codec
+    TCodec codec;
+    
+    if ( aMimeType.MatchF( _L8("*video/H263-2000*") ) != KErrNotFound )
+    {
+        codec = ECodecH263BPLevel10;
+        
+        if ( aMimeType.MatchF( _L8("*profile*") ) != KErrNotFound )
+        {
+            // Profile info is given, check it
+            if ( aMimeType.MatchF( _L8("*profile=0*") ) == KErrNotFound )
+            {
+                return ECodecUnsupported;
+            }
+        }
+        else 
+        {
+            // no profile given
+        }
+        
+        if ( aMimeType.MatchF( _L8("*level=10*") ) != KErrNotFound )
+        {
+            codec = ECodecH263BPLevel10;            
+        }
+            
+        else if ( aMimeType.MatchF( _L8("*level=45*") ) != KErrNotFound )
+        {            
+            codec = ECodecH263BPLevel45;                		
+        }
+        
+        else if ( aMimeType.MatchF( _L8("*level*") ) != KErrNotFound )
+        {
+            // no other levels supported
+            return ECodecUnsupported;
+        }
+        else
+        {
+            // if no level is given assume 10
+        }        
+    }
+    else if ( (aMimeType.MatchF( _L8("*video/mp4v-es*") ) != KErrNotFound) || 
+              (aMimeType.MatchF( _L8("*video/MP4V-ES*") ) != KErrNotFound) )
+    {
+    
+        codec = ECodecMPEG4VSPLevel0;
+        
+        // Check profile-level
+        if ( aMimeType.MatchF( _L8("*profile-level-id=*") ) != KErrNotFound )
+        {
+            if ( aMimeType.MatchF( _L8("*profile-level-id=8*") ) != KErrNotFound )
+            {
+                codec = ECodecMPEG4VSPLevel0;
+            }
+            else if( aMimeType.MatchF( _L8("*profile-level-id=1*") ) != KErrNotFound )
+            {
+                codec = ECodecMPEG4VSPLevel1;
+            }
+            else if ( aMimeType.MatchF( _L8("*profile-level-id=2*") ) != KErrNotFound )
+            {
+                codec = ECodecMPEG4VSPLevel2;                
+            }
+            else if ( aMimeType.MatchF( _L8("*profile-level-id=3*") ) != KErrNotFound )
+            {
+                codec = ECodecMPEG4VSPLevel3;            
+            }
+            else if ( aMimeType.MatchF( _L8("*profile-level-id=9*") ) != KErrNotFound )
+            {
+                codec = ECodecMPEG4VSPLevel0B;                
+            }
+            else if ( aMimeType.MatchF( _L8("*profile-level-id=4*") ) != KErrNotFound )
+            {
+                codec = ECodecMPEG4VSPLevel4;
+            }
+            else
+            {
+                return ECodecUnsupported;                
+            }
+        
+        } 
+        else
+        {   // no profile-level id
+            switch( aResolution.iWidth )
+            {                
+                case KSubQCIFWidth:
+                case KQCIFWidth:
+                {
+                    // Set profile-level-id=0
+                    codec = ECodecMPEG4VSPLevel0;
+                    break;
+                }
+                
+                case KCIFWidth:
+                case KQVGAWidth:
+                {                
+                    // Set profile-level-id=2
+                    codec = ECodecMPEG4VSPLevel2;
+                    break;
+                }
+
+                case KVGAWidth:
+                {
+                    // Set profile-level-id=4 (4a)
+                    codec = ECodecMPEG4VSPLevel4;                    
+                    break;
+                }
+
+                default:
+                {
+                    // Set profile-level-id=0
+                    codec = ECodecMPEG4VSPLevel0;
+                }                
+            }
+            
+        }
+    } 
+    
+#ifdef VIDEOEDITORENGINE_AVC_EDITING
+    else if ( (aMimeType.MatchF( _L8("*video/h264*") ) != KErrNotFound) || 
+              (aMimeType.MatchF( _L8("*video/H264*") ) != KErrNotFound) )
+    
+    {
+        codec = ECodecAVCBPLevel1;
+        
+        if ( aMimeType.MatchF( _L8("*profile-level-id=42800A*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel1;
+        }
+        else if( aMimeType.MatchF( _L8("*profile-level-id=42900B*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel1B;
+        }
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=42800B*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel1_1;                
+        }
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=42800C*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel1_2;
+        }    
+        //WVGA task
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=42800D*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel1_3;
+        } 
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=428014*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel2;
+        } 
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=428015*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel2_1;
+        } 
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=428016*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel2_2;
+        } 
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=42801E*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel3;
+        } 
+        else if ( aMimeType.MatchF( _L8("*profile-level-id=42801F*") ) != KErrNotFound )
+        {
+            codec = ECodecAVCBPLevel3_1;
+        } 
+        else
+        {
+            return ECodecUnsupported;                
+        }        
+    }
+#endif
+
+    else 
+    {
+        return ECodecUnsupported;
+    }
+    
+    return codec;
+
+}
+            
+            
+// End of file
+