[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