Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21d21c09 authored by Gilad Broner's avatar Gilad Broner
Browse files

media: dvb: Add offset to mpq_streambuffer data disposal callback



mpq_streambuffer data disposal callback now passes along an offset
parameter to specify from which location in the buffer data was disposed
of. Also, data disposal callback is triggered whenever data is read
and not only when a meta-data packet is disposed.

Change-Id: I9541c82cd4f57336a03f10be9e210be010217f61
Signed-off-by: default avatarGilad Broner <gbroner@codeaurora.org>
parent 5cc57e3e
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ int mpq_streambuffer_init(
	sbuff->buffers = data_buffers;
	sbuff->pending_buffers_count = 0;
	sbuff->buffers_num = data_buff_num;
	sbuff->cb = NULL;
	dvb_ringbuffer_init(&sbuff->packet_data, packet_buff, packet_buff_size);

	return 0;
@@ -222,9 +223,6 @@ int mpq_streambuffer_pkt_dispose(
	spin_unlock(&sbuff->raw_data.lock);
	spin_unlock(&sbuff->packet_data.lock);

	if (sbuff->cb)
		sbuff->cb(sbuff, &packet, sbuff->cb_user_data);

	return 0;
}
EXPORT_SYMBOL(mpq_streambuffer_pkt_dispose);
@@ -414,6 +412,7 @@ ssize_t mpq_streambuffer_data_read(
				u8 *buf, size_t len)
{
	ssize_t actual_len = 0;
	u32 offset;

	if ((NULL == sbuff) || (NULL == buf))
		return -EINVAL;
@@ -436,6 +435,7 @@ ssize_t mpq_streambuffer_data_read(
			return -EPERM;
		}

		offset = sbuff->raw_data.pread;
		actual_len = dvb_ringbuffer_avail(&sbuff->raw_data);
		if (actual_len < len)
			len = actual_len;
@@ -463,10 +463,15 @@ ssize_t mpq_streambuffer_data_read(
		if (actual_len < len)
			len = actual_len;
		memcpy(buf, desc->base + desc->read_ptr, len);
		offset = desc->read_ptr;
		desc->read_ptr += len;
	}

	spin_unlock(&sbuff->raw_data.lock);

	if (sbuff->cb)
		sbuff->cb(sbuff, offset, len, sbuff->cb_user_data);

	return len;
}
EXPORT_SYMBOL(mpq_streambuffer_data_read);
@@ -477,6 +482,7 @@ ssize_t mpq_streambuffer_data_read_user(
		u8 __user *buf, size_t len)
{
	ssize_t actual_len = 0;
	u32 offset;

	if ((NULL == sbuff) || (NULL == buf))
		return -EINVAL;
@@ -493,6 +499,7 @@ ssize_t mpq_streambuffer_data_read_user(
		if (NULL == sbuff->raw_data.data)
			return -EPERM;

		offset = sbuff->raw_data.pread;
		actual_len = dvb_ringbuffer_avail(&sbuff->raw_data);
		if (actual_len < len)
			len = actual_len;
@@ -519,9 +526,13 @@ ssize_t mpq_streambuffer_data_read_user(
		if (copy_to_user(buf, desc->base + desc->read_ptr, len))
			return -EFAULT;

		offset = desc->read_ptr;
		desc->read_ptr += len;
	}

	if (sbuff->cb)
		sbuff->cb(sbuff, offset, len, sbuff->cb_user_data);

	return len;
}
EXPORT_SYMBOL(mpq_streambuffer_data_read_user);
@@ -530,6 +541,8 @@ int mpq_streambuffer_data_read_dispose(
			struct mpq_streambuffer *sbuff,
			size_t len)
{
	u32 offset;

	if (NULL == sbuff)
		return -EINVAL;

@@ -547,6 +560,7 @@ int mpq_streambuffer_data_read_dispose(
			return -EINVAL;
		}

		offset = sbuff->raw_data.pread;
		DVB_RINGBUFFER_SKIP(&sbuff->raw_data, len);
		wake_up_all(&sbuff->raw_data.queue);
	} else {
@@ -554,6 +568,8 @@ int mpq_streambuffer_data_read_dispose(

		desc = (struct mpq_streambuffer_buffer_desc *)
				&sbuff->raw_data.data[sbuff->raw_data.pread];
		offset = desc->read_ptr;

		if ((desc->read_ptr + len) > desc->size)
			desc->read_ptr = desc->size;
		else
@@ -562,6 +578,9 @@ int mpq_streambuffer_data_read_dispose(

	spin_unlock(&sbuff->raw_data.lock);

	if (sbuff->cb)
		sbuff->cb(sbuff, offset, len, sbuff->cb_user_data);

	return 0;
}
EXPORT_SYMBOL(mpq_streambuffer_data_read_dispose);
@@ -604,9 +623,9 @@ int mpq_streambuffer_get_buffer_handle(
EXPORT_SYMBOL(mpq_streambuffer_get_buffer_handle);


int mpq_streambuffer_register_pkt_dispose(
int mpq_streambuffer_register_data_dispose(
	struct mpq_streambuffer *sbuff,
	mpq_streambuffer_pkt_dispose_cb cb_func,
	mpq_streambuffer_dispose_cb cb_func,
	void *user_data)
{
	if ((NULL == sbuff) || (NULL == cb_func))
@@ -617,7 +636,7 @@ int mpq_streambuffer_register_pkt_dispose(

	return 0;
}
EXPORT_SYMBOL(mpq_streambuffer_register_pkt_dispose);
EXPORT_SYMBOL(mpq_streambuffer_register_data_dispose);


ssize_t mpq_streambuffer_data_free(
+3 −4
Original line number Diff line number Diff line
@@ -4558,8 +4558,7 @@ static int mpq_dmx_tspp2_notify_data_read(struct dmx_ts_feed *ts_feed,
}

static void mpq_dmx_tspp2_streambuffer_cb(struct mpq_streambuffer *sbuff,
	struct mpq_streambuffer_packet_header *packet,
	void *user_data)
	u32 offset, size_t len, void *user_data)
{
	int ret;
	struct pipe_info *pipe_info = user_data;
@@ -4573,7 +4572,7 @@ static void mpq_dmx_tspp2_streambuffer_cb(struct mpq_streambuffer *sbuff,
		return;
	}

	ret = mpq_dmx_release_data(pipe_info, packet->raw_data_len);
	ret = mpq_dmx_release_data(pipe_info, len);
	if (ret)
		MPQ_DVB_ERR_PRINT("%s: mpq_dmx_release_data failed, ret=%d\n",
			__func__, ret);
@@ -5367,7 +5366,7 @@ static int mpq_dmx_tspp2_start_filtering(struct dvb_demux_feed *feed)
	}

	if (dvb_dmx_is_video_feed(feed)) {
		ret = mpq_streambuffer_register_pkt_dispose(
		ret = mpq_streambuffer_register_data_dispose(
			mpq_feed->video_info.video_buffer,
			mpq_dmx_tspp2_streambuffer_cb,
			tspp2_feed->main_pipe);
+11 −11
Original line number Diff line number Diff line
@@ -103,19 +103,19 @@
 * - Disposal of packets:
 *      mpq_streambuffer_pkt_dispose(...)
 *
 *   For linear buffer mode, disposing of a packet with data size > 0, causes
 *   the current buffer to be marked as free for writing, and triggers moving to
 *   For linear buffer mode, disposing of a packet with data size > 0,
 *   regardless of the 'dispose_data' parameter, causes the current buffer's
 *   data to be disposed and marked as free for writing, and triggers moving to
 *   the next available buffer, that shall now be the current read buffer.

 *
 */

struct mpq_streambuffer;
struct mpq_streambuffer_packet_header;

typedef void (*mpq_streambuffer_pkt_dispose_cb) (
typedef void (*mpq_streambuffer_dispose_cb) (
	struct mpq_streambuffer *sbuff,
	struct mpq_streambuffer_packet_header *packet,
	u32 offset,
	size_t len,
	void *user_data);

enum mpq_streambuffer_mode {
@@ -143,7 +143,7 @@ struct mpq_streambuffer {
	enum mpq_streambuffer_mode mode;
	u32 buffers_num;
	u32 pending_buffers_count;
	mpq_streambuffer_pkt_dispose_cb cb;
	mpq_streambuffer_dispose_cb cb;
	void *cb_user_data;
};

@@ -422,9 +422,9 @@ ssize_t mpq_streambuffer_data_avail(
 * Returns error status
 * -EINVAL if arguments are invalid
 */
int mpq_streambuffer_register_pkt_dispose(
int mpq_streambuffer_register_data_dispose(
	struct mpq_streambuffer *sbuff,
	mpq_streambuffer_pkt_dispose_cb cb_func,
	mpq_streambuffer_dispose_cb cb_func,
	void *user_data);

/**