version 1.2, 2001/03/08 01:41:26
|
version 1.3, 2001/03/14 01:43:11
|
Line 1
|
Line 1
|
/* |
/* |
* dvb_demux.c - DVB kernel demux API |
* dvb_demux.c - DVB kernel demux API |
* |
* |
* Copyright (C) 2000 Ralph Metzler <ralph@convergence.de> |
* Copyright (C) 2000-2001 Ralph Metzler <ralph@convergence.de> |
* & Marcus Metzler <marcus@convergence.de> |
* & Marcus Metzler <marcus@convergence.de> |
for convergence integrated media GmbH |
* for convergence integrated media GmbH |
* |
* |
* This program is free software; you can redistribute it and/or |
* This program is free software; you can redistribute it and/or |
* modify it under the terms of the GNU Lesser General Public License |
* modify it under the terms of the GNU Lesser General Public License |
Line 471 dmx_ts_feed_start_filtering(struct dmx_t
|
Line 471 dmx_ts_feed_start_filtering(struct dmx_t
|
if (dvbdmxfeed->type!=DMX_TYPE_TS) |
if (dvbdmxfeed->type!=DMX_TYPE_TS) |
return -EINVAL; |
return -EINVAL; |
|
|
|
if (!dvbdmx->start_feed) |
|
return -1; |
ret=dvbdmx->start_feed(dvbdmxfeed); |
ret=dvbdmx->start_feed(dvbdmxfeed); |
if (ret<0) |
if (ret<0) |
return ret; |
return ret; |
Line 489 dmx_ts_feed_stop_filtering(struct dmx_ts
|
Line 491 dmx_ts_feed_stop_filtering(struct dmx_ts
|
//printk ("function : %s\n", __FUNCTION__); |
//printk ("function : %s\n", __FUNCTION__); |
if (dvbdmxfeed->state<DMX_STATE_GO) |
if (dvbdmxfeed->state<DMX_STATE_GO) |
return -EINVAL; |
return -EINVAL; |
|
if (!dvbdmx->stop_feed) |
|
return -1; |
ret=dvbdmx->stop_feed(dvbdmxfeed); |
ret=dvbdmx->stop_feed(dvbdmxfeed); |
feed->is_filtering=0; |
feed->is_filtering=0; |
dvbdmxfeed->state=DMX_STATE_ALLOCATED; |
dvbdmxfeed->state=DMX_STATE_ALLOCATED; |
Line 540 static int dvbdmx_release_ts_feed(dmx_de
|
Line 544 static int dvbdmx_release_ts_feed(dmx_de
|
|
|
if (dvbdmxfeed->state==DMX_STATE_FREE) |
if (dvbdmxfeed->state==DMX_STATE_FREE) |
return -EINVAL; |
return -EINVAL; |
if (dvbdmxfeed->buffer) |
if (dvbdmxfeed->buffer) { |
vfree(dvbdmxfeed->buffer); |
vfree(dvbdmxfeed->buffer); |
dvbdmxfeed->buffer=0; |
dvbdmxfeed->buffer=0; |
|
} |
dvbdmxfeed->state=DMX_STATE_FREE; |
dvbdmxfeed->state=DMX_STATE_FREE; |
dvbdmxfeed->filter->state=DMX_STATE_FREE; |
dvbdmxfeed->filter->state=DMX_STATE_FREE; |
if (dvbdmxfeed->pid!=0xffff) { |
if (dvbdmxfeed->pid!=0xffff) { |
Line 655 dmx_section_feed_set(struct dmx_section_
|
Line 660 dmx_section_feed_set(struct dmx_section_
|
dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size); |
dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size); |
if (!dvbdmxfeed->buffer) |
if (!dvbdmxfeed->buffer) |
return -ENOMEM; |
return -ENOMEM; |
|
dvbdmxfeed->state=DMX_STATE_READY; |
return 0; |
return 0; |
} |
} |
|
|
Line 673 dmx_section_feed_start_filtering(dmx_sec
|
Line 679 dmx_section_feed_start_filtering(dmx_sec
|
dvbdmxfeed->secbufp=0; |
dvbdmxfeed->secbufp=0; |
dvbdmxfeed->seclen=0; |
dvbdmxfeed->seclen=0; |
|
|
|
if (!dvbdmx->start_feed) |
|
return -1; |
ret=dvbdmx->start_feed(dvbdmxfeed); |
ret=dvbdmx->start_feed(dvbdmxfeed); |
if (ret<0) |
if (ret<0) |
return ret; |
return ret; |
Line 686 dmx_section_feed_stop_filtering(struct d
|
Line 694 dmx_section_feed_stop_filtering(struct d
|
{ |
{ |
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; |
dvb_demux_feed_t *dvbdmxfeed=(dvb_demux_feed_t *) feed; |
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; |
dvb_demux_t *dvbdmx=dvbdmxfeed->demux; |
int ret=dvbdmx->stop_feed(dvbdmxfeed); |
int ret; |
|
|
|
if (!dvbdmx->stop_feed) |
|
return -1; |
|
ret=dvbdmx->stop_feed(dvbdmxfeed); |
|
|
dvbdmxfeed->state=DMX_STATE_READY; |
dvbdmxfeed->state=DMX_STATE_READY; |
feed->is_filtering=0; |
feed->is_filtering=0; |
Line 707 dmx_section_feed_release_filter(dmx_sect
|
Line 719 dmx_section_feed_release_filter(dmx_sect
|
//return -EBUSY; |
//return -EBUSY; |
|
|
f=dvbdmxfeed->filter; |
f=dvbdmxfeed->filter; |
if (f==dvbdmxfeed->filter) |
if (f==dvbdmxfilter) |
dvbdmxfeed->filter=dvbdmxfilter->next; |
dvbdmxfeed->filter=dvbdmxfilter->next; |
else { |
else { |
while(f->next!=dvbdmxfilter) |
while(f->next!=dvbdmxfilter) |
Line 754 static int dvbdmx_release_section_feed(d
|
Line 766 static int dvbdmx_release_section_feed(d
|
|
|
if (dvbdmxfeed->state==DMX_STATE_FREE) |
if (dvbdmxfeed->state==DMX_STATE_FREE) |
return -EINVAL; |
return -EINVAL; |
if (dvbdmxfeed->buffer) |
if (dvbdmxfeed->buffer) { |
vfree(dvbdmxfeed->buffer); |
vfree(dvbdmxfeed->buffer); |
dvbdmxfeed->buffer=0; |
dvbdmxfeed->buffer=0; |
|
} |
dvbdmxfeed->state=DMX_STATE_FREE; |
dvbdmxfeed->state=DMX_STATE_FREE; |
dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; |
dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0; |
if (dvbdmxfeed->pid!=0xffff) |
if (dvbdmxfeed->pid!=0xffff) |
Line 769 static int dvbdmx_release_section_feed(d
|
Line 782 static int dvbdmx_release_section_feed(d
|
* dvb_demux kernel data API calls |
* dvb_demux kernel data API calls |
******************************************************************************/ |
******************************************************************************/ |
|
|
static int dvbdmx_open(struct dmx_demux_s *demux) |
static int dvbdmx_open(dmx_demux_t *demux) |
{ |
{ |
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; |
dvb_demux_t *dvbdemux=(dvb_demux_t *) demux; |
|
|
Line 876 static int dvbdmx_get_pes_pids(dmx_demux
|
Line 889 static int dvbdmx_get_pes_pids(dmx_demux
|
} |
} |
|
|
int |
int |
DvbDmxInit(dvb_demux_t *dvbdemux, char *id, char *vendor, char *model) |
DvbDmxInit(dvb_demux_t *dvbdemux) |
{ |
{ |
dmx_demux_t *dmx=&dvbdemux->dmx; |
|
int i; |
int i; |
|
dmx_demux_t *dmx=&dvbdemux->dmx; |
|
|
|
dvbdemux->users=0; |
dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(dvb_demux_filter_t)); |
dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(dvb_demux_filter_t)); |
if (!dvbdemux->filter) |
if (!dvbdemux->filter) |
return -ENOMEM; |
return -ENOMEM; |
|
|
dvbdemux->start_feed=0; |
|
dvbdemux->stop_feed=0; |
|
dvbdemux->write_to_decoder=0; |
|
dvbdemux->frontend_list.next= |
|
dvbdemux->frontend_list.prev= |
|
&dvbdemux->frontend_list; |
|
dvbdemux->users=0; |
|
|
|
for (i=0; i<DVB_DEMUX_FILTER_MAX; i++) { |
for (i=0; i<DVB_DEMUX_FILTER_MAX; i++) { |
dvbdemux->filter[i].state=DMX_STATE_FREE; |
dvbdemux->filter[i].state=DMX_STATE_FREE; |
dvbdemux->filter[i].index=i; |
dvbdemux->filter[i].index=i; |
} |
} |
for (i=0; i<DVB_DEMUX_FEED_MAX; i++) |
for (i=0; i<DVB_DEMUX_FEED_MAX; i++) |
dvbdemux->feed[i].state=DMX_STATE_FREE; |
dvbdemux->feed[i].state=DMX_STATE_FREE; |
|
dvbdemux->frontend_list.next= |
|
dvbdemux->frontend_list.prev= |
|
&dvbdemux->frontend_list; |
for (i=0; i<DMX_TS_PES_OTHER; i++) { |
for (i=0; i<DMX_TS_PES_OTHER; i++) { |
dvbdemux->pesfilter[i]=NULL; |
dvbdemux->pesfilter[i]=NULL; |
dvbdemux->pids[i]=0xffff; |
dvbdemux->pids[i]=0xffff; |
Line 907 DvbDmxInit(dvb_demux_t *dvbdemux, char *
|
Line 915 DvbDmxInit(dvb_demux_t *dvbdemux, char *
|
memset(dvbdemux->pid2feed, 0, 0x2000*sizeof(dvb_demux_feed_t *)); |
memset(dvbdemux->pid2feed, 0, 0x2000*sizeof(dvb_demux_feed_t *)); |
dvbdemux->tsbufp=0; |
dvbdemux->tsbufp=0; |
|
|
dmx->id=id; |
|
dmx->vendor=vendor; |
|
dmx->model=model; |
|
dmx->frontend=0; |
dmx->frontend=0; |
dmx->reg_list.next=dmx->reg_list.prev=&dmx->reg_list; |
dmx->reg_list.next=dmx->reg_list.prev=&dmx->reg_list; |
dmx->priv=(void *) dvbdemux; |
dmx->priv=(void *) dvbdemux; |
|
//dmx->users=0; // reset in dmx_register_demux() |
dmx->open=dvbdmx_open; |
dmx->open=dvbdmx_open; |
dmx->close=dvbdmx_close; |
dmx->close=dvbdmx_close; |
dmx->write=dvbdmx_write; |
dmx->write=dvbdmx_write; |
Line 935 DvbDmxInit(dvb_demux_t *dvbdemux, char *
|
Line 941 DvbDmxInit(dvb_demux_t *dvbdemux, char *
|
|
|
if (dmx_register_demux(dmx)<0) |
if (dmx_register_demux(dmx)<0) |
return -1; |
return -1; |
if (dmx->open(dmx)<0) |
//if (dmx->open(dmx)<0) |
return -1; |
// return -1; |
return 0; |
return 0; |
} |
} |
|
|