Hi Daniel, First of all, thank you for all your work on this. I see that Mauro merged this v10, and after testing I posted a patch for the Kconfig, since that seems to be wrong. I have some more questions below, my apologies if that's been asked before. On 21/08/2020 14:58, Daniel W. S. Almeida wrote: > From: "Daniel W. S. Almeida" <dwlsalmeida@xxxxxxxxx> > > This series is work in progress. It represents the current work done on a > virtual DVB driver for the Linux media subsystem. I am new to the media > subsystem and to kernel development in general. > > This driver aims to: > - Serve as template for new DVB driver writers > - Help userspace application writers in general > - Push fake audio/video to userspace for testing > purposes > - Push debug information to userspace via debugfs > > Current state for this driver: > - Driver generates PSI information (PAT, PMT, SDT) > - Driver generates PCR packets > - Driver generates NULL packets for padding > - PCM audio stream is decoded by ffmpeg, but no audio is heard yet. > > > changes in v10: > s302m encoder got reworked > > The Virtual Digital TV Driver (vidtv) > > Background > ---------- > > Vidtv is a virtual DVB driver that aims to serve as a reference for driver > writers by serving as a template. It also validates the existing media DVB > APIs, thus helping userspace application writers. > > Currently, it consists of: > > - A fake tuner driver, which will report a bad signal quality if the chosen > frequency is too far away from a table of valid frequencies for a > particular delivery system. > > - A fake demod driver, which will constantly poll the fake signal quality > returned by the tuner, simulating a device that can lose/reacquire a lock > on the signal depending on the CNR levels. > > - A fake bridge driver, which is the module responsible for modprobing the > fake tuner and demod modules and implementing the demux logic. This module > takes parameters at initialization that will dictate how the simulation > behaves. > > - Code reponsible for encoding a valid MPEG Transport Stream, which is then > passed to the bridge driver. This fake stream contains some hardcoded content. > For now, we have a single, audio-only channel containing a single MPEG > Elementary Stream, which in turn contains a SMPTE 302m encoded sine-wave. > Note that this particular encoder was chosen because it is the easiest > way to encode PCM audio data in a MPEG Transport Stream. > > Building vidtv > -------------- > vidtv is a test driver and thus is **not** enabled by default when > compiling the kernel. > > In order to enable compilation of vidtv: > > - Enable **DVB_TEST_DRIVERS**, then > - Enable **DVB_VIDTV** > > When compiled as a module, expect the following .ko files: > > - dvb_vidtv_tuner.ko > > - dvb_vidtv_demod.ko > > - dvb_vidtv_bridge.ko Why the dvb_ prefix? All virtual drivers just start with 'vi'. And wouldn't it make more sense to call dvb_vidtv_bridge.ko just vidtv.ko? Just like the other virtual media drivers? > > Running vidtv > ------------- > When compiled as a module, run:: > > modprobe dvb_vidtv_bridge > > That's it! The bridge driver will initialize the tuner and demod drivers as > part of its own initialization. > > You can optionally define some command-line arguments to vidtv, see the > documentation for more info. > > Testing vidtv with v4l-utils > ============================ For regression testing of vidtv during the daily build it would be great if the contrib/test/test-media script can be enhanced to include vidtv. This is run during the daily build with a kernel that has lockdep and many other checks enabled, so it is very helpful to verify that no regressions happened. Note that this script relies on the /dev/mediaX devices to run the tests. I noticed that vidtv doesn't appear to create a /dev/mediaX device, even though CONFIG_MEDIA_CONTROLLER_DVB=y. This is definitely something that would be good to support in vidtv. Regards, Hans > > Start by installing v4l-utils and then modprobing vidtv:: > > modprobe dvb_vidtv_bridge > > If the driver is OK, it should load and its probing code will run. This will > pull in the tuner and demod drivers. > > Using dvb-fe-tool > ----------------- > > The first step to check whether the demod loaded successfully is to run:: > > $ dvb-fe-tool > > This should return what is currently set up at the demod struct, i.e.:: > > static const struct dvb_frontend_ops vidtv_demod_ops = { > .delsys = { > SYS_DVBT, > SYS_DVBT2, > SYS_DVBC_ANNEX_A, > SYS_DVBS, > SYS_DVBS2, > }, > > .info = { > .name = "Dummy demod for DVB-T/T2/C/S/S2", > .frequency_min_hz = 51 * MHz, > .frequency_max_hz = 2150 * MHz, > .frequency_stepsize_hz = 62500, > .frequency_tolerance_hz = 29500 * kHz, > .symbol_rate_min = 1000000, > .symbol_rate_max = 45000000, > > .caps = FE_CAN_FEC_1_2 | > FE_CAN_FEC_2_3 | > FE_CAN_FEC_3_4 | > FE_CAN_FEC_4_5 | > FE_CAN_FEC_5_6 | > FE_CAN_FEC_6_7 | > FE_CAN_FEC_7_8 | > FE_CAN_FEC_8_9 | > FE_CAN_QAM_16 | > FE_CAN_QAM_64 | > FE_CAN_QAM_32 | > FE_CAN_QAM_128 | > FE_CAN_QAM_256 | > FE_CAN_QAM_AUTO | > FE_CAN_QPSK | > FE_CAN_FEC_AUTO | > FE_CAN_INVERSION_AUTO | > FE_CAN_TRANSMISSION_MODE_AUTO | > FE_CAN_GUARD_INTERVAL_AUTO | > FE_CAN_HIERARCHY_AUTO, > } > > .... > > Using dvb-scan > -------------- > > In order to tune into a channel and read the PSI tables, we can use dvb-scan. > > For this, one should provide a configuration file known as a 'scan file', > here's an example:: > > [Channel] > FREQUENCY = 330000000 > MODULATION = QAM/AUTO > SYMBOL_RATE = 6940000 > INNER_FEC = AUTO > DELIVERY_SYSTEM = DVBC/ANNEX_A > > NOTE: > The parameters depend on the video standard you're testing. > > NOTE: > Vidtv is a fake driver and does not validate much of the information > in the scan file. Just specifying 'FREQUENCY' and 'DELIVERY_SYSTEM' > should be enough for DVB-T/DVB-T2. For DVB-S/DVB-C however, you > should also provide 'SYMBOL_RATE'. > > Assuming this channel is named 'channel.conf', you can then run:: > > $ dvbv5-scan dresden_dvbc_channel.conf > > Using dvb-zap > ------------- > > dvbv5-zap is a command line tool that can be used to record MPEG-TS to disk. The > typical use is to tune into a channel and put it into record mode. The example > below - which is taken from the documentation - illustrates that:: > > $ dvbv5-zap -c dvb_channel.conf "trilhas sonoras" -r > using demux '/dev/dvb/adapter0/demux0' > reading channels from file 'dvb_channel.conf' > service has pid type 05: 204 > tuning to 573000000 Hz > audio pid 104 > dvb_set_pesfilter 104 > Lock (0x1f) Quality= Good Signal= 100.00% C/N= -13.80dB UCB= 70 postBER= 3.14x10^-3 PER= 0 > DVR interface '/dev/dvb/adapter0/dvr0' can now be opened > > The channel can be watched by playing the contents of the DVR interface, with > some player that recognizes the MPEG-TS format, such as *mplayer* or *vlc*. > > By playing the contents of the stream one can visually inspect the workings of > vidtv, e.g.:: > > $ mplayer /dev/dvb/adapter0/dvr0 > > > Daniel W. S. Almeida (4): > media: vidtv: implement a tuner driver > media: vidtv: implement a demodulator driver > media: vidtv: add a bridge driver > media: Documentation: vidtv: Add ReST documentation for vidtv > > .../driver-api/media/drivers/index.rst | 1 + > .../driver-api/media/drivers/vidtv.rst | 417 +++++ > MAINTAINERS | 8 + > drivers/media/test-drivers/Kconfig | 16 + > drivers/media/test-drivers/Makefile | 1 + > drivers/media/test-drivers/vidtv/Kconfig | 11 + > drivers/media/test-drivers/vidtv/Makefile | 9 + > .../media/test-drivers/vidtv/vidtv_bridge.c | 546 +++++++ > .../media/test-drivers/vidtv/vidtv_bridge.h | 60 + > .../media/test-drivers/vidtv/vidtv_channel.c | 306 ++++ > .../media/test-drivers/vidtv/vidtv_channel.h | 76 + > .../media/test-drivers/vidtv/vidtv_common.c | 89 ++ > .../media/test-drivers/vidtv/vidtv_common.h | 33 + > .../media/test-drivers/vidtv/vidtv_demod.c | 440 ++++++ > .../media/test-drivers/vidtv/vidtv_demod.h | 73 + > .../media/test-drivers/vidtv/vidtv_encoder.h | 96 ++ > drivers/media/test-drivers/vidtv/vidtv_mux.c | 479 ++++++ > drivers/media/test-drivers/vidtv/vidtv_mux.h | 160 ++ > drivers/media/test-drivers/vidtv/vidtv_pes.c | 398 +++++ > drivers/media/test-drivers/vidtv/vidtv_pes.h | 189 +++ > drivers/media/test-drivers/vidtv/vidtv_psi.c | 1352 +++++++++++++++++ > drivers/media/test-drivers/vidtv/vidtv_psi.h | 593 ++++++++ > .../media/test-drivers/vidtv/vidtv_s302m.c | 552 +++++++ > .../media/test-drivers/vidtv/vidtv_s302m.h | 90 ++ > drivers/media/test-drivers/vidtv/vidtv_ts.c | 137 ++ > drivers/media/test-drivers/vidtv/vidtv_ts.h | 130 ++ > .../media/test-drivers/vidtv/vidtv_tuner.c | 427 ++++++ > .../media/test-drivers/vidtv/vidtv_tuner.h | 43 + > 28 files changed, 6732 insertions(+) > create mode 100644 Documentation/driver-api/media/drivers/vidtv.rst > create mode 100644 drivers/media/test-drivers/vidtv/Kconfig > create mode 100644 drivers/media/test-drivers/vidtv/Makefile > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_bridge.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_bridge.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_channel.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_channel.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_common.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_common.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_demod.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_demod.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_encoder.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_mux.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_mux.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_pes.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_pes.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_psi.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_psi.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_s302m.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_s302m.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_ts.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_ts.h > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_tuner.c > create mode 100644 drivers/media/test-drivers/vidtv/vidtv_tuner.h >