...
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Pushing data to Gstreamer server pipeline |
|---|
|
@startuml
autonumber
box "Platform" #LightGreen
participant rialtoClient
end box
box "Platform" #LightBlue
participant rialtoServer
participant GStreamer_server
participant Ocdm
end box
note across
Gstreamer app source uses 2 signals, need-data and enough-data,
to notify its client whether it needs more data. Rialto server
should only push data when the appsrc indicates that it is in
the need-data state.
end note
loop While appsrc needs data && appsrc data available in shm buffer
rialtoServer -> rialtoServer: Extract frame's metadata from shm
opt Frame encrypted
rialtoServer -> GStreamer_server: gst_buffer_add_protection_meta(buffer, meta)
end
rialtoServer -> GStreamer_server: gst_app_src_push_buffer(src, gst_buffer)
rialtoServer -> rialtoServer: 'Remove' frame from shm
opt First video frame pushed at start of playback / after seek
note across: Not currently implemented
rialtoServer --/ rialtoClient: notifyFrameReady(frame_timestamp)
end
opt Appsrc data exhausted from shm
opt (status == EOS) for this appsrc
rialtoServer -> GStreamer_server: notify EOS
else Not EOS
rialtoServer --/ rialtoClient: notifyNeedMediaData(...)
end
end
end
@enduml |
Frames are decrypted in the pipeline when they are pulled for playback.
| PlantUML Macro |
|---|
| format | SVG |
|---|
| title | Pushing data to Gstreamer server pipeline |
|---|
|
@startuml
autonumber
box "Platform" #LightGreen
participant rialtoClient
end box
box "Platform" #LightBlue
participant rialtoServer
participant GStreamer_server
participant Ocdm
end box
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.netfliuxnetflix.playready"
rialtoServer -> Ocdm: opencdm_select_key_id(ocdm_session, kid)
end
rialtoServer -> Ocdm: opencdm_gstreamer_session_decrypt(ocdm_session, gst_buffer, subsample_info, iv, key, init_with_last_15)
end
rialtoServer -> GStreamer_server: gst_app_src_push_buffer(src, gst_buffer)
rialtoServer -> rialtoServer: 'Remove' frame from shm
opt First video frame pushed at start of playback / after seek
note across: Not currently implemented
rialtoServer --/ rialtoClient: notifyFrameReady(frame_timestamp)
end
opt Appsrc data exhausted from shm
opt (status == EOS) for this appsrc
rialtoServer -> GStreamer_server: notify EOS
else Not EOS
rialtoServer --/ rialtoClient: notifyNeedMediaData(...)
end
end
end
@enduml |
...