Versions Compared

Key

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

...

PlantUML Macro
formatSVG
titleCreate MKS - Netflix/native Rialto
@startuml

autonumber

box "Container" #LightGreen
participant Netflix
participant DPI
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
end box

Netflix      ->  DPI:           createDrmSession(media_keys, content_id, license_type, drm_header)
DPI          ->  DPI:           Create DPI session object
DPI          ->  DPI:           Store content_id, & license_type\nin &\ndrm_header in session object
DPI          --> Netflix:       session_handle

Netflix      ->  DPI:                generateChallenge(drmHeader, licenseChallengegetChallengeData(is_LDL)
DPI          ->  rialtoClient:  createKeySession(media_keys_handle, session_type=TEMPORARY, is_LDL)
rialtoClient ->  rialtoServer:  createKeySession(media_keys_handle, session_type, is_LDL)
note over rialtoServer: As createKeySession() in Cobalt diagram above
rialtoServer --> rialtoClient:  status, key_session_id
rialtoClient --> DPI:           status, key_session_id

DPI          ->  rialtoClient:  setDrmHeadergenerateRequest(mediakey_keyssession_handleid, keyinit_sessiondata_idtype=DRMHEADER, drmHeaderinit_data=drm_header)
rialtoClient ->  rialtoServer:  setDrmHeader generateRequest(mediakey_keyssession_handleid, keyinit_sessiondata_idtype, drmHeaderinit_data)
note 
rialtoServer over rialtoServer:As generateRequest() in Cobalt diagram above,\nsee note that opendm_session_get_challenge_data()
rialtoServer --> rialtoClient:  status
rialtoClient --> DPI:           status

DPInote over DPI: getChallengeData() must block until onLicenseRequest() callback received
rialtoServer ->/  rialtoClient:  generateRequestonLicenseRequest(key_session_id, init_data_type=DRMHEADERchallenge, init_data=drm_headerurl)
rialtoClient ->/  rialtoServerDPI:  generateRequest(         onLicenseRequest(key_session_id, init_data_typechallenge, init_dataurl)
noteDPI over rialtoServer:As generateRequest() in Cobalt diagram above,\nsee note that opendm_session_get_challenge_data()
rialtoServer --> rialtoClient:  status
rialtoClient --> DPINetflix:           status
note over DPI: getChallengeData() must block until onLicenseRequest() callback received
rialtoServer -/  rialtoClient:  onLicenseRequest(key_session_id, challenge, url)
rialtoClient -/  DPIstatus, challenge


@enduml


Update - Cobalt/OCDM


PlantUML Macro
formatSVG
titleUpdate MKS - 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:     SbDrmUpdateSession(media_keys_handle, ticket, key, session_id)
Starboard    ->  ocdmProxy:     opencdm_session_update(session_id, key)
ocdmProxy    ->  ocdmProxy:     Lookup MediaKeys object for session_id
ocdmProxy    ->  rialtoClient:  updateSession(media_keys_handle, session_id, key)
rialtoClient ->  rialtoServer:  updateSession(media_keys_handle, session_id, key)

opt media_keys.key_system == "com.netflix.playready"
rialtoServer ->  Ocdm:          opencdm_session_store_license_data(session_id, license_data=key)
Ocdm         --> rialtoServer:  status, secure_stop_id
note left: Secure stop ID ignored as\nnot supported by Rialto
else
rialtoServer ->  Ocdm:          opencdm_session_update(session_id, key)
Ocdm         --> rialtoServer:  status
end

rialtoServer --> rialtoClient:  status
rialtoClient --> ocdmProxy:     status

opt update successful

ocdmProxy    --> Starboard:     status=OK
Starboard    --> Cobalt:        status=OK

loop For each key updated
Ocdm         -/  rialtoServer:  OnKeyUpdated(session_id, key_id)
rialtoServer ->  rialtoServer:  Store updated key_id
end
Ocdm         -/  rialtoServer:  OnAllKeysUpdated(session_id)
rialtoServer -/  rialtoClient:  onKeyStatusesChanged(session_id, key_statuses)
rialtoClient -/  ocdmProxy:     onKeyStatusesChanged(session_id, key_statuses)
loop For each key updated
ocdmProxy    -/  Starboard:     OnKeyUpdated(session_id, key_id)
end
ocdmProxy    -/  Starboard:     OnAllKeysUpdated(session_id)
Starboard    -/  Cobalt:        SbDrmSessionUpdatedFunc(media_keys_handle, context, ticket, kSbDrmStatusSuccess, nullptr, session_id);
Starboard    -/  Cobalt:        SbDrmSessionKeyStatusesChangedFunc(media_keys_handle, context, session_id, key_ids, key_statuses);

else update failed

ocdmProxy    --> Starboard:     status=NOK
Starboard    -/  Cobalt:        SbDrmSessionUpdatedFunc(media_keys_handle, context,  onLicenseRequest(key_session_idticket, kSbDrmStatusUnknownError, challengenullptr, urlsession_id);
DPI   Starboard       --> NetflixCobalt:       status, challenge
 status=NOK

end

@enduml


Update -

...

Netflix/

...

native Rialto


PlantUML Macro
formatSVG
titleUpdate MKS - CobaltNetflix/OCDMnative 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

Cobalt       ->  Starboard:     SbDrmUpdateSession(media_keys_handle, ticket, key, session_id)
Starboard
Netflix      ->  ocdmProxyDPI:     opencdm_session_update      storeLicenseData(session_id, keylicense_data)
ocdmProxyDPI          ->  DPI:    ocdmProxy:       Lookup MediaKeys object for session_id
ocdmProxyDPI          ->  rialtoClient:  updateSessionupdateKeySession(media_keys_handle, session_id, keylicense_data)
rialtoClient ->  rialtoServer:  updateSessionupdateKeySession(media_keys_handle, session_id, keylicense_data)

opt media_keys.key_system == "com.netflix.playready"
rialtoServer ->  Ocdmnote over rialtoServer, Ocdm: As shown for updateKeySession in previous diagram

rialtoServer --> rialtoClient:  status
rialtoClient --> DPI:          opencdm_session_store_license_data(session_id, license_data=key)
Ocdm status
DPI          --> rialtoServerNetflix:     status, secure_stop_id  status

note leftacross: Secure stop ID ignored as\nnot supported by Rialto
else
rialtoServer ->  Ocdm:          opencdm_session_update(session_id, key)Key update messages will be generated as shown in previous diagram

@enduml


License Renewal - Cobalt/OCDM

PlantUML Macro
formatSVG
titleLicense Renewal - 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


Ocdm         -->/ rialtoServer:   process_challenge_callback(session_id,  status
end

user_data, license_renewal_message, url)
rialtoServer -->/ rialtoClient:  status onLicenseRenewal(session_id, license_renewal_message)
rialtoClient -->/ ocdmProxy:     status

opt update successful
 onLicenseRenewal(session_id, license_renewal_message)
ocdmProxy    -->/ Starboard:     status=OK
Starboard    --> Cobalt:        status=OK

loop For each key updated
Ocdm  process_challenge_callback(session_id, user_data, license_renewal_message, url="")
Starboard    -/ Starboard:      Extract request_type -/& request_content rialtoServer:  OnKeyUpdated(session_id, key_id)
rialtoServer ->  rialtoServer:  Store updated key_id
end
Ocdm    from license_renewal_message
note left: Use user_data to determine media_keys etc
Starboard    -/ Cobalt:     -/  rialtoServer:  OnAllKeysUpdatedSbDrmSessionUpdateRequestFunc(session_id)
rialtoServer -/  rialtoClient:  onKeyStatusesChanged(media_keys, request_status=kSbDrmStatusSuccess, request_type, session_id, key_statusesrequest_content, url)
rialtoClient -/  ocdmProxy
note across: App then should  onKeyStatusesChanged(session_id, key_statuses)
loop For each key updated
ocdmProxy    -/  Starboard:     OnKeyUpdated(session_id, key_id)
end
ocdmProxy    -/  Starboard:     OnAllKeysUpdated(session_id)
Starboardfetch the updated license and call SbDrmUpdateSession() in the same way as for the initial license

@enduml


License Renewal - native Rialto

PlantUML Macro
formatSVG
titleLicense Renewal - native Rialto
@startuml

autonumber

box "Container" #LightGreen
participant Client
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box


Ocdm         -/  CobaltrialtoServer:        SbDrmSessionUpdatedFunc(media_keys_handle, context, ticket, kSbDrmStatusSuccess, nullptr, session_id);
Starboard    -/  Cobalt:        SbDrmSessionKeyStatusesChangedFunc(media_keys_handle, context, process_challenge_callback(session_id, user_data, license_renewal_message, url)
rialtoServer -/ rialtoClient:   onLicenseRenewal(session_id, key_ids, key_statuses);

else update failed

ocdmProxylicense_renewal_message)
rialtoClient -/ Client:    --> Starboard:     status=NOK
Starboard    -/  Cobalt:        SbDrmSessionUpdatedFunc(media_keys_handle, context, ticket, kSbDrmStatusUnknownError, nullptr, session_id);
Starboard    --> Cobalt:        status=NOK

end

@enduml

...

onLicenseRenewal(session_id, license_renewal_message)

note across: App then should fetch the updated license and call updateKeySession() in the same way as for the initial license

@enduml



Key Session Error - TODO

Not supported in avbus-poc or libNova - not required? If need, it follows a same pattern as License Renewal above and we would need to add onError() method in IMediaKeysClient interface.


Select Key ID - Netflix/native Rialto


PlantUML Macro
formatSVG
titleUpdate MKS - Netflix/native RialtoSelect Key ID
@startuml

autonumber

box "Container" #LightGreen
participant Netflix
participant DPI
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box

Netflix
Netflix      ->  DPI:           initDecryptContextByKid(session_id, key_id)
DPI          ->  DPI: DPI:           Lookup MediaKeys object for storeLicenseData(session_id, license_data)
DPI            ->  DPI:           Lookup MediaKeys object for session_id
DPI          ->  rialtoClient:  updateKeySession(media_keys_handle, session_id, license_data)
rialtoClient ->  rialtoServer:  updateKeySession(media_keys_handle, session_id, license_data)

note over rialtoServer, Ocdm: As shown for updateKeySession in previous diagram

rialtoServer --> rialtoClient:  status rialtoClient:  selectKeyId(media_keys_handle, session_id, key_id)
rialtoClient ->  rialtoClient:  Store session_id & key_id
note right
The key_id should be stored with the associated session_id in
a map/vector. This key_id will be retrieved later and stored in
the metadata when the client calls addSegment() call. When a
key session is destroyed the relevant entry in the map should
be removed. See Netflix to Rialto Client diagram.
end note
rialtoClient --> DPI:           status
DPI          --> Netflix:       status

note across: Key update messages will be generated as shown in previous diagram

@enduml

...

@enduml 


Contains Key - Netflix/native Rialto


PlantUML Macro
formatSVG
titleContains KeyLicense Renewal - Cobalt/OCDM
@startuml

autonumber

box "Container" #LightGreen
participant CobaltNetflix
participant StarboardDPI
participant ocdmProxy
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box


Ocdm         -/ rialtoServer:   process_challenge_callback(session_id, user_data, license_renewal_message, url)
rialtoServer -/ rialtoClient:   onLicenseRenewal(session_id, license_renewal_message)
rialtoClient -/ ocdmProxy: #LightBlue
participant rialtoServer
participant Ocdm
end box


Netflix       onLicenseRenewal(session_id, license_renewal_message)
ocdmProxy->  DPI:    -/ Starboard:      process_challenge_callbackhasLicense(session_id, user_data, license_renewal_message, url="")
Starboardkey_id)
DPI          -/> Starboard DPI:      Extract request_type & request_content from license_renewal_message
note left: Use user_data to determine media_keys etc
Starboard Lookup MediaKeys object for session_id
DPI    -/ Cobalt:     ->  rialtoClient:  SbDrmSessionUpdateRequestFunccontainsKey(media_keys, request_status=kSbDrmStatusSuccess, request_type_handle, session_id, request_content, url)

note across: App then should fetch the updated license and call SbDrmUpdateSession() in the same way as for the initial license

@enduml

License Renewal - native Rialto

PlantUML Macro
formatSVG
titleLicense Renewal - native Rialto
@startuml

autonumber

box "Container" #LightGreen
participant Client
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end boxkey_id)
rialtoClient ->  rialtoServer:  containsKey(media_keys_handle, session_id, key_id)
rialtoServer ->  Ocdm:          opencdm_session_has_key_id(session, key_id)



Ocdm         -/-> rialtoServer:   process_challenge_callback(session_id, user_data, license_renewal_message, url)result
rialtoServer -/-> rialtoClient:   onLicenseRenewal(session_id, license_renewal_message)result
rialtoClient --/> ClientDPI:         onLicenseRenewal(session_id, license_renewal_message)

note across: App then should fetch the updated license and call updateKeySession() in the same way as for the initial license

@enduml

Key Session Error - TODO

Not supported in avbus-poc or libNova - not required? If need, it follows a same pattern as License Renewal above and we would need to add onError() method in IMediaKeysClient interface.

Select Key ID - Netflix/native Rialto

  result
DPI          --> Netflix:       result


@enduml



Remove/OCDM

Note that Remove is not required by Cobalt so we do not yet need to implement this API.


PlantUML Macro
formatSVG
titleSelect Key IDRemove MKS
@startuml

autonumber

box "Container" #LightGreen
participant NetflixClient
participant DPIocdmProxy
participant rialtoClient
end box


Netflixbox "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box


Client ->  DPI:    ->  ocdmProxy:     initDecryptContextByKid(opencdm_session_id, keyremove(session_id)
DPIocdmProxy          ->  DPI:     ocdmProxy:       Lookup MediaKeys object for session_id
DPI    ocdmProxy      ->  rialtoClient:  selectKeyIdremoveKeySession(media_keys_handle, session_id, key_id)
rialtoClient ->  rialtoClientrialtoServer:  Store session_id & key_id
note right
The key_id should be stored with the associated session_id in
a map/vector. This key_id will be retrieved later and stored in
the metadata when the client calls addSegment() call. When a
key session is destroyed the relevant entry in the map should
be removed. See Netflix to Rialto Client diagram.
end noteremoveKeySession(media_keys_handle, session_id)
rialtoServer ->  Ocdm:          opencdm_session_remove(session_id)
Ocdm         --> rialtoServer:  status
rialtoServer --> rialtoClient:  status
rialtoClient --> DPIocdmProxy:           status
DPIocdmProxy          --> NetflixClient:        status

@enduml 

...


Load/OCDM

Note that Load is not required by Cobalt so we do not yet need to implement this API.


PlantUML Macro
formatSVG
titleContains KeyLoad MKS
@startuml

autonumber

box "Container" #LightGreen
participant NetflixClient
participant DPIocdmProxy
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box


NetflixClient       ->  DPIocdmProxy:           hasLicenseopencdm_session_load(session_id, key_id)
DPI     )
ocdmProxy     ->  DPI ocdmProxy:           Lookup MediaKeys object for session_id
DPI      ocdmProxy    ->  rialtoClient:  containsKeyloadKeySession(media_keys_handle, session_id, key_id)
rialtoClient ->  rialtoServer:  containsKeyloadKeySession(media_keys_handle, session_id, key_id)
rialtoServer ->  Ocdm:          opencdm_session_has_key_idload(session, key_id)
Ocdm         --> rialtoServer:  status


OcdmrialtoServer --> rialtoClient:  status
rialtoClient --> ocdmProxy:     status
ocdmProxy    --> rialtoServerClient:  result
rialtoServer --> rialtoClient:  result
rialtoClient --> DPI:        status

@enduml


Close - Cobalt/OCDM


PlantUML Macro
formatSVG
title"Destroy" MKS - 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       ->  result
DPIStarboard:     SbDrmCloseSession(media_keys_handle, session_id)
Starboard    -->  NetflixocdmProxy:       result


@enduml

Remove/OCDM

Note that Remove is not required by Cobalt so we do not yet need to implement this API.

PlantUML Macro
formatSVG
titleRemove MKS
@startuml

autonumber

box "Container" #LightGreen
participant Client
participant ocdmProxy
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box


Client       ->  ocdmProxy:     opencdm_session_remove(session_id)
ocdmProxy    ->  ocdmProxy:     Lookup MediaKeys object for session_id
ocdmProxy    ->  rialtoClient:  removeKeySession(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  removeKeySession(media_keys_handle, session_id)opencdm_session_close(session_id)
ocdmProxy    ->  ocdmProxy:     Lookup MediaKeys object for session_id
ocdmProxy    ->  rialtoClient:  closeKeySession(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  closeKeySession(media_keys_handle, session_id)

opt No buffered media segments that need this session for decryption

opt media_keys.key_system == "com.netflix.playready"
rialtoServer ->  Ocdm:          opencdm_session_cancel_challenge_data(session_id)
Ocdm         --> rialtoServer:  status
rialtoServer ->  Ocdm:          opencdm_session_clean_removedecrypt_context(session_id)
Ocdm         --> rialtoServer:  status
else !Netflix
rialtoServer --> rialtoClient:  status
rialtoClient --> ocdmProxy:     status
ocdmProxy    --> Client: ->  Ocdm:          opencdm_session_close(session_id)
note right: TODO: Current code only calls for !Netflix\nbut maybe should we always call it?
Ocdm          status

@enduml

Load/OCDM

Note that Load is not required by Cobalt so we do not yet need to implement this API.

PlantUML Macro
formatSVG
titleLoad MKS
@startuml

autonumber

box "Container" #LightGreen
participant Client
participant ocdmProxy
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box


Client       ->  ocdmProxy:     opencdm_session_load(session_id)
ocdmProxy    ->  ocdmProxy:     Lookup MediaKeys object for session_id
ocdmProxy    ->  rialtoClient:  loadKeySession(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  loadKeySession(media_keys_handle, session_id)
rialtoServer ->  Ocdm:          opencdm_session_load(session_id)
Ocdm     --> rialtoServer:  status
end

rialtoServer ->  Ocdm:          opencdm_destruct_session(session_id)
Ocdm         --> rialtoServer:  status

else Media segments are buffered that need this media key sessions
note over rialtoServer, Ocdm
The above sequence must be deferred until no media segments
are buffered that reference this media key session otherwise
their decryption will fail. rialtoServer must track these
references, details not shown for brevity.
end note
end

rialtoServer --> rialtoClient:  status
rialtoClient --> ocdmProxy:     status
ocdmProxy    --> rialtoServerStarboard:     status
rialtoServerStarboard    -->/  rialtoClientCobalt:  status
rialtoClient --> ocdmProxy:     status
ocdmProxySbDrmSessionClosedFunc(media_keys_handle, context, session_id)
Starboard    --> ClientCobalt:        status

@enduml


Close -

...

Netflix/

...

native Rialto

PlantUML Macro
formatSVG
title"Destroy" MKS - Cobalt/OCDMClose - 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       ->  Starboard:     SbDrmCloseSession(media_keys_handle, session_id)
StarboardDPI:     ->  ocdmProxy:     opencdm_session_close(session_id)
ocdmProxy~IDrmSession()
DPI          ->  ocdmProxy: DPI:           Lookup MediaKeys object for session_id
ocdmProxyDPI          ->  rialtoClient:  closeKeySession(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  closeKeySession(media_keys_handle, session_id)

opt No buffered media segments that need this session for decryption

opt media_keys.key_system == "com.netflix.playready"
rialtoServer ->  Ocdm:          opencdm_session_cancel_challenge_data(session_id)
Ocdm         --> rialtoServer:  status session_id)

note over rialtoServer, Ocdm: Same sequence as closeKeySession above

rialtoServer --> rialtoClient:  status
rialtoClient --> DPI:           status
DPI          --> Netflix:

@enduml

Set DRM Header

PlantUML Macro
formatSVG
titleSet DRM Header
@startuml

autonumber

box "Container" #LightGreen
participant Application
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box

Application  ->  rialtoClient:  setDrmHeader(media_keys_handle, session_id, drmHeader)
rialtoClient ->  rialtoServer:  setDrmHeader(media_keys_handle, session_id, drmHeader)
rialtoServer ->  Ocdm:             opencdm   opencdm_session_cleanset_decryptdrm_contextheader(session_idhandle, drmHeader)
Ocdm         --> rialtoServer:  status
else !Netflix
rialtoServer -->  OcdmrialtoClient:  status
rialtoClient --> Application      opencdm_session_close(session_id)
note:  status

@enduml

Get Last DRM Error

PlantUML Macro
formatSVG
titleGet Last DRM Error
@startuml

autonumber

box "Container" #LightGreen
participant Application
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box

Application  ->  rialtoClient:  getLastDrmError(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  getLastDrmError(media_keys_handle, session_id, drmHeader)
 right: TODO: Current code only calls for !Netflix\nbut maybe should we always call it?
Ocdm         --> rialtoServer:  status
end

rialtoServer ->  Ocdm:              opencdm opencdm_session_destructsystem_sessionerror(session_idhandle)
Ocdm         --> rialtoServer:  status

else Media segments are buffered that need this media key sessions
note over rialtoServer, Ocdm
The above sequence must be deferred until no media segments
are buffered that reference this media key session otherwise
their decryption will fail. rialtoServer must track these
references, details not shown for brevity.
end note
end

rialtoServer --> rialtoClient:  status
rialtoClient --> ocdmProxy:     status
ocdmProxy    --> Starboard:     status
Starboard    -/  Cobalt:        SbDrmSessionClosedFunc(media_keys_handle, context, session_id)
Starboard    --> Cobalt:        status

@enduml

...

, errorCode
rialtoServer --> rialtoClient:  status, errorCode
rialtoClient --> Application :  status, errorCode

@enduml

Get CDM Key Session Id

PlantUML Macro
formatSVG
titleGet CDM Key Session Id
@startuml

autonumber

box "Container" #LightGreen
participant Application
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box

Application  ->  rialtoClient:  getCdmKeySessionId(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  getCdmKeySessionId(media_keys_handle, session_id)
rialtoServer ->  Ocdm:          opencdm_session_id(session_handle)
Ocdm         --> rialtoServer:  status, cdmSessionId
rialtoServer --> rialtoClient:  status, cdmSessionId
rialtoClient --> Application :  status, cdmSessionId

@enduml

Release/OCDM

PlantUML Macro
formatSVG
titleClose - Netflix/native RialtoRelease/OCDM
@startuml

autonumber

box "Container" #LightGreen
participant NetflixClient
participant DPIocdmProxy
participant rialtoClient
end box

box "Platform" #LightBlue
participant rialtoServer
participant Ocdm
end box

Netflix
Client       ->  DPIocdmProxy:           ~IDrmSession()
DPI          ->  DPI:      opencdm_destruct_session(session_id)
ocdmProxy    ->  ocdmProxy:     Lookup MediaKeys object for session_id
DPIocdmProxy          ->  rialtoClient:  closeKeySessionreleaseKeySession(media_keys_handle, session_id)
rialtoClient ->  rialtoServer:  closeKeySessionreleaseKeySession(media_keys_handle, session_id)

noterialtoServer over-> rialtoServer, Ocdm:    Same   sequence as closeKeySession above
 opencdm_destruct_session(session_id)
Ocdm         --> rialtoServer:  status
rialtoServer --> rialtoClient:  status
rialtoClient --> DPIocdmProxy:     status
ocdmProxy    --> Client: status
DPI          --> Netflix:status

@enduml