Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

PlantUML Macro
formatSVG
titleCreate Player
@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 

Destroy

PlantUML Macro
formatSVG
titleDestroy Player
@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

MediaKeys

Check Supported Key Systems - indicative use of Rialto


Destroy

PlantUML Macro
formatSVG
titleCheck supported key systemsDestroy Player
@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

...

MediaKeys

Check Supported Key Systems - indicative use of Rialto

PlantUML Macro
formatSVG
titleGet DRM Version - Netflix/native RialtoCheck supported key systems
@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

Get DRM Version - Netflix/native Rialto

PlantUML Macro
formatSVG
titleCreate MediaKeys - Cobalt/OCDMGet DRM Version - Netflix/native Rialto
@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

Create - Netflix/native Rialto

version
rialtoServer --> rialtoClient:  rv=false, version=""
end
rialtoClient --> DPI:           rv, version
DPI          --> Netflix:       rv, version

@enduml


Create - Cobalt/OCDM

PlantUML Macro
formatSVG
titleCreate MediaKeys - Cobalt/OCDM
@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

Create - Netflix/native Rialto

PlantUML Macro
formatSVG
titleCreate - Netflix/non-OCDM
@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
formatSVG
titleCreate - Netflix/non-OCDM
@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


Destroy - Cobalt/OCDM

PlantUML Macro
formatSVG
titleDestroy - Cobalt/OCDM
@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

Destroy - Cobalt/OCDM

PlantUML Macro
formatSVG
titleDestroy - Cobalt/OCDM
@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

Destroy - Netflix/native Rialto

PlantUML Macro
formatSVG
titleDestroy - Netflix/native Rialto
@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

Destroy - Netflix/native Rialto

PlantUML Macro
formatSVG
titleDestroy - Netflix/native Rialto
@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

Check, if server certificate is supported

PlantUML Macro
formatSVG
titleisServerCertificateSupported
@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


IPC

Initialise Rialto Client

...