Renumber QUIC streams when there is no crypto stream

This also modifies spdy::PriorityWriteScheduler to allow using a different
value than kHttp2RootStreamId as the root stream ID.

gfe-relnote: Renumber QUIC streams, protected by QUIC_VERSION_99
PiperOrigin-RevId: 248609263
Change-Id: I5e83b5950253068996df830694ac55e424d7aa54
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc
index dc40122..a7fe40f 100644
--- a/quic/core/quic_utils.cc
+++ b/quic/core/quic_utils.cc
@@ -399,7 +399,7 @@
 
 // static
 QuicStreamId QuicUtils::GetHeadersStreamId(QuicTransportVersion version) {
-  return version == QUIC_VERSION_99 ? 4 : 3;
+  return GetFirstBidirectionalStreamId(version, Perspective::IS_CLIENT);
 }
 
 // static
@@ -461,19 +461,26 @@
 QuicStreamId QuicUtils::GetFirstBidirectionalStreamId(
     QuicTransportVersion version,
     Perspective perspective) {
-  if (perspective == Perspective::IS_CLIENT) {
-    // TODO(nharper): Return 0 instead of 4 when CRYPTO frames are used.
-    return version == QUIC_VERSION_99 ? 4 : 3;
+  if (version == QUIC_VERSION_99) {
+    return perspective == Perspective::IS_CLIENT ? 0 : 1;
+  } else if (QuicVersionUsesCryptoFrames(version)) {
+    return perspective == Perspective::IS_CLIENT ? 1 : 2;
   }
-  return version == QUIC_VERSION_99 ? 1 : 2;
+  return perspective == Perspective::IS_CLIENT ? 3 : 2;
 }
 
 // static
 QuicStreamId QuicUtils::GetFirstUnidirectionalStreamId(
     QuicTransportVersion version,
     Perspective perspective) {
+  if (version == QUIC_VERSION_99) {
+    return perspective == Perspective::IS_CLIENT ? 2 : 3;
+  } else if (QuicVersionUsesCryptoFrames(version)) {
+    return perspective == Perspective::IS_CLIENT ? 1 : 2;
+  }
+  return perspective == Perspective::IS_CLIENT ? 3 : 2;
   if (perspective == Perspective::IS_CLIENT) {
-    return version == QUIC_VERSION_99 ? 2 : 3;
+    return version == QUIC_VERSION_99 ? 2 : 1;
   }
   return version == QUIC_VERSION_99 ? 3 : 2;
 }