--- margi2/dvb_demux.c 2001/03/14 01:43:11 1.3 +++ margi2/dvb_demux.c 2001/03/29 23:12:01 1.4 @@ -201,9 +201,8 @@ DvbDmxSWFilterSectionPacket(dvb_demux_fe ccok=((dvbdmxfeed->cc+1)&0x0f)==(buf[3]&0x0f) ? 1 : 0; dvbdmxfeed->cc=buf[3]&0x0f; - if (buf[1]&0x40) { // PUSI set -- a section begins in this packet + if (buf[1]&0x40) { // PUSI set // offset to start of first section is in buf[p] - if (buf[p] && ccok) { // rest of previous section? // did we have enough data in last packet to calc length? @@ -366,10 +365,10 @@ DvbDmxFilterAlloc(dvb_demux_t *dvbdmx) { int i; - for (i=0; ifilternum; i++) if (dvbdmx->filter[i].state==DMX_STATE_FREE) break; - if (i==DVB_DEMUX_FILTER_MAX) + if (i==dvbdmx->filternum) return 0; dvbdmx->filter[i].state=DMX_STATE_ALLOCATED; return &dvbdmx->filter[i]; @@ -380,10 +379,10 @@ DvbDmxFeedAlloc(dvb_demux_t *dvbdmx) { int i; - for (i=0; ifeednum; i++) if (dvbdmx->feed[i].state==DMX_STATE_FREE) break; - if (i==DVB_DEMUX_FEED_MAX) + if (i==dvbdmx->feednum) return 0; dvbdmx->feed[i].state=DMX_STATE_ALLOCATED; return &dvbdmx->feed[i]; @@ -898,11 +897,17 @@ DvbDmxInit(dvb_demux_t *dvbdemux) dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(dvb_demux_filter_t)); if (!dvbdemux->filter) return -ENOMEM; - for (i=0; ifeed=vmalloc(dvbdemux->feednum*sizeof(dvb_demux_feed_t)); + if (!dvbdemux->feed) { + vfree(dvbdemux->filter); + return -ENOMEM; + } + for (i=0; ifilternum; i++) { dvbdemux->filter[i].state=DMX_STATE_FREE; dvbdemux->filter[i].index=i; } - for (i=0; ifeednum; i++) dvbdemux->feed[i].state=DMX_STATE_FREE; dvbdemux->frontend_list.next= dvbdemux->frontend_list.prev= @@ -941,8 +946,8 @@ DvbDmxInit(dvb_demux_t *dvbdemux) if (dmx_register_demux(dmx)<0) return -1; - //if (dmx->open(dmx)<0) - // return -1; + + sema_init(&dvbdemux->mutex, 1); return 0; } @@ -954,19 +959,7 @@ DvbDmxRelease(dvb_demux_t *dvbdemux) dmx_unregister_demux(dmx); if (dvbdemux->filter) vfree(dvbdemux->filter); + if (dvbdemux->feed) + vfree(dvbdemux->feed); return 0; } - -/* - * Local variables: - * c-indent-level: 8 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -8 - * c-argdecl-indent: 8 - * c-label-offset: -8 - * c-continued-statement-offset: 8 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil - * tab-width: 8 - * End: - */