diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactory.java index 11b860f9b1..d95bfdd83c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactory.java @@ -40,6 +40,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.regex.Pattern; @@ -466,6 +467,7 @@ public final class CmcdHeadersFactory { headerValueList.addAll(customDataList); if (!headerValueList.isEmpty()) { + Collections.sort(headerValueList); httpRequestHeaders.put( CmcdConfiguration.KEY_CMCD_OBJECT, COMMA_JOINER.join(headerValueList)); } @@ -635,6 +637,7 @@ public final class CmcdHeadersFactory { headerValueList.addAll(customDataList); if (!headerValueList.isEmpty()) { + Collections.sort(headerValueList); httpRequestHeaders.put( CmcdConfiguration.KEY_CMCD_REQUEST, COMMA_JOINER.join(headerValueList)); } @@ -814,6 +817,7 @@ public final class CmcdHeadersFactory { headerValueList.addAll(customDataList); if (!headerValueList.isEmpty()) { + Collections.sort(headerValueList); httpRequestHeaders.put( CmcdConfiguration.KEY_CMCD_SESSION, COMMA_JOINER.join(headerValueList)); } @@ -920,6 +924,7 @@ public final class CmcdHeadersFactory { headerValueList.addAll(customDataList); if (!headerValueList.isEmpty()) { + Collections.sort(headerValueList); httpRequestHeaders.put( CmcdConfiguration.KEY_CMCD_STATUS, COMMA_JOINER.join(headerValueList)); } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactoryTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactoryTest.java index 92d1b191d8..ddd7503f4f 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactoryTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/upstream/CmcdHeadersFactoryTest.java @@ -83,13 +83,13 @@ public class CmcdHeadersFactoryTest { assertThat(requestHeaders) .containsExactly( "CMCD-Object", - "br=840,tb=1000,d=3000,key-1=1,key-2-separated-by-multiple-hyphens=2", + "br=840,d=3000,key-1=1,key-2-separated-by-multiple-hyphens=2,tb=1000", "CMCD-Request", - "bl=1800,mtp=500,dl=900,su,key-3=\"stringValue1,stringValue2\"", + "bl=1800,dl=900,key-3=\"stringValue1,stringValue2\",mtp=500,su", "CMCD-Session", - "cid=\"mediaId\",sid=\"sessionId\",sf=d,st=l,pr=2.00", + "cid=\"mediaId\",pr=2.00,sf=d,sid=\"sessionId\",st=l", "CMCD-Status", - "rtp=1700,bs,key-4=\"stringValue3=stringValue4\""); + "bs,key-4=\"stringValue3=stringValue4\",rtp=1700"); } @Test diff --git a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java index a0811c907b..c6f99ab5c6 100644 --- a/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java +++ b/libraries/exoplayer_dash/src/test/java/androidx/media3/exoplayer/dash/DefaultDashChunkSourceTest.java @@ -319,11 +319,11 @@ public class DefaultDashChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=700,tb=1300,d=4000,ot=v", + "br=700,d=4000,ot=v,tb=1300", "CMCD-Request", - "bl=0,mtp=1000,dl=0,su", + "bl=0,dl=0,mtp=1000,su", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=d,st=v"); + "cid=\"mediaId\",sf=d,sid=\"" + cmcdConfiguration.sessionId + "\",st=v"); chunkSource.getNextChunk( new LoadingInfo.Builder().setPlaybackPositionUs(3_000_000).setPlaybackSpeed(1.25f).build(), @@ -334,11 +334,11 @@ public class DefaultDashChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=700,tb=1300,d=4000,ot=v", + "br=700,d=4000,ot=v,tb=1300", "CMCD-Request", - "bl=1000,mtp=1000,dl=800", + "bl=1000,dl=800,mtp=1000", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=d,st=v,pr=1.25"); + "cid=\"mediaId\",pr=1.25,sf=d,sid=\"" + cmcdConfiguration.sessionId + "\",st=v"); } @Test @@ -418,9 +418,9 @@ public class DefaultDashChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=700,tb=1300,d=4000,ot=v", + "br=700,d=4000,ot=v,tb=1300", "CMCD-Request", - "bl=0,mtp=1000,dl=0,su", + "bl=0,dl=0,mtp=1000,su", "CMCD-Session", "cid=\"mediaIdcontentIdSuffix\",sf=d,st=v", "CMCD-Status", @@ -466,11 +466,11 @@ public class DefaultDashChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=700,tb=1300,d=4000,ot=v,key-1=1", + "br=700,d=4000,key-1=1,ot=v,tb=1300", "CMCD-Request", - "bl=0,mtp=1000,dl=0,su,key-2=\"stringValue\"", + "bl=0,dl=0,key-2=\"stringValue\",mtp=1000,su", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=d,st=v,key-3=3", + "cid=\"mediaId\",key-3=3,sf=d,sid=\"" + cmcdConfiguration.sessionId + "\",st=v", "CMCD-Status", "key-4=5.0"); } diff --git a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/HlsChunkSourceTest.java b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/HlsChunkSourceTest.java index bfb1a44976..b8e52dee7c 100644 --- a/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/HlsChunkSourceTest.java +++ b/libraries/exoplayer_hls/src/test/java/androidx/media3/exoplayer/hls/HlsChunkSourceTest.java @@ -214,11 +214,11 @@ public class HlsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=800,tb=800,d=4000,ot=v", + "br=800,d=4000,ot=v,tb=800", "CMCD-Request", "bl=0,dl=0,su", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=h,st=v"); + "cid=\"mediaId\",sf=h,sid=\"" + cmcdConfiguration.sessionId + "\",st=v"); testChunkSource.getNextChunk( new LoadingInfo.Builder().setPlaybackPositionUs(3_000_000).setPlaybackSpeed(1.25f).build(), @@ -230,11 +230,11 @@ public class HlsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=800,tb=800,d=4000,ot=v", + "br=800,d=4000,ot=v,tb=800", "CMCD-Request", "bl=1000,dl=800", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=h,st=v,pr=1.25"); + "cid=\"mediaId\",pr=1.25,sf=h,sid=\"" + cmcdConfiguration.sessionId + "\",st=v"); } @Test @@ -327,7 +327,7 @@ public class HlsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=800,tb=800,d=4000,ot=v", + "br=800,d=4000,ot=v,tb=800", "CMCD-Request", "bl=0,dl=0,su", "CMCD-Session", @@ -376,11 +376,11 @@ public class HlsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=800,tb=800,d=4000,ot=v,key-1=1", + "br=800,d=4000,key-1=1,ot=v,tb=800", "CMCD-Request", - "bl=0,dl=0,su,key-2=\"stringValue\"", + "bl=0,dl=0,key-2=\"stringValue\",su", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=h,st=v,key-3=3", + "cid=\"mediaId\",key-3=3,sf=h,sid=\"" + cmcdConfiguration.sessionId + "\",st=v", "CMCD-Status", "key-4=5.0"); } diff --git a/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultSsChunkSourceTest.java b/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultSsChunkSourceTest.java index 5391560dd0..923c0dd22b 100644 --- a/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultSsChunkSourceTest.java +++ b/libraries/exoplayer_smoothstreaming/src/test/java/androidx/media3/exoplayer/smoothstreaming/DefaultSsChunkSourceTest.java @@ -69,11 +69,11 @@ public class DefaultSsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=308,tb=1536,d=1968,ot=v", + "br=308,d=1968,ot=v,tb=1536", "CMCD-Request", - "bl=0,mtp=1000,dl=0,su", + "bl=0,dl=0,mtp=1000,su", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=s,st=v"); + "cid=\"mediaId\",sf=s,sid=\"" + cmcdConfiguration.sessionId + "\",st=v"); chunkSource.getNextChunk( new LoadingInfo.Builder().setPlaybackPositionUs(3_000_000).setPlaybackSpeed(2.0f).build(), @@ -84,11 +84,11 @@ public class DefaultSsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=308,tb=1536,d=898,ot=v", + "br=308,d=898,ot=v,tb=1536", "CMCD-Request", - "bl=1000,mtp=1000,dl=500", + "bl=1000,dl=500,mtp=1000", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=s,st=v,pr=2.00"); + "cid=\"mediaId\",pr=2.00,sf=s,sid=\"" + cmcdConfiguration.sessionId + "\",st=v"); } @Test @@ -168,9 +168,9 @@ public class DefaultSsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=308,tb=1536,d=1968,ot=v", + "br=308,d=1968,ot=v,tb=1536", "CMCD-Request", - "bl=0,mtp=1000,dl=0,su", + "bl=0,dl=0,mtp=1000,su", "CMCD-Session", "cid=\"mediaIdcontentIdSuffix\",sf=s,st=v", "CMCD-Status", @@ -216,11 +216,11 @@ public class DefaultSsChunkSourceTest { assertThat(output.chunk.dataSpec.httpRequestHeaders) .containsExactly( "CMCD-Object", - "br=308,tb=1536,d=1968,ot=v,key-1=1", + "br=308,d=1968,key-1=1,ot=v,tb=1536", "CMCD-Request", - "bl=0,mtp=1000,dl=0,su,key-2=\"stringValue\"", + "bl=0,dl=0,key-2=\"stringValue\",mtp=1000,su", "CMCD-Session", - "cid=\"mediaId\",sid=\"" + cmcdConfiguration.sessionId + "\",sf=s,st=v,key-3=3", + "cid=\"mediaId\",key-3=3,sf=s,sid=\"" + cmcdConfiguration.sessionId + "\",st=v", "CMCD-Status", "key-4=5.0"); }