mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-19 07:00:10 -05:00
add refresh message
Add a new refresh message to request a keyframe from the pinos server. pinospay: pass the refresh-request message upstream pinossink: turn refresh-request messages into events pinossrc: turn a keyframe event into a refresh-request message
This commit is contained in:
parent
833168c3cf
commit
d5e333ac4b
7 changed files with 212 additions and 3 deletions
|
|
@ -721,3 +721,55 @@ pinos_buffer_builder_add_format_change (PinosBufferBuilder *builder,
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* pinos_buffer_iter_parse_refresh_request:
|
||||
* @iter: a #PinosBufferIter
|
||||
* @payload: a #PinosPacketRefreshRequest
|
||||
*
|
||||
* Parse a #PINOS_PACKET_TYPE_REFRESH_REQUEST packet from @iter into @payload.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean
|
||||
pinos_buffer_iter_parse_refresh_request (PinosBufferIter *iter,
|
||||
PinosPacketRefreshRequest *payload)
|
||||
{
|
||||
struct stack_iter *si = PPSI (iter);
|
||||
|
||||
g_return_val_if_fail (is_valid_iter (iter), FALSE);
|
||||
g_return_val_if_fail (si->type == PINOS_PACKET_TYPE_REFRESH_REQUEST, FALSE);
|
||||
|
||||
if (si->size < sizeof (PinosPacketRefreshRequest))
|
||||
return FALSE;
|
||||
|
||||
memcpy (payload, si->data, sizeof (*payload));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* pinos_buffer_builder_add_refresh_request:
|
||||
* @builder: a #PinosBufferBuilder
|
||||
* @payload: a #PinosPacketRefreshRequest
|
||||
*
|
||||
* Add a #PINOS_PACKET_TYPE_REFRESH_REQUEST payload in @payload to @builder.
|
||||
*
|
||||
* Returns: %TRUE on success
|
||||
*/
|
||||
gboolean
|
||||
pinos_buffer_builder_add_refresh_request (PinosBufferBuilder *builder,
|
||||
PinosPacketRefreshRequest *payload)
|
||||
{
|
||||
struct stack_builder *sb = PPSB (builder);
|
||||
PinosPacketRefreshRequest *p;
|
||||
|
||||
g_return_val_if_fail (is_valid_builder (builder), FALSE);
|
||||
|
||||
p = builder_add_packet (sb,
|
||||
PINOS_PACKET_TYPE_REFRESH_REQUEST,
|
||||
sizeof (PinosPacketRefreshRequest));
|
||||
memcpy (p, payload, sizeof (*payload));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@ gpointer pinos_buffer_steal (PinosBuffer *buffer,
|
|||
* that a previously received fd-payload is no longer in use.
|
||||
* @PINOS_PACKET_TYPE_FORMAT_CHANGE: a format change.
|
||||
* @PINOS_PACKET_TYPE_PROPERTY_CHANGE: one or more property changes.
|
||||
* @PINOS_PACKET_TYPE_REFRESH_REQUEST: ask for a new keyframe
|
||||
*
|
||||
* The possible packet types.
|
||||
*/
|
||||
|
|
@ -77,6 +78,7 @@ typedef enum {
|
|||
PINOS_PACKET_TYPE_RELEASE_FD_PAYLOAD = 4,
|
||||
PINOS_PACKET_TYPE_FORMAT_CHANGE = 5,
|
||||
PINOS_PACKET_TYPE_PROPERTY_CHANGE = 6,
|
||||
PINOS_PACKET_TYPE_REFRESH_REQUEST = 7,
|
||||
} PinosPacketType;
|
||||
|
||||
|
||||
|
|
@ -215,5 +217,25 @@ gboolean pinos_buffer_iter_parse_property_change (PinosBufferIter
|
|||
gboolean pinos_buffer_builder_add_property_change (PinosBufferBuilder *builder,
|
||||
PinosPacketPropertyChange *payload);
|
||||
|
||||
/* refresh request packets */
|
||||
/**
|
||||
* PinosPacketRefreshRequest:
|
||||
* @last_id: last frame seen frame id
|
||||
* @request_type: the type of the request
|
||||
* @pts: the timestamp of the requested key frame, 0 = as soon as possible
|
||||
*
|
||||
* A refresh request packet. This packet is sent to trigger a new keyframe.
|
||||
*/
|
||||
typedef struct {
|
||||
guint32 last_id;
|
||||
guint32 request_type;
|
||||
gint64 pts;
|
||||
} PinosPacketRefreshRequest;
|
||||
|
||||
gboolean pinos_buffer_iter_parse_refresh_request (PinosBufferIter *iter,
|
||||
PinosPacketRefreshRequest *payload);
|
||||
gboolean pinos_buffer_builder_add_refresh_request (PinosBufferBuilder *builder,
|
||||
PinosPacketRefreshRequest *payload);
|
||||
|
||||
|
||||
#endif /* __PINOS_BUFFER_H__ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue