From 12910da66a47465a9bb335f29b5838f440a2b954 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 6 Jan 2015 20:27:36 +0100 Subject: stream_pvr: uncrustify Mostly automatic, with some manual changes. --- stream/stream_pvr.c | 2494 ++++++++++++++++++++++++--------------------------- 1 file changed, 1188 insertions(+), 1306 deletions(-) (limited to 'stream') diff --git a/stream/stream_pvr.c b/stream/stream_pvr.c index 829151ba28..9a18b29591 100644 --- a/stream/stream_pvr.c +++ b/stream/stream_pvr.c @@ -109,116 +109,114 @@ const struct m_sub_options stream_pvr_conf = { #define BUFPRINTF(d, ...) snprintf(d, sizeof(d), __VA_ARGS__) typedef struct station_elem_s { - char name[PVR_STATION_NAME_SIZE]; - int freq; - char station[PVR_STATION_NAME_SIZE]; - int enabled; - int priority; + char name[PVR_STATION_NAME_SIZE]; + int freq; + char station[PVR_STATION_NAME_SIZE]; + int enabled; + int priority; } station_elem_t; typedef struct stationlist_s { - char name[PVR_STATION_NAME_SIZE]; - station_elem_t *list; - int total; /* total number */ - int used; /* used number */ - int enabled; /* enabled number */ + char name[PVR_STATION_NAME_SIZE]; + station_elem_t *list; + int total; /* total number */ + int used; /* used number */ + int enabled; /* enabled number */ } stationlist_t; struct pvr_t { - struct mp_log *log; - tv_param_t *tv_params; - struct pvr_params *params; - int dev_fd; - char *video_dev; - int chantab; - - /* v4l2 params */ - int mute; - int input; - int normid; - int brightness; - int contrast; - int hue; - int saturation; - int width; - int height; - int freq; - int chan_idx; - int chan_idx_last; - stationlist_t stationlist; - /* dups the tv_param_channel, or the url's channel param */ - char *param_channel; - - /* encoder params */ - int aspect; - int samplerate; - int layer; - int audio_rate; - int audio_mode; - int bitrate; - int bitrate_mode; - int bitrate_peak; - int stream_type; + struct mp_log *log; + tv_param_t *tv_params; + struct pvr_params *params; + int dev_fd; + char *video_dev; + int chantab; + + /* v4l2 params */ + int mute; + int input; + int normid; + int brightness; + int contrast; + int hue; + int saturation; + int width; + int height; + int freq; + int chan_idx; + int chan_idx_last; + stationlist_t stationlist; + /* dups the tv_param_channel, or the url's channel param */ + char *param_channel; + + /* encoder params */ + int aspect; + int samplerate; + int layer; + int audio_rate; + int audio_mode; + int bitrate; + int bitrate_mode; + int bitrate_peak; + int stream_type; }; static int pvr_stream_control(struct stream *s, int cmd, void *arg); -static struct pvr_t * -pvr_init (void) +static struct pvr_t *pvr_init(void) { - struct pvr_t *pvr = NULL; - - pvr = calloc (1, sizeof (struct pvr_t)); - pvr->dev_fd = -1; - pvr->video_dev = strdup (PVR_DEFAULT_DEVICE); - pvr->chantab = 5; - - /* v4l2 params */ - pvr->mute = 0; - pvr->input = 0; - pvr->normid = -1; - pvr->brightness = 0; - pvr->contrast = 0; - pvr->hue = 0; - pvr->saturation = 0; - pvr->width = -1; - pvr->height = -1; - pvr->freq = -1; - pvr->chan_idx = -1; - pvr->chan_idx_last = -1; - - /* set default encoding settings - * may be overlapped by user parameters - * Use VBR MPEG_PS encoding at 6 Mbps (peak at 9.6 Mbps) - * with 48 KHz L2 384 kbps audio. - */ - pvr->aspect = V4L2_MPEG_VIDEO_ASPECT_4x3; - pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000; - pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_2; - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_384K; - pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO; - pvr->bitrate = 6000000; - pvr->bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR; - pvr->bitrate_peak = 9600000; - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS; - - return pvr; + struct pvr_t *pvr = NULL; + + pvr = calloc(1, sizeof (struct pvr_t)); + pvr->dev_fd = -1; + pvr->video_dev = strdup(PVR_DEFAULT_DEVICE); + pvr->chantab = 5; + + /* v4l2 params */ + pvr->mute = 0; + pvr->input = 0; + pvr->normid = -1; + pvr->brightness = 0; + pvr->contrast = 0; + pvr->hue = 0; + pvr->saturation = 0; + pvr->width = -1; + pvr->height = -1; + pvr->freq = -1; + pvr->chan_idx = -1; + pvr->chan_idx_last = -1; + + /* set default encoding settings + * may be overlapped by user parameters + * Use VBR MPEG_PS encoding at 6 Mbps (peak at 9.6 Mbps) + * with 48 KHz L2 384 kbps audio. + */ + pvr->aspect = V4L2_MPEG_VIDEO_ASPECT_4x3; + pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000; + pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_2; + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_384K; + pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO; + pvr->bitrate = 6000000; + pvr->bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR; + pvr->bitrate_peak = 9600000; + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS; + + return pvr; } -static void -pvr_uninit (struct pvr_t *pvr) +static void pvr_uninit(struct pvr_t *pvr) { - if (!pvr) - return; + if (!pvr) + return; - /* close device */ - if (pvr->dev_fd != -1) - close (pvr->dev_fd); + /* close device */ + if (pvr->dev_fd != -1) + close(pvr->dev_fd); - free (pvr->video_dev); - free (pvr->stationlist.list); - free (pvr->param_channel); - free (pvr); + free(pvr->video_dev); + free(pvr->stationlist.list); + free(pvr->param_channel); + free(pvr); } /** @@ -226,64 +224,61 @@ pvr_uninit (struct pvr_t *pvr) * * @see parse_setup_stationlist */ -static int -copycreate_stationlist (struct pvr_t *pvr, stationlist_t *stationlist, int num) +static int copycreate_stationlist(struct pvr_t *pvr, stationlist_t *stationlist, + int num) { - int i; + int i; - if (pvr->chantab < 0 || !stationlist) - return -1; + if (pvr->chantab < 0 || !stationlist) + return -1; - num = FFMAX (num, chanlists[pvr->chantab].count); + num = FFMAX(num, chanlists[pvr->chantab].count); - free (stationlist->list); - stationlist->list = NULL; + free(stationlist->list); + stationlist->list = NULL; - stationlist->total = 0; - stationlist->enabled = 0; - stationlist->used = 0; - stationlist->list = calloc (num, sizeof (station_elem_t)); + stationlist->total = 0; + stationlist->enabled = 0; + stationlist->used = 0; + stationlist->list = calloc(num, sizeof (station_elem_t)); - if (!stationlist->list) - { - MP_ERR(pvr, "No memory allocated for station list, giving up\n"); - return -1; - } - - /* transport the channel list data to our extented struct */ - stationlist->total = num; - BUFSTRCPY(stationlist->name, chanlists[pvr->chantab].name); - - for (i = 0; i < chanlists[pvr->chantab].count; i++) - { - stationlist->list[i].station[0]= '\0'; /* no station name yet */ - BUFSTRCPY(stationlist->list[i].name, chanlists[pvr->chantab].list[i].name); - stationlist->list[i].freq = chanlists[pvr->chantab].list[i].freq; - stationlist->list[i].enabled = 1; /* default enabled */ - stationlist->enabled++; - stationlist->used++; - } - - return 0; + if (!stationlist->list) { + MP_ERR(pvr, "No memory allocated for station list, giving up\n"); + return -1; + } + + /* transport the channel list data to our extented struct */ + stationlist->total = num; + BUFSTRCPY(stationlist->name, chanlists[pvr->chantab].name); + + for (i = 0; i < chanlists[pvr->chantab].count; i++) { + stationlist->list[i].station[0] = '\0'; /* no station name yet */ + BUFSTRCPY(stationlist->list[i].name, + chanlists[pvr->chantab].list[i].name); + stationlist->list[i].freq = chanlists[pvr->chantab].list[i].freq; + stationlist->list[i].enabled = 1; /* default enabled */ + stationlist->enabled++; + stationlist->used++; + } + + return 0; } -static int -print_all_stations (struct pvr_t *pvr) +static int print_all_stations(struct pvr_t *pvr) { - int i; + int i; - if (!pvr || !pvr->stationlist.list) - return -1; + if (!pvr || !pvr->stationlist.list) + return -1; - for (i = 0; i < pvr->stationlist.total; i++) - { - MP_VERBOSE(pvr, "%3d: [%c] channel: %8s - freq: %8d - station: %s\n", - i, (pvr->stationlist.list[i].enabled) ? 'X' : ' ', - pvr->stationlist.list[i].name, pvr->stationlist.list[i].freq, - pvr->stationlist.list[i].station); - } + for (i = 0; i < pvr->stationlist.total; i++) { + MP_VERBOSE(pvr, "%3d: [%c] channel: %8s - freq: %8d - station: %s\n", + i, (pvr->stationlist.list[i].enabled) ? 'X' : ' ', + pvr->stationlist.list[i].name, pvr->stationlist.list[i].freq, + pvr->stationlist.list[i].station); + } - return 0; + return 0; } /** @@ -291,14 +286,13 @@ print_all_stations (struct pvr_t *pvr) * * @see parse_setup_stationlist */ -static void -disable_all_stations (struct pvr_t *pvr) +static void disable_all_stations(struct pvr_t *pvr) { - int i; + int i; - for (i = 0; i < pvr->stationlist.total; i++) - pvr->stationlist.list[i].enabled = 0; - pvr->stationlist.enabled = 0; + for (i = 0; i < pvr->stationlist.total; i++) + pvr->stationlist.list[i].enabled = 0; + pvr->stationlist.enabled = 0; } /** @@ -306,108 +300,101 @@ disable_all_stations (struct pvr_t *pvr) * * @see parse_setup_stationlist */ -static int -set_station (struct pvr_t *pvr, const char *station, - const char *channel, int freq, int priority) +static int set_station(struct pvr_t *pvr, const char *station, + const char *channel, int freq, int priority) { - int i; + int i; - if (!pvr || !pvr->stationlist.list) - return -1; + if (!pvr || !pvr->stationlist.list) + return -1; - if (0 >= pvr->stationlist.total || (!channel && !freq)) - return -1; + if (0 >= pvr->stationlist.total || (!channel && !freq)) + return -1; + + /* select channel */ + for (i = 0; i < pvr->stationlist.used; i++) { + if (channel && !strcasecmp(pvr->stationlist.list[i].name, channel)) + break; /* found existing channel entry */ - /* select channel */ - for (i = 0; i < pvr->stationlist.used; i++) - { - if (channel && !strcasecmp (pvr->stationlist.list[i].name, channel)) - break; /* found existing channel entry */ + if (freq > 0 && pvr->stationlist.list[i].freq == freq) + break; /* found existing frequency entry */ + } - if (freq > 0 && pvr->stationlist.list[i].freq == freq) - break; /* found existing frequency entry */ - } + if (i < pvr->stationlist.used) { + /** + * found an existing entry, + * which is about to change with the user data. + * it is also enabled .. + */ + if (!pvr->stationlist.list[i].enabled) { + pvr->stationlist.list[i].enabled = 1; + pvr->stationlist.enabled++; + } - if (i < pvr->stationlist.used) - { - /** - * found an existing entry, - * which is about to change with the user data. - * it is also enabled .. - */ - if (!pvr->stationlist.list[i].enabled) - { - pvr->stationlist.list[i].enabled = 1; - pvr->stationlist.enabled++; + if (station) + BUFSTRCPY(pvr->stationlist.list[i].station, station); + else if (channel) + BUFSTRCPY(pvr->stationlist.list[i].station, channel); + else + BUFPRINTF(pvr->stationlist.list[i].station, "F %d", freq); + + pvr->stationlist.list[i].priority = priority; + + MP_DBG(pvr, "Set user station channel: %8s - freq: %8d - station: %s\n", + pvr->stationlist.list[i].name, + pvr->stationlist.list[i].freq, + pvr->stationlist.list[i].station); + return 0; } - if (station) - BUFSTRCPY(pvr->stationlist.list[i].station, station); - else if (channel) - BUFSTRCPY(pvr->stationlist.list[i].station, channel); - else - BUFPRINTF(pvr->stationlist.list[i].station, "F %d", freq); + /* from here on, we have to create a new entry, frequency is mandatory */ + if (freq < 0) { + MP_ERR(pvr, "Cannot add new station/channel without frequency\n"); + return -1; + } + if (pvr->stationlist.total < i) { + /** + * we have to extend the stationlist about + * an arbitrary size, even though this path is not performance critical + */ + pvr->stationlist.total += 10; + pvr->stationlist.list = + realloc(pvr->stationlist.list, + pvr->stationlist.total * sizeof (station_elem_t)); + + if (!pvr->stationlist.list) { + MP_ERR(pvr, "No memory allocated for station list, giving up\n"); + return -1; + } + + /* clear the new space ..*/ + memset(&(pvr->stationlist.list[pvr->stationlist.used]), 0, + (pvr->stationlist.total - pvr->stationlist.used) + * sizeof (station_elem_t)); + } + + /* here we go, our actual new entry */ + pvr->stationlist.used++; + pvr->stationlist.list[i].enabled = 1; pvr->stationlist.list[i].priority = priority; + pvr->stationlist.enabled++; - MP_DBG(pvr, "Set user station channel: %8s - freq: %8d - station: %s\n", - pvr->stationlist.list[i].name, - pvr->stationlist.list[i].freq, - pvr->stationlist.list[i].station); - return 0; - } + if (station) + BUFSTRCPY(pvr->stationlist.list[i].station, station); + if (channel) + BUFSTRCPY(pvr->stationlist.list[i].name, channel); + else + BUFPRINTF(pvr->stationlist.list[i].name, "F %d", freq); - /* from here on, we have to create a new entry, frequency is mandatory */ - if (freq < 0) - { - MP_ERR(pvr, "Cannot add new station/channel without frequency\n"); - return -1; - } + pvr->stationlist.list[i].freq = freq; - if (pvr->stationlist.total < i) - { - /** - * we have to extend the stationlist about - * an arbitrary size, even though this path is not performance critical - */ - pvr->stationlist.total += 10; - pvr->stationlist.list = - realloc (pvr->stationlist.list, - pvr->stationlist.total * sizeof (station_elem_t)); - - if (!pvr->stationlist.list) - { - MP_ERR(pvr, "No memory allocated for station list, giving up\n"); - return -1; - } + MP_DBG(pvr, "Add user station channel: %8s - freq: %8d - station: %s\n", + pvr->stationlist.list[i].name, + pvr->stationlist.list[i].freq, + pvr->stationlist.list[i].station); - /* clear the new space ..*/ - memset (&(pvr->stationlist.list[pvr->stationlist.used]), 0, - (pvr->stationlist.total - pvr->stationlist.used) - * sizeof (station_elem_t)); - } - - /* here we go, our actual new entry */ - pvr->stationlist.used++; - pvr->stationlist.list[i].enabled = 1; - pvr->stationlist.list[i].priority = priority; - pvr->stationlist.enabled++; - - if (station) - BUFSTRCPY(pvr->stationlist.list[i].station, station); - if (channel) - BUFSTRCPY(pvr->stationlist.list[i].name, channel); - else - BUFPRINTF(pvr->stationlist.list[i].name, "F %d", freq); - - pvr->stationlist.list[i].freq = freq; - - MP_DBG(pvr, "Add user station channel: %8s - freq: %8d - station: %s\n", - pvr->stationlist.list[i].name, - pvr->stationlist.list[i].freq, - pvr->stationlist.list[i].station); - - return 0; + return 0; } static int compare_priority(const void *pa, const void *pb) @@ -431,1278 +418,1173 @@ static int compare_priority(const void *pa, const void *pb) * - disable all stations * - update and/or create entries in the stationlist and enable them */ -static int -parse_setup_stationlist (struct pvr_t *pvr) +static int parse_setup_stationlist(struct pvr_t *pvr) { - int i; + int i; - if (!pvr) - return -1; + if (!pvr) + return -1; - /* Create our station/channel list */ - if (pvr->tv_params->chanlist) - { - /* select channel list */ - for (i = 0; chanlists[i].name != NULL; i++) - { - if (!strcasecmp (chanlists[i].name, pvr->tv_params->chanlist)) - { - pvr->chantab = i; - break; - } - } - if (!chanlists[i].name) - { - MP_ERR(pvr, "unable to find channel list %s, using default %s\n", - pvr->tv_params->chanlist, chanlists[pvr->chantab].name); + /* Create our station/channel list */ + if (pvr->tv_params->chanlist) { + /* select channel list */ + for (i = 0; chanlists[i].name != NULL; i++) { + if (!strcasecmp(chanlists[i].name, pvr->tv_params->chanlist)) { + pvr->chantab = i; + break; + } + } + if (!chanlists[i].name) { + MP_ERR(pvr, "unable to find channel list %s, using default %s\n", + pvr->tv_params->chanlist, chanlists[pvr->chantab].name); + } else { + MP_INFO(pvr, "select channel list %s, entries %d\n", + chanlists[pvr->chantab].name, chanlists[pvr->chantab].count); + } } - else - { - MP_INFO(pvr, "select channel list %s, entries %d\n", - chanlists[pvr->chantab].name, chanlists[pvr->chantab].count); + + if (0 > pvr->chantab) { + MP_FATAL(pvr, "No channel list selected, giving up\n"); + return -1; } - } - if (0 > pvr->chantab) - { - MP_FATAL(pvr, "No channel list selected, giving up\n"); - return -1; - } + if (copycreate_stationlist(pvr, &(pvr->stationlist), -1) < 0) { + MP_FATAL(pvr, "No memory allocated for station list, giving up\n"); + return -1; + } - if (copycreate_stationlist (pvr,&(pvr->stationlist), -1) < 0) - { - MP_FATAL(pvr, "No memory allocated for station list, giving up\n"); - return -1; - } + /* Handle user channel mappings */ + if (pvr->tv_params->channels) { + char channel[PVR_STATION_NAME_SIZE]; + char station[PVR_STATION_NAME_SIZE]; + char **channels = pvr->tv_params->channels; - /* Handle user channel mappings */ - if (pvr->tv_params->channels) - { - char channel[PVR_STATION_NAME_SIZE]; - char station[PVR_STATION_NAME_SIZE]; - char **channels = pvr->tv_params->channels; + disable_all_stations(pvr); - disable_all_stations (pvr); + int prio = 0; + for (i = 0; i < pvr->stationlist.total; i++) + pvr->stationlist.list[i].priority = ++prio; - int prio = 0; - for (i = 0; i < pvr->stationlist.total; i++) - pvr->stationlist.list[i].priority = ++prio; + while (*channels) { + char *tmp = *(channels++); + char *sep = strchr(tmp, '-'); + int freq = -1; - while (*channels) - { - char *tmp = *(channels++); - char *sep = strchr (tmp, '-'); - int freq=-1; + if (!sep) + continue; /* Wrong syntax, but mplayer should not crash */ - if (!sep) - continue; /* Wrong syntax, but mplayer should not crash */ + BUFSTRCPY(station, sep + 1); - BUFSTRCPY(station, sep + 1); + sep[0] = '\0'; + BUFSTRCPY(channel, tmp); - sep[0] = '\0'; - BUFSTRCPY(channel, tmp); + while ((sep = strchr(station, '_'))) + sep[0] = ' '; - while ((sep = strchr (station, '_'))) - sep[0] = ' '; + /* if channel number is a number and larger than 1000 treat it as + * frequency tmp still contain pointer to null-terminated string with + * channel number here + */ + if ((freq = atoi(channel)) <= 1000) + freq = -1; - /* if channel number is a number and larger than 1000 treat it as - * frequency tmp still contain pointer to null-terminated string with - * channel number here - */ - if ((freq = atoi (channel)) <= 1000) - freq = -1; + if (set_station(pvr, station, (freq <= 0) ? channel : NULL, freq, + ++prio) < 0) + { + MP_ERR(pvr, "Unable to set user station channel: %8s - " + "freq: %8d - station: %s\n", channel, freq, station); + } + } - if (set_station (pvr, station, (freq <= 0) ? channel : NULL, freq, ++prio) < 0) - { - MP_ERR(pvr, "Unable to set user station channel: %8s - freq: %8d - station: %s\n", - channel, freq, station); - } + qsort(pvr->stationlist.list, pvr->stationlist.total, + sizeof(station_elem_t), compare_priority); } - qsort(pvr->stationlist.list, pvr->stationlist.total, - sizeof(station_elem_t), compare_priority); - } - - return print_all_stations (pvr); + return print_all_stations(pvr); } -static int -get_v4l2_freq (struct pvr_t *pvr) +static int get_v4l2_freq(struct pvr_t *pvr) { - int freq; - struct v4l2_frequency vf; - struct v4l2_tuner vt; + int freq; + struct v4l2_frequency vf; + struct v4l2_tuner vt; - if (!pvr) - return -1; + if (!pvr) + return -1; - if (pvr->dev_fd < 0) - return -1; + if (pvr->dev_fd < 0) + return -1; - memset (&vt, 0, sizeof (vt)); - memset (&vf, 0, sizeof (vf)); + memset(&vt, 0, sizeof (vt)); + memset(&vf, 0, sizeof (vf)); - if (ioctl (pvr->dev_fd, VIDIOC_G_TUNER, &vt) < 0) - { - MP_ERR(pvr, "can't set tuner (%s).\n", mp_strerror (errno)); - return -1; - } + if (ioctl(pvr->dev_fd, VIDIOC_G_TUNER, &vt) < 0) { + MP_ERR(pvr, "can't set tuner (%s).\n", mp_strerror(errno)); + return -1; + } - if (ioctl (pvr->dev_fd, VIDIOC_G_FREQUENCY, &vf) < 0) - { - MP_ERR(pvr, "can't get frequency (%s).\n", mp_strerror(errno)); - return -1; - } - freq = vf.frequency; - if (!(vt.capability & V4L2_TUNER_CAP_LOW)) - freq *= 1000; - freq /= 16; + if (ioctl(pvr->dev_fd, VIDIOC_G_FREQUENCY, &vf) < 0) { + MP_ERR(pvr, "can't get frequency (%s).\n", mp_strerror(errno)); + return -1; + } + freq = vf.frequency; + if (!(vt.capability & V4L2_TUNER_CAP_LOW)) + freq *= 1000; + freq /= 16; - return freq; + return freq; } -static int -set_v4l2_freq (struct pvr_t *pvr) +static int set_v4l2_freq(struct pvr_t *pvr) { - struct v4l2_frequency vf; - struct v4l2_tuner vt; + struct v4l2_frequency vf; + struct v4l2_tuner vt; - if (!pvr) - return -1; + if (!pvr) + return -1; - if (0 >= pvr->freq) - { - MP_ERR(pvr, "Frequency invalid %d !!!\n", pvr->freq); - return -1; - } - - /* don't set the frequency, if it's already set. - * setting it here would interrupt the stream. - */ - if (get_v4l2_freq (pvr) == pvr->freq) - { - MP_INFO(pvr, "Frequency %d already set.\n", pvr->freq); - return 0; - } + if (0 >= pvr->freq) { + MP_ERR(pvr, "Frequency invalid %d !!!\n", pvr->freq); + return -1; + } - if (pvr->dev_fd < 0) - return -1; + /* don't set the frequency, if it's already set. + * setting it here would interrupt the stream. + */ + if (get_v4l2_freq(pvr) == pvr->freq) { + MP_INFO(pvr, "Frequency %d already set.\n", pvr->freq); + return 0; + } - memset (&vf, 0, sizeof (vf)); - memset (&vt, 0, sizeof (vt)); + if (pvr->dev_fd < 0) + return -1; - if (ioctl (pvr->dev_fd, VIDIOC_G_TUNER, &vt) < 0) - { - MP_ERR(pvr, "can't get tuner (%s).\n", mp_strerror (errno)); - return -1; - } + memset(&vf, 0, sizeof (vf)); + memset(&vt, 0, sizeof (vt)); + + if (ioctl(pvr->dev_fd, VIDIOC_G_TUNER, &vt) < 0) { + MP_ERR(pvr, "can't get tuner (%s).\n", mp_strerror(errno)); + return -1; + } - vf.type = vt.type; - vf.frequency = pvr->freq * 16; + vf.type = vt.type; + vf.frequency = pvr->freq * 16; - if (!(vt.capability & V4L2_TUNER_CAP_LOW)) - vf.frequency /= 1000; + if (!(vt.capability & V4L2_TUNER_CAP_LOW)) + vf.frequency /= 1000; - if (ioctl (pvr->dev_fd, VIDIOC_S_FREQUENCY, &vf) < 0) - { - MP_ERR(pvr, "can't set frequency (%s).\n", mp_strerror (errno)); - return -1; - } + if (ioctl(pvr->dev_fd, VIDIOC_S_FREQUENCY, &vf) < 0) { + MP_ERR(pvr, "can't set frequency (%s).\n", mp_strerror(errno)); + return -1; + } - memset (&vt, 0, sizeof(vt)); - if (ioctl (pvr->dev_fd, VIDIOC_G_TUNER, &vt) < 0) - { - MP_ERR(pvr, "can't set tuner (%s).\n", mp_strerror (errno)); - return -1; - } + memset(&vt, 0, sizeof(vt)); + if (ioctl(pvr->dev_fd, VIDIOC_G_TUNER, &vt) < 0) { + MP_ERR(pvr, "can't set tuner (%s).\n", mp_strerror(errno)); + return -1; + } - /* just a notification */ - if (!vt.signal) - MP_ERR(pvr, "NO SIGNAL at frequency %d (%d)\n", pvr->freq, vf.frequency); - else - MP_INFO(pvr, "Got signal at frequency %d (%d)\n", pvr->freq, vf.frequency); + /* just a notification */ + if (!vt.signal) { + MP_ERR(pvr, "NO SIGNAL at frequency %d (%d)\n", pvr->freq, vf.frequency); + } else { + MP_INFO(pvr, "Got signal at frequency %d (%d)\n", pvr->freq, + vf.frequency); + } - return 0; + return 0; } -static int -set_station_by_step (struct pvr_t *pvr, int step, int v4lAction) +static int set_station_by_step(struct pvr_t *pvr, int step, int v4lAction) { - if (!pvr || !pvr->stationlist.list) - return -1; - - if (pvr->stationlist.enabled >= abs (step)) - { - int gotcha = 0; - int chidx = pvr->chan_idx + step; + if (!pvr || !pvr->stationlist.list) + return -1; - while (!gotcha) - { - chidx = (chidx + pvr->stationlist.used) % pvr->stationlist.used; + if (pvr->stationlist.enabled >= abs(step)) { + int gotcha = 0; + int chidx = pvr->chan_idx + step; + + while (!gotcha) { + chidx = (chidx + pvr->stationlist.used) % pvr->stationlist.used; + + MP_DBG(pvr, "Offset switch: current %d, enabled %d, step %d -> %d\n", + pvr->chan_idx, pvr->stationlist.enabled, step, + chidx); + + if (!pvr->stationlist.list[chidx].enabled) { + MP_DBG(pvr, "Switch disabled to user station channel: %8s - " + "freq: %8d - station: %s\n", + pvr->stationlist.list[chidx].name, + pvr->stationlist.list[chidx].freq, + pvr->stationlist.list[chidx].station); + chidx += FFSIGN(step); + } else { + gotcha = 1; + } + } - MP_DBG(pvr, "Offset switch: current %d, enabled %d, step %d -> %d\n", - pvr->chan_idx, pvr->stationlist.enabled, step, chidx); + pvr->freq = pvr->stationlist.list[chidx].freq; + pvr->chan_idx_last = pvr->chan_idx; + pvr->chan_idx = chidx; - if (!pvr->stationlist.list[chidx].enabled) - { - MP_DBG(pvr, "Switch disabled to user station channel: %8s - freq: %8d - station: %s\n", + MP_INFO(pvr, "Switch to user station channel: %8s - freq: %8d - station: %s\n", pvr->stationlist.list[chidx].name, pvr->stationlist.list[chidx].freq, pvr->stationlist.list[chidx].station); - chidx += FFSIGN (step); - } - else - gotcha = 1; + + if (v4lAction) + return set_v4l2_freq(pvr); + + return (pvr->freq > 0) ? 0 : -1; } - pvr->freq = pvr->stationlist.list[chidx].freq; - pvr->chan_idx_last = pvr->chan_idx; - pvr->chan_idx = chidx; + MP_ERR(pvr, "Ooops couldn't set freq by channel entry step %d to " + "current %d, enabled %d\n", + step, pvr->chan_idx, pvr->stationlist.enabled); - MP_INFO(pvr, "Switch to user station channel: %8s - freq: %8d - station: %s\n", - pvr->stationlist.list[chidx].name, - pvr->stationlist.list[chidx].freq, - pvr->stationlist.list[chidx].station); + return -1; +} - if (v4lAction) - return set_v4l2_freq (pvr); +static int set_station_by_channelname_or_freq(struct pvr_t *pvr, + const char *channel, + int freq, int v4lAction) +{ + int i = 0; - return (pvr->freq > 0) ? 0 : -1; - } + if (!pvr || !pvr->stationlist.list) + return -1; - MP_ERR(pvr, "Ooops couldn't set freq by channel entry step %d to current %d, enabled %d\n", - step, pvr->chan_idx, pvr->stationlist.enabled); + if (0 >= pvr->stationlist.enabled) { + MP_WARN(pvr, "No enabled station, cannot switch channel/frequency\n"); + return -1; + } - return -1; -} + if (channel) { + /* select by channel */ + for (i = 0; i < pvr->stationlist.used; i++) { + if (!strcasecmp(pvr->stationlist.list[i].name, channel)) { + if (!pvr->stationlist.list[i].enabled) { + MP_WARN(pvr, "Switch disabled to user station channel: %8s " + "- freq: %8d - station: %s\n", + pvr->stationlist.list[i].name, + pvr->stationlist.list[i].freq, + pvr->stationlist.list[i].station); + + return -1; + } + + pvr->freq = pvr->stationlist.list[i].freq; + pvr->chan_idx_last = pvr->chan_idx; + pvr->chan_idx = i; + break; + } + } + } else if (freq >= 0) { + /* select by freq */ + for (i = 0; i < pvr->stationlist.used; i++) { + if (pvr->stationlist.list[i].freq == freq) { + if (!pvr->stationlist.list[i].enabled) { + MP_WARN(pvr, "Switch disabled to user station channel: " + "%8s - freq: %8d - station: %s\n", + pvr->stationlist.list[i].name, + pvr->stationlist.list[i].freq, + pvr->stationlist.list[i].station); + + return -1; + } + + pvr->freq = pvr->stationlist.list[i].freq; + pvr->chan_idx_last = pvr->chan_idx; + pvr->chan_idx = i; + break; + } + } + } -static int -set_station_by_channelname_or_freq (struct pvr_t *pvr, const char *channel, - int freq, int v4lAction) -{ - int i = 0; + if (i >= pvr->stationlist.used) { + if (channel) { + MP_WARN(pvr, "unable to find channel %s\n", channel); + } else { + MP_WARN(pvr, "unable to find frequency %d\n", freq); + } + return -1; + } - if (!pvr || !pvr->stationlist.list) - return -1; + MP_INFO(pvr, "Switch to user station channel: %8s - freq: %8d - station: %s\n", + pvr->stationlist.list[i].name, + pvr->stationlist.list[i].freq, + pvr->stationlist.list[i].station); - if (0 >= pvr->stationlist.enabled) - { - MP_WARN(pvr, "No enabled station, cannot switch channel/frequency\n"); - return -1; - } - - if (channel) - { - /* select by channel */ - for (i = 0; i < pvr->stationlist.used ; i++) - { - if (!strcasecmp (pvr->stationlist.list[i].name, channel)) - { - if (!pvr->stationlist.list[i].enabled) - { - MP_WARN(pvr, "Switch disabled to user station channel: %8s - freq: %8d - station: %s\n", - pvr->stationlist.list[i].name, - pvr->stationlist.list[i].freq, - pvr->stationlist.list[i].station); + if (v4lAction) + return set_v4l2_freq(pvr); + + return (pvr->freq > 0) ? 0 : -1; +} - return -1; +static void parse_encoder_options(struct pvr_t *pvr) +{ + if (!pvr) + return; + + /* -pvr aspect=digit */ + if (pvr->params->aspect_ratio >= 0 && pvr->params->aspect_ratio <= 3) + pvr->aspect = pvr->params->aspect_ratio; + + /* -pvr arate=x */ + if (pvr->params->sample_rate != 0) { + switch (pvr->params->sample_rate) { + case 32000: + pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000; + break; + case 44100: + pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100; + break; + case 48000: + pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000; + break; + default: + break; } + } - pvr->freq = pvr->stationlist.list[i].freq; - pvr->chan_idx_last = pvr->chan_idx; - pvr->chan_idx = i; - break; - } + /* -pvr alayer=x */ + if (pvr->params->audio_layer == 1) { + pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_1; + } else if (pvr->params->audio_layer == 2) { + pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_2; + } else if (pvr->params->audio_layer == 3) { + pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_3; } - } - else if (freq >= 0) - { - /* select by freq */ - for (i = 0; i < pvr->stationlist.used; i++) - { - if (pvr->stationlist.list[i].freq == freq) - { - if (!pvr->stationlist.list[i].enabled) - { - MP_WARN(pvr, "Switch disabled to user station channel: %8s - freq: %8d - station: %s\n", - pvr->stationlist.list[i].name, - pvr->stationlist.list[i].freq, - pvr->stationlist.list[i].station); - return -1; + /* -pvr abitrate=x */ + if (pvr->params->audio_bitrate != 0) { + if (pvr->layer == V4L2_MPEG_AUDIO_ENCODING_LAYER_1) { + switch (pvr->params->audio_bitrate) { + case 32: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_32K; + break; + case 64: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_64K; + break; + case 96: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_96K; + break; + case 128: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_128K; + break; + case 160: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_160K; + break; + case 192: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_192K; + break; + case 224: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_224K; + break; + case 256: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_256K; + break; + case 288: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_288K; + break; + case 320: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_320K; + break; + case 352: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_352K; + break; + case 384: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_384K; + break; + case 416: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_416K; + break; + case 448: + pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_448K; + break; + default: + break; + } + } else if (pvr->layer == V4L2_MPEG_AUDIO_ENCODING_LAYER_2) { + switch (pvr->params->audio_bitrate) { + case 32: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_32K; + break; + case 48: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_48K; + break; + case 56: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_56K; + break; + case 64: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_64K; + break; + case 80: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_80K; + break; + case 96: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_96K; + break; + case 112: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_112K; + break; + case 128: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_128K; + break; + case 160: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_160K; + break; + case 192: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_192K; + break; + case 224: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_224K; + break; + case 256: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_256K; + break; + case 320: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_320K; + break; + case 384: + pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_384K; + break; + default: + break; + } + } else if (pvr->layer == V4L2_MPEG_AUDIO_ENCODING_LAYER_3) { + switch (pvr->params->audio_bitrate) { + case 32: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_32K; + break; + case 40: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_40K; + break; + case 48: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_48K; + break; + case 56: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_56K; + break; + case 64: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_64K; + break; + case 80: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_80K; + break; + case 96: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_96K; + break; + case 112: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_112K; + break; + case 128: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_128K; + break; + case 160: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_160K; + break; + case 192: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_192K; + break; + case 224: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_224K; + break; + case 256: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_256K; + break; + case 320: + pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_320K; + break; + default: + break; + } } + } - pvr->freq = pvr->stationlist.list[i].freq; - pvr->chan_idx_last = pvr->chan_idx; - pvr->chan_idx = i; - break; - } + /* -pvr amode=x */ + if (pvr->params->audio_mode) { + if (!strcmp(pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_STEREO)) { + pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO; + } else if (!strcmp(pvr->params->audio_mode, + PVR_AUDIO_MODE_ARG_JOINT_STEREO)) + { + pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_JOINT_STEREO; + } else if (!strcmp(pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_DUAL)) { + pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_DUAL; + } else if (!strcmp(pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_MONO)) { + pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_MONO; + } } - } - if (i >= pvr->stationlist.used) - { - if (channel) - MP_WARN(pvr, "unable to find channel %s\n", channel); - else - MP_WARN(pvr, "unable to find frequency %d\n", freq); - return -1; - } + /* -pvr vbitrate=x */ + if (pvr->params->bitrate) + pvr->bitrate = pvr->params->bitrate; - MP_INFO(pvr, "Switch to user station channel: %8s - freq: %8d - station: %s\n", - pvr->stationlist.list[i].name, - pvr->stationlist.list[i].freq, - pvr->stationlist.list[i].station); + /* -pvr vmode=x */ + if (pvr->params->bitrate_mode) { + if (!strcmp(pvr->params->bitrate_mode, PVR_VIDEO_BITRATE_MODE_ARG_VBR)) { + pvr->bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR; + } else if (!strcmp(pvr->params->bitrate_mode, + PVR_VIDEO_BITRATE_MODE_ARG_CBR)) + { + pvr->bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR; + } + } - if (v4lAction) - return set_v4l2_freq (pvr); + /* -pvr vpeak=x */ + if (pvr->params->bitrate_peak) + pvr->bitrate_peak = pvr->params->bitrate_peak; + + /* -pvr fmt=x */ + if (pvr->params->stream_type) { + if (!strcmp(pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_PS)) { + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS; + } else if (!strcmp(pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_TS)) { + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_TS; + } else if (!strcmp(pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_MPEG1)) { + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG1_SS; + } else if (!strcmp(pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_DVD)) { + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_DVD; + } else if (!strcmp(pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_VCD)) { + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG1_VCD; + } else if (!strcmp(pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_SVCD)) { + pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD; + } + } +} - return (pvr->freq > 0) ? 0 : -1; +static void add_v4l2_ext_control(struct v4l2_ext_control *ctrl, + uint32_t id, int32_t value) +{ + ctrl->id = id; + ctrl->value = value; } -static void -parse_encoder_options (struct pvr_t *pvr) +static int set_encoder_settings(struct pvr_t *pvr) { - if (!pvr) - return; - - /* -pvr aspect=digit */ - if (pvr->params->aspect_ratio >= 0 && pvr->params->aspect_ratio <= 3) - pvr->aspect = pvr->params->aspect_ratio; - - /* -pvr arate=x */ - if (pvr->params->sample_rate != 0) - { - switch (pvr->params->sample_rate) - { - case 32000: - pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000; - break; - case 44100: - pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100; - break; - case 48000: - pvr->samplerate = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000; - break; - default: - break; - } - } + struct v4l2_ext_control *ext_ctrl = NULL; + struct v4l2_ext_controls ctrls; + uint32_t count = 0; - /* -pvr alayer=x */ - if (pvr->params->audio_layer == 1) - pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_1; - else if (pvr->params->audio_layer == 2) - pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_2; - else if (pvr->params->audio_layer == 3) - pvr->layer = V4L2_MPEG_AUDIO_ENCODING_LAYER_3; - - /* -pvr abitrate=x */ - if (pvr->params->audio_bitrate != 0) - { - if (pvr->layer == V4L2_MPEG_AUDIO_ENCODING_LAYER_1) - { - switch (pvr->params->audio_bitrate) - { - case 32: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_32K; - break; - case 64: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_64K; - break; - case 96: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_96K; - break; - case 128: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_128K; - break; - case 160: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_160K; - break; - case 192: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_192K; - break; - case 224: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_224K; - break; - case 256: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_256K; - break; - case 288: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_288K; - break; - case 320: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_320K; - break; - case 352: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_352K; - break; - case 384: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_384K; - break; - case 416: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_416K; - break; - case 448: - pvr->audio_rate = V4L2_MPEG_AUDIO_L1_BITRATE_448K; - break; - default: - break; - } - } + if (!pvr) + return -1; - else if (pvr->layer == V4L2_MPEG_AUDIO_ENCODING_LAYER_2) - { - switch (pvr->params->audio_bitrate) - { - case 32: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_32K; - break; - case 48: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_48K; - break; - case 56: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_56K; - break; - case 64: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_64K; - break; - case 80: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_80K; - break; - case 96: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_96K; - break; - case 112: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_112K; - break; - case 128: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_128K; - break; - case 160: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_160K; - break; - case 192: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_192K; - break; - case 224: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_224K; - break; - case 256: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_256K; - break; - case 320: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_320K; - break; - case 384: - pvr->audio_rate = V4L2_MPEG_AUDIO_L2_BITRATE_384K; - break; - default: - break; - } - } + if (pvr->dev_fd < 0) + return -1; - else if (pvr->layer == V4L2_MPEG_AUDIO_ENCODING_LAYER_3) - { - switch (pvr->params->audio_bitrate) - { - case 32: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_32K; - break; - case 40: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_40K; - break; - case 48: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_48K; - break; - case 56: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_56K; - break; - case 64: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_64K; - break; - case 80: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_80K; - break; - case 96: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_96K; - break; - case 112: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_112K; - break; - case 128: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_128K; - break; - case 160: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_160K; - break; - case 192: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_192K; - break; - case 224: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_224K; + ext_ctrl = malloc(PVR_MAX_CONTROLS * sizeof (struct v4l2_ext_control)); + + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_ASPECT, + pvr->aspect); + + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ, + pvr->samplerate); + + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_ENCODING, + pvr->layer); + + switch (pvr->layer) { + case V4L2_MPEG_AUDIO_ENCODING_LAYER_1: + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_L1_BITRATE, + pvr->audio_rate); break; - case 256: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_256K; + case V4L2_MPEG_AUDIO_ENCODING_LAYER_2: + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_L2_BITRATE, + pvr->audio_rate); break; - case 320: - pvr->audio_rate = V4L2_MPEG_AUDIO_L3_BITRATE_320K; + case V4L2_MPEG_AUDIO_ENCODING_LAYER_3: + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_L3_BITRATE, + pvr->audio_rate); break; - default: + default: break; - } } - } - - /* -pvr amode=x */ - if (pvr->params->audio_mode) - { - if (!strcmp (pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_STEREO)) - pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO; - else if (!strcmp (pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_JOINT_STEREO)) - pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_JOINT_STEREO; - else if (!strcmp (pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_DUAL)) - pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_DUAL; - else if (!strcmp (pvr->params->audio_mode, PVR_AUDIO_MODE_ARG_MONO)) - pvr->audio_mode = V4L2_MPEG_AUDIO_MODE_MONO; - } - - /* -pvr vbitrate=x */ - if (pvr->params->bitrate) - pvr->bitrate = pvr->params->bitrate; - - /* -pvr vmode=x */ - if (pvr->params->bitrate_mode) - { - if (!strcmp (pvr->params->bitrate_mode, PVR_VIDEO_BITRATE_MODE_ARG_VBR)) - pvr->bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR; - else if (!strcmp (pvr->params->bitrate_mode, PVR_VIDEO_BITRATE_MODE_ARG_CBR)) - pvr->bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR; - } - - /* -pvr vpeak=x */ - if (pvr->params->bitrate_peak) - pvr->bitrate_peak = pvr->params->bitrate_peak; - - /* -pvr fmt=x */ - if (pvr->params->stream_type) - { - if (!strcmp (pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_PS)) - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS; - else if (!strcmp (pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_TS)) - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_TS; - else if (!strcmp (pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_MPEG1)) - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG1_SS; - else if (!strcmp (pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_DVD)) - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_DVD; - else if (!strcmp (pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_VCD)) - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG1_VCD; - else if (!strcmp (pvr->params->stream_type, PVR_VIDEO_STREAM_TYPE_SVCD)) - pvr->stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD; - } -} -static void -add_v4l2_ext_control (struct v4l2_ext_control *ctrl, - uint32_t id, int32_t value) -{ - ctrl->id = id; - ctrl->value = value; -} + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_MODE, + pvr->audio_mode); -static int -set_encoder_settings (struct pvr_t *pvr) -{ - struct v4l2_ext_control *ext_ctrl = NULL; - struct v4l2_ext_controls ctrls; - uint32_t count = 0; + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_BITRATE, + pvr->bitrate); - if (!pvr) - return -1; + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, + pvr->bitrate_peak); - if (pvr->dev_fd < 0) - return -1; + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_BITRATE_MODE, + pvr->bitrate_mode); - ext_ctrl = (struct v4l2_ext_control *) - malloc (PVR_MAX_CONTROLS * sizeof (struct v4l2_ext_control)); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_ASPECT, - pvr->aspect); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ, - pvr->samplerate); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_ENCODING, - pvr->layer); - - switch (pvr->layer) - { - case V4L2_MPEG_AUDIO_ENCODING_LAYER_1: - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_L1_BITRATE, - pvr->audio_rate); - break; - case V4L2_MPEG_AUDIO_ENCODING_LAYER_2: - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_L2_BITRATE, - pvr->audio_rate); - break; - case V4L2_MPEG_AUDIO_ENCODING_LAYER_3: - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_L3_BITRATE, - pvr->audio_rate); - break; - default: - break; - } - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_AUDIO_MODE, - pvr->audio_mode); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_BITRATE, - pvr->bitrate); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, - pvr->bitrate_peak); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_VIDEO_BITRATE_MODE, - pvr->bitrate_mode); - - add_v4l2_ext_control (&ext_ctrl[count++], V4L2_CID_MPEG_STREAM_TYPE, - pvr->stream_type); - - /* set new encoding settings */ - ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG; - ctrls.count = count; - ctrls.controls = ext_ctrl; - - if (ioctl (pvr->dev_fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0) - { - MP_ERR(pvr, "Error setting MPEG controls (%s).\n", mp_strerror (errno)); - free (ext_ctrl); - return -1; - } + add_v4l2_ext_control(&ext_ctrl[count++], V4L2_CID_MPEG_STREAM_TYPE, + pvr->stream_type); - free (ext_ctrl); + /* set new encoding settings */ + ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG; + ctrls.count = count; + ctrls.controls = ext_ctrl; - return 0; + if (ioctl(pvr->dev_fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0) { + MP_ERR(pvr, "Error setting MPEG controls (%s).\n", mp_strerror(errno)); + free(ext_ctrl); + return -1; + } + + free(ext_ctrl); + + return 0; } -static void -parse_v4l2_tv_options (struct pvr_t *pvr) +static void parse_v4l2_tv_options(struct pvr_t *pvr) { - if (!pvr) - return; - - /* Create our station/channel list */ - parse_setup_stationlist (pvr); - - if (pvr->param_channel) - { - if (set_station_by_channelname_or_freq (pvr, pvr->param_channel, - -1, 0) >= 0) - { - if (pvr->tv_params->freq) - { - MP_INFO(pvr, "tv param freq %s is overwritten by channel setting freq %d\n", - pvr->tv_params->freq, pvr->freq); - } + if (!pvr) + return; + + /* Create our station/channel list */ + parse_setup_stationlist(pvr); + + if (pvr->param_channel) { + if (set_station_by_channelname_or_freq(pvr, pvr->param_channel, + -1, 0) >= 0) { + if (pvr->tv_params->freq) { + MP_INFO(pvr, "tv param freq %s is overwritten by channel " + "setting freq %d\n", pvr->tv_params->freq, pvr->freq); + } + } } - } - - if (pvr->freq < 0 && pvr->tv_params->freq) - { - MP_INFO(pvr, "tv param freq %s is used directly\n", - pvr->tv_params->freq); - if (set_station_by_channelname_or_freq (pvr, NULL, - atoi (pvr->tv_params->freq), 0)<0) - { - MP_WARN(pvr, "tv param freq %s invalid to set station\n", + if (pvr->freq < 0 && pvr->tv_params->freq) { + MP_INFO(pvr, "tv param freq %s is used directly\n", pvr->tv_params->freq); - } - } - if (pvr->tv_params->device) - { - free (pvr->video_dev); - pvr->video_dev = strdup (pvr->tv_params->device); - } + if (set_station_by_channelname_or_freq(pvr, NULL, + atoi(pvr->tv_params->freq), + 0) < 0) { + MP_WARN(pvr, "tv param freq %s invalid to set station\n", + pvr->tv_params->freq); + } + } + + if (pvr->tv_params->device) { + free(pvr->video_dev); + pvr->video_dev = strdup(pvr->tv_params->device); + } - if (!pvr->tv_params->audio) - pvr->mute = !pvr->tv_params->audio; + if (!pvr->tv_params->audio) + pvr->mute = !pvr->tv_params->audio; - if (pvr->tv_params->input) - pvr->input = pvr->tv_params->input; + if (pvr->tv_params->input) + pvr->input = pvr->tv_params->input; - if (pvr->tv_params->normid) - pvr->normid = pvr->tv_params->normid; + if (pvr->tv_params->normid) + pvr->normid = pvr->tv_params->normid; - if (pvr->tv_params->brightness) - pvr->brightness = pvr->tv_params->brightness; + if (pvr->tv_params->brightness) + pvr->brightness = pvr->tv_params->brightness; - if (pvr->tv_params->contrast) - pvr->contrast = pvr->tv_params->contrast; + if (pvr->tv_params->contrast) + pvr->contrast = pvr->tv_params->contrast; - if (pvr->tv_params->hue) - pvr->hue = pvr->tv_params->hue; + if (pvr->tv_params->hue) + pvr->hue = pvr->tv_params->hue; - if (pvr->tv_params->saturation) - pvr->saturation = pvr->tv_params->saturation; + if (pvr->tv_params->saturation) + pvr->saturation = pvr->tv_params->saturation; - if (pvr->tv_params->width) - pvr->width = pvr->tv_params->width; + if (pvr->tv_params->width) + pvr->width = pvr->tv_params->width; - if (pvr->tv_params->height) - pvr->height = pvr->tv_params->height; + if (pvr->tv_params->height) + pvr->height = pvr->tv_params->height; } -static int -set_v4l2_settings (struct pvr_t *pvr) +static int set_v4l2_settings(struct pvr_t *pvr) { - if (!pvr) - return -1; + if (!pvr) + return -1; - if (pvr->dev_fd < 0) - return -1; + if (pvr->dev_fd < 0) + return -1; - /* -tv noaudio */ - if (pvr->mute) - { - struct v4l2_control ctrl; - ctrl.id = V4L2_CID_AUDIO_MUTE; - ctrl.value = 1; - if (ioctl (pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) - { - MP_ERR(pvr, "can't mute (%s).\n", mp_strerror (errno)); - return -1; - } - } - - /* -tv input=x */ - if (pvr->input != 0) - { - if (ioctl (pvr->dev_fd, VIDIOC_S_INPUT, &pvr->input) < 0) - { - MP_ERR(pvr, "can't set input (%s)\n", mp_strerror (errno)); - return -1; + /* -tv noaudio */ + if (pvr->mute) { + struct v4l2_control ctrl; + ctrl.id = V4L2_CID_AUDIO_MUTE; + ctrl.value = 1; + if (ioctl(pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) { + MP_ERR(pvr, "can't mute (%s).\n", mp_strerror(errno)); + return -1; + } } - } - - /* -tv normid=x */ - if (pvr->normid != -1) - { - struct v4l2_standard std; - std.index = pvr->normid; - - if (ioctl (pvr->dev_fd, VIDIOC_ENUMSTD, &std) < 0) - { - MP_ERR(pvr, "can't set norm (%s)\n", mp_strerror (errno)); - return -1; + + /* -tv input=x */ + if (pvr->input != 0) { + if (ioctl(pvr->dev_fd, VIDIOC_S_INPUT, &pvr->input) < 0) { + MP_ERR(pvr, "can't set input (%s)\n", mp_strerror(errno)); + return -1; + } } - MP_VERBOSE(pvr, "set norm to %s\n", std.name); + /* -tv normid=x */ + if (pvr->normid != -1) { + struct v4l2_standard std; + std.index = pvr->normid; + + if (ioctl(pvr->dev_fd, VIDIOC_ENUMSTD, &std) < 0) { + MP_ERR(pvr, "can't set norm (%s)\n", mp_strerror(errno)); + return -1; + } + + MP_VERBOSE(pvr, "set norm to %s\n", std.name); - if (ioctl (pvr->dev_fd, VIDIOC_S_STD, &std.id) < 0) - { - MP_ERR(pvr, "can't set norm (%s)\n", mp_strerror (errno)); - return -1; + if (ioctl(pvr->dev_fd, VIDIOC_S_STD, &std.id) < 0) { + MP_ERR(pvr, "can't set norm (%s)\n", mp_strerror(errno)); + return -1; + } } - } - - /* -tv brightness=x */ - if (pvr->brightness != 0) - { - struct v4l2_control ctrl; - ctrl.id = V4L2_CID_BRIGHTNESS; - ctrl.value = pvr->brightness; - - if (ctrl.value < 0) - ctrl.value = 0; - if (ctrl.value > 255) - ctrl.value = 255; - - if (ioctl (pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) - { - MP_ERR(pvr, "can't set brightness to %d (%s).\n", - ctrl.value, mp_strerror (errno)); - return -1; + + /* -tv brightness=x */ + if (pvr->brightness != 0) { + struct v4l2_control ctrl; + ctrl.id = V4L2_CID_BRIGHTNESS; + ctrl.value = pvr->brightness; + + if (ctrl.value < 0) + ctrl.value = 0; + if (ctrl.value > 255) + ctrl.value = 255; + + if (ioctl(pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) { + MP_ERR(pvr, "can't set brightness to %d (%s).\n", + ctrl.value, mp_strerror(errno)); + return -1; + } } - } - - /* -tv contrast=x */ - if (pvr->contrast != 0) - { - struct v4l2_control ctrl; - ctrl.id = V4L2_CID_CONTRAST; - ctrl.value = pvr->contrast; - - if (ctrl.value < 0) - ctrl.value = 0; - if (ctrl.value > 127) - ctrl.value = 127; - - if (ioctl (pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) - { - MP_ERR(pvr, "can't set contrast to %d (%s).\n", - ctrl.value, mp_strerror (errno)); - return -1; + + /* -tv contrast=x */ + if (pvr->contrast != 0) { + struct v4l2_control ctrl; + ctrl.id = V4L2_CID_CONTRAST; + ctrl.value = pvr->contrast; + + if (ctrl.value < 0) + ctrl.value = 0; + if (ctrl.value > 127) + ctrl.value = 127; + + if (ioctl(pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) { + MP_ERR(pvr, "can't set contrast to %d (%s).\n", + ctrl.value, mp_strerror(errno)); + return -1; + } } - } - - /* -tv hue=x */ - if (pvr->hue != 0) - { - struct v4l2_control ctrl; - ctrl.id = V4L2_CID_HUE; - ctrl.value = pvr->hue; - - if (ctrl.value < -128) - ctrl.value = -128; - if (ctrl.value > 127) - ctrl.value = 127; - - if (ioctl (pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) - { - MP_ERR(pvr, "can't set hue to %d (%s).\n", - ctrl.value, mp_strerror (errno)); - return -1; + + /* -tv hue=x */ + if (pvr->hue != 0) { + struct v4l2_control ctrl; + ctrl.id = V4L2_CID_HUE; + ctrl.value = pvr->hue; + + if (ctrl.value < -128) + ctrl.value = -128; + if (ctrl.value > 127) + ctrl.value = 127; + + if (ioctl(pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) { + MP_ERR(pvr, "can't set hue to %d (%s).\n", + ctrl.value, mp_strerror(errno)); + return -1; + } } - } - - /* -tv saturation=x */ - if (pvr->saturation != 0) - { - struct v4l2_control ctrl; - ctrl.id = V4L2_CID_SATURATION; - ctrl.value = pvr->saturation; - - if (ctrl.value < 0) - ctrl.value = 0; - if (ctrl.value > 127) - ctrl.value = 127; - - if (ioctl (pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) - { - MP_ERR(pvr, "can't set saturation to %d (%s).\n", - ctrl.value, mp_strerror (errno)); - return -1; + + /* -tv saturation=x */ + if (pvr->saturation != 0) { + struct v4l2_control ctrl; + ctrl.id = V4L2_CID_SATURATION; + ctrl.value = pvr->saturation; + + if (ctrl.value < 0) + ctrl.value = 0; + if (ctrl.value > 127) + ctrl.value = 127; + + if (ioctl(pvr->dev_fd, VIDIOC_S_CTRL, &ctrl) < 0) { + MP_ERR(pvr, "can't set saturation to %d (%s).\n", + ctrl.value, mp_strerror(errno)); + return -1; + } } - } - - /* -tv width=x:height=y */ - if (pvr->width && pvr->height) - { - struct v4l2_format vfmt; - vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - vfmt.fmt.pix.width = pvr->width; - vfmt.fmt.pix.height = pvr->height; - - if (ioctl (pvr->dev_fd, VIDIOC_S_FMT, &vfmt) < 0) - { - MP_ERR(pvr, "can't set resolution to %dx%d (%s).\n", - pvr->width, pvr->height, mp_strerror (errno)); - return -1; + + /* -tv width=x:height=y */ + if (pvr->width && pvr->height) { + struct v4l2_format vfmt; + vfmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + vfmt.fmt.pix.width = pvr->width; + vfmt.fmt.pix.height = pvr->height; + + if (ioctl(pvr->dev_fd, VIDIOC_S_FMT, &vfmt) < 0) { + MP_ERR(pvr, "can't set resolution to %dx%d (%s).\n"