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:
Wim Taymans 2016-04-13 13:04:32 +02:00
parent 833168c3cf
commit d5e333ac4b
7 changed files with 212 additions and 3 deletions

View file

@ -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;
}

View file

@ -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__ */