Skip to content

Commit 411e7a8

Browse files
committed
Add snippets for xr DRM
1 parent 5fdf7e6 commit 411e7a8

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
accompanist = "0.36.0"
33
activityKtx = "1.10.1"
44
android-googleid = "1.1.1"
5-
androidGradlePlugin = "8.10.0"
5+
androidGradlePlugin = "8.11.1"
66
androidx-activity-compose = "1.10.1"
77
androidx-appcompat = "1.7.0"
88
androidx-compose-bom = "2025.05.00"

xr/src/main/java/com/example/xr/compose/SpatialExternalSurface.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ import androidx.compose.runtime.ExperimentalComposeApi
2323
import androidx.compose.runtime.remember
2424
import androidx.compose.ui.platform.LocalContext
2525
import androidx.compose.ui.unit.dp
26+
import androidx.media3.common.C
2627
import androidx.media3.common.MediaItem
2728
import androidx.media3.exoplayer.ExoPlayer
2829
import androidx.xr.compose.spatial.Subspace
2930
import androidx.xr.compose.subspace.SpatialExternalSurface
3031
import androidx.xr.compose.subspace.StereoMode
32+
import androidx.xr.compose.subspace.SurfaceProtection
3133
import androidx.xr.compose.subspace.layout.SubspaceModifier
3234
import androidx.xr.compose.subspace.layout.height
3335
import androidx.xr.compose.subspace.layout.width
@@ -72,3 +74,47 @@ fun SpatialExternalSurfaceContent() {
7274
}
7375
}
7476
// [END androidxr_compose_SpatialExternalSurfaceStereo]
77+
78+
// [START androidxr_compose_SpatialExternalSurfaceDRM]
79+
@OptIn(ExperimentalComposeApi::class)
80+
@Suppress("RestrictedApi") // b/416066566
81+
@Composable
82+
fun DrmSpatialVideoPlayer() {
83+
val context = LocalContext.current
84+
Subspace {
85+
SpatialExternalSurface(
86+
modifier = SubspaceModifier
87+
.width(1200.dp)
88+
.height(676.dp),
89+
stereoMode = StereoMode.SideBySide,
90+
surfaceProtection = SurfaceProtection.Protected
91+
) {
92+
val exoPlayer = remember { ExoPlayer.Builder(context).build() }
93+
94+
// Define the URI for your DRM-protected content and license server.
95+
val videoUri = "https://your-content-provider.com/video.mpd"
96+
val drmLicenseUrl = "https://your-license-server.com/license"
97+
98+
// Build a MediaItem with the necessary DRM configuration.
99+
val mediaItem = MediaItem.Builder()
100+
.setUri(videoUri)
101+
.setDrmConfiguration(
102+
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
103+
.setLicenseUri(drmLicenseUrl)
104+
.build()
105+
)
106+
.build()
107+
108+
onSurfaceCreated { surface ->
109+
// The created surface is secure and can be used by the player.
110+
exoPlayer.setVideoSurface(surface)
111+
exoPlayer.setMediaItem(mediaItem)
112+
exoPlayer.prepare()
113+
exoPlayer.play()
114+
}
115+
116+
onSurfaceDestroyed { exoPlayer.release() }
117+
}
118+
}
119+
}
120+
// [END androidxr_compose_SpatialExternalSurfaceDRM]

xr/src/main/java/com/example/xr/scenecore/SpatialVideo.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.example.xr.scenecore
1919
import android.content.ContentResolver
2020
import android.net.Uri
2121
import androidx.activity.ComponentActivity
22+
import androidx.media3.common.C
2223
import androidx.media3.common.MediaItem
2324
import androidx.media3.exoplayer.ExoPlayer
2425
import androidx.xr.runtime.Session
@@ -109,3 +110,43 @@ private fun ComponentActivity.surfaceEntityCreateMVHEVC(xrSession: Session) {
109110
exoPlayer.play()
110111
// [END androidxr_scenecore_surfaceEntityCreateMVHEVC]
111112
}
113+
114+
@Suppress("RestrictedApi") // b/416066566
115+
private fun ComponentActivity.surfaceEntityCreateDRM(xrSession: Session) {
116+
// [START androidxr_scenecore_surfaceEntityCreateDRM]
117+
// Create a SurfaceEntity with DRM content
118+
119+
// Define the URI for your DRM-protected content and license server.
120+
val videoUri = "https://your-content-provider.com/video.mpd"
121+
val drmLicenseUrl = "https://your-license-server.com/license"
122+
123+
// Create the SurfaceEntity with the PROTECTED content security level.
124+
val protectedSurfaceEntity = SurfaceEntity.create(
125+
session = xrSession,
126+
stereoMode = SurfaceEntity.StereoMode.SIDE_BY_SIDE,
127+
pose = Pose(Vector3(0.0f, 0.0f, -1.5f)),
128+
canvasShape = SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f),
129+
contentSecurityLevel = SurfaceEntity.ContentSecurityLevel.PROTECTED
130+
)
131+
132+
// Build a MediaItem with the necessary DRM configuration.
133+
val mediaItem = MediaItem.Builder()
134+
.setUri(videoUri)
135+
.setDrmConfiguration(
136+
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
137+
.setLicenseUri(drmLicenseUrl)
138+
.build()
139+
)
140+
.build()
141+
142+
// Initialize ExoPlayer and set the protected surface.
143+
val exoPlayer = ExoPlayer.Builder(this).build()
144+
exoPlayer.setVideoSurface(protectedSurfaceEntity.getSurface())
145+
146+
// Set the media item and start playback.
147+
exoPlayer.setMediaItem(mediaItem)
148+
exoPlayer.prepare()
149+
exoPlayer.play()
150+
151+
// [END androidxr_scenecore_surfaceEntityCreateDRM]
152+
}

0 commit comments

Comments
 (0)