diff options
Diffstat (limited to 'gst-libs')
-rw-r--r-- | gst-libs/gst/allocators/gstdmabuf.c | 4 | ||||
-rw-r--r-- | gst-libs/gst/pbutils/gstdiscoverer-types.c | 4 | ||||
-rw-r--r-- | gst-libs/gst/riff/riff-read.c | 3 | ||||
-rw-r--r-- | gst-libs/gst/rtsp/gstrtspconnection.c | 52 | ||||
-rw-r--r-- | gst-libs/gst/rtsp/gstrtsptransport.c | 2 | ||||
-rw-r--r-- | gst-libs/gst/sdp/gstmikey.c | 334 | ||||
-rw-r--r-- | gst-libs/gst/sdp/gstmikey.h | 145 | ||||
-rw-r--r-- | gst-libs/gst/sdp/sdp.h | 1 | ||||
-rw-r--r-- | gst-libs/gst/video/gstvideodecoder.c | 32 | ||||
-rw-r--r-- | gst-libs/gst/video/video-tile.c | 4 |
10 files changed, 408 insertions, 173 deletions
diff --git a/gst-libs/gst/allocators/gstdmabuf.c b/gst-libs/gst/allocators/gstdmabuf.c index 9cf05cb..02a5eed 100644 --- a/gst-libs/gst/allocators/gstdmabuf.c +++ b/gst-libs/gst/allocators/gstdmabuf.c @@ -69,7 +69,7 @@ gst_dmabuf_allocator_free (GstAllocator * allocator, GstMemory * gmem) g_warning (G_STRLOC ":%s: Freeing memory %p still mapped", G_STRFUNC, mem); munmap ((void *) mem->data, gmem->maxsize); } - if (mem->fd >= 0) + if (mem->fd >= 0 && gmem->parent == NULL) close (mem->fd); g_mutex_clear (&mem->lock); g_slice_free (GstDmaBufMemory, mem); @@ -176,7 +176,7 @@ gst_dmabuf_mem_share (GstMemory * gmem, gssize offset, gssize size) GST_MINI_OBJECT_FLAG_LOCK_READONLY, mem->mem.allocator, parent, mem->mem.maxsize, mem->mem.align, mem->mem.offset + offset, size); - sub->fd = -1; + sub->fd = mem->fd; g_mutex_init (&sub->lock); return GST_MEMORY_CAST (sub); diff --git a/gst-libs/gst/pbutils/gstdiscoverer-types.c b/gst-libs/gst/pbutils/gstdiscoverer-types.c index 12905ef..9cda787 100644 --- a/gst-libs/gst/pbutils/gstdiscoverer-types.c +++ b/gst-libs/gst/pbutils/gstdiscoverer-types.c @@ -1085,9 +1085,9 @@ DISCOVERER_INFO_ACCESSOR_CODE (toc, const GstToc *, NULL); * * Get the installer details for missing elements * - * Returns: (transfer full): (array zero-terminated=1): An array of strings + * Returns: (transfer full) (array zero-terminated=1): An array of strings * containing informations about how to install the various missing elements - * for @info to be usable. Free with g_strfreev. + * for @info to be usable. Free with g_strfreev(). * * Since: 1.4 */ diff --git a/gst-libs/gst/riff/riff-read.c b/gst-libs/gst/riff/riff-read.c index 824bc73..a60b9cf 100644 --- a/gst-libs/gst/riff/riff-read.c +++ b/gst-libs/gst/riff/riff-read.c @@ -258,8 +258,7 @@ too_small: not_riff: { GST_ELEMENT_ERROR (element, STREAM, WRONG_TYPE, (NULL), - ("Stream is no RIFF stream: %" GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (tag))); + ("Stream is no RIFF stream: 0x%" G_GINT32_MODIFIER "x", tag)); gst_buffer_unmap (buf, &info); gst_buffer_unref (buf); return FALSE; diff --git a/gst-libs/gst/rtsp/gstrtspconnection.c b/gst-libs/gst/rtsp/gstrtspconnection.c index 87be31a..2218921 100644 --- a/gst-libs/gst/rtsp/gstrtspconnection.c +++ b/gst-libs/gst/rtsp/gstrtspconnection.c @@ -2889,25 +2889,43 @@ gst_rtsp_connection_do_tunnel (GstRTSPConnection * conn, g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL); if (conn2 != NULL) { - g_return_val_if_fail (conn->tstate == TUNNEL_STATE_GET, GST_RTSP_EINVAL); - g_return_val_if_fail (conn2->tstate == TUNNEL_STATE_POST, GST_RTSP_EINVAL); + GstRTSPTunnelState ts1 = conn->tstate; + GstRTSPTunnelState ts2 = conn2->tstate; + + g_return_val_if_fail ((ts1 == TUNNEL_STATE_GET && ts2 == TUNNEL_STATE_POST) + || (ts1 == TUNNEL_STATE_POST && ts2 == TUNNEL_STATE_GET), + GST_RTSP_EINVAL); g_return_val_if_fail (!memcmp (conn2->tunnelid, conn->tunnelid, TUNNELID_LEN), GST_RTSP_EINVAL); - /* both connections have socket0 as the read/write socket. start by taking the - * socket from conn2 and set it as the socket in conn */ - conn->socket1 = conn2->socket0; - conn->stream1 = conn2->stream0; - conn->input_stream = conn2->input_stream; - conn->control_stream = g_io_stream_get_input_stream (conn->stream0); + /* both connections have socket0 as the read/write socket */ + if (ts1 == TUNNEL_STATE_GET) { + /* conn2 is the HTTP POST channel. take its socket and set it as read + * socket in conn */ + conn->socket1 = conn2->socket0; + conn->stream1 = conn2->stream0; + conn->input_stream = conn2->input_stream; + conn->control_stream = g_io_stream_get_input_stream (conn->stream0); + conn2->output_stream = NULL; + } else { + /* conn2 is the HTTP GET channel. take its socket and set it as write + * socket in conn */ + conn->socket1 = conn->socket0; + conn->stream1 = conn->stream0; + conn->socket0 = conn2->socket0; + conn->stream0 = conn2->stream0; + conn->output_stream = conn2->output_stream; + conn->control_stream = g_io_stream_get_input_stream (conn->stream0); + } /* clean up some of the state of conn2 */ g_cancellable_cancel (conn2->cancellable); conn2->write_socket = conn2->read_socket = NULL; conn2->socket0 = NULL; conn2->stream0 = NULL; + conn2->socket1 = NULL; + conn2->stream1 = NULL; conn2->input_stream = NULL; - conn2->output_stream = NULL; conn2->control_stream = NULL; g_cancellable_reset (conn2->cancellable); @@ -3140,7 +3158,7 @@ gst_rtsp_source_dispatch_read (GPollableInputStream * stream, (GSourceFunc) gst_rtsp_source_dispatch_read_get_channel, watch, NULL); g_source_add_child_source ((GSource *) watch, watch->controlsrc); - } + } goto read_done; } else goto eof; @@ -3753,18 +3771,18 @@ gst_rtsp_watch_send_message (GstRTSPWatch * watch, GstRTSPMessage * message, * Wait until there is place in the backlog queue, @timeout is reached * or @watch is set to flushing. * - * If @timeout is #NULL this function can block forever. If @timeout - * contains a valid timeout, this function will return #GST_RTSP_ETIMEOUT + * If @timeout is %NULL this function can block forever. If @timeout + * contains a valid timeout, this function will return %GST_RTSP_ETIMEOUT * after the timeout expired. * * The typically use of this function is when gst_rtsp_watch_write_data - * returns GST_RTSP_ENOMEM. The caller then calls this function to wait for + * returns %GST_RTSP_ENOMEM. The caller then calls this function to wait for * free space in the backlog queue and try again. * - * Returns: #GST_RTSP_OK when if there is room in queue. - * #GST_RTSP_ETIMEOUT when @timeout was reached. - * #GST_RTSP_EINTR when @watch is flushing - * #GST_RTSP_EINVAL when called with invalid parameters. + * Returns: %GST_RTSP_OK when if there is room in queue. + * %GST_RTSP_ETIMEOUT when @timeout was reached. + * %GST_RTSP_EINTR when @watch is flushing + * %GST_RTSP_EINVAL when called with invalid parameters. * * Since: 1.4 */ diff --git a/gst-libs/gst/rtsp/gstrtsptransport.c b/gst-libs/gst/rtsp/gstrtsptransport.c index 81c7431..2dd9acb 100644 --- a/gst-libs/gst/rtsp/gstrtsptransport.c +++ b/gst-libs/gst/rtsp/gstrtsptransport.c @@ -271,7 +271,7 @@ gst_rtsp_transport_get_mime (GstRTSPTransMode trans, const gchar ** mime) /** * gst_rtsp_transport_get_media_type: * @transport: a #GstRTSPTransport - * @media_type: (out): media type of @transport + * @media_type: (out) (transfer none): media type of @transport * * Get the media type of @transport. This media type is typically * used to generate #GstCaps events. diff --git a/gst-libs/gst/sdp/gstmikey.c b/gst-libs/gst/sdp/gstmikey.c index 19093bd..406d498 100644 --- a/gst-libs/gst/sdp/gstmikey.c +++ b/gst-libs/gst/sdp/gstmikey.c @@ -29,13 +29,22 @@ * messages. * </para> * </refsect2> + * + * Since: 1.4 */ #include <string.h> #include "gstmikey.h" -static void payload_destroy (GstMIKEYPayload ** payload); +GST_DEFINE_MINI_OBJECT_TYPE (GstMIKEYPayload, gst_mikey_payload); +GST_DEFINE_MINI_OBJECT_TYPE (GstMIKEYMessage, gst_mikey_message); + +static void +payload_destroy (GstMIKEYPayload ** payload) +{ + gst_mikey_payload_unref (*payload); +} #define INIT_ARRAY(field, type, init_func) \ G_STMT_START { \ @@ -92,10 +101,12 @@ get_mac_len (GstMIKEYMacAlg mac_alg) * @enc_alg: the #GstMIKEYEncAlg * @mac_alg: a #GstMIKEYMacAlg * - * Set the KEMAC parameters. @payload should point to a #GST_MIKEY_PT_KEMAC + * Set the KEMAC parameters. @payload should point to a %GST_MIKEY_PT_KEMAC * payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_kemac_set (GstMIKEYPayload * payload, @@ -113,10 +124,12 @@ gst_mikey_payload_kemac_set (GstMIKEYPayload * payload, return TRUE; } -static void -gst_mikey_payload_kemac_clear (GstMIKEYPayloadKEMAC * payload) +static gboolean +gst_mikey_payload_kemac_dispose (GstMIKEYPayloadKEMAC * payload) { FREE_ARRAY (payload->subpayloads); + + return TRUE; } static GstMIKEYPayloadKEMAC * @@ -127,8 +140,8 @@ gst_mikey_payload_kemac_copy (const GstMIKEYPayloadKEMAC * payload) gst_mikey_payload_kemac_set (©->pt, payload->enc_alg, payload->mac_alg); len = payload->subpayloads->len; for (i = 0; i < len; i++) { - GstMIKEYPayload *pay = g_array_index (payload->subpayloads, - GstMIKEYPayload *, i); + GstMIKEYPayload *pay = + g_array_index (payload->subpayloads, GstMIKEYPayload *, i); gst_mikey_payload_kemac_add_sub (©->pt, gst_mikey_payload_copy (pay)); } return copy; @@ -139,9 +152,11 @@ gst_mikey_payload_kemac_copy (const GstMIKEYPayloadKEMAC * payload) * @payload: a #GstMIKEYPayload * * Get the number of sub payloads of @payload. @payload should be of type - * #GST_MIKEY_PT_KEMAC. + * %GST_MIKEY_PT_KEMAC. * * Returns: the number of sub payloads in @payload + * + * Since: 1.4 */ guint gst_mikey_payload_kemac_get_n_sub (const GstMIKEYPayload * payload) @@ -160,9 +175,11 @@ gst_mikey_payload_kemac_get_n_sub (const GstMIKEYPayload * payload) * @idx: an index * * Get the sub payload of @payload at @idx. @payload should be of type - * #GST_MIKEY_PT_KEMAC. + * %GST_MIKEY_PT_KEMAC. * - * Returns: the #GstMIKEYPayload at @idx. + * Returns: (transfer none): the #GstMIKEYPayload at @idx. + * + * Since: 1.4 */ const GstMIKEYPayload * gst_mikey_payload_kemac_get_sub (const GstMIKEYPayload * payload, guint idx) @@ -186,6 +203,8 @@ gst_mikey_payload_kemac_get_sub (const GstMIKEYPayload * payload, guint idx) * Remove the sub payload at @idx in @payload. * * Returns: %TRUE on success. + * + * Since: 1.4 */ gboolean gst_mikey_payload_kemac_remove_sub (GstMIKEYPayload * payload, guint idx) @@ -204,11 +223,13 @@ gst_mikey_payload_kemac_remove_sub (GstMIKEYPayload * payload, guint idx) /** * gst_mikey_payload_kemac_add_sub: * @payload: a #GstMIKEYPayload - * @newpay: a #GstMIKEYPayload to add + * @newpay: (transfer full): a #GstMIKEYPayload to add * * Add a new sub payload to @payload. * * Returns: %TRUE on success. + * + * Since: 1.4 */ gboolean gst_mikey_payload_kemac_add_sub (GstMIKEYPayload * payload, @@ -230,12 +251,14 @@ gst_mikey_payload_kemac_add_sub (GstMIKEYPayload * payload, * @payload: a #GstMIKEYPayload * @C: envelope key cache indicator * @data_len: the length of @data - * @data: the encrypted envelope key + * @data: (array length=data_len): the encrypted envelope key * * Set the PKE values in @payload. @payload must be of type - * #GST_MIKEY_PT_PKE. + * %GST_MIKEY_PT_PKE. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_pke_set (GstMIKEYPayload * payload, GstMIKEYCacheType C, @@ -253,10 +276,12 @@ gst_mikey_payload_pke_set (GstMIKEYPayload * payload, GstMIKEYCacheType C, return TRUE; } -static void -gst_mikey_payload_pke_clear (GstMIKEYPayloadPKE * payload) +static gboolean +gst_mikey_payload_pke_dispose (GstMIKEYPayloadPKE * payload) { FREE_MEMDUP (payload->data); + + return TRUE; } static GstMIKEYPayloadPKE * @@ -296,11 +321,13 @@ get_ts_len (GstMIKEYTSType type) * gst_mikey_payload_t_set: * @payload: a #GstMIKEYPayload * @type: the #GstMIKEYTSType - * @ts_value: the timestamp value + * @ts_value: (array): the timestamp value * - * Set the timestamp in a #GST_MIKEY_PT_T @payload. + * Set the timestamp in a %GST_MIKEY_PT_T @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_t_set (GstMIKEYPayload * payload, @@ -321,10 +348,12 @@ gst_mikey_payload_t_set (GstMIKEYPayload * payload, return TRUE; } -static void -gst_mikey_payload_t_clear (GstMIKEYPayloadT * payload) +static gboolean +gst_mikey_payload_t_dispose (GstMIKEYPayloadT * payload) { FREE_MEMDUP (payload->ts_value); + + return TRUE; } static GstMIKEYPayloadT * @@ -355,6 +384,8 @@ param_clear (GstMIKEYPayloadSPParam * param) * Set the Security Policy parameters for @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_sp_set (GstMIKEYPayload * payload, @@ -372,10 +403,12 @@ gst_mikey_payload_sp_set (GstMIKEYPayload * payload, return TRUE; } -static void -gst_mikey_payload_sp_clear (GstMIKEYPayloadSP * payload) +static gboolean +gst_mikey_payload_sp_dispose (GstMIKEYPayloadSP * payload) { FREE_ARRAY (payload->params); + + return TRUE; } static GstMIKEYPayloadSP * @@ -398,10 +431,12 @@ gst_mikey_payload_sp_copy (const GstMIKEYPayloadSP * payload) * gst_mikey_payload_sp_get_n_params: * @payload: a #GstMIKEYPayload * - * Get the number of security policy parameters in a #GST_MIKEY_PT_SP + * Get the number of security policy parameters in a %GST_MIKEY_PT_SP * @payload. * * Returns: the number of parameters in @payload + * + * Since: 1.4 */ guint gst_mikey_payload_sp_get_n_params (const GstMIKEYPayload * payload) @@ -420,10 +455,12 @@ gst_mikey_payload_sp_get_n_params (const GstMIKEYPayload * payload) * @payload: a #GstMIKEYPayload * @idx: an index * - * Get the Security Policy parameter in a #GST_MIKEY_PT_SP @payload + * Get the Security Policy parameter in a %GST_MIKEY_PT_SP @payload * at @idx. * * Returns: the #GstMIKEYPayloadSPParam at @idx in @payload + * + * Since: 1.4 */ const GstMIKEYPayloadSPParam * gst_mikey_payload_sp_get_param (const GstMIKEYPayload * payload, guint idx) @@ -444,10 +481,12 @@ gst_mikey_payload_sp_get_param (const GstMIKEYPayload * payload, guint idx) * @payload: a #GstMIKEYPayload * @idx: an index * - * Remove the Security Policy parameters from a #GST_MIKEY_PT_SP + * Remove the Security Policy parameters from a %GST_MIKEY_PT_SP * @payload at @idx. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_sp_remove_param (GstMIKEYPayload * payload, guint idx) @@ -468,12 +507,14 @@ gst_mikey_payload_sp_remove_param (GstMIKEYPayload * payload, guint idx) * @payload: a #GstMIKEYPayload * @type: a type * @len: a length - * @val: @len bytes of data + * @val: (array length=len): @len bytes of data * - * Add a new parameter to the #GST_MIKEY_PT_SP @payload with @type, @len + * Add a new parameter to the %GST_MIKEY_PT_SP @payload with @type, @len * and @val. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_sp_add_param (GstMIKEYPayload * payload, @@ -499,11 +540,13 @@ gst_mikey_payload_sp_add_param (GstMIKEYPayload * payload, * gst_mikey_payload_rand_set: * @payload: a #GstMIKEYPayload * @len: the length of @rand - * @rand: random values + * @rand: (array length=len): random values * - * Set the random values in a #GST_MIKEY_PT_RAND @payload. + * Set the random values in a %GST_MIKEY_PT_RAND @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_rand_set (GstMIKEYPayload * payload, guint8 len, @@ -520,10 +563,12 @@ gst_mikey_payload_rand_set (GstMIKEYPayload * payload, guint8 len, return TRUE; } -static void -gst_mikey_payload_rand_clear (GstMIKEYPayloadRAND * payload) +static gboolean +gst_mikey_payload_rand_dispose (GstMIKEYPayloadRAND * payload) { FREE_MEMDUP (payload->rand); + + return TRUE; } static GstMIKEYPayloadRAND * @@ -544,12 +589,14 @@ gst_mikey_payload_rand_copy (const GstMIKEYPayloadRAND * payload) * @payload: a #GstMIKEYPayload * @key_type: a #GstMIKEYKeyDataType * @key_len: the length of @key_data - * @key_data: the key of type @key_type + * @key_data: (array length=key_len): the key of type @key_type * * Set @key_len bytes of @key_data of type @key_type as the key for the - * #GST_MIKEY_PT_KEY_DATA @payload. + * %GST_MIKEY_PT_KEY_DATA @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_key_data_set_key (GstMIKEYPayload * payload, @@ -572,12 +619,14 @@ gst_mikey_payload_key_data_set_key (GstMIKEYPayload * payload, * gst_mikey_payload_key_data_set_salt: * @payload: a #GstMIKEYPayload * @salt_len: the length of @salt_data - * @salt_data: the salt + * @salt_data: (array length=salt_len) (allow-none): the salt * * Set the salt key data. If @salt_len is 0 and @salt_data is %NULL, the * salt data will be removed. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_key_data_set_salt (GstMIKEYPayload * payload, @@ -602,11 +651,13 @@ gst_mikey_payload_key_data_set_salt (GstMIKEYPayload * payload, * gst_mikey_payload_key_data_set_spi: * @payload: a #GstMIKEYPayload * @spi_len: the length of @spi_data - * @spi_data: the SPI/MKI data + * @spi_data: (array length=spi_len): the SPI/MKI data * - * Set the SPI/MKI validity in the #GST_MIKEY_PT_KEY_DATA @payload. + * Set the SPI/MKI validity in the %GST_MIKEY_PT_KEY_DATA @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_key_data_set_spi (GstMIKEYPayload * payload, @@ -632,13 +683,15 @@ gst_mikey_payload_key_data_set_spi (GstMIKEYPayload * payload, * gst_mikey_payload_key_data_set_interval: * @payload: a #GstMIKEYPayload * @vf_len: the length of @vf_data - * @vf_data: the Valid From data + * @vf_data: (array length=vf_data): the Valid From data * @vt_len: the length of @vt_data - * @vt_data: the Valid To data + * @vt_data: (array length=vt_len): the Valid To data * - * Set the key validity period in the #GST_MIKEY_PT_KEY_DATA @payload. + * Set the key validity period in the %GST_MIKEY_PT_KEY_DATA @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_payload_key_data_set_interval (GstMIKEYPayload * payload, @@ -663,13 +716,15 @@ gst_mikey_payload_key_data_set_interval (GstMIKEYPayload * payload, return TRUE; } -static void -gst_mikey_payload_key_data_clear (GstMIKEYPayloadKeyData * payload) +static gboolean +gst_mikey_payload_key_data_dispose (GstMIKEYPayloadKeyData * payload) { FREE_MEMDUP (payload->key_data); FREE_MEMDUP (payload->salt_data); FREE_MEMDUP (payload->kv_data[0]); FREE_MEMDUP (payload->kv_data[1]); + + return TRUE; } static GstMIKEYPayloadKeyData * @@ -695,37 +750,46 @@ gst_mikey_payload_key_data_copy (const GstMIKEYPayloadKeyData * payload) /* General Extension Payload */ +static void +mikey_payload_free (GstMIKEYPayload * payload) +{ + g_slice_free1 (payload->len, payload); +} + + /** * gst_mikey_payload_new: * @type: a #GstMIKEYPayloadType * * Make a new #GstMIKEYPayload with @type. * - * Returns: a new #GstMIKEYPayload or %NULL on failure. + * Returns: (nullable): a new #GstMIKEYPayload or %NULL on failure. + * + * Since: 1.4 */ GstMIKEYPayload * gst_mikey_payload_new (GstMIKEYPayloadType type) { guint len = 0; - GstMIKEYPayloadClearFunc clear; - GstMIKEYPayloadCopyFunc copy; GstMIKEYPayload *result; + GstMiniObjectCopyFunction copy; + GstMiniObjectDisposeFunction clear; switch (type) { case GST_MIKEY_PT_KEMAC: len = sizeof (GstMIKEYPayloadKEMAC); - clear = (GstMIKEYPayloadClearFunc) gst_mikey_payload_kemac_clear; - copy = (GstMIKEYPayloadCopyFunc) gst_mikey_payload_kemac_copy; + clear = (GstMiniObjectDisposeFunction) gst_mikey_payload_kemac_dispose; + copy = (GstMiniObjectCopyFunction) gst_mikey_payload_kemac_copy; break; case GST_MIKEY_PT_T: len = sizeof (GstMIKEYPayloadT); - clear = (GstMIKEYPayloadClearFunc) gst_mikey_payload_t_clear; - copy = (GstMIKEYPayloadCopyFunc) gst_mikey_payload_t_copy; + clear = (GstMiniObjectDisposeFunction) gst_mikey_payload_t_dispose; + copy = (GstMiniObjectCopyFunction) gst_mikey_payload_t_copy; break; case GST_MIKEY_PT_PKE: len = sizeof (GstMIKEYPayloadPKE); - clear = (GstMIKEYPayloadClearFunc) gst_mikey_payload_pke_clear; - copy = (GstMIKEYPayloadCopyFunc) gst_mikey_payload_pke_copy; + clear = (GstMiniObjectDisposeFunction) gst_mikey_payload_pke_dispose; + copy = (GstMiniObjectCopyFunction) gst_mikey_payload_pke_copy; break; case GST_MIKEY_PT_DH: case GST_MIKEY_PT_SIGN: @@ -735,20 +799,20 @@ gst_mikey_payload_new (GstMIKEYPayloadType type) case GST_MIKEY_PT_V: case GST_MIKEY_PT_SP: len = sizeof (GstMIKEYPayloadSP); - clear = (GstMIKEYPayloadClearFunc) gst_mikey_payload_sp_clear; - copy = (GstMIKEYPayloadCopyFunc) gst_mikey_payload_sp_copy; + clear = (GstMiniObjectDisposeFunction) gst_mikey_payload_sp_dispose; + copy = (GstMiniObjectCopyFunction) gst_mikey_payload_sp_copy; break; case GST_MIKEY_PT_RAND: len = sizeof (GstMIKEYPayloadRAND); - clear = (GstMIKEYPayloadClearFunc) gst_mikey_payload_rand_clear; - copy = (GstMIKEYPayloadCopyFunc) gst_mikey_payload_rand_copy; + clear = (GstMiniObjectDisposeFunction) gst_mikey_payload_rand_dispose; + copy = (GstMiniObjectCopyFunction) gst_mikey_payload_rand_copy; break; case GST_MIKEY_PT_ERR: break; case GST_MIKEY_PT_KEY_DATA: len = sizeof (GstMIKEYPayloadKeyData); - clear = (GstMIKEYPayloadClearFunc) gst_mikey_payload_key_data_clear; - copy = (GstMIKEYPayloadCopyFunc) gst_mikey_payload_key_data_copy; + clear = (GstMiniObjectDisposeFunction) gst_mikey_payload_key_data_dispose; + copy = (GstMiniObjectCopyFunction) gst_mikey_payload_key_data_copy; break; case GST_MIKEY_PT_GEN_EXT: case GST_MIKEY_PT_LAST: @@ -758,55 +822,47 @@ gst_mikey_payload_new (GstMIKEYPayloadType type) return NULL; result = g_slice_alloc0 (len); + gst_mini_object_init (GST_MINI_OBJECT_CAST (result), + 0, GST_TYPE_MIKEY_PAYLOAD, copy, clear, + (GstMiniObjectFreeFunction) mikey_payload_free); result->type = type; result->len = len; - result->clear_func = clear; - result->copy_func = copy; return result; } -/** - * gst_mikey_payload_copy: - * @payload: a #GstMIKEYPayload - * - * Copy @payload. - * - * Returns: a new #GstMIKEYPayload that is a copy of @payload - */ -GstMIKEYPayload * -gst_mikey_payload_copy (const GstMIKEYPayload * payload) +static GstMIKEYMessage * +mikey_message_copy (GstMIKEYMessage * msg) { - g_return_val_if_fail (payload != NULL, NULL); - g_return_val_if_fail (payload->copy_func != NULL, NULL); + GstMIKEYMessage *copy; + guint i, len; - return payload->copy_func (payload); -} + copy = gst_mikey_message_new (); -/** - * gst_mikey_payload_free: - * @payload: a #GstMIKEYPayload - * - * Free @payload - * - * Returns: %TRUE on success - */ -gboolean -gst_mikey_payload_free (GstMIKEYPayload * payload) -{ - g_return_val_if_fail (payload != NULL, FALSE); + gst_mikey_message_set_info (copy, msg->version, msg->type, msg->V, + msg->prf_func, msg->CSB_id, msg->map_type); - if (payload->clear_func) - payload->clear_func (payload); - g_slice_free1 (payload->len, payload); + len = msg->map_info->len; + for (i = 0; i < len; i++) { + const GstMIKEYMapSRTP *srtp = gst_mikey_message_get_cs_srtp (msg, i); + gst_mikey_message_add_cs_srtp (copy, srtp->policy, srtp->ssrc, srtp->roc); + } - return TRUE; + len = msg->payloads->len; + for (i = 0; i < len; i++) { + const GstMIKEYPayload *pay = gst_mikey_message_get_payload (msg, i); + gst_mikey_message_add_payload (copy, gst_mikey_payload_copy (pay)); + } + return copy; } static void -payload_destroy (GstMIKEYPayload ** payload) +mikey_message_free (GstMIKEYMessage * msg) { - gst_mikey_payload_free (*payload); + FREE_ARRAY (msg->map_info); + FREE_ARRAY (msg->payloads); + + g_slice_free (GstMIKEYMessage, msg); } /** @@ -815,6 +871,8 @@ payload_destroy (GstMIKEYPayload ** payload) * Make a new MIKEY message. * * Returns: a new #GstMIKEYMessage on success + * + * Since: 1.4 */ GstMIKEYMessage * gst_mikey_message_new (void) @@ -822,6 +880,10 @@ gst_mikey_message_new (void) GstMIKEYMessage *result; result = g_slice_new0 (GstMIKEYMessage); + gst_mini_object_init (GST_MINI_OBJECT_CAST (result), + 0, GST_TYPE_MIKEY_MESSAGE, + (GstMiniObjectCopyFunction) mikey_message_copy, NULL, + (GstMiniObjectFreeFunction) mikey_message_free); INIT_ARRAY (result->map_info, GstMIKEYMapSRTP, NULL); INIT_ARRAY (result->payloads, GstMIKEYPayload *, payload_destroy); @@ -838,6 +900,8 @@ gst_mikey_message_new (void) * Make a new #GstMIKEYMessage from @bytes. * * Returns: a new #GstMIKEYMessage + * + * Since: 1.4 */ GstMIKEYMessage * gst_mikey_message_new_from_bytes (GBytes * bytes, GstMIKEYDecryptInfo * info, @@ -853,23 +917,6 @@ gst_mikey_message_new_from_bytes (GBytes * bytes, GstMIKEYDecryptInfo * info, } /** - * gst_mikey_message_free: - * @msg: a #GstMIKEYMessage - * - * Free all resources allocated in @msg. - */ -void -gst_mikey_message_free (GstMIKEYMessage * msg) -{ - g_return_if_fail (msg != NULL); - - FREE_ARRAY (msg->map_info); - FREE_ARRAY (msg->payloads); - - g_slice_free (GstMIKEYMessage, msg); -} - -/** * gst_mikey_message_set_info: * @msg: a #GstMIKEYMessage * @version: a version @@ -882,6 +929,8 @@ gst_mikey_message_free (GstMIKEYMessage * msg) * Set the information in @msg. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_set_info (GstMIKEYMessage * msg, guint8 version, @@ -907,6 +956,8 @@ gst_mikey_message_set_info (GstMIKEYMessage * msg, guint8 version, * Get the number of crypto sessions in @msg. * * Returns: the number of crypto sessions + * + * Since: 1.4 */ guint gst_mikey_message_get_n_cs (const GstMIKEYMessage * msg) @@ -924,6 +975,8 @@ gst_mikey_message_get_n_cs (const GstMIKEYMessage * msg) * Get the policy information of @msg at @idx. * * Returns: a #GstMIKEYMapSRTP + * + * Since: 1.4 */ const GstMIKEYMapSRTP * gst_mikey_message_get_cs_srtp (const GstMIKEYMessage * msg, guint idx) @@ -948,6 +1001,8 @@ gst_mikey_message_get_cs_srtp (const GstMIKEYMessage * msg, guint idx) * When @idx is -1, the policy will be appended. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_insert_cs_srtp (GstMIKEYMessage * msg, gint idx, @@ -975,6 +1030,8 @@ gst_mikey_message_insert_cs_srtp (GstMIKEYMessage * msg, gint idx, * Replace a Crypto Session map for SRTP in @msg at @idx with @map. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_replace_cs_srtp (GstMIKEYMessage * msg, gint idx, @@ -998,6 +1055,8 @@ gst_mikey_message_replace_cs_srtp (GstMIKEYMessage * msg, gint idx, * Remove the SRTP policy at @idx. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_remove_cs_srtp (GstMIKEYMessage * msg, gint idx) @@ -1021,6 +1080,8 @@ gst_mikey_message_remove_cs_srtp (GstMIKEYMessage * msg, gint idx) * Add a Crypto policy for SRTP to @msg. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_cs_srtp (GstMIKEYMessage * msg, guint8 policy, @@ -1046,6 +1107,8 @@ gst_mikey_message_add_cs_srtp (GstMIKEYMessage * msg, guint8 policy, * Get the number of payloads in @msg. * * Returns: the number of payloads in @msg + * + * Since: 1.4 */ guint gst_mikey_message_get_n_payloads (const GstMIKEYMessage * msg) @@ -1062,7 +1125,10 @@ gst_mikey_message_get_n_payloads (const GstMIKEYMessage * msg) * * Get the #GstMIKEYPayload at @idx in @msg * - * Returns: the #GstMIKEYPayload at @idx + * Returns: (transfer none): the #GstMIKEYPayload at @idx. The payload + * remains valid for as long as it is part of @msg. + * + * Since: 1.4 */ const GstMIKEYPayload * gst_mikey_message_get_payload (const GstMIKEYMessage * msg, guint idx) @@ -1084,6 +1150,8 @@ gst_mikey_message_get_payload (const GstMIKEYMessage * msg, guint idx) * Find the @nth occurence of the payload with @type in @msg. * * Returns: the @nth #GstMIKEYPayload of @type. + * + * Since: 1.4 */ const GstMIKEYPayload * gst_mikey_message_find_payload (const GstMIKEYMessage * msg, @@ -1115,6 +1183,8 @@ gst_mikey_message_find_payload (const GstMIKEYMessage * msg, * Remove the payload in @msg at @idx * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_remove_payload (GstMIKEYMessage * msg, guint idx) @@ -1131,12 +1201,14 @@ gst_mikey_message_remove_payload (GstMIKEYMessage * msg, guint idx) * gst_mikey_message_insert_payload: * @msg: a #GstMIKEYMessage * @idx: an index - * @payload: a #GstMIKEYPayload + * @payload: (transfer full): a #GstMIKEYPayload * * Insert the @payload at index @idx in @msg. If @idx is -1, the payload * will be appended to @msg. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_insert_payload (GstMIKEYMessage * msg, guint idx, @@ -1157,11 +1229,13 @@ gst_mikey_message_insert_payload (GstMIKEYMessage * msg, guint idx, /** * gst_mikey_message_add_payload: * @msg: a #GstMIKEYMessage - * @payload: a #GstMIKEYPayload + * @payload: (transfer full): a #GstMIKEYPayload * * Add a new payload to @msg. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_payload (GstMIKEYMessage * msg, GstMIKEYPayload * payload) @@ -1173,11 +1247,13 @@ gst_mikey_message_add_payload (GstMIKEYMessage * msg, GstMIKEYPayload * payload) * gst_mikey_message_replace_payload: * @msg: a #GstMIKEYMessage * @idx: an index - * @payload: a #GstMIKEYPayload + * @payload: (transfer full): a #GstMIKEYPayload * * Replace the payload at @idx in @msg with @payload. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_replace_payload (GstMIKEYMessage * msg, guint idx, @@ -1190,7 +1266,7 @@ gst_mikey_message_replace_payload (GstMIKEYMessage * msg, guint idx, g_return_val_if_fail (msg->payloads->len > idx, FALSE); p = g_array_index (msg->payloads, GstMIKEYPayload *, idx); - gst_mikey_payload_free (p); + gst_mikey_payload_unref (p); g_array_index (msg->payloads, GstMIKEYPayload *, idx) = payload; return TRUE; @@ -1201,11 +1277,13 @@ gst_mikey_message_replace_payload (GstMIKEYMessage * msg, guint idx, * @msg: a #GstMIKEYMessage * @C: envelope key cache indicator * @data_len: the length of @data - * @data: the encrypted envelope key + * @data: (array length=data_len): the encrypted envelope key * * Add a new PKE payload to @msg with the given parameters. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_pke (GstMIKEYMessage * msg, GstMIKEYCacheType C, @@ -1217,7 +1295,7 @@ gst_mikey_message_add_pke (GstMIKEYMessage * msg, GstMIKEYCacheType C, p = gst_mikey_payload_new (GST_MIKEY_PT_PKE); if (!gst_mikey_payload_pke_set (p, C, data_len, data)) { - gst_mikey_payload_free (p); + gst_mikey_payload_unref (p); return FALSE; } @@ -1228,11 +1306,13 @@ gst_mikey_message_add_pke (GstMIKEYMessage * msg, GstMIKEYCacheType C, * gst_mikey_message_add_t: * @msg: a #GstMIKEYMessage * @type: specifies the timestamp type used - * @ts_value: The timestamp value of the specified @type + * @ts_value: (array): The timestamp value of the specified @type * * Add a new T payload to @msg with the given parameters. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_t (GstMIKEYMessage * msg, GstMIKEYTSType type, @@ -1244,7 +1324,7 @@ gst_mikey_message_add_t (GstMIKEYMessage * msg, GstMIKEYTSType type, p = gst_mikey_payload_new (GST_MIKEY_PT_T); if (!gst_mikey_payload_t_set (p, type, ts_value)) { - gst_mikey_payload_free (p); + gst_mikey_payload_unref (p); return FALSE; } @@ -1259,6 +1339,8 @@ gst_mikey_message_add_t (GstMIKEYMessage * msg, GstMIKEYTSType type, * in NTP-UTC format. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_t_now_ntp_utc (GstMIKEYMessage * msg) @@ -1284,11 +1366,13 @@ gst_mikey_message_add_t_now_ntp_utc (GstMIKEYMessage * msg) * gst_mikey_message_add_rand: * @msg: a #GstMIKEYMessage * @len: the length of @rand - * @rand: random data + * @rand: (array length=len): random data * * Add a new RAND payload to @msg with the given parameters. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_rand (GstMIKEYMessage * msg, guint8 len, @@ -1301,7 +1385,7 @@ gst_mikey_message_add_rand (GstMIKEYMessage * msg, guint8 len, p = gst_mikey_payload_new (GST_MIKEY_PT_RAND); if (!gst_mikey_payload_rand_set (p, len, rand)) { - gst_mikey_payload_free (p); + gst_mikey_payload_unref (p); return FALSE; } @@ -1316,6 +1400,8 @@ gst_mikey_message_add_rand (GstMIKEYMessage * msg, guint8 len, * Add a new RAND payload to @msg with @len random bytes. * * Returns: %TRUE on success + * + * Since: 1.4 */ gboolean gst_mikey_message_add_rand_len (GstMIKEYMessage * msg, guint8 len) @@ -1582,6 +1668,8 @@ payloads_to_bytes (GArray * payloads, GByteArray * arr, guint8 ** ptr, * Convert @msg to a #GBytes. * * Returns: a new #GBytes for @msg. + * + * Since: 1.4 */ GBytes * gst_mikey_message_to_bytes (GstMIKEYMessage * msg, GstMIKEYEncryptInfo * info, @@ -1943,21 +2031,21 @@ short_data: { GST_DEBUG ("not enough data"); if (p) - gst_mikey_payload_free (p); + gst_mikey_payload_unref (p); return FALSE; } invalid_data: { GST_DEBUG ("invalid data"); if (p) - gst_mikey_payload_free (p); + gst_mikey_payload_unref (p); return FALSE; } } /** * gst_mikey_message_new_from_data: - * @data: bytes to read + * @data: (array length=size) (element-type guint8): bytes to read * @size: length of @data * @info: #GstMIKEYDecryptInfo * @error: a #GError @@ -1967,6 +2055,8 @@ invalid_data: * * Returns: a #GstMIKEYMessage on success or %NULL when parsing failed and * @error will be set. + * + * Since: 1.4 */ GstMIKEYMessage * gst_mikey_message_new_from_data (gconstpointer data, gsize size, @@ -2042,19 +2132,19 @@ gst_mikey_message_new_from_data (gconstpointer data, gsize size, short_data: { GST_DEBUG ("not enough data"); - gst_mikey_message_free (msg); + gst_mikey_message_unref (msg); return NULL; } unknown_version: { GST_DEBUG ("unknown version"); - gst_mikey_message_free (msg); + gst_mikey_message_unref (msg); return NULL; } parse_error: { GST_DEBUG ("failed to parse"); - gst_mikey_message_free (msg); + gst_mikey_message_unref (msg); return NULL; } } diff --git a/gst-libs/gst/sdp/gstmikey.h b/gst-libs/gst/sdp/gstmikey.h index 0ffeb2f..91d7be2 100644 --- a/gst-libs/gst/sdp/gstmikey.h +++ b/gst-libs/gst/sdp/gstmikey.h @@ -26,6 +26,9 @@ G_BEGIN_DECLS +GType gst_mikey_message_get_type(void); +#define GST_TYPE_MIKEY_MESSAGE (gst_mikey_message_get_type()) + typedef struct _GstMIKEYMessage GstMIKEYMessage; typedef struct _GstMIKEYEncryptInfo GstMIKEYEncryptInfo; typedef struct _GstMIKEYDecryptInfo GstMIKEYDecryptInfo; @@ -140,21 +143,8 @@ typedef struct { typedef struct _GstMIKEYPayload GstMIKEYPayload; -/** - * GstMIKEYPayloadClearFunc: - * @payload: a #GstMIKEYPayload - * - * Function used to clear a payload - */ -typedef void (*GstMIKEYPayloadClearFunc) (GstMIKEYPayload *payload); - -/** - * GstMIKEYPayloadCopyFunc: - * @payload: a #GstMIKEYPayload - * - * Function used to copy a payload - */ -typedef GstMIKEYPayload * (*GstMIKEYPayloadCopyFunc) (const GstMIKEYPayload *payload); +GType gst_mikey_payload_get_type(void); +#define GST_TYPE_MIKEY_PAYLOAD (gst_mikey_payload_get_type()) /** * GstMIKEYPayload: @@ -166,15 +156,71 @@ typedef GstMIKEYPayload * (*GstMIKEYPayloadCopyFunc) (const GstMIKEYPayload *pay * Hold the common fields for all payloads */ struct _GstMIKEYPayload { + GstMiniObject mini_object; + GstMIKEYPayloadType type; guint len; - GstMIKEYPayloadClearFunc clear_func; - GstMIKEYPayloadCopyFunc copy_func; }; GstMIKEYPayload * gst_mikey_payload_new (GstMIKEYPayloadType type); -GstMIKEYPayload * gst_mikey_payload_copy (const GstMIKEYPayload *payload); -gboolean gst_mikey_payload_free (GstMIKEYPayload *payload); + +/** + * gst_mikey_payload_ref: + * @payload: The payload to refcount + * + * Increase the refcount of this payload. + * + * Returns: (transfer full): @payload (for convenience when doing assignments) + * + * Since: 1.4 + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC GstMIKEYPayload * gst_mikey_payload_ref (GstMIKEYPayload * payload); +#endif + +static inline GstMIKEYPayload * +gst_mikey_payload_ref (GstMIKEYPayload * payload) +{ + return (GstMIKEYPayload *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (payload)); +} + +/** + * gst_mikey_payload_unref: + * @payload: (transfer full): the payload to refcount + * + * Decrease the refcount of an payload, freeing it if the refcount reaches 0. + * + * Since: 1.4 + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC void gst_mikey_payload_unref (GstMIKEYPayload * payload); +#endif + +static inline void +gst_mikey_payload_unref (GstMIKEYPayload * payload) +{ + gst_mini_object_unref (GST_MINI_OBJECT_CAST (payload)); +} + +/** + * gst_mikey_payload_copy: + * @payload: a #GstMIKEYPayload. + * + * Create a copy of the given payload. + * + * Returns: (transfer full): a new copy of @payload. + * + * Since: 1.4 + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC GstMIKEYPayload * gst_mikey_payload_copy (const GstMIKEYPayload * buf); +#endif + +static inline GstMIKEYPayload * +gst_mikey_payload_copy (const GstMIKEYPayload * payload) +{ + return (GstMIKEYPayload *) gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (payload)); +} /** * GstMIKEYEncAlg: @@ -491,6 +537,8 @@ gboolean gst_mikey_payload_key_data_set_interval (GstMIKEYPayload *payload, */ struct _GstMIKEYMessage { + GstMiniObject mini_object; + guint8 version; GstMIKEYType type; gboolean V; @@ -509,7 +557,64 @@ GstMIKEYMessage * gst_mikey_message_new_from_bytes (GBytes *bytes, GError **error); GBytes * gst_mikey_message_to_bytes (GstMIKEYMessage *msg, GstMIKEYEncryptInfo *info, GError **error); -void gst_mikey_message_free (GstMIKEYMessage *msg); +/** + * gst_mikey_message_ref: + * @message: The message to refcount + * + * Increase the refcount of this message. + * + * Returns: (transfer full): @message (for convenience when doing assignments) + * + * Since: 1.4 + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC GstMIKEYMessage * gst_mikey_message_ref (GstMIKEYMessage * message); +#endif + +static inline GstMIKEYMessage * +gst_mikey_message_ref (GstMIKEYMessage * message) +{ + return (GstMIKEYMessage *) gst_mini_object_ref (GST_MINI_OBJECT_CAST (message)); +} + +/** + * gst_mikey_message_unref: + * @message: (transfer full): the message to refcount + * + * Decrease the refcount of an message, freeing it if the refcount reaches 0. + * + * Since: 1.4 + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC void gst_mikey_message_unref (GstMIKEYMessage * message); +#endif + +static inline void +gst_mikey_message_unref (GstMIKEYMessage * message) +{ + gst_mini_object_unref (GST_MINI_OBJECT_CAST (message)); +} + +/** + * gst_mikey_message_copy: + * @message: a #GstMIKEYMessage. + * + * Create a copy of the given message. + * + * Returns: (transfer full): a new copy of @message. + * + * Since: 1.4 + */ +#ifdef _FOOL_GTK_DOC_ +G_INLINE_FUNC GstMIKEYMessage * gst_mikey_message_copy (const GstMIKEYMessage * buf); +#endif + +static inline GstMIKEYMessage * +gst_mikey_message_copy (const GstMIKEYMessage * message) +{ + return (GstMIKEYMessage *) gst_mini_object_copy (GST_MINI_OBJECT_CONST_CAST (message)); +} + gboolean gst_mikey_message_set_info (GstMIKEYMessage *msg, guint8 version, GstMIKEYType type, gboolean V, diff --git a/gst-libs/gst/sdp/sdp.h b/gst-libs/gst/sdp/sdp.h index 0647bf6..c5cc089 100644 --- a/gst-libs/gst/sdp/sdp.h +++ b/gst-libs/gst/sdp/sdp.h @@ -24,5 +24,6 @@ #include <gst/sdp/gstsdp.h> #include <gst/sdp/gstsdpmessage.h> +#include <gst/sdp/gstmikey.h> #endif /* __GST_SDP__H__ */ diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index 9760619..95577d1 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -926,26 +926,46 @@ gst_video_decoder_parse_available (GstVideoDecoder * dec, gboolean at_eos, GstVideoDecoderClass *decoder_class = GST_VIDEO_DECODER_GET_CLASS (dec); GstVideoDecoderPrivate *priv = dec->priv; GstFlowReturn ret = GST_FLOW_OK; - gsize start_size, available; + gsize was_available, available; + guint inactive = 0; available = gst_adapter_available (priv->input_adapter); - start_size = 0; - while (ret == GST_FLOW_OK && ((available && start_size != available) - || new_buffer)) { + while (available || new_buffer) { new_buffer = FALSE; /* current frame may have been parsed and handled, * so we need to set up a new one when asking subclass to parse */ if (priv->current_frame == NULL) priv->current_frame = gst_video_decoder_new_frame (dec); - start_size = available; + was_available = available; ret = decoder_class->parse (dec, priv->current_frame, priv->input_adapter, at_eos); + if (ret != GST_FLOW_OK) + break; + + /* if the subclass returned success (GST_FLOW_OK), it is expected + * to have collected and submitted a frame, i.e. it should have + * called gst_video_decoder_have_frame(), or at least consumed a + * few bytes through gst_video_decoder_add_to_frame(). + * + * Otherwise, this is an implementation bug, and we error out + * after 2 failed attempts */ available = gst_adapter_available (priv->input_adapter); + if (!priv->current_frame || available != was_available) + inactive = 0; + else if (++inactive == 2) + goto error_inactive; } return ret; + + /* ERRORS */ +error_inactive: + { + GST_ERROR_OBJECT (dec, "Failed to consume data. Error in subclass?"); + return GST_FLOW_ERROR; + } } static GstFlowReturn @@ -3720,7 +3740,7 @@ gst_video_decoder_set_needs_format (GstVideoDecoder * dec, gboolean enabled) * * Queries decoder required format handling. * - * Returns: TRUE if required format handling is enabled. + * Returns: %TRUE if required format handling is enabled. * * Since: 1.4 */ diff --git a/gst-libs/gst/video/video-tile.c b/gst-libs/gst/video/video-tile.c index 10954a5..dd40ee6 100644 --- a/gst-libs/gst/video/video-tile.c +++ b/gst-libs/gst/video/video-tile.c @@ -30,10 +30,12 @@ * Get the tile index of the tile at coordinates @x and @y in the tiled * image of @x_tiles by @y_tiles. * - * Use this method when @mode is of type #GST_VIDEO_TILE_MODE_INDEXED. + * Use this method when @mode is of type %GST_VIDEO_TILE_MODE_INDEXED. * * Returns: the index of the tile at @x and @y in the tiled image of * @x_tiles by @y_tiles. + * + * Since: 1.4 */ guint gst_video_tile_get_index (GstVideoTileMode mode, gint x, gint y, |