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

Commit 7e6c57e2 authored by Gilad Broner's avatar Gilad Broner
Browse files

Revert "media: dvb: Use fill count for dvb_ringbuffer"



This reverts commit f3ba3f6a.

In order to sync on buffer state with SDMX, demux manipulates the
read/write pointers of dvb_ringbuffer directly to account for new
data from SDMX. When dvb_ringbuffer is using fill count internally,
updating the read/write pointers does not affect the fill count
and so buffer is out of sync with SDMX.

Change-Id: I70828ba3337e49c53da67862b20d5f2c119f4271
Signed-off-by: default avatarGilad Broner <gbroner@codeaurora.org>
parent 5e741700
Loading
Loading
Loading
Loading
+17 −19
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
 * Copyright (C) 2003 Oliver Endriss
 * Copyright (C) 2004 Andrew de Quincey
 *
 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
 *
 * based on code originally found in av7110.c & dvb_ci.c:
 * Copyright (C) 1999-2003 Ralph  Metzler
@@ -49,7 +49,6 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
	rbuf->data=data;
	rbuf->size=len;
	rbuf->error=0;
	atomic_set(&rbuf->fill, 0);

	init_waitqueue_head(&rbuf->queue);

@@ -58,23 +57,33 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)



int dvb_ringbuffer_empty(const struct dvb_ringbuffer *rbuf)
int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf)
{
	return (atomic_read(&rbuf->fill) == 0);
	return (rbuf->pread == rbuf->pwrite);
}



ssize_t dvb_ringbuffer_free(const struct dvb_ringbuffer *rbuf)
ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf)
{
	return rbuf->size - atomic_read(&rbuf->fill);
	ssize_t free;

	free = rbuf->pread - rbuf->pwrite;
	if (free <= 0)
		free += rbuf->size;
	return free-1;
}



ssize_t dvb_ringbuffer_avail(const struct dvb_ringbuffer *rbuf)
ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf)
{
	return atomic_read(&rbuf->fill);
	ssize_t avail;

	avail = rbuf->pwrite - rbuf->pread;
	if (avail < 0)
		avail += rbuf->size;
	return avail;
}


@@ -83,7 +92,6 @@ void dvb_ringbuffer_flush(struct dvb_ringbuffer *rbuf)
{
	rbuf->pread = rbuf->pwrite;
	rbuf->error = 0;
	atomic_set(&rbuf->fill, 0);
}
EXPORT_SYMBOL(dvb_ringbuffer_flush);

@@ -91,9 +99,7 @@ void dvb_ringbuffer_reset(struct dvb_ringbuffer *rbuf)
{
	rbuf->pread = rbuf->pwrite = 0;
	rbuf->error = 0;
	atomic_set(&rbuf->fill, 0);
}
EXPORT_SYMBOL(dvb_ringbuffer_reset);

void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf)
{
@@ -118,13 +124,11 @@ ssize_t dvb_ringbuffer_read_user(struct dvb_ringbuffer *rbuf, u8 __user *buf, si
		buf += split;
		todo -= split;
		rbuf->pread = 0;
		atomic_sub(split, &rbuf->fill);
	}
	if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
		return -EFAULT;

	rbuf->pread = (rbuf->pread + todo) % rbuf->size;
	atomic_sub(todo, &rbuf->fill);

	return len;
}
@@ -140,12 +144,10 @@ void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf, u8 *buf, size_t len)
		buf += split;
		todo -= split;
		rbuf->pread = 0;
		atomic_sub(split, &rbuf->fill);
	}
	memcpy(buf, rbuf->data+rbuf->pread, todo);

	rbuf->pread = (rbuf->pread + todo) % rbuf->size;
	atomic_sub(todo, &rbuf->fill);
}


@@ -161,11 +163,9 @@ ssize_t dvb_ringbuffer_write(struct dvb_ringbuffer *rbuf, const u8 *buf, size_t
		buf += split;
		todo -= split;
		rbuf->pwrite = 0;
		atomic_add(split, &rbuf->fill);
	}
	memcpy(rbuf->data+rbuf->pwrite, buf, todo);
	rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
	atomic_add(todo, &rbuf->fill);

	return len;
}
@@ -187,7 +187,6 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf,
		buf += split;
		todo -= split;
		rbuf->pwrite = 0;
		atomic_add(split, &rbuf->fill);
	}

	if (copy_from_user(rbuf->data + rbuf->pwrite, buf, todo)) {
@@ -196,7 +195,6 @@ ssize_t dvb_ringbuffer_write_user(struct dvb_ringbuffer *rbuf,
	}

	rbuf->pwrite = (rbuf->pwrite + todo) % rbuf->size;
	atomic_add(todo, &rbuf->fill);

	return len;
}
+12 −16
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@
 * Copyright (C) 2003 Oliver Endriss
 * Copyright (C) 2004 Andrew de Quincey
 *
 * Copyright (c) 2012,2014, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
 *
 * based on code originally found in av7110.c & dvb_ci.c:
 * Copyright (C) 1999-2003 Ralph Metzler & Marcus Metzler
@@ -37,7 +37,6 @@ struct dvb_ringbuffer {
	ssize_t           size;
	ssize_t           pread;
	ssize_t           pwrite;
	atomic_t	fill;
	int               error;

	wait_queue_head_t queue;
@@ -80,13 +79,13 @@ struct dvb_ringbuffer {
extern void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len);

/* test whether buffer is empty */
extern int dvb_ringbuffer_empty(const struct dvb_ringbuffer *rbuf);
extern int dvb_ringbuffer_empty(struct dvb_ringbuffer *rbuf);

/* return the number of free bytes in the buffer */
extern ssize_t dvb_ringbuffer_free(const struct dvb_ringbuffer *rbuf);
extern ssize_t dvb_ringbuffer_free(struct dvb_ringbuffer *rbuf);

/* return the number of bytes waiting in the buffer */
extern ssize_t dvb_ringbuffer_avail(const struct dvb_ringbuffer *rbuf);
extern ssize_t dvb_ringbuffer_avail(struct dvb_ringbuffer *rbuf);


/*
@@ -110,13 +109,11 @@ extern void dvb_ringbuffer_flush_spinlock_wakeup(struct dvb_ringbuffer *rbuf);

/* advance read ptr by <num> bytes */
#define DVB_RINGBUFFER_SKIP(rbuf,num)	\
	{ (rbuf)->pread = ((rbuf)->pread+(num))%(rbuf)->size;	\
	atomic_sub((num), &(rbuf)->fill); }
			(rbuf)->pread = ((rbuf)->pread+(num))%(rbuf)->size

/* advance write ptr by <num> bytes */
#define DVB_RINGBUFFER_PUSH(rbuf, num)	\
	{ ((rbuf)->pwrite = (((rbuf)->pwrite+(num))%(rbuf)->size));	\
	atomic_add((num), &(rbuf)->fill); }
			((rbuf)->pwrite = (((rbuf)->pwrite+(num))%(rbuf)->size))

/*
** read <len> bytes from ring buffer into <buf>
@@ -134,8 +131,7 @@ extern void dvb_ringbuffer_read(struct dvb_ringbuffer *rbuf,
/* write single byte to ring buffer */
#define DVB_RINGBUFFER_WRITE_BYTE(rbuf,byte)	\
			{ (rbuf)->data[(rbuf)->pwrite]=(byte); \
			(rbuf)->pwrite = ((rbuf)->pwrite+1)%(rbuf)->size; \
			atomic_inc(&(rbuf)->fill); }
			(rbuf)->pwrite = ((rbuf)->pwrite+1)%(rbuf)->size; }
/*
** write <len> bytes to ring buffer
** <usermem> specifies whether <buf> resides in user space
+4 −1
Original line number Diff line number Diff line
@@ -183,7 +183,10 @@ struct dmx_buffer_status {
	/* fullness of buffer in bytes */
	unsigned int fullness;

	/* How many bytes are free */
	/*
	 * How many bytes are free
	 * It's the same as: size-fullness-1
	 */
	unsigned int free_bytes;

	/* read pointer offset in bytes */