Lines Matching defs:dmxdev

3  * dmxdev.c - DVB demultiplexer device
9 #define pr_fmt(fmt) "dmxdev: " fmt
20 #include <media/dmxdev.h>
119 struct dmxdev *dmxdev = dvbdev->priv;
125 if (mutex_lock_interruptible(&dmxdev->mutex))
128 if (dmxdev->exit) {
129 mutex_unlock(&dmxdev->mutex);
133 dmxdev->may_do_mmap = 0;
148 if (!(dmxdev->capabilities & DMXDEV_CAP_DUPLEX)) {
150 dmxdev->may_do_mmap = 1;
153 mutex_unlock(&dmxdev->mutex);
163 mutex_unlock(&dmxdev->mutex);
168 mutex_unlock(&dmxdev->mutex);
171 dvb_ringbuffer_init(&dmxdev->dvr_buffer, mem, DVR_BUFFER_SIZE);
172 if (dmxdev->may_do_mmap)
173 dvb_vb2_init(&dmxdev->dvr_vb2_ctx, "dvr",
179 dmxdev->dvr_orig_fe = dmxdev->demux->frontend;
181 if (!dmxdev->demux->write) {
182 mutex_unlock(&dmxdev->mutex);
186 front = get_fe(dmxdev->demux, DMX_MEMORY_FE);
189 mutex_unlock(&dmxdev->mutex);
192 dmxdev->demux->disconnect_frontend(dmxdev->demux);
193 dmxdev->demux->connect_frontend(dmxdev->demux, front);
196 mutex_unlock(&dmxdev->mutex);
203 struct dmxdev *dmxdev = dvbdev->priv;
205 mutex_lock(&dmxdev->mutex);
208 dmxdev->demux->disconnect_frontend(dmxdev->demux);
209 dmxdev->demux->connect_frontend(dmxdev->demux,
210 dmxdev->dvr_orig_fe);
214 dmxdev->may_do_mmap) {
215 if (dmxdev->may_do_mmap) {
216 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
217 dvb_vb2_stream_off(&dmxdev->dvr_vb2_ctx);
218 dvb_vb2_release(&dmxdev->dvr_vb2_ctx);
221 if (dmxdev->dvr_buffer.data) {
222 void *mem = dmxdev->dvr_buffer.data;
225 spin_lock_irq(&dmxdev->lock);
226 dmxdev->dvr_buffer.data = NULL;
227 spin_unlock_irq(&dmxdev->lock);
233 if (dvbdev->users == 1 && dmxdev->exit == 1) {
234 mutex_unlock(&dmxdev->mutex);
237 mutex_unlock(&dmxdev->mutex);
246 struct dmxdev *dmxdev = dvbdev->priv;
249 if (!dmxdev->demux->write)
253 if (mutex_lock_interruptible(&dmxdev->mutex))
256 if (dmxdev->exit) {
257 mutex_unlock(&dmxdev->mutex);
260 ret = dmxdev->demux->write(dmxdev->demux, buf, count);
261 mutex_unlock(&dmxdev->mutex);
269 struct dmxdev *dmxdev = dvbdev->priv;
271 if (dmxdev->exit)
274 return dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer,
279 static int dvb_dvr_set_buffer_size(struct dmxdev *dmxdev,
282 struct dvb_ringbuffer *buf = &dmxdev->dvr_buffer;
299 spin_lock_irq(&dmxdev->lock);
305 spin_unlock_irq(&dmxdev->lock);
530 struct dmxdev *dmxdev = filter->dev;
533 for (i = 0; i < dmxdev->filternum; i++)
534 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
535 dmxdev->filter[i].type == DMXDEV_TYPE_SEC &&
536 dmxdev->filter[i].params.sec.pid == pid) {
537 dvb_dmxdev_feed_start(&dmxdev->filter[i]);
541 filter->dev->demux->release_section_feed(dmxdev->demux,
611 static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
640 ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts,
650 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
656 dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
665 struct dmxdev *dmxdev = filter->dev;
699 for (i = 0; i < dmxdev->filternum; i++) {
700 if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
701 dmxdev->filter[i].type == DMXDEV_TYPE_SEC &&
702 dmxdev->filter[i].params.sec.pid == para->pid) {
703 *secfeed = dmxdev->filter[i].feed.sec;
710 ret = dmxdev->demux->allocate_section_feed(dmxdev->demux,
765 ret = dvb_dmxdev_start_feed(dmxdev, filter, feed);
783 struct dmxdev *dmxdev = dvbdev->priv;
787 if (!dmxdev->filter)
790 if (mutex_lock_interruptible(&dmxdev->mutex))
793 if (dmxdev->exit) {
794 mutex_unlock(&dmxdev->mutex);
798 for (i = 0; i < dmxdev->filternum; i++)
799 if (dmxdev->filter[i].state == DMXDEV_STATE_FREE)
802 if (i == dmxdev->filternum) {
803 mutex_unlock(&dmxdev->mutex);
807 dmxdevfilter = &dmxdev->filter[i];
812 dmxdev->may_do_mmap = 1;
814 dmxdev->may_do_mmap = 0;
826 mutex_unlock(&dmxdev->mutex);
830 static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev,
833 mutex_lock(&dmxdev->mutex);
846 spin_lock_irq(&dmxdev->lock);
848 spin_unlock_irq(&dmxdev->lock);
855 mutex_unlock(&dmxdev->mutex);
867 static int dvb_dmxdev_add_pid(struct dmxdev *dmxdev,
889 return dvb_dmxdev_start_feed(dmxdev, filter, feed);
894 static int dvb_dmxdev_remove_pid(struct dmxdev *dmxdev,
916 static int dvb_dmxdev_filter_set(struct dmxdev *dmxdev,
937 static int dvb_dmxdev_pes_filter_set(struct dmxdev *dmxdev,
956 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter,
1033 struct dmxdev *dmxdev = dmxdevfilter->dev;
1037 if (mutex_lock_interruptible(&dmxdev->mutex))
1043 mutex_unlock(&dmxdev->mutex);
1055 mutex_unlock(&dmxdev->mutex);
1064 mutex_unlock(&dmxdev->mutex);
1067 ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, parg);
1073 mutex_unlock(&dmxdev->mutex);
1076 ret = dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, parg);
1082 mutex_unlock(&dmxdev->mutex);
1090 if (!dmxdev->demux->get_pes_pids) {
1094 dmxdev->demux->get_pes_pids(dmxdev->demux, parg);
1098 if (!dmxdev->demux->get_stc) {
1102 ret = dmxdev->demux->get_stc(dmxdev->demux,
1113 ret = dvb_dmxdev_add_pid(dmxdev, dmxdevfilter, *(u16 *)parg);
1122 ret = dvb_dmxdev_remove_pid(dmxdev, dmxdevfilter, *(u16 *)parg);
1129 mutex_unlock(&dmxdev->mutex);
1138 mutex_unlock(&dmxdev->mutex);
1147 mutex_unlock(&dmxdev->mutex);
1156 mutex_unlock(&dmxdev->mutex);
1167 mutex_unlock(&dmxdev->mutex);
1178 mutex_unlock(&dmxdev->mutex);
1218 struct dmxdev *dmxdev = dmxdevfilter->dev;
1221 if (!dmxdev->may_do_mmap)
1224 if (mutex_lock_interruptible(&dmxdev->mutex))
1228 mutex_unlock(&dmxdev->mutex);
1234 mutex_unlock(&dmxdev->mutex);
1243 struct dmxdev *dmxdev = dmxdevfilter->dev;
1246 ret = dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
1248 mutex_lock(&dmxdev->mutex);
1249 dmxdev->dvbdev->users--;
1250 if (dmxdev->dvbdev->users == 1 && dmxdev->exit == 1) {
1251 mutex_unlock(&dmxdev->mutex);
1252 wake_up(&dmxdev->dvbdev->wait_queue);
1254 mutex_unlock(&dmxdev->mutex);
1287 struct dmxdev *dmxdev = dvbdev->priv;
1291 if (mutex_lock_interruptible(&dmxdev->mutex))
1296 ret = dvb_dvr_set_buffer_size(dmxdev, arg);
1301 ret = dvb_vb2_reqbufs(&dmxdev->dvr_vb2_ctx, parg);
1305 ret = dvb_vb2_querybuf(&dmxdev->dvr_vb2_ctx, parg);
1309 ret = dvb_vb2_expbuf(&dmxdev->dvr_vb2_ctx, parg);
1313 ret = dvb_vb2_qbuf(&dmxdev->dvr_vb2_ctx, parg);
1314 if (ret == 0 && !dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
1315 ret = dvb_vb2_stream_on(&dmxdev->dvr_vb2_ctx);
1319 ret = dvb_vb2_dqbuf(&dmxdev->dvr_vb2_ctx, parg);
1326 mutex_unlock(&dmxdev->mutex);
1339 struct dmxdev *dmxdev = dvbdev->priv;
1344 poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
1346 if (dmxdev->exit)
1348 if (dvb_vb2_is_streaming(&dmxdev->dvr_vb2_ctx))
1349 return dvb_vb2_poll(&dmxdev->dvr_vb2_ctx, file, wait);
1352 dmxdev->may_do_mmap) {
1353 if (dmxdev->dvr_buffer.error)
1356 if (!dvb_ringbuffer_empty(&dmxdev->dvr_buffer))
1368 struct dmxdev *dmxdev = dvbdev->priv;
1371 if (!dmxdev->may_do_mmap)
1374 if (dmxdev->exit)
1377 if (mutex_lock_interruptible(&dmxdev->mutex))
1380 ret = dvb_vb2_mmap(&dmxdev->dvr_vb2_ctx, vma);
1381 mutex_unlock(&dmxdev->mutex);
1409 int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
1413 if (dmxdev->demux->open(dmxdev->demux) < 0)
1416 dmxdev->filter = vmalloc(array_size(sizeof(struct dmxdev_filter),
1417 dmxdev->filternum));
1418 if (!dmxdev->filter)
1421 mutex_init(&dmxdev->mutex);
1422 spin_lock_init(&dmxdev->lock);
1423 for (i = 0; i < dmxdev->filternum; i++) {
1424 dmxdev->filter[i].dev = dmxdev;
1425 dmxdev->filter[i].buffer.data = NULL;
1426 dvb_dmxdev_filter_state_set(&dmxdev->filter[i],
1430 ret = dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev,
1431 DVB_DEVICE_DEMUX, dmxdev->filternum);
1435 ret = dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr,
1436 dmxdev, DVB_DEVICE_DVR, dmxdev->filternum);
1440 dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
1445 dvb_unregister_device(dmxdev->dvbdev);
1447 vfree(dmxdev->filter);
1448 dmxdev->filter = NULL;
1454 void dvb_dmxdev_release(struct dmxdev *dmxdev)
1456 mutex_lock(&dmxdev->mutex);
1457 dmxdev->exit = 1;
1458 mutex_unlock(&dmxdev->mutex);
1460 if (dmxdev->dvbdev->users > 1) {
1461 wait_event(dmxdev->dvbdev->wait_queue,
1462 dmxdev->dvbdev->users == 1);
1464 if (dmxdev->dvr_dvbdev->users > 1) {
1465 wait_event(dmxdev->dvr_dvbdev->wait_queue,
1466 dmxdev->dvr_dvbdev->users == 1);
1469 dvb_unregister_device(dmxdev->dvbdev);
1470 dvb_unregister_device(dmxdev->dvr_dvbdev);
1472 vfree(dmxdev->filter);
1473 dmxdev->filter = NULL;
1474 dmxdev->demux->close(dmxdev->demux);