int32_t coolapi_read(int32_t fd, unsigned char * buffer, uint32_t len) { int32_t result; uint32_t done = 0, toread; unsigned char * buff = &buffer[0]; dmx_t * dmx = find_demux(fd, 0); if(!dmx) { cs_debug_mask(D_DVBAPI, "dmx is NULL!"); return 0; } cs_debug_mask(D_DVBAPI, "dmx channel %x pid %x len %d", (int) dmx->channel, dmx->pid, len); result = cnxt_cbuf_read_data(dmx->buffer2, buff, 3, &done); check_error ("cnxt_cbuf_read_data", result); if(done != 3) return 0; toread = ((buff[1] << 8) | buff[2]) & 0xFFF; if((toread+3) > len) return 0; result = cnxt_cbuf_read_data(dmx->buffer2, buff+3, toread, &done); check_error ("cnxt_cbuf_read_data", result); if(done != toread) return 0; done += 3; cs_debug_mask(D_DVBAPI, "bytes read %d\n", done); return done; }
int32_t coolapi_read(dmx_t *dmx, dmx_callback_data_t *data) { if(!dmx) { cs_debug_mask(D_DVBAPI, "dmx is NULL!"); return -1; } int32_t result; uint32_t done = 0, toread, len = data->len; uchar *buff = &dmx->buffer[0]; uint32_t bytes_used = 0; //cs_debug_mask(D_DVBAPI, "dmx channel %x pid %x len %d", (int) dmx->channel, dmx->pid, len); result = cnxt_cbuf_get_used(data->buf, &bytes_used); coolapi_check_error("cnxt_cbuf_get_used", result); if(bytes_used == 0) { return -1; } result = cnxt_cbuf_read_data(data->buf, buff, 3, &done); coolapi_check_error("cnxt_cbuf_read_data", result); if(done != 3) { return -1; } toread = ((buff[1] << 8) | buff[2]) & 0xFFF; if((toread + 3) > len) { return -1; } result = cnxt_cbuf_read_data(data->buf, buff + 3, toread, &done); coolapi_check_error("cnxt_cbuf_read_data", result); if(done != toread) { return -1; } done += 3; //cs_debug_mask(D_DVBAPI, "bytes read %d\n", done); return 0; }