Index: chrome/test/data/webrtc/munge_sdp.js |
diff --git a/chrome/test/data/webrtc/munge_sdp.js b/chrome/test/data/webrtc/munge_sdp.js |
index 70ed1e621888b3d09dcc86100466d3639f7cfa34..c8baaa0a71a83b2b314bce01d7909048baa80c0a 100644 |
--- a/chrome/test/data/webrtc/munge_sdp.js |
+++ b/chrome/test/data/webrtc/munge_sdp.js |
@@ -8,14 +8,14 @@ |
* See |setSdpDefaultCodec|. |
*/ |
function setSdpDefaultAudioCodec(sdp, codec) { |
- return setSdpDefaultCodec(sdp, 'audio', codec); |
+ return setSdpDefaultCodec(sdp, 'audio', codec, false /* preferHwCodec */); |
} |
/** |
* See |setSdpDefaultCodec|. |
*/ |
-function setSdpDefaultVideoCodec(sdp, codec) { |
- return setSdpDefaultCodec(sdp, 'video', codec); |
+function setSdpDefaultVideoCodec(sdp, codec, preferHwCodec) { |
+ return setSdpDefaultCodec(sdp, 'video', codec, preferHwCodec); |
} |
/** |
@@ -55,14 +55,17 @@ function setOpusDtxEnabled(sdp) { |
/** |
* Returns a modified version of |sdp| where the |codec| has been promoted to be |
* the default codec, i.e. the codec whose ID is first in the list of codecs on |
- * the 'm=|type|' line, where |type| is 'audio' or 'video'. |
+ * the 'm=|type|' line, where |type| is 'audio' or 'video'. If |preferHwCodec| |
+ * is true, it will select the last codec with the given name, and if false, it |
+ * will select the first codec with the given name, because HW codecs are listed |
+ * after SW codecs in the SDP list. |
* @private |
*/ |
-function setSdpDefaultCodec(sdp, type, codec) { |
+function setSdpDefaultCodec(sdp, type, codec, preferHwCodec) { |
var sdpLines = splitSdpLines(sdp); |
// Find codec ID, e.g. 100 for 'VP8' if 'a=rtpmap:100 VP8/9000'. |
- var codecId = findRtpmapId(sdpLines, codec); |
+ var codecId = findRtpmapId(sdpLines, codec, preferHwCodec); |
if (codecId === null) { |
failure('setSdpDefaultCodec', |
'Unknown ID for |codec| = \'' + codec + '\'.'); |
@@ -129,13 +132,15 @@ function getSdpDefaultCodec(sdp, type) { |
/** |
* Searches through all |sdpLines| for the 'a=rtpmap:' line for the codec of |
* the specified name, returning its ID as an int if found, or null otherwise. |
- * |codec| is the case-sensitive name of the codec. |
+ * |codec| is the case-sensitive name of the codec. If |lastInstance| |
+ * is true, it will return the last such ID, and if false, it will return the |
+ * first such ID. |
* For example, if |sdpLines| contains 'a=rtpmap:100 VP8/9000' and |codec| is |
* 'VP8', this function returns 100. |
* @private |
*/ |
-function findRtpmapId(sdpLines, codec) { |
- var lineNo = findRtpmapLine(sdpLines, codec); |
+function findRtpmapId(sdpLines, codec, lastInstance) { |
+ var lineNo = findRtpmapLine(sdpLines, codec, lastInstance); |
if (lineNo === null) |
return null; |
// Parse <id> from 'a=rtpmap:<id> <codec>/<rate>'. |
@@ -163,28 +168,46 @@ function findRtpmapCodec(sdpLines, id) { |
} |
/** |
- * Finds the first 'a=rtpmap:' line from |sdpLines| that contains |contains| and |
- * returns its line index, or null if no such line was found. |contains| may be |
- * the codec ID, codec name or bitrate. An 'a=rtpmap:' line looks like this: |
- * 'a=rtpmap:<id> <codec>/<rate>'. |
+ * Finds a 'a=rtpmap:' line from |sdpLines| that contains |contains| and returns |
+ * its line index, or null if no such line was found. |contains| may be the |
+ * codec ID, codec name or bitrate. If |lastInstance| is true, it will return |
+ * the last such line index, and if false, it will return the first such line |
+ * index. |
+ * An 'a=rtpmap:' line looks like this: 'a=rtpmap:<id> <codec>/<rate>'. |
*/ |
-function findRtpmapLine(sdpLines, contains) { |
- for (var i = 0; i < sdpLines.length; i++) { |
- // Is 'a=rtpmap:' line containing |contains| string? |
- if (sdpLines[i].startsWith('a=rtpmap:') && |
- sdpLines[i].indexOf(contains) != -1) { |
- // Expecting pattern 'a=rtpmap:<id> <codec>/<rate>'. |
- var pattern = new RegExp('a=rtpmap:(\\d+) \\w+\\/\\d+'); |
- if (!sdpLines[i].match(pattern)) |
- failure('findRtpmapLine', 'Unexpected "a=rtpmap:" pattern.'); |
- // Return line index. |
- return i; |
+function findRtpmapLine(sdpLines, contains, lastInstance) { |
+ if (lastInstance === true) { |
+ for (var i = sdpLines.length - 1; i >= 0 ; i--) { |
+ if (isRtpmapLine(sdpLines[i], contains)) |
+ return i; |
+ } |
+ } else { |
+ for (var i = 0; i < sdpLines.length; i++) { |
+ if (isRtpmapLine(sdpLines[i], contains)) |
+ return i; |
} |
} |
return null; |
} |
/** |
+ * Returns true if |sdpLine| contains |contains| and is of pattern |
+ * 'a=rtpmap:<id> <codec>/<rate>'. |
+ */ |
+function isRtpmapLine(sdpLine, contains) { |
+ // Is 'a=rtpmap:' line containing |contains| string? |
+ if (sdpLine.startsWith('a=rtpmap:') && |
+ sdpLine.indexOf(contains) != -1) { |
+ // Expecting pattern 'a=rtpmap:<id> <codec>/<rate>'. |
+ var pattern = new RegExp('a=rtpmap:(\\d+) \\w+\\/\\d+'); |
+ if (!sdpLine.match(pattern)) |
+ failure('isRtpmapLine', 'Unexpected "a=rtpmap:" pattern.'); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+/** |
* Finds the fmtp line in |sdpLines| for the given |codecId|, and returns its |
* line number. The line starts with 'a=fmtp:<codecId>'. |
* @private |