[media] ngene: Strip dummy packets inserted by the driver
As the CI requires a continuous data stream, the driver inserts dummy packets when necessary. Do not pass these packets to userspace anymore. Signed-off-by: Oliver Endriss <o.endriss@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
3b2cfd6e1a
commit
36e3fc8957
|
@ -507,7 +507,7 @@ void FillTSBuffer(void *Buffer, int Length, u32 Flags)
|
||||||
{
|
{
|
||||||
u32 *ptr = Buffer;
|
u32 *ptr = Buffer;
|
||||||
|
|
||||||
memset(Buffer, 0xff, Length);
|
memset(Buffer, TS_FILLER, Length);
|
||||||
while (Length > 0) {
|
while (Length > 0) {
|
||||||
if (Flags & DF_SWAP32)
|
if (Flags & DF_SWAP32)
|
||||||
*ptr = 0x471FFF10;
|
*ptr = 0x471FFF10;
|
||||||
|
|
|
@ -118,6 +118,16 @@ static void swap_buffer(u32 *p, u32 len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* start of filler packet */
|
||||||
|
static u8 fill_ts[] = { 0x47, 0x1f, 0xff, 0x10, TS_FILLER };
|
||||||
|
|
||||||
|
/* #define DEBUG_CI_XFER */
|
||||||
|
#ifdef DEBUG_CI_XFER
|
||||||
|
static u32 ok;
|
||||||
|
static u32 overflow;
|
||||||
|
static u32 stripped;
|
||||||
|
#endif
|
||||||
|
|
||||||
void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
|
void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
|
||||||
{
|
{
|
||||||
struct ngene_channel *chan = priv;
|
struct ngene_channel *chan = priv;
|
||||||
|
@ -126,21 +136,41 @@ void *tsin_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
|
||||||
|
|
||||||
if (flags & DF_SWAP32)
|
if (flags & DF_SWAP32)
|
||||||
swap_buffer(buf, len);
|
swap_buffer(buf, len);
|
||||||
|
|
||||||
if (dev->ci.en && chan->number == 2) {
|
if (dev->ci.en && chan->number == 2) {
|
||||||
if (dvb_ringbuffer_free(&dev->tsin_rbuf) > len) {
|
while (len >= 188) {
|
||||||
dvb_ringbuffer_write(&dev->tsin_rbuf, buf, len);
|
if (memcmp(buf, fill_ts, sizeof fill_ts) != 0) {
|
||||||
wake_up_interruptible(&dev->tsin_rbuf.queue);
|
if (dvb_ringbuffer_free(&dev->tsin_rbuf) >= 188) {
|
||||||
|
dvb_ringbuffer_write(&dev->tsin_rbuf, buf, 188);
|
||||||
|
wake_up(&dev->tsin_rbuf.queue);
|
||||||
|
#ifdef DEBUG_CI_XFER
|
||||||
|
ok++;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return 0;
|
#ifdef DEBUG_CI_XFER
|
||||||
|
else
|
||||||
|
overflow++;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG_CI_XFER
|
||||||
|
else
|
||||||
|
stripped++;
|
||||||
|
|
||||||
|
if (ok % 100 == 0 && overflow)
|
||||||
|
printk(KERN_WARNING "%s: ok %u overflow %u dropped %u\n", __func__, ok, overflow, stripped);
|
||||||
|
#endif
|
||||||
|
buf += 188;
|
||||||
|
len -= 188;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (chan->users > 0)
|
if (chan->users > 0)
|
||||||
dvb_dmx_swfilter(&chan->demux, buf, len);
|
dvb_dmx_swfilter(&chan->demux, buf, len);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 fill_ts[188] = { 0x47, 0x1f, 0xff, 0x10 };
|
|
||||||
|
|
||||||
void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
|
void *tsout_exchange(void *priv, void *buf, u32 len, u32 clock, u32 flags)
|
||||||
{
|
{
|
||||||
struct ngene_channel *chan = priv;
|
struct ngene_channel *chan = priv;
|
||||||
|
|
|
@ -789,6 +789,8 @@ struct ngene {
|
||||||
u8 uart_rbuf[UART_RBUF_LEN];
|
u8 uart_rbuf[UART_RBUF_LEN];
|
||||||
int uart_rp, uart_wp;
|
int uart_rp, uart_wp;
|
||||||
|
|
||||||
|
#define TS_FILLER 0x6f
|
||||||
|
|
||||||
u8 *tsout_buf;
|
u8 *tsout_buf;
|
||||||
#define TSOUT_BUF_SIZE (512*188*8)
|
#define TSOUT_BUF_SIZE (512*188*8)
|
||||||
struct dvb_ringbuffer tsout_rbuf;
|
struct dvb_ringbuffer tsout_rbuf;
|
||||||
|
|
Loading…
Reference in New Issue