...
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Cobalt participant Starboard participant GStreamer_client participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant GStreamer_server end box == Create Media Pipeline == Cobalt -> Starboard: SbPlayerCreate(media_keys_handle, video_info, audio_info) Starboard -> GStreamer_client: Create Gst pipeline with Rialto sinks activate GStreamer_client noteopt rightmaxWidth of GStreamer_client AsStarboard the Gst pipeline is brought up the creation of the-> first rialto sink for a pipeline triggers the createMediaPipeline() call. Creation of additional rialto sinks increments a ref count to the media pipeline. To identify which pipeline a sink relates to it will pass a unique ID for that pipeline which is TBD but could be pointer to the pipeline root element or the gstreamer pipeline bus handle. For now videoRequirements can be set to 2160x3840 until resource management comes into scope. end note GStreamer_client -> rialtoClient: createMediaPipeline(client, videoRequirements) rialtoClient -> rialtoServer: createMediaPipeline(client, videoRequirements) rialtoServer -> rialtoServer: Check resource permissions that were granted to app and currently\nallocated pipelines allows creation of this new pipeline note left: Currently this check is simply num_current_pipeline_sessions < max_playback_sessions opt Permission check passed rialtoServer GStreamer_client: Set PROP_MAX_VIDEO_WIDTH end opt maxHeight Starboard -> GStreamer_client: Set PROP_MAX_VIDEO_HEIGHT end note right of GStreamer_client As the Gst pipeline is brought up the creation of the first rialto sink for a pipeline triggers the createMediaPipeline() call. Creation of additional rialto sinks increments a ref count to the media pipeline. To identify which pipeline a sink relates to it will pass the parent bin object pointer to the pipeline root element. end note note right of GStreamer_client If max width and max height are not set by the client the mediaPipeline shall be created with videoRequirements set to 2160x3840. If max width and max height are set, then rialto shall assume the playback is secondary video. end note GStreamer_client -> rialtoClient: createMediaPipeline(client, videoRequirements) rialtoClient -> rialtoServer: Store video requirementscreateMediaPipeline(client, videoRequirements) rialtoServer --> rialtoClient rialtoServer: pipeline_session rialtoClient --> GStreamer_client: pipeline_session GStreamer_client -> rialtoClient: load(pipeline_session, MEDIA_TYPE_MSE, ~"", ~""). rialtoClientCheck resource permissions that were granted to app and currently\nallocated pipelines allows creation of this new pipeline note left: Currently this check is simply num_current_pipeline_sessions < max_playback_sessions opt Permission check passed rialtoServer -> rialtoServer: load(pipeline_session, MEDIA_TYPE_MSE, ~"", ~"")Store video requirements rialtoServer --> GStreamer_serverrialtoClient: Create rialto server MSE pipeline GStreamer_server_session rialtoClient --> rialtoServer: rialtoServer -/GStreamer_client: pipeline_session GStreamer_client -> rialtoClient: notifyNetworkStateload(pipeline_session, NETWORKMEDIA_STATE_BUFFERING)TYPE_MSE, ~"", ~""). rialtoClient -/> GStreamer_clientrialtoServer: notifyNetworkState load(pipeline_session, NETWORKMEDIA_STATE_BUFFERINGTYPE_MSE, ~"", ~"") rialtoServer --> rialtoClientGStreamer_server: Create rialto server MSE pipeline rialtoClientGStreamer_server --> GStreamer_clientrialtoServer: opt videoRequirements video_codec != None GStreamer_client2160x3840 && westerossink rialtoServer -> rialtoClient GStreamer_server: Set secondary video GStreamer_server attachSource(pipeline_session, video_source) rialtoClient--> rialtoServer: end rialtoServer ->/ rialtoServerrialtoClient: attachSourcenotifyNetworkState(pipeline_session, videoNETWORK_STATE_sourceBUFFERING) rialtoServerrialtoClient ->/ GStreamer_serverclient: Add video sink to pipeline GStreamer_server --> rialtoServer:notifyNetworkState(pipeline_session, NETWORK_STATE_BUFFERING) rialtoServer --> rialtoClient: rialtoClient --> GStreamer_client: end opt audiovideo_codec != None GStreamer_client -> rialtoClient: attachSource(pipeline_session, audiovideo_source) rialtoClient -> rialtoServer: attachSource(pipeline_session, audiovideo_source) rialtoServer -> GStreamer_server: Add audiovideo sink to pipeline GStreamer_server --> rialtoServer: rialtoServer --> rialtoClient: rialtoClient --> GStreamer_client: end deactivateopt GStreamer_client audio_codec != None GStreamer_client --> Starboard Starboard rialtoClient: attachSource(pipeline_session, audio_source) rialtoClient --> Cobalt: == Notify that Pipeline & network session is currently IDLE == rialtoServer: attachSource(pipeline_session, audio_source) rialtoServer -/> rialtoClientGStreamer_server: Add audio sink notifyNetworkState(NETWORK_STATE_IDLE) note right Note that notification may occur before createMediaPipeline() call returns end note to pipeline GStreamer_server --> rialtoServer: rialtoServer --> rialtoClient: rialtoClient --/ > GStreamer_client: notifyNetworkState(NETWORK_STATE_IDLE) end rialtoServerrialtoClient -/> rialtoServer: rialtoClient: notifyPlaybackStateallSourcesAttached(PLAYBACKpipeline_STATE_IDLEsession) noterialtoServer right Note that notification may occur before-> createMediaPipeline() call returns end note rialtoClient -/ GStreamer_client: notifyPlaybackState(PLAYBACK_STATE_IDLE) else Permission check failed GStreamer_server: Setup and add app source GStreamer_server --> rialtoServer: rialtoServer --> rialtoClient: deactivate GStreamer_client GStreamer_client --> ERROR_DENIED rialtoClientStarboard Starboard --> GStreamer_client: ERROR_DENIEDCobalt: end @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Cobalt participant Starboard participant GStreamer_client participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant GStreamer_server end box Cobalt == Notify that Pipeline & network session is currently IDLE == rialtoServer ->/ StarboardrialtoClient: SbPlayerDestroy(player_session) Starboard -> GStreamer_client: Destroy Rialto Client Gst pipeline activate GStreamer_client note right of GStreamer_client As each rialto sink is freed it will decrement the ref count to its media player (via the TBD unique pipeline ID). When the ref count reaches zero the destructor is triggered. end note GStreamer_client -> rialtoClient: ~IMediaPipeline() deactivate GStreamer_client rialtoClient -> rialtoServer: ~IMediaPipeline() rialtoServer -> GStreamer_server: Destroy rialto server pipeline GStreamer_server --> rialtoServer: notifyNetworkState(NETWORK_STATE_IDLE) note right Note that notification may occur before createMediaPipeline() call returns end note rialtoClient -/ GStreamer_client: notifyNetworkState(NETWORK_STATE_IDLE) rialtoServer -/ rialtoClient: notifyPlaybackState(PLAYBACK_STATE_IDLE) note right Note that notification may occur before createMediaPipeline() call returns end note rialtoClient -/ GStreamer_client: notifyPlaybackState(PLAYBACK_STATE_IDLE) else Permission check failed rialtoServer --> rialtoClient: ERROR_DENIED rialtoClient --> GStreamer_client: GStreamer_client --> Starboard Starboard --> Cobalt: ERROR_DENIED end @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant ClientCobalt participant Starboard participant GStreamer_client participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant OcdmGStreamer_server end box altCobalt Client should check if the required key system is supported Client -> Starboard: -> rialtoClient: supportsKeySystemSbPlayerDestroy(keyplayer_systemsession) rialtoClient ->Starboard rialtoServer: supportsKeySystem(key_system) rialtoServer -> OcdmGStreamer_client: Destroy Rialto Client Gst pipeline activate GStreamer_client note right of opencdm_is_type_supported(key_system, "") Ocdm --> rialtoServer: result rialtoServer --> rialtoClient: result rialtoClient --> Client: result else Or find the supported key systems then choose its preferred Client GStreamer_client As each rialto sink is freed it will decrement the ref count to its media player (via the TBD unique pipeline ID). When the ref count reaches zero the destructor is triggered. end note GStreamer_client -> rialtoClient: ~IMediaPipeline() deactivate GStreamer_client rialtoClient -> rialtoClientrialtoServer: getSupportedKeySystems ~IMediaPipeline() rialtoClientrialtoServer -> rialtoServer: getSupportedKeySystems() loop For each key system supported by Rialto rialtoServer -> Ocdm: -> GStreamer_server: Destroy rialto server pipeline GStreamer_server --> rialtoServer: rialtoServer --> rialtoClient: opencdm_is_type_supported(key_system, "") Ocdm rialtoClient --> rialtoServerGStreamer_client: result opt If key_system supported rialtoServerGStreamer_client --> Starboard Starboard rialtoServer: Add key_system to array of supported keys systems end end rialtoServer --> rialtoClientCobalt: key_systems rialtoClient --> Client: key_systems end @enduml |
...
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant NetflixClient participant DPI participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Netflixalt Client should check if the ->required key DPI:system getDrmVersion() DPIis supported Client -> rialtoClient: getSupportedKeySystemVersion("com.netflix.playready"supportsKeySystem(key_system) rialtoClient -> rialtoServer: getSupportedKeySystemVersionsupportsKeySystem(key_system) rialtoServer -> Ocdm: opencdm_createis_type_systemsupported(key_system, ""); noteOcdm right: This temporary media keys does not count towards\nany quota allocated by Rialto Server Manager Ocdm --> rialtoServer: result rialtoServer --> rialtoServerrialtoClient: media_keysresult rialtoServerrialtoClient --> Client: Ocdm: result else Or opencdm_system_get_version(media_keys) Ocdm --> rialtoServer: version rialtoServer -> find the supported key systems then choose its preferred Client -> rialtoClient: getSupportedKeySystems() rialtoClient -> rialtoServer: getSupportedKeySystems() loop For each key system supported by Rialto rialtoServer -> Ocdm: opencdm_destructis_type_systemsupported(media_keyskey_system, "") Ocdm --> rialtoServer: statusresult opt KeyIf key_system version retrieved successfullysupported rialtoServer --> rialtoClient rialtoServer: rv=true, version else Error queryingAdd key_system to array of supported key system versionkeys systems end end rialtoServer --> rialtoClient: rv=false, version="" end key_systems rialtoClient --> DPIClient: rv, version DPI --> Netflix: rv, version @enduml |
...
key_systems
end
@enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant CobaltNetflix participant Starboard participant ocdmProxyDPI participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box CobaltNetflix -> StarboardDPI: SbDrmCreateSystem(key_system getDrmVersion() StarboardDPI -> ocdmProxy: opencdm_create_system(key_system) ocdmProxy -> rialtoClient: createMediaKeys(key_systemgetSupportedKeySystemVersion("com.netflix.playready") rialtoClient -> rialtoServer: createMediaKeysgetSupportedKeySystemVersion(key_system) rialtoServer -> Ocdm: opencdm_create_system(key_system) Ocdm --> rialtoServer: handle rialtoServer -> rialtoServer: Store Media Keys instance handle note right This stored handle is only needed for deleting any MediaKeys objects that the client fails to destroy when moved out of the Running state. end note rialtoServer --> rialtoClient: media_keys_handle rialtoClient --> ocdmProxy: media_keys_handle ocdmProxy; note right: This temporary media keys does not count towards\nany quota allocated by Rialto Server Manager Ocdm --> rialtoServer: media_keys rialtoServer -> Ocdm: opencdm_system_get_version(media_keys) Ocdm --> rialtoServer: version rialtoServer -> Ocdm: opencdm_destruct_system(media_keys) Ocdm --> StarboardrialtoServer: status opt Key system handle Starboardversion retrieved successfully rialtoServer --> CobaltrialtoClient: rv=true, version else Error querying supported key system handle @enduml |
version
rialtoServer --> rialtoClient: rv=false, version=""
end
rialtoClient --> DPI: rv, version
DPI --> Netflix: rv, version
@enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml
autonumber
box "Container" #LightGreen
participant Cobalt
participant Starboard
participant ocdmProxy
participant rialtoClient
end box
box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box
Cobalt -> Starboard: SbDrmCreateSystem(key_system)
Starboard -> ocdmProxy: opencdm_create_system(key_system)
ocdmProxy -> rialtoClient: createMediaKeys(key_system)
rialtoClient -> rialtoServer: createMediaKeys(key_system)
rialtoServer -> Ocdm: opencdm_create_system(key_system)
Ocdm --> rialtoServer: handle
rialtoServer -> rialtoServer: Store Media Keys instance handle
note right
This stored handle is only needed for deleting any
MediaKeys objects that the client fails to destroy
when moved out of the Running state.
end note
rialtoServer --> rialtoClient: media_keys_handle
rialtoClient --> ocdmProxy: media_keys_handle
ocdmProxy --> Starboard: handle
Starboard --> Cobalt: handle
@enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml
autonumber
box "Container" #LightGreen
participant Netflix
participant DPI
participant rialtoClient
end box
box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box
Netflix -> DPI: initialize(drmSystemCallback, provisioningEngine)
DPI -> rialtoClient: createMediaKeys("com.netflix.playready")
rialtoClient -> rialtoServer: createMediaKeys(key_system)
rialtoServer -> Ocdm: opencdm_create_system(key_system)
Ocdm --> rialtoServer: handle
rialtoServer -> rialtoServer: Store Media Keys instance handle
note right
This stored handle is only needed for deleting any
MediaKeys objects that the client fails to destroy
when moved out of the Running state.
end note
rialtoServer --> rialtoClient: media_keys_handle
rialtoClient --> | ||||
| PlantUML Macro | ||||
| ||||
@startuml autonumber box "Container" #LightGreen participant Netflix participant DPI participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Netflix -> DPI: initialize(drmSystemCallback, provisioningEngine)media_keys_handle DPI --> rialtoClientNetflix: createMediaKeys("com.netflix.playready") rialtoClient -> rialtoServer: createMediaKeys(key_system) rialtoServer -> Ocdm: opencdm_create_system(key_system) Ocdm --> rialtoServer: status @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Cobalt participant Starboard participant ocdmProxy participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Cobalt handle rialtoServer -> rialtoServerStarboard: Store Media Keys instance SbDrmDestroySystem(handle) noteStarboard right This stored handle is-> only neededocdmProxy: for deleting any MediaKeys objects that the client fails to destroy when moved out of the Running state. end note rialtoServer --> rialtoClient: opencdm_destruct_system(handle) ocdmProxy -> rialtoClient: ~IMediaKeys() rialtoClient -> rialtoServer: destroyMediaKeys(media_keys_handle) rialtoClientrialtoServer --> DPI Ocdm: mediaopencdm_keysdestruct_system(handle) DPI Ocdm --> Netflix: status @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Cobalt participant Starboard participant ocdmProxy participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Cobalt --> rialtoServer: status rialtoServer -> rialtoServer: Remove stored MediaKeys handle rialtoServer --> rialtoClient: status rialtoClient --> ocdmProxy: status ocdmProxy --> Starboard: SbDrmDestroySystem(handle)status Starboard --> ocdmProxy: opencdm_destruct_system(handle) ocdmProxy -> Cobalt: status @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Netflix participant DPI participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Netflix rialtoClient: ~IMediaKeys() rialtoClient -> rialtoServer: destroyMediaKeys(media_keys_handle) rialtoServer -> OcdmDPI: opencdm_destruct_system(handle teardown() OcdmDPI --> rialtoServerrialtoClient: status~IMediaKeys() rialtoServerrialtoClient -> rialtoServer: Remove stored MediaKeys handledestroyMediaKeys(media_keys_handle) rialtoServer --> rialtoClient: status rialtoClient --> ocdmProxy Ocdm: status ocdmProxy --> Starboard: opencdm_destruct_system(handle) Ocdm status Starboard --> CobaltrialtoServer: status @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Netflix participant DPI participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Netflix -> status rialtoServer -> rialtoServer: Remove stored MediaKeys handle rialtoServer --> rialtoClient: status rialtoClient --> DPI: teardown()status DPI --> Netflix: rialtoClient: ~IMediaKeys() rialtoClient -> rialtoServer: destroyMediaKeys(media_keys_handle) rialtoServer -> Ocdm: opencdm_destruct_system(handle) Ocdm status note over Netflix: To prevent leaks ~IDrmSystem() should call\n~IMediaKeys() if teardown() wasn't called @enduml |
| PlantUML Macro | ||||
|---|---|---|---|---|
| ||||
@startuml autonumber box "Container" #LightGreen participant Client participant rialtoClient end box box "Platform" #LightBlue participant rialtoServer participant Ocdm end box Client --> rialtoServerrialtoClient: status rialtoServerisServerCertificateSupported(key_system) rialtoClient -> rialtoServer: Remove stored MediaKeys handle rialtoServer --> rialtoClient: status rialtoClient --> DPIisServerCertificateSupported(key_system) rialtoServer -> Ocdm: status DPIopencdm_system_supports_server_certificate(key_system) Ocdm --> NetflixrialtoServer: result rialtoServer --> rialtoClient: statusresult note over Netflix: To prevent leaks ~IDrmSystem() should call\n~IMediaKeys() if teardown() wasn't called rialtoClient --> Client: result @enduml |
...