Lines Matching full:demux
3 * dvb_demux.c - DVB kernel demux API
158 struct dvb_demux *demux = feed->demux; in dvb_dmx_swfilter_section_feed() local
172 demux->check_crc32(feed, sec->secbuf, sec->seclen)) { in dvb_dmx_swfilter_section_feed()
214 * Losless Section Demux 1.4.1 by Emard
226 * when demux is started, let feed->pusi_seen = false to
234 struct dvb_demux *demux = feed->demux; in dvb_dmx_swfilter_section_copy_dump() local
252 demux->memcopy(feed, sec->secbuf_base + sec->tsfeedp, buf, len); in dvb_dmx_swfilter_section_copy_dump()
384 if (feed->demux->write_to_decoder) in dvb_dmx_swfilter_packet_type()
385 feed->demux->write_to_decoder(feed, buf, 188); in dvb_dmx_swfilter_packet_type()
405 static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) in dvb_dmx_swfilter_packet() argument
415 demux->speed_pkts_cnt++; in dvb_dmx_swfilter_packet()
418 if (!(demux->speed_pkts_cnt % SPEED_PKTS_INTERVAL)) { in dvb_dmx_swfilter_packet()
421 if (ktime_to_ns(demux->speed_last_time) != 0) { in dvb_dmx_swfilter_packet()
422 speed_bytes = (u64)demux->speed_pkts_cnt in dvb_dmx_swfilter_packet()
428 demux->speed_last_time); in dvb_dmx_swfilter_packet()
435 demux->speed_last_time = cur_time; in dvb_dmx_swfilter_packet()
436 demux->speed_pkts_cnt = 0; in dvb_dmx_swfilter_packet()
441 list_for_each_entry(feed, &demux->feed_list, list_head) { in dvb_dmx_swfilter_packet()
453 if (demux->cnt_storage && dvb_demux_tscheck) { in dvb_dmx_swfilter_packet()
457 demux->cnt_storage[pid] = in dvb_dmx_swfilter_packet()
458 (demux->cnt_storage[pid] + 1) & 0xf; in dvb_dmx_swfilter_packet()
460 if ((buf[3] & 0xf) != demux->cnt_storage[pid]) { in dvb_dmx_swfilter_packet()
461 list_for_each_entry(feed, &demux->feed_list, list_head) { in dvb_dmx_swfilter_packet()
469 pid, demux->cnt_storage[pid], in dvb_dmx_swfilter_packet()
471 demux->cnt_storage[pid] = buf[3] & 0xf; in dvb_dmx_swfilter_packet()
477 list_for_each_entry(feed, &demux->feed_list, list_head) { in dvb_dmx_swfilter_packet()
494 void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, in dvb_dmx_swfilter_packets() argument
499 spin_lock_irqsave(&demux->lock, flags); in dvb_dmx_swfilter_packets()
503 dvb_dmx_swfilter_packet(demux, buf); in dvb_dmx_swfilter_packets()
507 spin_unlock_irqrestore(&demux->lock, flags); in dvb_dmx_swfilter_packets()
537 static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, in _dvb_dmx_swfilter() argument
544 spin_lock_irqsave(&demux->lock, flags); in _dvb_dmx_swfilter()
546 if (demux->tsbufp) { /* tsbuf[0] is now 0x47. */ in _dvb_dmx_swfilter()
547 i = demux->tsbufp; in _dvb_dmx_swfilter()
550 memcpy(&demux->tsbuf[i], buf, count); in _dvb_dmx_swfilter()
551 demux->tsbufp += count; in _dvb_dmx_swfilter()
554 memcpy(&demux->tsbuf[i], buf, j); in _dvb_dmx_swfilter()
555 if (demux->tsbuf[0] == 0x47) /* double check */ in _dvb_dmx_swfilter()
556 dvb_dmx_swfilter_packet(demux, demux->tsbuf); in _dvb_dmx_swfilter()
557 demux->tsbufp = 0; in _dvb_dmx_swfilter()
571 memcpy(demux->tsbuf, q, 188); in _dvb_dmx_swfilter()
572 demux->tsbuf[0] = 0x47; in _dvb_dmx_swfilter()
573 q = demux->tsbuf; in _dvb_dmx_swfilter()
575 dvb_dmx_swfilter_packet(demux, q); in _dvb_dmx_swfilter()
581 memcpy(demux->tsbuf, &buf[p], i); in _dvb_dmx_swfilter()
582 demux->tsbufp = i; in _dvb_dmx_swfilter()
583 if (pktsize == 204 && demux->tsbuf[0] == 0xB8) in _dvb_dmx_swfilter()
584 demux->tsbuf[0] = 0x47; in _dvb_dmx_swfilter()
588 spin_unlock_irqrestore(&demux->lock, flags); in _dvb_dmx_swfilter()
591 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) in dvb_dmx_swfilter() argument
593 _dvb_dmx_swfilter(demux, buf, count, 188); in dvb_dmx_swfilter()
597 void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count) in dvb_dmx_swfilter_204() argument
599 _dvb_dmx_swfilter(demux, buf, count, 204); in dvb_dmx_swfilter_204()
603 void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count) in dvb_dmx_swfilter_raw() argument
607 spin_lock_irqsave(&demux->lock, flags); in dvb_dmx_swfilter_raw()
609 demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, in dvb_dmx_swfilter_raw()
610 &demux->feed->buffer_flags); in dvb_dmx_swfilter_raw()
612 spin_unlock_irqrestore(&demux->lock, flags); in dvb_dmx_swfilter_raw()
616 static struct dvb_demux_filter *dvb_dmx_filter_alloc(struct dvb_demux *demux) in dvb_dmx_filter_alloc() argument
620 for (i = 0; i < demux->filternum; i++) in dvb_dmx_filter_alloc()
621 if (demux->filter[i].state == DMX_STATE_FREE) in dvb_dmx_filter_alloc()
624 if (i == demux->filternum) in dvb_dmx_filter_alloc()
627 demux->filter[i].state = DMX_STATE_ALLOCATED; in dvb_dmx_filter_alloc()
629 return &demux->filter[i]; in dvb_dmx_filter_alloc()
632 static struct dvb_demux_feed *dvb_dmx_feed_alloc(struct dvb_demux *demux) in dvb_dmx_feed_alloc() argument
636 for (i = 0; i < demux->feednum; i++) in dvb_dmx_feed_alloc()
637 if (demux->feed[i].state == DMX_STATE_FREE) in dvb_dmx_feed_alloc()
640 if (i == demux->feednum) in dvb_dmx_feed_alloc()
643 demux->feed[i].state = DMX_STATE_ALLOCATED; in dvb_dmx_feed_alloc()
645 return &demux->feed[i]; in dvb_dmx_feed_alloc()
652 list_for_each_entry(entry, &feed->demux->feed_list, list_head) in dvb_demux_feed_find()
661 spin_lock_irq(&feed->demux->lock); in dvb_demux_feed_add()
668 list_add(&feed->list_head, &feed->demux->feed_list); in dvb_demux_feed_add()
670 spin_unlock_irq(&feed->demux->lock); in dvb_demux_feed_add()
675 spin_lock_irq(&feed->demux->lock); in dvb_demux_feed_del()
684 spin_unlock_irq(&feed->demux->lock); in dvb_demux_feed_del()
691 struct dvb_demux *demux = feed->demux; in dmx_ts_feed_set() local
696 if (mutex_lock_interruptible(&demux->mutex)) in dmx_ts_feed_set()
701 mutex_unlock(&demux->mutex); in dmx_ts_feed_set()
705 if (demux->pesfilter[pes_type] && in dmx_ts_feed_set()
706 demux->pesfilter[pes_type] != feed) { in dmx_ts_feed_set()
707 mutex_unlock(&demux->mutex); in dmx_ts_feed_set()
711 demux->pesfilter[pes_type] = feed; in dmx_ts_feed_set()
712 demux->pids[pes_type] = pid; in dmx_ts_feed_set()
723 mutex_unlock(&demux->mutex); in dmx_ts_feed_set()
731 struct dvb_demux *demux = feed->demux; in dmx_ts_feed_start_filtering() local
734 if (mutex_lock_interruptible(&demux->mutex)) in dmx_ts_feed_start_filtering()
738 mutex_unlock(&demux->mutex); in dmx_ts_feed_start_filtering()
742 if (!demux->start_feed) { in dmx_ts_feed_start_filtering()
743 mutex_unlock(&demux->mutex); in dmx_ts_feed_start_filtering()
747 if ((ret = demux->start_feed(feed)) < 0) { in dmx_ts_feed_start_filtering()
748 mutex_unlock(&demux->mutex); in dmx_ts_feed_start_filtering()
752 spin_lock_irq(&demux->lock); in dmx_ts_feed_start_filtering()
755 spin_unlock_irq(&demux->lock); in dmx_ts_feed_start_filtering()
756 mutex_unlock(&demux->mutex); in dmx_ts_feed_start_filtering()
764 struct dvb_demux *demux = feed->demux; in dmx_ts_feed_stop_filtering() local
767 mutex_lock(&demux->mutex); in dmx_ts_feed_stop_filtering()
770 mutex_unlock(&demux->mutex); in dmx_ts_feed_stop_filtering()
774 if (!demux->stop_feed) { in dmx_ts_feed_stop_filtering()
775 mutex_unlock(&demux->mutex); in dmx_ts_feed_stop_filtering()
779 ret = demux->stop_feed(feed); in dmx_ts_feed_stop_filtering()
781 spin_lock_irq(&demux->lock); in dmx_ts_feed_stop_filtering()
784 spin_unlock_irq(&demux->lock); in dmx_ts_feed_stop_filtering()
785 mutex_unlock(&demux->mutex); in dmx_ts_feed_stop_filtering()
794 struct dvb_demux *demux = (struct dvb_demux *)dmx; in dvbdmx_allocate_ts_feed() local
797 if (mutex_lock_interruptible(&demux->mutex)) in dvbdmx_allocate_ts_feed()
800 if (!(feed = dvb_dmx_feed_alloc(demux))) { in dvbdmx_allocate_ts_feed()
801 mutex_unlock(&demux->mutex); in dvbdmx_allocate_ts_feed()
807 feed->demux = demux; in dvbdmx_allocate_ts_feed()
820 if (!(feed->filter = dvb_dmx_filter_alloc(demux))) { in dvbdmx_allocate_ts_feed()
822 mutex_unlock(&demux->mutex); in dvbdmx_allocate_ts_feed()
830 mutex_unlock(&demux->mutex); in dvbdmx_allocate_ts_feed()
838 struct dvb_demux *demux = (struct dvb_demux *)dmx; in dvbdmx_release_ts_feed() local
841 mutex_lock(&demux->mutex); in dvbdmx_release_ts_feed()
844 mutex_unlock(&demux->mutex); in dvbdmx_release_ts_feed()
856 demux->pesfilter[feed->pes_type] = NULL; in dvbdmx_release_ts_feed()
858 mutex_unlock(&demux->mutex); in dvbdmx_release_ts_feed()
870 struct dvb_demux *dvbdemux = dvbdmxfeed->demux; in dmx_section_feed_allocate_filter()
901 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; in dmx_section_feed_set()
944 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; in dmx_section_feed_start_filtering()
990 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; in dmx_section_feed_stop_filtering()
1016 struct dvb_demux *dvbdmx = dvbdmxfeed->demux; in dmx_section_feed_release_filter()
1050 static int dvbdmx_allocate_section_feed(struct dmx_demux *demux, in dvbdmx_allocate_section_feed() argument
1054 struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; in dvbdmx_allocate_section_feed()
1067 dvbdmxfeed->demux = dvbdmx; in dvbdmx_allocate_section_feed()
1077 (*feed)->parent = demux; in dvbdmx_allocate_section_feed()
1090 static int dvbdmx_release_section_feed(struct dmx_demux *demux, in dvbdmx_release_section_feed() argument
1094 struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; in dvbdmx_release_section_feed()
1116 static int dvbdmx_open(struct dmx_demux *demux) in dvbdmx_open() argument
1118 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_open()
1127 static int dvbdmx_close(struct dmx_demux *demux) in dvbdmx_close() argument
1129 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_close()
1139 static int dvbdmx_write(struct dmx_demux *demux, const char __user *buf, size_t count) in dvbdmx_write() argument
1141 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_write()
1144 if ((!demux->frontend) || (demux->frontend->source != DMX_MEMORY_FE)) in dvbdmx_write()
1163 static int dvbdmx_add_frontend(struct dmx_demux *demux, in dvbdmx_add_frontend() argument
1166 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_add_frontend()
1174 static int dvbdmx_remove_frontend(struct dmx_demux *demux, in dvbdmx_remove_frontend() argument
1177 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_remove_frontend()
1190 static struct list_head *dvbdmx_get_frontends(struct dmx_demux *demux) in dvbdmx_get_frontends() argument
1192 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_get_frontends()
1200 static int dvbdmx_connect_frontend(struct dmx_demux *demux, in dvbdmx_connect_frontend() argument
1203 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_connect_frontend()
1205 if (demux->frontend) in dvbdmx_connect_frontend()
1210 demux->frontend = frontend; in dvbdmx_connect_frontend()
1215 static int dvbdmx_disconnect_frontend(struct dmx_demux *demux) in dvbdmx_disconnect_frontend() argument
1217 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_disconnect_frontend()
1221 demux->frontend = NULL; in dvbdmx_disconnect_frontend()
1226 static int dvbdmx_get_pes_pids(struct dmx_demux *demux, u16 * pids) in dvbdmx_get_pes_pids() argument
1228 struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; in dvbdmx_get_pes_pids()