Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 219369
b: refs/heads/master
c: 9230aca
h: refs/heads/master
i:
  219367: 675be9a
v: v3
  • Loading branch information
Steven Toth authored and Mauro Carvalho Chehab committed Oct 21, 2010
1 parent 94ae86a commit c4d70f6
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5fa56ccdacc54f5f694141c1a74f781cf77874bb
refs/heads/master: 9230acaac461c492ff9dea24bbe6a7f568b62cf6
14 changes: 14 additions & 0 deletions trunk/drivers/media/video/saa7164/saa7164-buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,20 @@ int saa7164_buffer_dealloc(struct saa7164_buffer *buf)
return SAA_OK;
}

int saa7164_buffer_zero_offsets(struct saa7164_port *port, int i)
{
struct saa7164_dev *dev = port->dev;

if ((i < 0) || (i >= port->hwcfg.buffercount))
return -EINVAL;

dprintk(DBGLVL_BUF, "%s(idx = %d)\n", __func__, i);

saa7164_writel(port->bufoffset + (sizeof(u32) * i), 0);

return 0;
}

/* Write a buffer into the hardware */
int saa7164_buffer_activate(struct saa7164_buffer *buf, int i)
{
Expand Down
61 changes: 60 additions & 1 deletion trunk/drivers/media/video/saa7164/saa7164-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,57 @@ LIST_HEAD(saa7164_devlist);

#define INT_SIZE 16

static void saa7164_ts_verifier(struct saa7164_buffer *buf)
{
struct saa7164_port *port = buf->port;
struct saa7164_dev *dev = port->dev;
u32 i;
u8 tmp, cc, a;
u8 *bufcpu = (u8 *)buf->cpu;

port->sync_errors = 0;
port->v_cc_errors = 0;
port->a_cc_errors = 0;

for (i = 0; i < buf->actual_size; i += 188) {
if (*(bufcpu + i) != 0x47)
port->sync_errors++;

/* Query pid lower 8 bits */
tmp = *(bufcpu + i + 2);
cc = *(bufcpu + i + 3) & 0x0f;

if (tmp == 0xf1) {
a = ((port->last_v_cc + 1) & 0x0f);
if (a != cc) {
printk(KERN_ERR "video cc last = %x current = %x i = %d\n", port->last_v_cc, cc, i);
port->v_cc_errors++;
}

port->last_v_cc = cc;
} else
if (tmp == 0xf2) {
a = ((port->last_a_cc + 1) & 0x0f);
if (a != cc) {
printk(KERN_ERR "audio cc last = %x current = %x i = %d\n", port->last_a_cc, cc, i);
port->a_cc_errors++;
}

port->last_a_cc = cc;
}

}

if (port->v_cc_errors)
printk(KERN_ERR "video pid cc, %d errors\n", port->v_cc_errors);

if (port->a_cc_errors)
printk(KERN_ERR "audio pid cc, %d errors\n", port->a_cc_errors);

if (port->sync_errors)
printk(KERN_ERR "sync_errors = %d\n", port->sync_errors);
}

static void saa7164_histogram_reset(struct saa7164_histogram *hg, char *name)
{
int i;
Expand Down Expand Up @@ -188,7 +239,10 @@ static void saa7164_work_enchandler(struct work_struct *w)
dprintk(DBGLVL_IRQ, "%s() wp: %d processing: %d\n",
__func__, wp, rp);

/* */
/* Validate the incoming buffer content */
if (port->encoder_params.stream_type == V4L2_MPEG_STREAM_TYPE_MPEG2_TS)
saa7164_ts_verifier(buf);

/* find a free user buffer and clone to it */
if (!list_empty(&port->list_buf_free.list)) {

Expand All @@ -212,6 +266,11 @@ static void saa7164_work_enchandler(struct work_struct *w)
} else
printk(KERN_ERR "encirq no free buffers\n");

/* Ensure offset into buffer remains 0, fill buffer
* with known bad data. */
saa7164_buffer_zero_offsets(port, rp);
memset(buf->cpu, 0xDE, buf->pci_size);

break;
}

Expand Down
8 changes: 8 additions & 0 deletions trunk/drivers/media/video/saa7164/saa7164.h
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,13 @@ struct saa7164_port {
struct saa7164_buffer list_buf_used;
struct saa7164_buffer list_buf_free;
wait_queue_head_t wait_read;

/* Debug */
u32 sync_errors;
u32 v_cc_errors;
u32 a_cc_errors;
u8 last_v_cc;
u8 last_a_cc;
};

struct saa7164_dev {
Expand Down Expand Up @@ -521,6 +528,7 @@ extern int saa7164_buffer_cfg_port(struct saa7164_port *port);
extern struct saa7164_user_buffer *saa7164_buffer_alloc_user(
struct saa7164_dev *dev, u32 len);
extern void saa7164_buffer_dealloc_user(struct saa7164_user_buffer *buf);
extern int saa7164_buffer_zero_offsets(struct saa7164_port *port, int i);


/* ----------------------------------------------------------- */
Expand Down

0 comments on commit c4d70f6

Please sign in to comment.