...
| 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
== Initialisation - register for callbacks ==
opt Video source attached
rialtoServer -> GStreamer_server: g_signal_connect(video_decoder, getVideoUnderflowSignalName_soc(), video_underflow_cb, user_data);
GStreamer_server --> rialtoServer: video_handler_id
end
opt Audio source attached
rialtoServer -> GStreamer_server: g_signal_connect(audio_decoder, getAudioUnderflowSignalName_soc(), audio_underflow_cb, user_data);
GStreamer_server --> rialtoServer: audio_handler_id
end
== Termination - unregister for callbacks ==
opt Video source removed
rialtoServer -> GStreamer_server: g_signal_handler_disconnect(video_decoder, video_handler_id);
GStreamer_server --> rialtoServer:
end
opt Audio source removed
rialtoServer -> GStreamer_server: g_signal_handler_disconnect(audio_decoder, audio_handler_id);
GStreamer_server --> rialtoServer:
end
== Underflow ==
opt Data starvation in server AV pipeline
GStreamer_server -/ rialtoServer: video_underflow_cb() or audio_underflow_cb()
note across
underflow_enabled: Underflow is enabled when we're in playing state and source is attached.
underflow_cancelled: Underflow may be cancelled when haveData is called between notification from GStreamer and Underflow task handling.
end note
opt underflow_enabled && !underflow_cancelled
rialtoServer -/ rialtoClient: notifyBufferUnderflow(source_id)
rialtoClient -/ GStreamer_client: notifyBufferUnderflow(source_id)
GStreamer_client -/ Starboard: emit video_underflow_cb() or audio_underflow_cb()
note over Starboard, GStreamer_client
Starboard does not have any support for underflow
so the event can be ignored for this integration.
end note
end
note across
There will be one re more pending need data requests at this point which if serviced will allow playback to resume
end note
end
@enduml |
Non-fatal Playback Failures
Decryption: Any encrypted frames that fail to decrypt are dropped, and an error notification is propagated to the rialto-gstreamer, at which point a decryption error is raised on the sink.
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Non-fatal Errors |
|---|
|
@startuml
autonumber
box "Container" #LightGreen
participant Application
participant rialtoGstreamer
participant rialtoClient
end box
box "Platform" #LightBlue
participant rialtoServer
participant GStreamer_server
end box
== Decryption ==
GStreamer_server -> rialtoServer: decrypt(buffer)
rialtoServer -> GStreamer_server: gst_buffer_get_protection_meta(buffer)
opt Protection Meta exists (Frame encrypted)
rialtoServer -> rialtoServer: Extract frame's metadata
opt media_keys.key_system == "com.netflix.playready"
rialtoServer -> Ocdm: opencdm_select_key_id(ocdm_session, kid)
end
opt Implementation before CBCS support added
rialtoServer -> Ocdm: opencdm_gstreamer_session_decrypt_ex(ocdm_session, gst_buffer, subsample_info, iv, key, init_with_last_15, caps)
else Implementation after CBCS support added
rialtoServer -> Ocdm: opencdm_gstreamer_session_decrypt_buffer(ocdm_session, gst_buffer, caps)
end
end
@enduml |