[prev in list] [next in list] [prev in thread] [next in thread]
List: helix-datatype-cvs
Subject: [Datatype-cvs] mdf/video/renderer mdfpluginarchive.cpp, 1.1.2.4,
From: jwei () helixcommunity ! org
Date: 2007-06-28 21:55:23
Message-ID: 200706282155.l5SLtiON026694 () mailer ! progressive-comp ! com
[Download RAW message or body]
Update of /cvsroot/datatype/mdf/video/renderer
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv23873/video/renderer
Modified Files:
Tag: hxclient_2_1_0_cayennes
mdfpluginarchive.cpp mdfpluginmanager.cpp mdfpluginpackage.cpp
mdfvideoadapter.cpp
Log Message:
Nokia submits this code under the terms of a commercial contribution agreement with \
RealNetworks, and I am authorized to contribute this code under said agreement."
Modified by: john.wei@nokia.com
Reviewed by:
Date: 18-June-2007
Project: SymbianMmf_Rel
TSW: TBD
Synopsis: MDF Video Renderer - fix decoder and postprocessor mismatch
In the file \datatype\mdf\video\format\common\mdfpayloadformat.cpp,
Before 4/7/07, following method was declared as
==================================================
XBOOL CMdfPluginManager::IsDecoderSupportMimeTypeL( const CVideoDecoderInfo* \
pDecoderInfo, const TDesC8& aMimeType, const CCompressedVideoFormat*& \
pCCompressedVideoFormat ) const ==================================================
After 4/7/07, it is modified as following to accommodate WM:
==================================================
HXBOOL CMdfPluginManager::IsDecoderSupportMimeTypeL( const CVideoDecoderInfo* \
pDecoderInfo, const CPayloadFormatInfo* aPayloadInfo , const CCompressedVideoFormat*& \
pCCompressedVideoFormat ) const ==================================================
This method is used in the way as follows:
==================================================
for( TInt m = 0; m < payloadformatCount; m++ )
{
if( payloadformatinfo->SupportMimeType( aMimeType ) )
{
for( TInt j = 0; j < decoderCount; j++ )
{
if( IsDecoderSupportMimeTypeL( decoderInfo, *convertedMimeType, format ) ) //before \
4/7/07
if( IsDecoderSupportMimeTypeL( decoderInfo, payloadformatinfo, format ) ) //after \
4/7/07
{
==================================================
IsDecoderSupportMimeTypeL() is meant to check if decoder supports a particular \
mimetype. However modified version is made to check if decoder and payloadformat have \
common mimetype, instead of this particular mimetype. This causes decoders could be \
paired wrongly with postprocessors, which resulting in video not played at all for \
affected mimetypes.
This CR proposes to fix the bug stated above.
Files Modified:
/cvsroot/datatype/mdf/video/format/common/mdfpayloadformat.cpp
/cvsroot/datatype/mdf/video/format/common/pub/mdfpayloadformat.h
/cvsroot/datatype/mdf/video/format/h263/mdfh263payloadformat.cpp
/cvsroot/datatype/mdf/video/format/h264/mdfh264payloadformat.cpp
/cvsroot/datatype/mdf/video/format/mp4/mdfmp4payloadformat.cpp
/cvsroot/datatype/mdf/video/format/rm/mdfrvxpayloadformat.cpp
/cvsroot/datatype/mdf/video/format/wmv/mdfwmvpayloadformat.cpp
/cvsroot/datatype/mdf/video/renderer/mdfpluginmanager.cpp
/cvsroot/datatype/mdf/video/renderer/pub/mdfpluginmanager.h
/cvsroot/datatype/mdf/video/renderer/mdfpluginarchive.cpp
/cvsroot/datatype/mdf/video/renderer/pub/mdfpluginpackage.h
/cvsroot/datatype/mdf/video/renderer/mdfpluginpackage.cpp
/cvsroot/datatype/mdf/video/renderer/mdfvideoadapter.cpp
======================================================
Image Size and Heap Use impact: minor
Module Release testing (STIF) : Passed
Test case(s) Added : None
Memory leak check performed : Yes. No new leaks introduced.
Platforms and Profiles Build Verified: helix-client-s60-32-mmf-mdf-arm
Platforms and Profiles Functionality verified: armv5, winscw
Branch: Head & 210CayS
Index: mdfpluginmanager.cpp
===================================================================
RCS file: /cvsroot/datatype/mdf/video/renderer/mdfpluginmanager.cpp,v
retrieving revision 1.2.2.11
retrieving revision 1.2.2.12
diff -u -d -r1.2.2.11 -r1.2.2.12
--- mdfpluginmanager.cpp 7 Apr 2007 22:08:29 -0000 1.2.2.11
+++ mdfpluginmanager.cpp 28 Jun 2007 21:55:21 -0000 1.2.2.12
@@ -282,8 +282,7 @@
CPluginPackage* newPackage = CPluginPackage::NewL( aMimeType );
m_PluginPackageArray.Append( newPackage ); //transfer the ownership
m_bPluginArchiveMatchPackageArray = EFalse;
-
-
+
TInt decoderCount = m_HwDecoderArray.Count();
TInt postprocessorCount = m_HwPostProcessorArray.Count();
TInt payloadformatCount = m_PayloadFormatArray.Count();
@@ -297,14 +296,17 @@
if( payloadformatinfo->SupportMimeType( aMimeType ) )
{
MDFVIDEOLOG_INOUTFN( "Selected payload do support mimetype" );
+ const TDesC8& mimetypekey = payloadformatinfo->GetMimeTypeKey( \
aMimeType );
TVideoDataUnitType unitType = \
payloadformatinfo->GetVideoDataUnitType();
TVideoDataUnitEncapsulation unitEncapsulation = \
payloadformatinfo->GetVideoDataUnitEncapsulation(); TUid plId = \
payloadformatinfo->Uid();
-
+
+ newPackage->SetMimeTypeKeyL( mimetypekey );
newPackage->SetVideoDataUnitType( unitType );
newPackage->SetVideoDataUnitEncapsulation( unitEncapsulation );
newPackage->SetPayloadFormatId( plId );
-
+
+
MDFVIDEOLOG_INOUTFN( "Payload matches, check for decoder ..." );
for( TInt j = 0; j < decoderCount; j++ )
{
@@ -313,7 +315,7 @@
const CCompressedVideoFormat* format = NULL;
- if( IsDecoderSupportMimeTypeL( decoderInfo, payloadformatinfo, \
format ) ) + if( IsDecoderSupportMimeTypeL( decoderInfo, \
mimetypekey, format ) ) {
MDFVIDEOLOG_INOUTFN( "Selected decoder do support mimetype" \
); TUid decoderUid = decoderInfo->Uid();
@@ -381,12 +383,13 @@
MDFVIDEOLOG_INOUTFN( "dev->SetInputFormatL leaves" );
}
CleanupStack::PopAndDestroy(dev);
- } //if( IsDecoderSupportMimeTypeL( decoderInfo, \
*convertedMimeType, format ) ) + } //if( \
IsDecoderSupportMimeTypeL( decoderInfo, mimetypekey, format ) ) else
{
MDFVIDEOLOG_INOUTFN( "Decoder do NOT support mimetype" );
}
} //for( TInt j = 0; j < decoderCount; j++ )
+
} //if( payloadformatinfo->SupportMimeType( aMimeType ) )
else
{
@@ -527,53 +530,6 @@
return pMimeType;
}
-HBufC8* CMdfPluginManager::ConvertToStandardMimeTypeL( const TDesC8& aMimeType ) \
const
-{
- MDFVIDEOLOG_ENTERFN( "ConvertToStandardMimeTypeL" );
-
- _LIT8( KH263, "h263" );
- _LIT8( KMP4, "mp4" );
- _LIT8( KRVX, "real" );
- _LIT8( KH264, "h264" );
- _LIT8( KAVC, "avc" );
-
- HBufC8* convertedMimeType = NULL;
- HBufC8* inMimeType = aMimeType.AllocLC();
-
- TPtr8 tptr8 = inMimeType->Des();
- tptr8.LowerCase();
-
- if( tptr8.Find( KH263 ) != KErrNotFound )
- {
- convertedMimeType = KH263().AllocL();
- }
- else if( tptr8.Find( KMP4 ) != KErrNotFound )
- {
- convertedMimeType = KMP4().AllocL();
- }
- else if( tptr8.Find( KH264 ) != KErrNotFound )
- {
- convertedMimeType = KH264().AllocL();
- }
- else if( tptr8.Find( KAVC ) != KErrNotFound )
- {
- convertedMimeType = KH264().AllocL();
- }
- else if( tptr8.Find( KRVX ) != KErrNotFound )
- {
- convertedMimeType = KRVX().AllocL();
- }
- else
- {
- convertedMimeType = aMimeType.AllocL();
- }
-
- CleanupStack::PopAndDestroy( inMimeType );
-
- MDFVIDEOLOG_LEAVEFN( "ConvertToStandardMimeTypeL" );
- return convertedMimeType;
-}
-
HX_RESULT CMdfPluginManager::SelectPackageByCodecRule( const TDesC8& aMimeType, TUid \
decUidNeeded,
TUid ppUidNeeded, \
CPluginPackage& pluginPackage ) const {
@@ -633,14 +589,12 @@
MDFVIDEOLOG_LEAVEFN( "RemoveRule" );
}
-HXBOOL CMdfPluginManager::IsDecoderSupportMimeTypeL( const CVideoDecoderInfo* \
pDecoderInfo, const CPayloadFormatInfo* aPayloadInfo , const CCompressedVideoFormat*& \
pCCompressedVideoFormat ) const +HXBOOL CMdfPluginManager::IsDecoderSupportMimeTypeL( \
const CVideoDecoderInfo* pDecoderInfo, const TDesC8& aMimeType, const \
CCompressedVideoFormat*& pCCompressedVideoFormat ) const {
MDFVIDEOLOG_ENTERFN( "IsDecoderSupportMimeTypeL" );
const RPointerArray<CCompressedVideoFormat>& supportedFormats = \
pDecoderInfo->SupportedFormats();
- TArray<HBufC8*> mimeKeywordArray = aPayloadInfo->GetSupportedMimetypeKeywords();
- UINT keywordCount = mimeKeywordArray.Count();
HXBOOL found( FALSE );
UINT count = supportedFormats.Count();
pCCompressedVideoFormat = NULL;
@@ -653,16 +607,12 @@
TPtr8 tptr8 = mimetype->Des();
tptr8.LowerCase();
- for (UINT j=0; j < keywordCount; j++)
+ if (tptr8.Find( aMimeType ) != KErrNotFound )
{
- const TDesC8& mimeKey = *(mimeKeywordArray[j]);
- if (tptr8.Find( mimeKey ) != KErrNotFound )
- {
- pCCompressedVideoFormat = format;
- found = TRUE;
- break;
- }
+ pCCompressedVideoFormat = format;
+ found = TRUE;
}
+
CleanupStack::PopAndDestroy( mimetype );
}
MDFVIDEOLOG_RETURNFN( "IsDecoderSupportMimeTypeL", found );
Index: mdfpluginpackage.cpp
===================================================================
RCS file: /cvsroot/datatype/mdf/video/renderer/mdfpluginpackage.cpp,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -u -d -r1.1.2.4 -r1.1.2.5
--- mdfpluginpackage.cpp 27 Mar 2007 16:00:48 -0000 1.1.2.4
+++ mdfpluginpackage.cpp 28 Jun 2007 21:55:21 -0000 1.1.2.5
@@ -84,6 +84,7 @@
{
delete m_pMimeTypeHelix;
delete m_pMimeTypeVidHw;
+ delete m_pMimeTypeKey;
#ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT
m_lSupportedScreens.Close();
m_lScreenIndex = -1;
@@ -101,6 +102,11 @@
return *m_pMimeTypeVidHw;
}
+const TDesC8& CPluginPackage::GetMimeTypeKey() const
+{
+ return *m_pMimeTypeKey;
+}
+
TUid CPluginPackage::GetHwDecoderId() const
{
return m_HwDecoderId;
@@ -140,6 +146,13 @@
m_pMimeTypeVidHw = aMimeType.AllocL();
}
+void CPluginPackage::SetMimeTypeKeyL( const TDesC8& aMimeType )
+{
+ delete m_pMimeTypeKey;
+ m_pMimeTypeKey = NULL;
+ m_pMimeTypeKey = aMimeType.AllocL();
+}
+
void CPluginPackage::SetVideoDataUnitType( TVideoDataUnitType aVideoDataUnitType )
{
m_VideoDataUnitType = aVideoDataUnitType;
@@ -216,12 +229,6 @@
{
TBool retVal = ETrue;
- if( m_pMimeTypeHelix != aPluginPackage.m_pMimeTypeHelix
- || m_pMimeTypeVidHw != aPluginPackage.m_pMimeTypeVidHw )
- {
- retVal = EFalse;
- }
-
if( retVal )
{
if( m_pMimeTypeHelix && m_pMimeTypeHelix->Compare( \
*(aPluginPackage.m_pMimeTypeHelix) ) ) @@ -238,6 +245,14 @@
}
}
+ if( retVal )
+ {
+ if( m_pMimeTypeKey && m_pMimeTypeKey->Compare( \
*(aPluginPackage.m_pMimeTypeKey) ) ) + {
+ retVal = EFalse;
+ }
+ }
+
#ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT
if( retVal )
{
@@ -294,6 +309,7 @@
{
delete m_pMimeTypeHelix;
delete m_pMimeTypeVidHw;
+ delete m_pMimeTypeKey;
m_pMimeTypeHelix = NULL;
if( aPluginPackage.m_pMimeTypeHelix )
{
@@ -304,6 +320,11 @@
{
m_pMimeTypeVidHw = (aPluginPackage.m_pMimeTypeVidHw)->Alloc();
}
+ m_pMimeTypeKey = NULL;
+ if( aPluginPackage.m_pMimeTypeKey )
+ {
+ m_pMimeTypeKey = (aPluginPackage.m_pMimeTypeKey)->Alloc();
+ }
#ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT
m_lSupportedScreens.Reset();
@@ -330,6 +351,7 @@
CPluginPackage::CPluginPackage()
: m_pMimeTypeHelix( NULL ),
m_pMimeTypeVidHw( NULL ),
+ m_pMimeTypeKey( NULL ),
m_HwDecoderId( KUidZero ),
m_HwPostProcessorId( KUidZero ),
m_PayloadFormatId( KUidZero ),
@@ -347,6 +369,7 @@
{
m_pMimeTypeHelix = aMimeType.AllocL();
m_pMimeTypeVidHw = KNullDesC8().AllocL();
+ m_pMimeTypeKey = KNullDesC8().AllocL();
}
void CPluginPackage::ConstructL( const CPluginPackage& aPluginPackage )
@@ -367,6 +390,14 @@
{
m_pMimeTypeVidHw = KNullDesC8().AllocL();
}
+ if( aPluginPackage.m_pMimeTypeKey )
+ {
+ m_pMimeTypeKey = (aPluginPackage.m_pMimeTypeKey)->AllocL();
+ }
+ else
+ {
+ m_pMimeTypeKey = KNullDesC8().AllocL();
+ }
#ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT
m_lSupportedScreens.Reset();
@@ -392,6 +423,7 @@
{
m_pMimeTypeHelix = KNullDesC8().AllocL();
m_pMimeTypeVidHw = KNullDesC8().AllocL();
+ m_pMimeTypeKey = KNullDesC8().AllocL();
}
Index: mdfpluginarchive.cpp
===================================================================
RCS file: /cvsroot/datatype/mdf/video/renderer/mdfpluginarchive.cpp,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -u -d -r1.1.2.4 -r1.1.2.5
--- mdfpluginarchive.cpp 27 Mar 2007 16:00:48 -0000 1.1.2.4
+++ mdfpluginarchive.cpp 28 Jun 2007 21:55:21 -0000 1.1.2.5
@@ -62,6 +62,7 @@
_LIT8( KMimeTypeHelix, "helix mime type" );
_LIT8( KMimeTypeVidHw, "hardware mime type" );
+_LIT8( KMimeTypeKey, "mime type key" );
_LIT8( KHwDecoderId, "decoder id" );
_LIT8( KHwPostProcessorId, "postprocessor id" );
@@ -244,6 +245,11 @@
aPackage->SetVideoHwMimeTypeL( right );
MDFVIDEOLOG_INOUTFN( "MimeTypeVidHw Read Successfully" );
}
+ else if( !left.Compare( KMimeTypeKey ) )
+ {
+ aPackage->SetMimeTypeKeyL( right );
+ MDFVIDEOLOG_INOUTFN( "MimeTypeKey Read Successfully" );
+ }
else if( !left.Compare( KHwDecoderId ) )
{
TUint id;
@@ -993,6 +999,11 @@
WriteOneLine( aPackage.GetVideoHwMimeType() );
WriteOneLine( KTxtLineDelimiter );
+ WriteOneLineWithTrailingSpace( KMimeTypeKey, KNumberOfCharPerArgument );
+ WriteOneLine( KEqualChar );
+ WriteOneLine( aPackage.GetMimeTypeKey() );
+ WriteOneLine( KTxtLineDelimiter );
+
WriteOneLineWithTrailingSpace( KHwDecoderId, KNumberOfCharPerArgument );
WriteOneLine( KEqualChar );
WriteOneLine( aPackage.GetHwDecoderId().iUid, ETrue );
Index: mdfvideoadapter.cpp
===================================================================
RCS file: /cvsroot/datatype/mdf/video/renderer/mdfvideoadapter.cpp,v
retrieving revision 1.3.2.64
retrieving revision 1.3.2.65
diff -u -d -r1.3.2.64 -r1.3.2.65
--- mdfvideoadapter.cpp 2 May 2007 16:16:46 -0000 1.3.2.64
+++ mdfvideoadapter.cpp 28 Jun 2007 21:55:21 -0000 1.3.2.65
@@ -351,73 +351,76 @@
if ( SUCCEEDED( retVal ) && bUseCodecConfigRules )
{
// find codec rule to be applied
- const TDesC8& aMimeType = m_pPluginPackage->GetHelixMimeType();
+ const TDesC8& aMimeType = m_pPluginPackage->GetHelixMimeType();
+ const TDesC8& aMimeTypeKey = m_pPluginPackage->GetMimeTypeKey();
const TDesC8& aProfile = m_pPayloadFormatPluginDevice->GetVideoProfile();
MDFVIDEOLOG_WRITE_FORMAT2( "<-> Profile string for video is %s", \
aProfile.Ptr() );
- HBufC8* convertedMimeType = NULL;
- TRAPD( error, convertedMimeType = \
m_pPluginManager->ConvertToStandardMimeTypeL( aMimeType ) );
- if( error == KErrNone )
+ HXBOOL foundRule = FALSE;
+ HXBOOL foundType = FALSE;
+ UINT8 count = m_CodecConfigRuleArray.Count();
+ TUid decUidToUse = KUidZero;
+ TUid ppUidToUse = KUidZero;
+
+ for( UINT8 i = 0; i < count; i++ )
{
- HXBOOL foundRule = FALSE;
- HXBOOL foundType = FALSE;
- UINT8 count = m_CodecConfigRuleArray.Count();
- TUid decUidToUse = KUidZero;
- TUid ppUidToUse = KUidZero;
+ CodecConfigRule* pCodecRule = m_CodecConfigRuleArray[i];
- for( UINT8 i = 0; i < count; i++ )
+ TInt ismimetypefound = KErrNotFound;
+
+ if( pCodecRule )
{
- CodecConfigRule* pCodecRule = m_CodecConfigRuleArray[i];
- if( ( pCodecRule ) && ( *(pCodecRule->pMimeType) == \
*convertedMimeType ) )
- {
- foundType = TRUE;
- if( ( aProfile == KNullDesC8() ) ||
- ( *(pCodecRule->pProfile) == KNullDesC8() ) ||
- ( *(pCodecRule->pProfile) == aProfile ) )
- {
- UINT32 resolution = \
m_pPayloadFormatPluginDevice->GetVideoResolution();
- MDFVIDEOLOG_WRITE_FORMAT2( "<-> Video resolution is %d", \
resolution );
- if( ( resolution > 0 ) && ( resolution <= \
pCodecRule->ulFrameResolution ) )
- {
- decUidToUse = pCodecRule->DecoderUid;
- ppUidToUse = pCodecRule->PostProcessorUid;
- }
- else
- {
- decUidToUse = pCodecRule->DefaultDecoderUid;
- ppUidToUse = pCodecRule->DefaultPostProcUid;
- }
- if( decUidToUse != KUidZero )
- {
- foundRule = TRUE;
- break;
- }
- }
- }
+ ismimetypefound = aMimeTypeKey.Find( *(pCodecRule->pMimeType) );
}
- if( foundRule )
+ if( ( pCodecRule ) && ( ismimetypefound != KErrNotFound ) )
{
- if( ( decUidToUse != m_pPluginPackage->GetHwDecoderId() ) ||
- ( ( ppUidToUse != KUidZero ) && ( ppUidToUse != \
m_pPluginPackage->GetHwPostProcessorId() ) ) ) + foundType = TRUE;
+ if( ( aProfile == KNullDesC8() ) ||
+ ( *(pCodecRule->pProfile) == KNullDesC8() ) ||
+ ( *(pCodecRule->pProfile) == aProfile ) )
{
- // current package's decoder and/or post processor doesn't match \
desired
- // need to select another package
- retVal = m_pPluginManager->SelectPackageByCodecRule( aMimeType, \
decUidToUse,
- ppUidToUse, \
*m_pPluginPackage ); + UINT32 resolution = \
m_pPayloadFormatPluginDevice->GetVideoResolution(); + \
MDFVIDEOLOG_WRITE_FORMAT2( "<-> Video resolution is %d", resolution ); + \
if( ( resolution > 0 ) && ( resolution <= pCodecRule->ulFrameResolution ) ) + \
{ + decUidToUse = pCodecRule->DecoderUid;
+ ppUidToUse = pCodecRule->PostProcessorUid;
+ }
+ else
+ {
+ decUidToUse = pCodecRule->DefaultDecoderUid;
+ ppUidToUse = pCodecRule->DefaultPostProcUid;
+ }
+ if( decUidToUse != KUidZero )
+ {
+ foundRule = TRUE;
+ break;
+ }
}
}
- else if ( foundType )
+ }
+
+ if( foundRule )
+ {
+ if( ( decUidToUse != m_pPluginPackage->GetHwDecoderId() ) ||
+ ( ( ppUidToUse != KUidZero ) && ( ppUidToUse != \
m_pPluginPackage->GetHwPostProcessorId() ) ) ) {
- // if some rule exists for mimetype but it does not have valid info, \
return error
- // else do nothing, it'll fall back to use plugin package already \
selected
- MDFVIDEOLOG_WRITE_FORMAT2( " Error: Valid codec rule not found \
for mimetype %s", aMimeType.Ptr() );
- retVal = HXR_UNSUPPORTED_VIDEO;
+ // current package's decoder and/or post processor doesn't match \
desired + // need to select another package
+ retVal = m_pPluginManager->SelectPackageByCodecRule( aMimeType, \
decUidToUse, + ppUidToUse, *m_pPluginPackage );
}
}
- HX_DELETE( convertedMimeType );
+ else if ( foundType )
+ {
+ // if some rule exists for mimetype but it does not have valid info, \
return error + // else do nothing, it'll fall back to use plugin package \
already selected + MDFVIDEOLOG_WRITE_FORMAT2( " Error: Valid codec rule \
not found for mimetype %s", aMimeType.Ptr() ); + retVal = \
HXR_UNSUPPORTED_VIDEO; + }
}
-
+
if ( SUCCEEDED( retVal ) )
{
m_pPictureHeader = m_pPayloadFormatPluginDevice->GetPictureHeader();
_______________________________________________
Datatype-cvs mailing list
Datatype-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/datatype-cvs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic