Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 330578
b: refs/heads/master
c: b6ecf8b
h: refs/heads/master
v: v3
  • Loading branch information
Antti Palosaari authored and Mauro Carvalho Chehab committed Aug 4, 2012
1 parent b6a2846 commit 05d0353
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 64 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3256cdef6ea09776e587b23240b74ead733fb11c
refs/heads/master: b6ecf8bb4e0fbda10f41770187e2120c282770f4
1 change: 1 addition & 0 deletions trunk/drivers/media/dvb/dvb-usb/dvb_usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ struct dvb_usb_device_properties {
int (*get_rc_config) (struct dvb_usb_device *, struct dvb_usb_rc *);
int (*get_usb_stream_config) (struct dvb_frontend *,
struct usb_data_stream_properties *);
int (*get_ts_config) (struct dvb_frontend *, unsigned int *);

struct i2c_algorithm *i2c_algo;

Expand Down
73 changes: 73 additions & 0 deletions trunk/drivers/media/dvb/dvb-usb/dvb_usb_dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,60 @@
*/
#include "dvb_usb_common.h"

static void dvb_usb_data_complete(struct usb_data_stream *stream, u8 *buffer,
size_t length)
{
struct dvb_usb_adapter *adap = stream->user_priv;
if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
dvb_dmx_swfilter(&adap->demux, buffer, length);
}

static void dvb_usb_data_complete_204(struct usb_data_stream *stream,
u8 *buffer, size_t length)
{
struct dvb_usb_adapter *adap = stream->user_priv;
if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
dvb_dmx_swfilter_204(&adap->demux, buffer, length);
}

static void dvb_usb_data_complete_raw(struct usb_data_stream *stream,
u8 *buffer, size_t length)
{
struct dvb_usb_adapter *adap = stream->user_priv;
if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
dvb_dmx_swfilter_raw(&adap->demux, buffer, length);
}

int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap)
{
int ret;
struct usb_data_stream_properties stream_props;

adap->stream.udev = adap->dev->udev;
adap->stream.user_priv = adap;

/* resolve USB stream configuration for buffer alloc */
if (adap->dev->props.get_usb_stream_config) {
ret = adap->dev->props.get_usb_stream_config(NULL,
&stream_props);
if (ret < 0)
return ret;
} else {
stream_props = adap->props.fe[0].stream;
}

/* FIXME: can be removed as set later in anyway */
adap->stream.complete = dvb_usb_data_complete;

return usb_urb_init(&adap->stream, &stream_props);
}

int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap)
{
usb_urb_exit(&adap->stream);
return 0;
}

/* does the complete input transfer handling */
static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
{
Expand Down Expand Up @@ -57,6 +111,25 @@ static int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
*/
if (adap->feedcount == onoff && adap->feedcount > 0) {
struct usb_data_stream_properties stream_props;
unsigned int ts_props;

/* resolve TS configuration */
if (adap->dev->props.get_ts_config) {
ret = adap->dev->props.get_ts_config(
adap->fe_adap[adap->active_fe].fe,
&ts_props);
if (ret < 0)
return ret;
} else {
ts_props = 0; /* normal 188 payload only TS */
}

if (ts_props & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
adap->stream.complete = dvb_usb_data_complete_204;
else if (ts_props & DVB_USB_ADAP_RECEIVES_RAW_PAYLOAD)
adap->stream.complete = dvb_usb_data_complete_raw;
else
adap->stream.complete = dvb_usb_data_complete;

/* resolve USB stream configuration */
if (adap->dev->props.get_usb_stream_config) {
Expand Down
63 changes: 0 additions & 63 deletions trunk/drivers/media/dvb/dvb-usb/dvb_usb_urb.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,66 +66,3 @@ int dvb_usbv2_generic_write(struct dvb_usb_device *d, u8 *buf, u16 len)
return dvb_usbv2_generic_rw(d, buf, len, NULL, 0, 0);
}
EXPORT_SYMBOL(dvb_usbv2_generic_write);

static void dvb_usb_data_complete(struct usb_data_stream *stream, u8 *buffer,
size_t length)
{
struct dvb_usb_adapter *adap = stream->user_priv;
if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
dvb_dmx_swfilter(&adap->demux, buffer, length);
}

static void dvb_usb_data_complete_204(struct usb_data_stream *stream,
u8 *buffer, size_t length)
{
struct dvb_usb_adapter *adap = stream->user_priv;
if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
dvb_dmx_swfilter_204(&adap->demux, buffer, length);
}

static void dvb_usb_data_complete_raw(struct usb_data_stream *stream,
u8 *buffer, size_t length)
{
struct dvb_usb_adapter *adap = stream->user_priv;
if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
dvb_dmx_swfilter_raw(&adap->demux, buffer, length);
}

int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap)
{
int ret;
struct usb_data_stream_properties stream_props;

/*
* FIXME: We should config demux callback for each time streaming is
* started. Same for the USB data stream config.
*/

adap->stream.udev = adap->dev->udev;
if (adap->props.fe[0].caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
adap->stream.complete = dvb_usb_data_complete_204;
else if (adap->props.fe[0].caps & DVB_USB_ADAP_RECEIVES_RAW_PAYLOAD)
adap->stream.complete = dvb_usb_data_complete_raw;
else
adap->stream.complete = dvb_usb_data_complete;

adap->stream.user_priv = adap;

/* resolve USB stream configuration */
if (adap->dev->props.get_usb_stream_config) {
ret = adap->dev->props.get_usb_stream_config(NULL,
&stream_props);
if (ret < 0)
return ret;
} else {
stream_props = adap->props.fe[0].stream;
}

return usb_urb_init(&adap->stream, &stream_props);
}

int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap)
{
usb_urb_exit(&adap->stream);
return 0;
}

0 comments on commit 05d0353

Please sign in to comment.