linux/drivers/media/pci
Daniel Scheller 60d0bbec59 media: ngene: compensate for TS buffer offset shifts
A possible hardware bug was discovered when using CA addon hardware
attached to the ngene hardware, in that the TS input buffer much likely
will shift and thus become unaligned to 188 byte blocks (a full TS frame)
when things like CA module initialisation (which happens via differing
communication paths) take place. This causes the TS NULL removal in
tsin_exchange() to fail to detect this previously inserted data and thus
causes userspace applications to receive data they didn't sent beforehand
and ultimately cause troubles.

On driver load with an inserted CAM, buffers are fine at first (note that
the driver has to keep the communication running from/to the card by
inserting TS NULL frames, this is done in tsout_exchange() via
FillTSBuffer() - that data is simply sent back by the hardware):

  offset | 0    1   2   3   4   5 .... 188 189 190 191 192 193 .... 376
  data   | 47  1f  ff  10  6f  6f ....  47  1f  ff  10  6f  6f ....  47

After a few seconds, the CA module is recognised and initialised, which is
signalled by

  dvb_ca_en50221: dvb_ca adapter X: DVB CAM detected and initialised successfully

This is where the first shift happens (this is always four bytes), buffer
becomes like this:

  offset | 0    1   2   3   4   5 .... 188 189 190 191 192 193 .... 376
  data   | 6f  6f  6f  6f  47  1f ....  6f  6f  6f  6f  47  1f ....  6f

Next, VDR, TVHeadend or any other CI aware application is started, buffers
will shift by even more bytes. It is believed this is due to the hardware
not handling control and data bytes properly distinct, and control data
having an influence on the actual data stream, which we cannot properly
detect at the driver level.

Workaround this hardware quirk by adding a detection for the TS sync byte
0x47 before each TS frame copy, scan for a new SYNC byte and a TS NULL
packet if buffers become unaligned, take note of that offset and apply
that when copying data to the DVB ring buffers. The last <188 bytes from
the hardware buffers are stored in a temp buffer (tsin_buffer), for which
the remainder will be in the beginning of the next hardware buffer (next
iteration of tsin_exchange()). That remainder will be appended to the
temp buffer and finally sent to the DVB ring buffer. The resulting TS
stream is perfectly fine, and the TS NULL packets inserted by the driver
which are sent back are properly removed. The resulting offset is being
clamped to 188 byte segments (one TS packet). Though this can result in
a repeated TS packet if the overall offset grows beyond this (and it
will grow only on CA initialisation), this is still way better than
unaligned TS frames and data sent to userspace that just isn't supposed
to be there.

This compensation can be toggled by the ci_tsfix modparam, which defaults
to 1 (enabled). In the case of problems, this can be turned off by setting
the parameter to 0 to restore the old behaviour.

Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2018-03-06 12:54:26 -05:00
..
b2c2 media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
bt8xx vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
cobalt media: cobalt: add SPDX license info 2018-02-14 13:15:33 -05:00
cx18 media: s5h14*.h: fix typos for CONTINUOUS 2018-03-06 05:15:02 -05:00
cx88 media: s5h14*.h: fix typos for CONTINUOUS 2018-03-06 05:15:02 -05:00
cx23885 media: cx23885: Add support for new Hauppauge QuadHD (885) 2018-03-06 06:04:36 -05:00
cx25821 media: cx25821: prevent out-of-bounds read on array card 2018-02-26 08:00:06 -05:00
ddbridge media: ddbridge: adapt cxd2099 attach to new i2c_client way 2018-03-06 12:13:59 -05:00
dm1105 media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
dt3155 media: pci: make video_device const 2017-08-27 08:44:58 -04:00
intel media: intel-ipu3: cio2: Use SPDX license headers 2018-02-23 02:28:18 -05:00
ivtv media: ivtv: remove ivtv-alsa-mixer 2018-02-26 08:11:42 -05:00
mantis media: mantis: remove mantis_vp3028.c/mantis_vp3028.h 2018-03-06 08:21:35 -05:00
meye vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
netup_unidvb media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
ngene media: ngene: compensate for TS buffer offset shifts 2018-03-06 12:54:26 -05:00
pluto2 media: fix usage of whitespaces and on indentation 2018-01-04 13:12:01 -05:00
pt1 media: fix usage of whitespaces and on indentation 2018-01-04 13:12:01 -05:00
pt3 media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
saa7134 media: s5h14*.h: fix typos for CONTINUOUS 2018-03-06 05:15:02 -05:00
saa7146 media: replace all <spaces><tab> occurrences 2018-01-04 13:15:05 -05:00
saa7164 media: s5h14*.h: fix typos for CONTINUOUS 2018-03-06 05:15:02 -05:00
smipcie media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
solo6x10 media: solo6x10: use ktime_get_ts64() for time sync 2017-12-08 11:21:29 -05:00
sta2x11 media: sta2x11: document missing function parameters 2017-11-30 04:18:55 -05:00
ttpci media: dvb: update buffer mmaped flags and frame counter 2018-02-23 11:44:08 -05:00
tw68 media: tw68: fix kernel-doc markups 2017-11-30 04:18:56 -05:00
tw686x media updates for v4.15-rc1 2017-11-15 20:30:12 -08:00
tw5864 media: fix usage of whitespaces and on indentation 2018-01-04 13:12:01 -05:00
zoran vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
Kconfig media: intel-ipu3: cio2: add new MIPI-CSI2 driver 2017-12-29 07:00:51 -05:00
Makefile media: intel-ipu3: cio2: add new MIPI-CSI2 driver 2017-12-29 07:00:51 -05:00