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 {
KEY_VERSION,
KEY_TOP_BITRATE,
KEY_OBJECT_DURATION,
KEY_MEASURED_THROUGHPUT
KEY_MEASURED_THROUGHPUT,
KEY_OBJECT_TYPE
})
@Documented
@Target(TYPE_USE)
......@@ -96,6 +97,7 @@ public final class CmcdConfiguration {
public static final String KEY_TOP_BITRATE = "tb";
public static final String KEY_OBJECT_DURATION = "d";
public static final String KEY_MEASURED_THROUGHPUT = "mtp";
public static final String KEY_OBJECT_TYPE = "ot";
/**
* Factory for {@link CmcdConfiguration} instances.
......@@ -295,4 +297,12 @@ public final class CmcdConfiguration {
public boolean isMeasuredThroughputLoggingAllowed() {
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 {
ImmutableMap<@CmcdConfiguration.HeaderKey String, String> httpRequestHeaders =
cmcdHeadersFactory == null
? ImmutableMap.of()
: cmcdHeadersFactory.createHttpRequestHeaders();
: cmcdHeadersFactory
.setObjectType(CmcdHeadersFactory.OBJECT_TYPE_INIT_SEGMENT)
.createHttpRequestHeaders();
DataSpec dataSpec =
DashUtil.buildDataSpec(
representation,
......@@ -712,6 +714,7 @@ public class DefaultDashChunkSource implements DashChunkSource {
? ImmutableMap.of()
: cmcdHeadersFactory
.setChunkDurationUs(endTimeUs - startTimeUs)
.setObjectType(CmcdHeadersFactory.getObjectType(trackSelection))
.createHttpRequestHeaders();
DataSpec dataSpec =
DashUtil.buildDataSpec(
......@@ -761,6 +764,7 @@ public class DefaultDashChunkSource implements DashChunkSource {
? ImmutableMap.of()
: cmcdHeadersFactory
.setChunkDurationUs(endTimeUs - startTimeUs)
.setObjectType(CmcdHeadersFactory.getObjectType(trackSelection))
.createHttpRequestHeaders();
DataSpec dataSpec =
DashUtil.buildDataSpec(
......
......@@ -314,7 +314,7 @@ public class DefaultDashChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=700,tb=1300,d=4000",
"br=700,tb=1300,d=4000,ot=v",
"CMCD-Request",
"bl=0,mtp=1000",
"CMCD-Session",
......@@ -359,7 +359,7 @@ public class DefaultDashChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=700,tb=1300,d=4000",
"br=700,tb=1300,d=4000,ot=v",
"CMCD-Request",
"bl=0,mtp=1000",
"CMCD-Session",
......@@ -405,7 +405,7 @@ public class DefaultDashChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=700,tb=1300,d=4000,key1=value1",
"br=700,tb=1300,d=4000,ot=v,key1=value1",
"CMCD-Request",
"bl=0,mtp=1000,key2=\"stringValue\"",
"CMCD-Session",
......
......@@ -46,6 +46,7 @@ import com.google.android.exoplayer2.upstream.CmcdHeadersFactory;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DataSpec;
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.UriUtil;
import com.google.android.exoplayer2.util.Util;
......@@ -492,25 +493,31 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
cmcdConfiguration == null
? null
: new CmcdHeadersFactory(
cmcdConfiguration,
trackSelection,
bufferedDurationUs,
/* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_HLS,
/* isLive= */ !playlist.hasEndTag);
cmcdConfiguration,
trackSelection,
bufferedDurationUs,
/* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_HLS,
/* 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.
@Nullable
Uri initSegmentKeyUri =
getFullEncryptionKeyUri(playlist, segmentBaseHolder.segmentBase.initializationSegment);
out.chunk =
maybeCreateEncryptionChunkFor(initSegmentKeyUri, selectedTrackIndex, cmcdHeadersFactory);
maybeCreateEncryptionChunkFor(
initSegmentKeyUri, selectedTrackIndex, /* isInitSegment= */ true, cmcdHeadersFactory);
if (out.chunk != null) {
return;
}
@Nullable
Uri mediaSegmentKeyUri = getFullEncryptionKeyUri(playlist, segmentBaseHolder.segmentBase);
out.chunk =
maybeCreateEncryptionChunkFor(mediaSegmentKeyUri, selectedTrackIndex, cmcdHeadersFactory);
maybeCreateEncryptionChunkFor(
mediaSegmentKeyUri, selectedTrackIndex, /* isInitSegment= */ false, cmcdHeadersFactory);
if (out.chunk != null) {
return;
}
......@@ -549,6 +556,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
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
private static SegmentBaseHolder getNextSegmentHolder(
HlsMediaPlaylist mediaPlaylist, long nextMediaSequence, int nextPartIndex) {
......@@ -856,6 +870,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
private Chunk maybeCreateEncryptionChunkFor(
@Nullable Uri keyUri,
int selectedTrackIndex,
boolean isInitSegment,
@Nullable CmcdHeadersFactory cmcdHeadersFactory) {
if (keyUri == null) {
return null;
......@@ -869,10 +884,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
keyCache.put(keyUri, encryptionKey);
return null;
}
ImmutableMap<@CmcdConfiguration.HeaderKey String, String> httpRequestHeaders =
cmcdHeadersFactory == null
? ImmutableMap.of()
: cmcdHeadersFactory.createHttpRequestHeaders();
ImmutableMap.of();
if (cmcdHeadersFactory != null) {
if (isInitSegment) {
cmcdHeadersFactory.setObjectType(CmcdHeadersFactory.OBJECT_TYPE_INIT_SEGMENT);
}
httpRequestHeaders = cmcdHeadersFactory.createHttpRequestHeaders();
}
DataSpec dataSpec =
new DataSpec.Builder()
.setUri(keyUri)
......
......@@ -149,8 +149,19 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
? getEncryptionIvArray(Assertions.checkNotNull(initSegment.encryptionIV))
: null;
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 =
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);
}
......
......@@ -210,7 +210,7 @@ public class HlsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=800,tb=800,d=4000",
"br=800,tb=800,d=4000,ot=v",
"CMCD-Request",
"bl=0",
"CMCD-Session",
......@@ -256,7 +256,7 @@ public class HlsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=800,tb=800,d=4000",
"br=800,tb=800,d=4000,ot=v",
"CMCD-Request",
"bl=0",
"CMCD-Session",
......@@ -303,7 +303,7 @@ public class HlsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=800,tb=800,d=4000,key1=value1",
"br=800,tb=800,d=4000,ot=v,key1=value1",
"CMCD-Request",
"bl=0,key2=\"stringValue\"",
"CMCD-Session",
......
......@@ -296,7 +296,8 @@ public class DefaultSsChunkSource implements SsChunkSource {
bufferedDurationUs,
/* streamingFormat= */ CmcdHeadersFactory.STREAMING_FORMAT_SS,
/* isLive= */ manifest.isLive)
.setChunkDurationUs(chunkEndTimeUs - chunkStartTimeUs);
.setChunkDurationUs(chunkEndTimeUs - chunkStartTimeUs)
.setObjectType(CmcdHeadersFactory.getObjectType(trackSelection));
out.chunk =
newMediaChunk(
......
......@@ -64,7 +64,7 @@ public class DefaultSsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=308,tb=1536,d=1968",
"br=308,tb=1536,d=1968,ot=v",
"CMCD-Request",
"bl=0,mtp=1000",
"CMCD-Session",
......@@ -109,7 +109,7 @@ public class DefaultSsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=308,tb=1536,d=1968",
"br=308,tb=1536,d=1968,ot=v",
"CMCD-Request",
"bl=0,mtp=1000",
"CMCD-Session",
......@@ -155,7 +155,7 @@ public class DefaultSsChunkSourceTest {
assertThat(output.chunk.dataSpec.httpRequestHeaders)
.containsExactly(
"CMCD-Object",
"br=308,tb=1536,d=1968,key1=value1",
"br=308,tb=1536,d=1968,ot=v,key1=value1",
"CMCD-Request",
"bl=0,mtp=1000,key2=\"stringValue\"",
"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