videofeeds/utils/src/CIptvTerminalVideoSupport.cpp
changeset 0 96612d01cf9f
--- /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 <e32base.h>
+#include "IptvDebug.h"
+#include <barsread.h>
+#include <barsc.h>
+#include <bautils.h>
+#include <iptvmimesupport.rsg>
+#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<CIptvMediaContent>& 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