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