diff -r 000000000000 -r 96612d01cf9f videofeeds/utils/src/CIptvTerminalVideoSupport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/utils/src/CIptvTerminalVideoSupport.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,349 @@ +/* +* Copyright (c) 2004-2005 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 "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: +* +*/ + + + + +// INCLUDE FILES +#include +#include "IptvDebug.h" +#include +#include +#include +#include +#include "CIptvMediaContent.h" +#include "CIptvTerminalVideoSupport.h" +#include "TIptvMimeType.h" + +// CONSTANTS +_LIT(KIptvMimeResourceFile, "\\Resource\\Apps\\Iptvmimesupport.RSC"); +_LIT(KIptvMimeRootC, "C:"); +_LIT(KIptvMimeRootE, "E:"); +_LIT(KIptvMimeRootF, "F:"); +_LIT(KIptvMimeRootZ, "Z:"); +const TInt KIptvMaxDrives = 4; + +// ============================ MEMBER FUNCTIONS =============================== + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------- +// +void CIptvTerminalVideoSupport::ConstructL() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvTerminalVideoSupport::ConstructL"); + + LoadResourceL(); + } + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::LoadResourceL +// +// --------------------------------------------------------- +// +void CIptvTerminalVideoSupport::LoadResourceL() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvTerminalVideoSupport::LoadResourceL"); + + RFs fs; + User::LeaveIfError(fs.Connect()); + RResourceFile file; + TFileName filename; + TBool open = EFalse; + + for (TInt i = 0; i < KIptvMaxDrives; i++) + { + switch (i) + { + case 0: + { + filename.Copy(KIptvMimeRootC); + filename.Append(KIptvMimeResourceFile); + } + break; + case 1: + { + filename.Copy(KIptvMimeRootE); + filename.Append(KIptvMimeResourceFile); + } + break; + case 2: + { + filename.Copy(KIptvMimeRootF); + filename.Append(KIptvMimeResourceFile); + } + break; + case 3: + { + filename.Copy(KIptvMimeRootZ); + filename.Append(KIptvMimeResourceFile); + } + break; + default: + { + } + break; + } + + TRAPD(error, file.OpenL(fs, filename)); + if (error == KErrNone) + { + open = ETrue; + break; + } + } + + if (open) + { + CleanupClosePushL(file); + file.ConfirmSignatureL(); + HBufC8* buffer = file.AllocReadLC(R_SUP_MIME_TYPE_LIST); + LoadMimeTypesL(buffer); + CleanupStack::PopAndDestroy(); // buffer + CleanupStack::PopAndDestroy(); // file + } + fs.Close(); + } + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::LoadMimeTypesL +// +// --------------------------------------------------------- +// +void CIptvTerminalVideoSupport::LoadMimeTypesL(const HBufC8* aBuffer) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvTerminalVideoSupport::LoadMimeTypesL"); + + if (aBuffer) + { + TResourceReader reader; + reader.SetBuffer(aBuffer); + + TUint32 version = reader.ReadUint32(); + TInt count = reader.ReadInt16(); + + for (TInt i = 0; i < count; i++) + { + TIptvMimeType type; + HBufC* mimeType = reader.ReadHBufCL(); + CleanupStack::PushL(mimeType); + + if (mimeType) + { + TInt length = mimeType->Length(); + TInt dataToCopy = Min(length, KIptvCAMimeTypeLength); + type.iMimeType.Copy(mimeType->Mid(0, dataToCopy)); + } + + type.iMaxBitrate = reader.ReadUint32(); + type.iMaxScreensizeH = reader.ReadUint32(); + type.iMaxScreensizeV = reader.ReadUint32(); + type.iMaxFramerate = reader.ReadUint32(); + + iMimeTypes.AppendL(type); + CleanupStack::PopAndDestroy(mimeType); + } + } + } + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::NewL +// Two-phased constructor. +// --------------------------------------------------------- +// +EXPORT_C CIptvTerminalVideoSupport* CIptvTerminalVideoSupport::NewL() + { + CIptvTerminalVideoSupport* self = new(ELeave) CIptvTerminalVideoSupport(); + CleanupStack::PushL(self); + + self->ConstructL(); + + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::~CIptvTerminalVideoSupport +// Destructor +// ----------------------------------------------------------------------------- +// +CIptvTerminalVideoSupport::~CIptvTerminalVideoSupport() + { + iMimeTypes.Close(); + } + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::CIptvTerminalVideoSupport +// C++ default constructor +// --------------------------------------------------------- +// +CIptvTerminalVideoSupport::CIptvTerminalVideoSupport() + { + } + +// --------------------------------------------------------- +// CIptvTerminalVideoSupport::SelectMimeTypeL +// +// --------------------------------------------------------- +// +EXPORT_C TInt CIptvTerminalVideoSupport::SelectMimeTypeL(RPointerArray& aMediaContents) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvTerminalVideoSupport::SelectMimeTypeL"); + + CIptvMediaContent* bestContent = NULL; + TInt priority = 0; + TInt index = 0; + + TInt count = aMediaContents.Count(); + for (TInt i = 0; i < count; i++) + { + TInt mimeTypeCount = iMimeTypes.Count(); + for (TInt j = 0; j < mimeTypeCount; j++) + { + // Compare is current media content's mime-type supported. + // Mime-types are in priorized order in iMimeTypes array, best is first. + if (aMediaContents[i]->iMimeType.Compare(iMimeTypes[j].iMimeType) == 0) + { + // No best content yet. No comparison needed to previous best content. + if (!bestContent) + { + if (aMediaContents[i]->iBitrate <= iMimeTypes[j].iMaxBitrate && + aMediaContents[i]->iHeight <= iMimeTypes[j].iMaxScreensizeV && + aMediaContents[i]->iWidth <= iMimeTypes[j].iMaxScreensizeH && + aMediaContents[i]->iFramerate <= iMimeTypes[j].iMaxFramerate) + { + index = i; + bestContent = aMediaContents[i]; + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("First best content selected!:"); + IPTVLOGSTRING_LOW_LEVEL(""); + bestContent->PrintL(); + priority = j; + break; + } + } + else + { + // We already have some content as a best content. Let's compare + // is new content better than previous. If is -> we got new best content. + // Notice!! j = 0 is best priority because best mime-type is fist in array! + if (j < priority) + { + if (aMediaContents[i]->iBitrate <= iMimeTypes[j].iMaxBitrate && + aMediaContents[i]->iHeight <= iMimeTypes[j].iMaxScreensizeV && + aMediaContents[i]->iWidth <= iMimeTypes[j].iMaxScreensizeH && + aMediaContents[i]->iFramerate <= iMimeTypes[j].iMaxFramerate) + { + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("Best content changed from:"); + bestContent->PrintL(); + priority = j; + index = i; + bestContent = aMediaContents[i]; + + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("To:"); + bestContent->PrintL(); + } + } + // Same priority ex. same mime-type. Let's use another parameters. + else if (j == priority) + { + // New contents bitrate is better that previous best content's. + if ((aMediaContents[i]->iBitrate > bestContent->iBitrate && aMediaContents[i]->iBitrate <= iMimeTypes[j].iMaxBitrate) && + aMediaContents[i]->iHeight <= iMimeTypes[j].iMaxScreensizeV && + aMediaContents[i]->iWidth <= iMimeTypes[j].iMaxScreensizeH && + aMediaContents[i]->iFramerate <= iMimeTypes[j].iMaxFramerate) + { + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("Best content changed from:"); + bestContent->PrintL(); + + index = i; + bestContent = aMediaContents[i]; + + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("To:"); + bestContent->PrintL(); + } + // New contens horizontal screensize is better than previous best content's + else if (aMediaContents[i]->iBitrate <= iMimeTypes[j].iMaxBitrate && + (aMediaContents[i]->iHeight > bestContent->iHeight && aMediaContents[i]->iHeight <= iMimeTypes[j].iMaxScreensizeH) && + aMediaContents[i]->iWidth <= iMimeTypes[j].iMaxScreensizeH && + aMediaContents[i]->iFramerate <= iMimeTypes[j].iMaxFramerate) + { + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("Best content changed from:"); + bestContent->PrintL(); + + index = i; + bestContent = aMediaContents[i]; + + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("To:"); + bestContent->PrintL(); + } + // New contents vertical screensize is better that previous best content's + else if (aMediaContents[i]->iBitrate <= iMimeTypes[j].iMaxBitrate && + aMediaContents[i]->iHeight <= iMimeTypes[j].iMaxScreensizeV && + (aMediaContents[i]->iWidth > bestContent->iWidth && aMediaContents[i]->iWidth <= iMimeTypes[j].iMaxScreensizeV) && + aMediaContents[i]->iFramerate <= iMimeTypes[j].iMaxFramerate) + { + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("Best content changed from:"); + bestContent->PrintL(); + index = i; + bestContent = aMediaContents[i]; + + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("To:"); + bestContent->PrintL(); + } + // New contents framerate is better than previous best content's + else if (aMediaContents[i]->iBitrate <= iMimeTypes[j].iMaxBitrate && + aMediaContents[i]->iHeight <= iMimeTypes[j].iMaxScreensizeV && + aMediaContents[i]->iWidth <= iMimeTypes[j].iMaxScreensizeH && + (aMediaContents[i]->iFramerate > bestContent->iFramerate && aMediaContents[i]->iFramerate <= iMimeTypes[j].iMaxFramerate)) + { + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("Best content changed from:"); + bestContent->PrintL(); + index = i; + bestContent = aMediaContents[i]; + + IPTVLOGSTRING_LOW_LEVEL(""); + IPTVLOGSTRING_LOW_LEVEL("To:"); + bestContent->PrintL(); + } + } + } + } + } + } + + if (bestContent) + { + return index; + } + else + { + return KErrNotFound; + } + } + +// End of file