Lines Matching refs:demux
38 * The demux device is implemented as a cloning device. Each instance can
172 * Start running the demux.
175 dtv_demux_start(struct dtv_demux *demux)
177 struct dtv_softc *sc = demux->dd_sc;
182 * If the demux is not running, mark it as running and update the
183 * global demux run counter.
187 if (demux->dd_running == false) {
189 demux->dd_running = true;
190 /* If this is the first demux running, trigger device start */
204 * demux instance as halted.
209 demux->dd_running = false;
217 * Stop running the demux.
220 dtv_demux_stop(struct dtv_demux *demux)
222 struct dtv_softc *sc = demux->dd_sc;
227 * If the demux is running, mark it as halted and update the
228 * global demux run counter.
231 if (demux->dd_running == true) {
233 demux->dd_running = false;
235 /* If this was the last demux running, trigger device stop */
247 * demux instance as running.
252 demux->dd_running = true;
260 * Put the demux into PID filter mode and update the PID filter table.
263 dtv_demux_set_pidfilter(struct dtv_demux *demux, uint16_t pid, bool onoff)
265 struct dtv_softc *sc = demux->dd_sc;
268 * TS PID is 13 bits; demux device uses special PID 0x2000 to mean
274 /* Set demux mode */
275 demux->dd_mode = DTV_DEMUX_MODE_PES;
292 * Open a new instance of the demux cloning device.
298 struct dtv_demux *demux;
302 demux = kmem_zalloc(sizeof(*demux), KM_SLEEP);
303 demux->dd_sc = sc;
305 demux->dd_mode = DTV_DEMUX_MODE_NONE;
306 selinit(&demux->dd_sel);
307 mutex_init(&demux->dd_lock, MUTEX_DEFAULT, IPL_SCHED);
308 cv_init(&demux->dd_section_cv, "dtvsec");
312 kmem_free(demux, sizeof(*demux));
316 /* Add the demux to the list of demux instances */
318 TAILQ_INSERT_TAIL(&sc->sc_demux_list, demux, dd_entries);
321 return fd_clone(fp, fd, flags, &dtv_demux_fileops, demux);
325 * Close the instance of the demux cloning device.
330 struct dtv_demux *demux = fp->f_data;
334 if (demux == NULL)
339 sc = demux->dd_sc;
341 /* If the demux is still running, stop it */
342 if (demux->dd_running) {
343 error = dtv_demux_stop(demux);
348 /* Remove the demux from the list of demux instances */
350 TAILQ_REMOVE(&sc->sc_demux_list, demux, dd_entries);
353 mutex_destroy(&demux->dd_lock);
354 cv_destroy(&demux->dd_section_cv);
355 kmem_free(demux, sizeof(*demux));
364 * Handle demux ioctl requests
369 struct dtv_demux *demux = fp->f_data;
375 if (demux == NULL)
380 return dtv_demux_start(demux);
382 return dtv_demux_stop(demux);
385 * The demux driver doesn't support configurable buffer sizes,
399 * demux instance mode to section filter.
401 demux->dd_secfilt.params = *sctfilt;
402 demux->dd_secfilt.rp = demux->dd_secfilt.wp = 0;
403 demux->dd_secfilt.nsections = 0;
404 demux->dd_secfilt.overflow = false;
405 demux->dd_mode = DTV_DEMUX_MODE_SECTION;
409 * start running the demux immediately (no need for a
413 error = dtv_demux_start(demux);
433 error = dtv_demux_set_pidfilter(demux, pesfilt->pid, true);
439 * start running the demux immediately (no need for a
443 error = dtv_demux_start(demux);
450 return dtv_demux_set_pidfilter(demux, pid, true);
453 return dtv_demux_set_pidfilter(demux, pid, false);
465 struct dtv_demux *demux = fp->f_data;
468 if (demux == NULL)
472 * If the demux instance is in section filter mode, wait for an
475 mutex_enter(&demux->dd_lock);
476 if (demux->dd_mode == DTV_DEMUX_MODE_SECTION &&
477 demux->dd_secfilt.nsections > 0) {
480 selrecord(curlwp, &demux->dd_sel);
482 mutex_exit(&demux->dd_lock);
488 * Read from the demux instance
494 struct dtv_demux *demux = fp->f_data;
498 if (demux == NULL)
502 if (demux->dd_mode != DTV_DEMUX_MODE_SECTION)
508 mutex_enter(&demux->dd_lock);
509 while (demux->dd_secfilt.nsections == 0) {
511 mutex_exit(&demux->dd_lock);
516 error = cv_wait_sig(&demux->dd_section_cv, &demux->dd_lock);
518 mutex_exit(&demux->dd_lock);
523 *sec = demux->dd_secfilt.section[demux->dd_secfilt.rp];
525 demux->dd_secfilt.rp++;
526 if (demux->dd_secfilt.rp >= __arraycount(demux->dd_secfilt.section))
527 demux->dd_secfilt.rp = 0;
529 demux->dd_secfilt.nsections--;
530 mutex_exit(&demux->dd_lock);
534 * the demux after one PSI section is received.
536 if (demux->dd_secfilt.params.flags & DMX_ONESHOT)
537 dtv_demux_stop(demux);
558 dtv_demux_check_crc(struct dtv_demux *demux, struct dtv_ts_section *sec)
580 dtv_demux_process(struct dtv_demux *demux, const uint8_t *tspkt,
584 dmx_filter_t *dmxfilt = &demux->dd_secfilt.params.filter;
591 /* If the demux instance is not running, ignore the packet */
592 if (demux->dd_running == false)
596 * If the demux instance is not in section filter mode, ignore
599 if (demux->dd_mode != DTV_DEMUX_MODE_SECTION)
605 if (TS_PID(tspkt) != demux->dd_secfilt.params.pid)
613 mutex_enter(&demux->dd_lock);
616 if (demux->dd_secfilt.nsections ==
617 __arraycount(demux->dd_secfilt.section)) {
618 demux->dd_secfilt.overflow = true;
621 sec = &demux->dd_secfilt.section[demux->dd_secfilt.wp];
695 if ((demux->dd_secfilt.params.flags & DMX_CHECK_CRC) &&
696 dtv_demux_check_crc(demux, sec) == false) {
702 demux->dd_secfilt.wp++;
703 if (demux->dd_secfilt.wp >=
704 __arraycount(demux->dd_secfilt.section))
705 demux->dd_secfilt.wp = 0;
706 demux->dd_secfilt.nsections++;
707 cv_broadcast(&demux->dd_section_cv);
708 selnotify(&demux->dd_sel, 0, 0);
712 mutex_exit(&demux->dd_lock);
717 * Submit TS data to all demux instances
722 struct dtv_demux *demux;
725 TAILQ_FOREACH(demux, &sc->sc_demux_list, dd_entries) {
726 dtv_demux_process(demux, tspkt, tspktlen);