Commit 7f5c6765 by rohks Committed by Tianyi Feng

Add field object type (ot)

Added this CMCD-Object field to Common Media Client Data (CMCD) logging.

#minor-release

PiperOrigin-RevId: 554843305
(cherry picked from commit f11106cbfe806f02e3bdb162cb62af2672911960)
parent 504020a7
...@@ -72,7 +72,8 @@ public final class CmcdConfiguration { ...@@ -72,7 +72,8 @@ public final class CmcdConfiguration {
KEY_VERSION, KEY_VERSION,
KEY_TOP_BITRATE, KEY_TOP_BITRATE,
KEY_OBJECT_DURATION, KEY_OBJECT_DURATION,
KEY_MEASURED_THROUGHPUT KEY_MEASURED_THROUGHPUT,
KEY_OBJECT_TYPE
}) })
@Documented @Documented
@Target(TYPE_USE) @Target(TYPE_USE)
...@@ -96,6 +97,7 @@ public final class CmcdConfiguration { ...@@ -96,6 +97,7 @@ public final class CmcdConfiguration {
public static final String KEY_TOP_BITRATE = "tb"; public static final String KEY_TOP_BITRATE = "tb";
public static final String KEY_OBJECT_DURATION = "d"; public static final String KEY_OBJECT_DURATION = "d";
public static final String KEY_MEASURED_THROUGHPUT = "mtp"; public static final String KEY_MEASURED_THROUGHPUT = "mtp";
public static final String KEY_OBJECT_TYPE = "ot";
/** /**
* Factory for {@link CmcdConfiguration} instances. * Factory for {@link CmcdConfiguration} instances.
...@@ -295,4 +297,12 @@ public final class CmcdConfiguration { ...@@ -295,4 +297,12 @@ public final class CmcdConfiguration {
public boolean isMeasuredThroughputLoggingAllowed() { public boolean isMeasuredThroughputLoggingAllowed() {
return requestConfig.isKeyAllowed(KEY_MEASURED_THROUGHPUT); return requestConfig.isKeyAllowed(KEY_MEASURED_THROUGHPUT);
} }
/**
* Returns whether logging object type is allowed based on the {@linkplain RequestConfig request
* configuration}.
*/
public boolean isObjectTypeLoggingAllowed() {
return requestConfig.isKeyAllowed(KEY_OBJECT_TYPE);
}
} }
...@@ -668,7 +668,9 @@ public class DefaultDashChunkSource implements DashChunkSource { ...@@ -668,7 +668,9 @@ public class DefaultDashChunkSource implements DashChunkSource {
ImmutableMap<@CmcdConfiguration.HeaderKey String, String> httpRequestHeaders = ImmutableMap<@CmcdConfiguration.HeaderKey String, String> httpRequestHeaders =
cmcdHeadersFactory == null cmcdHeadersFactory == null
? ImmutableMap.of() ? ImmutableMap.of()
: cmcdHeadersFactory.createHttpRequestHeaders(); : cmcdHeadersFactory
.setObjectType(CmcdHeadersFactory.OBJECT_TYPE_INIT_SEGMENT)
.createHttpRequestHeaders();
DataSpec dataSpec = DataSpec dataSpec =
DashUtil.buildDataSpec( DashUtil.buildDataSpec(
representation, representation,
...@@ -712,6 +714,7 @@ public class DefaultDashChunkSource implements DashChunkSource { ...@@ -712,6 +714,7 @@ public class DefaultDashChunkSource implements DashChunkSource {
? ImmutableMap.of() ? ImmutableMap.of()
: cmcdHeadersFactory : cmcdHeadersFactory
.setChunkDurationUs(endTimeUs - startTimeUs) .setChunkDurationUs(endTimeUs - startTimeUs)
.setObjectType(CmcdHeadersFactory.getObjectType(trackSelection))
.createHttpRequestHeaders(); .createHttpRequestHeaders();
DataSpec dataSpec = DataSpec dataSpec =
DashUtil.buildDataSpec( DashUtil.buildDataSpec(
...@@ -761,6 +764,7 @@ public class DefaultDashChunkSource implements DashChunkSource { ...@@ -761,6 +764,7 @@ public class DefaultDashChunkSource implements DashChunkSource {
? ImmutableMap.of() ? ImmutableMap.of()
: cmcdHeadersFactory : cmcdHeadersFactory
.setChunkDurationUs(endTimeUs - startTimeUs) .setChunkDurationUs(endTimeUs - startTimeUs)
.setObjectType(CmcdHeadersFactory.getObjectType(trackSelection))
.createHttpRequestHeaders(); .createHttpRequestHeaders();
DataSpec dataSpec = DataSpec dataSpec =
DashUtil.buildDataSpec( DashUtil.buildDataSpec(
......
...@@ -314,7 +314,7 @@ public class DefaultDashChunkSourceTest { ...@@ -314,7 +314,7 @@ public class DefaultDashChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=700,tb=1300,d=4000", "br=700,tb=1300,d=4000,ot=v",
"CMCD-Request", "CMCD-Request",
"bl=0,mtp=1000", "bl=0,mtp=1000",
"CMCD-Session", "CMCD-Session",
...@@ -359,7 +359,7 @@ public class DefaultDashChunkSourceTest { ...@@ -359,7 +359,7 @@ public class DefaultDashChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=700,tb=1300,d=4000", "br=700,tb=1300,d=4000,ot=v",
"CMCD-Request", "CMCD-Request",
"bl=0,mtp=1000", "bl=0,mtp=1000",
"CMCD-Session", "CMCD-Session",
...@@ -405,7 +405,7 @@ public class DefaultDashChunkSourceTest { ...@@ -405,7 +405,7 @@ public class DefaultDashChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=700,tb=1300,d=4000,key1=value1", "br=700,tb=1300,d=4000,ot=v,key1=value1",
"CMCD-Request", "CMCD-Request",
"bl=0,mtp=1000,key2=\"stringValue\"", "bl=0,mtp=1000,key2=\"stringValue\"",
"CMCD-Session", "CMCD-Session",
......
...@@ -46,6 +46,7 @@ import com.google.android.exoplayer2.upstream.CmcdHeadersFactory; ...@@ -46,6 +46,7 @@ import com.google.android.exoplayer2.upstream.CmcdHeadersFactory;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.TimestampAdjuster; import com.google.android.exoplayer2.util.TimestampAdjuster;
import com.google.android.exoplayer2.util.UriUtil; import com.google.android.exoplayer2.util.UriUtil;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
...@@ -492,25 +493,31 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -492,25 +493,31 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
cmcdConfiguration == null cmcdConfiguration == null
? null ? null
: new CmcdHeadersFactory( : new CmcdHeadersFactory(
cmcdConfiguration, cmcdConfiguration,
trackSelection, trackSelection,
bufferedDurationUs, bufferedDurationUs,
/* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_HLS, /* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_HLS,
/* isLive= */ !playlist.hasEndTag); /* isLive= */ !playlist.hasEndTag)
.setObjectType(
getIsMuxedAudioAndVideo()
? CmcdHeadersFactory.OBJECT_TYPE_MUXED_AUDIO_AND_VIDEO
: CmcdHeadersFactory.getObjectType(trackSelection));
// Check if the media segment or its initialization segment are fully encrypted. // Check if the media segment or its initialization segment are fully encrypted.
@Nullable @Nullable
Uri initSegmentKeyUri = Uri initSegmentKeyUri =
getFullEncryptionKeyUri(playlist, segmentBaseHolder.segmentBase.initializationSegment); getFullEncryptionKeyUri(playlist, segmentBaseHolder.segmentBase.initializationSegment);
out.chunk = out.chunk =
maybeCreateEncryptionChunkFor(initSegmentKeyUri, selectedTrackIndex, cmcdHeadersFactory); maybeCreateEncryptionChunkFor(
initSegmentKeyUri, selectedTrackIndex, /* isInitSegment= */ true, cmcdHeadersFactory);
if (out.chunk != null) { if (out.chunk != null) {
return; return;
} }
@Nullable @Nullable
Uri mediaSegmentKeyUri = getFullEncryptionKeyUri(playlist, segmentBaseHolder.segmentBase); Uri mediaSegmentKeyUri = getFullEncryptionKeyUri(playlist, segmentBaseHolder.segmentBase);
out.chunk = out.chunk =
maybeCreateEncryptionChunkFor(mediaSegmentKeyUri, selectedTrackIndex, cmcdHeadersFactory); maybeCreateEncryptionChunkFor(
mediaSegmentKeyUri, selectedTrackIndex, /* isInitSegment= */ false, cmcdHeadersFactory);
if (out.chunk != null) { if (out.chunk != null) {
return; return;
} }
...@@ -549,6 +556,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -549,6 +556,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
cmcdHeadersFactory); cmcdHeadersFactory);
} }
private boolean getIsMuxedAudioAndVideo() {
Format format = trackGroup.getFormat(trackSelection.getSelectedIndex());
String audioMimeType = MimeTypes.getAudioMediaMimeType(format.codecs);
String videoMimeType = MimeTypes.getVideoMediaMimeType(format.codecs);
return audioMimeType != null && videoMimeType != null;
}
@Nullable @Nullable
private static SegmentBaseHolder getNextSegmentHolder( private static SegmentBaseHolder getNextSegmentHolder(
HlsMediaPlaylist mediaPlaylist, long nextMediaSequence, int nextPartIndex) { HlsMediaPlaylist mediaPlaylist, long nextMediaSequence, int nextPartIndex) {
...@@ -856,6 +870,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -856,6 +870,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private Chunk maybeCreateEncryptionChunkFor( private Chunk maybeCreateEncryptionChunkFor(
@Nullable Uri keyUri, @Nullable Uri keyUri,
int selectedTrackIndex, int selectedTrackIndex,
boolean isInitSegment,
@Nullable CmcdHeadersFactory cmcdHeadersFactory) { @Nullable CmcdHeadersFactory cmcdHeadersFactory) {
if (keyUri == null) { if (keyUri == null) {
return null; return null;
...@@ -869,10 +884,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -869,10 +884,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
keyCache.put(keyUri, encryptionKey); keyCache.put(keyUri, encryptionKey);
return null; return null;
} }
ImmutableMap<@CmcdConfiguration.HeaderKey String, String> httpRequestHeaders = ImmutableMap<@CmcdConfiguration.HeaderKey String, String> httpRequestHeaders =
cmcdHeadersFactory == null ImmutableMap.of();
? ImmutableMap.of() if (cmcdHeadersFactory != null) {
: cmcdHeadersFactory.createHttpRequestHeaders(); if (isInitSegment) {
cmcdHeadersFactory.setObjectType(CmcdHeadersFactory.OBJECT_TYPE_INIT_SEGMENT);
}
httpRequestHeaders = cmcdHeadersFactory.createHttpRequestHeaders();
}
DataSpec dataSpec = DataSpec dataSpec =
new DataSpec.Builder() new DataSpec.Builder()
.setUri(keyUri) .setUri(keyUri)
......
...@@ -149,8 +149,19 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -149,8 +149,19 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
? getEncryptionIvArray(Assertions.checkNotNull(initSegment.encryptionIV)) ? getEncryptionIvArray(Assertions.checkNotNull(initSegment.encryptionIV))
: null; : null;
Uri initSegmentUri = UriUtil.resolveToUri(mediaPlaylist.baseUri, initSegment.url); Uri initSegmentUri = UriUtil.resolveToUri(mediaPlaylist.baseUri, initSegment.url);
ImmutableMap<@CmcdConfiguration.HeaderKey String, String> initHttpRequestHeaders =
cmcdHeadersFactory == null
? ImmutableMap.of()
: cmcdHeadersFactory
.setObjectType(CmcdHeadersFactory.OBJECT_TYPE_INIT_SEGMENT)
.createHttpRequestHeaders();
initDataSpec = initDataSpec =
new DataSpec(initSegmentUri, initSegment.byteRangeOffset, initSegment.byteRangeLength); new DataSpec.Builder()
.setUri(initSegmentUri)
.setPosition(initSegment.byteRangeOffset)
.setLength(initSegment.byteRangeLength)
.setHttpRequestHeaders(initHttpRequestHeaders)
.build();
initDataSource = buildDataSource(dataSource, initSegmentKey, initSegmentIv); initDataSource = buildDataSource(dataSource, initSegmentKey, initSegmentIv);
} }
......
...@@ -210,7 +210,7 @@ public class HlsChunkSourceTest { ...@@ -210,7 +210,7 @@ public class HlsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=800,tb=800,d=4000", "br=800,tb=800,d=4000,ot=v",
"CMCD-Request", "CMCD-Request",
"bl=0", "bl=0",
"CMCD-Session", "CMCD-Session",
...@@ -256,7 +256,7 @@ public class HlsChunkSourceTest { ...@@ -256,7 +256,7 @@ public class HlsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=800,tb=800,d=4000", "br=800,tb=800,d=4000,ot=v",
"CMCD-Request", "CMCD-Request",
"bl=0", "bl=0",
"CMCD-Session", "CMCD-Session",
...@@ -303,7 +303,7 @@ public class HlsChunkSourceTest { ...@@ -303,7 +303,7 @@ public class HlsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=800,tb=800,d=4000,key1=value1", "br=800,tb=800,d=4000,ot=v,key1=value1",
"CMCD-Request", "CMCD-Request",
"bl=0,key2=\"stringValue\"", "bl=0,key2=\"stringValue\"",
"CMCD-Session", "CMCD-Session",
......
...@@ -296,7 +296,8 @@ public class DefaultSsChunkSource implements SsChunkSource { ...@@ -296,7 +296,8 @@ public class DefaultSsChunkSource implements SsChunkSource {
bufferedDurationUs, bufferedDurationUs,
/* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_SS, /* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_SS,
/* isLive= */ manifest.isLive) /* isLive= */ manifest.isLive)
.setChunkDurationUs(chunkEndTimeUs - chunkStartTimeUs); .setChunkDurationUs(chunkEndTimeUs - chunkStartTimeUs)
.setObjectType(CmcdHeadersFactory.getObjectType(trackSelection));
out.chunk = out.chunk =
newMediaChunk( newMediaChunk(
......
...@@ -64,7 +64,7 @@ public class DefaultSsChunkSourceTest { ...@@ -64,7 +64,7 @@ public class DefaultSsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=308,tb=1536,d=1968", "br=308,tb=1536,d=1968,ot=v",
"CMCD-Request", "CMCD-Request",
"bl=0,mtp=1000", "bl=0,mtp=1000",
"CMCD-Session", "CMCD-Session",
...@@ -109,7 +109,7 @@ public class DefaultSsChunkSourceTest { ...@@ -109,7 +109,7 @@ public class DefaultSsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=308,tb=1536,d=1968", "br=308,tb=1536,d=1968,ot=v",
"CMCD-Request", "CMCD-Request",
"bl=0,mtp=1000", "bl=0,mtp=1000",
"CMCD-Session", "CMCD-Session",
...@@ -155,7 +155,7 @@ public class DefaultSsChunkSourceTest { ...@@ -155,7 +155,7 @@ public class DefaultSsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders) assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly( .containsExactly(
"CMCD-Object", "CMCD-Object",
"br=308,tb=1536,d=1968,key1=value1", "br=308,tb=1536,d=1968,ot=v,key1=value1",
"CMCD-Request", "CMCD-Request",
"bl=0,mtp=1000,key2=\"stringValue\"", "bl=0,mtp=1000,key2=\"stringValue\"",
"CMCD-Session", "CMCD-Session",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment