[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-server-cvs
Subject:    [Server-cvs] protocol/common mp_url_parser.cpp,1.4,1.4.2.1
From:       skharkar () helixcommunity ! org
Date:       2011-06-03 23:50:43
Message-ID: 201106032350.p53NotEa028073 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/server/protocol/common
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv31008

Modified Files:
      Tag: SERVER_14_2
	mp_url_parser.cpp 
Log Message:
Synopsis
========
Bug 269463: 5% allowance rule isn't honored when selecting bit rates 

Reviewer: Dean
 
Branches: HEAD,SERVER_14_2
 
Description
===========
HX_RESULT CMultiplexerURLParser::GetMultiplexerStreamHeader logic of selecting audio \
or video stream was wrong. There was assumtion that there are only two audio streams \
and/or streams are alwasy sorted according to bitrate, There was a typo of  \
if(nMPVideoStreamCount > 1 || nMPVideoStreamCount > 1)

Fix was to re-implement following speced behavior
The server will select the stream with the closest bitrate to the attribute value, so \
long as the stream is not more than 5% higher  than the attribute value (it will \
otherwise take the next lower stream).   The 5% max value is ignored if the bitrate \
attribute is defined as lower than the lowest rate, in which case the lowest rate is \
selected.


Files affected
===============
server/protocol/common/mp_url_parser.cpp

Tested
======
Tested with encoded audio streams at 48kpbs and 64kbps. 
Chose playback bitrate to 30,55,57,61,62,75 etc and confirmed that behavior matched \
ecpected behavior.

QA hints
=========
None



Index: mp_url_parser.cpp
===================================================================
RCS file: /cvsroot/server/protocol/common/mp_url_parser.cpp,v
retrieving revision 1.4
retrieving revision 1.4.2.1
diff -u -d -r1.4 -r1.4.2.1
--- mp_url_parser.cpp	3 Nov 2010 03:20:08 -0000	1.4
+++ mp_url_parser.cpp	3 Jun 2011 23:50:41 -0000	1.4.2.1
@@ -251,82 +251,24 @@
         return HXR_OK;
     }
 
-    if(nMPVideoStreamCount > 1 || nMPVideoStreamCount > 1)
+    if(nMPVideoStreamCount > 1 || nMPAudioStreamCount > 1)
     {
         IHXValues* pAudioStreamHeader = NULL;
         IHXValues* pVideoStreamHeader = NULL;
-        UINT32 ulVideoBRPlus5Per = m_ulVideoBR + m_ulVideoBR/20;
-        UINT32 ulAudioBRPlus5Per = m_ulAudioBR + m_ulAudioBR/20;
 
-        for (i = pSelectedHeaders->Begin(); i != pSelectedHeaders->End(); ++i)
+        INT32 iAudioStreamIndex = GetSelectedStreamId(pSelectedHeaders, "audio");
+        INT32 iVideoStreamIndex = GetSelectedStreamId(pSelectedHeaders, "video");
+        if (iAudioStreamIndex != -1)
         {
-            IHXValues* pTemp = (IHXValues*)(*i);
-            IHXBuffer* pMimeType = NULL;
-            UINT32 ulAvgBitRate = 0;
-            pTemp->GetPropertyCString("MimeType", pMimeType);
-            pTemp->GetPropertyULONG32("AvgBitRate", ulAvgBitRate);
-            ulAvgBitRate /= 1024; //to kbps
-
-            if(strncasecmp((const char*)pMimeType->GetBuffer(), "video", 5) == 0)
-            {
-                if(pVideoStreamHeader == NULL)
-                {
-                    pVideoStreamHeader = pTemp;
-                    HX_RELEASE(pMimeType);
-                    continue;
-                }
-                else
-                {
-                    UINT32 ulThatBitRate = 0;
-                    pVideoStreamHeader->GetPropertyULONG32("AvgBitRate", \
                ulThatBitRate);
-                    ulThatBitRate /= 1024; //to kpbs
-
-                    UINT32 ulDiffThis = abs((int)ulAvgBitRate - (int)m_ulVideoBR);
-                    UINT32 ulDiffThat = abs((int)ulThatBitRate - (int)m_ulVideoBR);
-                    
-                    if(ulDiffThis < ulDiffThat)
-                    {
-                        //close to the br
-                        pVideoStreamHeader = pTemp;
-                    }
-                    else if(ulThatBitRate > ulVideoBRPlus5Per && ulAvgBitRate < \
                ulVideoBRPlus5Per)
-                    {
-                        //that one is over the limit
-                        pVideoStreamHeader = pTemp;
-                    }
-                }
-            }
-            else if(strncasecmp((const char*)pMimeType->GetBuffer(), "audio", 5) == \
                0)
-            {
-                if(pAudioStreamHeader == NULL)
-                {
-                    pAudioStreamHeader = pTemp;
-                    HX_RELEASE(pMimeType);
-                    continue;
-                }
-                else
-                {
-                    UINT32 ulThatBitRate = 0;
-                    pAudioStreamHeader->GetPropertyULONG32("AvgBitRate", \
                ulThatBitRate);
-                    ulThatBitRate /= 1024; //to kpbs
-
-                    UINT32 ulDiffThis = abs((int)ulAvgBitRate - (int)m_ulAudioBR);
-                    UINT32 ulDiffThat = abs((int)ulThatBitRate - (int)m_ulAudioBR);
-                    
-                    if(ulDiffThis < ulDiffThat)
-                    {
-                        //close to the br
-                        pAudioStreamHeader = pTemp;
-                    }
-                    else if(ulThatBitRate > ulAudioBRPlus5Per && ulAvgBitRate < \
                ulAudioBRPlus5Per)
-                    {
-                        //that one is over the limit
-                        pAudioStreamHeader = pTemp;
-                    }
-                }
-            }
-            HX_RELEASE(pMimeType);
+            LISTPOSITION pos = pSelectedHeaders->FindIndex(iAudioStreamIndex);
+            pAudioStreamHeader = (IHXValues*)pSelectedHeaders->GetAt(pos);
+        }
+        if (iVideoStreamIndex != -1)
+        {
+            LISTPOSITION pos = pSelectedHeaders->FindIndex(iVideoStreamIndex);
+            pVideoStreamHeader = (IHXValues*)pSelectedHeaders->GetAt(pos);
         }
+
         pSelectedHeaders->RemoveAll();
 
         if(pAudioStreamHeader)
@@ -353,3 +295,114 @@
     return HXR_OK;
  }
 
+ INT32 CMultiplexerURLParser::GetSelectedStreamId(CHXSimpleList* pSelectedHeaders, \
const char* pMimeType) + {
+     UINT32 ulLowerStreamBitrate = 0;
+     UINT32 ulUpperStreamBitrate = 0;
+
+     INT32 iLowerStreamId = GetLowerBitrateStreamId(pSelectedHeaders, pMimeType, \
&ulLowerStreamBitrate); +
+     INT32 iUpperStreamId = GetUpperBitrateStreamId(pSelectedHeaders, pMimeType, \
&ulUpperStreamBitrate); +
+     if (iLowerStreamId == -1)
+     {
+         return iUpperStreamId;
+     }
+     else if(iUpperStreamId == -1)
+     {
+         return iLowerStreamId;
+     }
+     else
+     {
+        UINT32 ulRequestedBR = m_ulVideoBR;
+        if (strncasecmp(pMimeType, "audio", 5) == 0)
+        {
+            ulRequestedBR = m_ulAudioBR;
+        }
+        UINT32 ulRequestedBRPlus5Per = (UINT32)ulRequestedBR*1.05;
+
+        UINT32 ulDiffLower = abs((int)ulRequestedBR - (int)ulLowerStreamBitrate);
+        UINT32 ulDiffUpper = abs((int)ulUpperStreamBitrate - (int)ulRequestedBR);
+
+        if ((ulDiffUpper < ulDiffLower) && ulUpperStreamBitrate <= \
ulRequestedBRPlus5Per) +        {
+            return iUpperStreamId;
+        }
+        else
+        {
+            return iLowerStreamId;
+        }
+     }
+
+ }
+
+ INT32 CMultiplexerURLParser::GetLowerBitrateStreamId(CHXSimpleList* \
pSelectedHeaders, const char* pReqMimeType, UINT32 *pLowerBitrate) + {
+    INT32 iLowerStreamIndex = -1;
+    UINT32 ulLowerBitrate = 0;
+    UINT32 ulRequestedBR = m_ulVideoBR;
+    if (strncasecmp(pReqMimeType, "audio", 5) == 0)
+    {
+        ulRequestedBR = m_ulAudioBR;
+    }
+
+    CHXSimpleList::Iterator i;
+    UINT32 count =0;
+    for (i = pSelectedHeaders->Begin(); i != pSelectedHeaders->End(); ++i,++count)
+    {
+        IHXValues* pTemp = (IHXValues*)(*i);
+        IHXBuffer* pMimeType = NULL;
+        UINT32 ulAvgBitRate = 0;
+        pTemp->GetPropertyCString("MimeType", pMimeType);
+        pTemp->GetPropertyULONG32("AvgBitRate", ulAvgBitRate);
+        ulAvgBitRate /= 1000; //to kbps
+
+        if(strncasecmp((const char*)pMimeType->GetBuffer(), pReqMimeType, \
strlen(pReqMimeType)) == 0) +        {
+            if ((ulAvgBitRate <= ulRequestedBR) && (ulAvgBitRate > ulLowerBitrate))
+            {
+                ulLowerBitrate = ulAvgBitRate;
+                iLowerStreamIndex = count;
+                *pLowerBitrate = ulAvgBitRate;
+            }
+        }
+    }
+
+    return iLowerStreamIndex;
+ }
+
+ INT32 CMultiplexerURLParser::GetUpperBitrateStreamId(CHXSimpleList* \
pSelectedHeaders, const char* pReqMimeType, UINT32 *pUpperBitrate) + {
+    INT32 iUpperStreamIndex = -1;
+    UINT32 ulUpperBitrate = MAX_UINT32;
+
+    UINT32 ulRequestedBR = m_ulVideoBR;
+    if (strncasecmp(pReqMimeType, "audio", 5) == 0)
+    {
+        ulRequestedBR = m_ulAudioBR;
+    }
+
+    CHXSimpleList::Iterator i;
+    UINT32 count =0;
+    for (i = pSelectedHeaders->Begin(); i != pSelectedHeaders->End(); ++i,++count)
+    {
+        IHXValues* pTemp = (IHXValues*)(*i);
+        IHXBuffer* pMimeType = NULL;
+        UINT32 ulAvgBitRate = 0;
+        pTemp->GetPropertyCString("MimeType", pMimeType);
+        pTemp->GetPropertyULONG32("AvgBitRate", ulAvgBitRate);
+        ulAvgBitRate /= 1000; //to kbps
+
+        if(strncasecmp((const char*)pMimeType->GetBuffer(), pReqMimeType, \
strlen(pReqMimeType)) == 0) +        {
+            if ((ulAvgBitRate >= ulRequestedBR) && (ulAvgBitRate < ulUpperBitrate))
+            {
+                ulUpperBitrate = ulAvgBitRate;
+                iUpperStreamIndex = count;
+                *pUpperBitrate = ulAvgBitRate;
+            }
+        }
+    }
+
+    return iUpperStreamIndex;
+ }


_______________________________________________
Server-cvs mailing list
Server-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/server-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic