static GstFlowReturn gst_hls_demux_data_received (GstAdaptiveDemux * demux, GstAdaptiveDemuxStream * stream) { GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux); gsize available; GstBuffer *buffer = NULL; available = gst_adapter_available (stream->adapter); /* Is it encrypted? */ if (hlsdemux->current_key) { GError *err = NULL; GstBuffer *tmp_buffer; /* must be a multiple of 16 */ available = available & (~0xF); if (available == 0) { return GST_FLOW_OK; } buffer = gst_adapter_take_buffer (stream->adapter, available); buffer = gst_hls_demux_decrypt_fragment (hlsdemux, buffer, &err); if (buffer == NULL) { GST_ELEMENT_ERROR (demux, STREAM, DECODE, ("Failed to decrypt buffer"), ("decryption failed %s", err->message)); g_error_free (err); return GST_FLOW_ERROR; } tmp_buffer = hlsdemux->pending_buffer; hlsdemux->pending_buffer = buffer; buffer = tmp_buffer; } else { buffer = gst_adapter_take_buffer (stream->adapter, available); if (hlsdemux->pending_buffer) { buffer = gst_buffer_append (hlsdemux->pending_buffer, buffer); hlsdemux->pending_buffer = NULL; } } return gst_hls_demux_handle_buffer (demux, stream, buffer, FALSE); }
static GstFlowReturn gst_hls_demux_data_received (GstAdaptiveDemux * demux, GstAdaptiveDemuxStream * stream, GstBuffer * buffer) { GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux); if (hlsdemux->current_offset == -1) hlsdemux->current_offset = GST_BUFFER_OFFSET_IS_VALID (buffer) ? GST_BUFFER_OFFSET (buffer) : 0; /* Is it encrypted? */ if (hlsdemux->current_key) { GError *err = NULL; gsize size; GstBuffer *tmp_buffer; gst_adapter_push (hlsdemux->pending_encrypted_data, buffer); size = gst_adapter_available (hlsdemux->pending_encrypted_data); /* must be a multiple of 16 */ size = size & (~0xF); if (size == 0) { return GST_FLOW_OK; } buffer = gst_adapter_take_buffer (hlsdemux->pending_encrypted_data, size); buffer = gst_hls_demux_decrypt_fragment (hlsdemux, buffer, &err); if (buffer == NULL) { GST_ELEMENT_ERROR (demux, STREAM, DECODE, ("Failed to decrypt buffer"), ("decryption failed %s", err->message)); g_error_free (err); return GST_FLOW_ERROR; } tmp_buffer = hlsdemux->pending_decrypted_buffer; hlsdemux->pending_decrypted_buffer = buffer; buffer = tmp_buffer; } return gst_hls_demux_handle_buffer (demux, stream, buffer, FALSE); }