int main(int argc, char *argv[]) { struct dvb_v5_fe_parms *parms; int fe_flags = O_RDWR; argp_parse(&argp, argc, argv, 0, 0, 0); /* * If called without any option, be verbose, to print the * DVB frontend information. */ if (!get && !delsys && !set_params && !femon) verbose++; if (!delsys && !set_params) fe_flags = O_RDONLY; parms = dvb_fe_open_flags(adapter, frontend, verbose, dvbv3, NULL, fe_flags); if (!parms) return -1; if (delsys) { printf("Changing delivery system to: %s\n", delivery_system_name[delsys]); dvb_set_sys(parms, delsys); goto ret; } #if 0 if (set_params) do_something(); #endif if (get) { dvb_fe_get_parms(parms); dvb_fe_prt_parms(parms); } if (femon) get_show_stats(parms); ret: dvb_fe_close(parms); return 0; }
int main(int argc, char *argv[]) { struct dvb_device *dvb; struct dvb_dev_list *dvb_dev; struct dvb_v5_fe_parms *parms; int ret, fe_flags = O_RDWR; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif if (argp_parse(&argp, argc, argv, ARGP_NO_HELP | ARGP_NO_EXIT, 0, 0)) { argp_help(&argp, stderr, ARGP_HELP_SHORT_USAGE, PROGRAM_NAME); return -1; } /* * If called without any option, be verbose, to print the * DVB frontend information. */ if (!get && !delsys && !set_params && !femon) verbose++; if (!delsys && !set_params) fe_flags = O_RDONLY; dvb = dvb_dev_alloc(); if (!dvb) return -1; if (server && port) { printf(_("Connecting to %s:%d\n"), server, port); ret = dvb_dev_remote_init(dvb, server, port); if (ret < 0) return -1; } dvb_dev_set_log(dvb, verbose, NULL); if (device_mon) { dvb_dev_find(dvb, &dev_change_monitor, NULL); while (1) { usleep(1000000); } } dvb_dev_find(dvb, NULL, NULL); parms = dvb->fe_parms; dvb_dev = dvb_dev_seek_by_adapter(dvb, adapter, frontend, DVB_DEVICE_FRONTEND); if (!dvb_dev) return -1; if (!dvb_dev_open(dvb, dvb_dev->sysname, fe_flags)) return -1; if (delsys) { printf(_("Changing delivery system to: %s\n"), delivery_system_name[delsys]); dvb_set_sys(parms, delsys); goto ret; } #if 0 if (set_params) do_something(); #endif if (get) { dvb_fe_get_parms(parms); dvb_fe_prt_parms(parms); } if (femon) get_show_stats(parms); ret: dvb_dev_free(dvb); return 0; }
int main(int argc, char **argv) { struct arguments args; char *homedir = getenv("HOME"); char *channel = NULL; int lnb = -1, idx = -1; int vpid = -1, apid = -1, sid = -1; int pmtpid = 0; int pat_fd = -1, pmt_fd = -1, sid_fd = -1; int audio_fd = -1, video_fd = -1; int dvr_fd = -1, file_fd = -1; int err = -1; int r; struct dvb_v5_fe_parms *parms = NULL; const struct argp argp = { .options = options, .parser = parse_opt, .doc = N_("DVB zap utility"), .args_doc = N_("<channel name> [or <frequency> if in monitor mode]"), }; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif memset(&args, 0, sizeof(args)); args.sat_number = -1; args.lna = LNA_AUTO; args.input_format = FILE_DVBV5; argp_parse(&argp, argc, argv, ARGP_NO_HELP | ARGP_NO_EXIT, &idx, &args); if (idx < argc) channel = argv[idx]; if (!channel) { argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.input_format == FILE_UNKNOWN) { fprintf(stderr, _("ERROR: Please specify a valid format\n")); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (!args.traffic_monitor && args.search) { fprintf(stderr, _("ERROR: search string can be used only on monitor mode\n")); argp_help(&argp, stderr, ARGP_HELP_STD_HELP, PROGRAM_NAME); return -1; } if (args.lnb_name) { lnb = dvb_sat_search_lnb(args.lnb_name); if (lnb < 0) { printf(_("Please select one of the LNBf's below:\n")); dvb_print_all_lnb(); exit(1); } else { printf(_("Using LNBf ")); dvb_print_lnb(lnb); } } r = asprintf(&args.demux_dev, "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux); if (r < 0) { fprintf(stderr, _("asprintf error\n")); return -1; } r = asprintf(&args.dvr_dev, "/dev/dvb/adapter%i/dvr%i", args.adapter, args.demux); if (r < 0) { fprintf(stderr, _("asprintf error\n")); return -1; } if (args.silent < 2) fprintf(stderr, _("using demux '%s'\n"), args.demux_dev); if (!args.confname) { if (!homedir) ERROR(_("$HOME not set")); r = asprintf(&args.confname, "%s/.tzap/%i/%s", homedir, args.adapter, CHANNEL_FILE); if (access(args.confname, R_OK)) { free(args.confname); r = asprintf(&args.confname, "%s/.tzap/%s", homedir, CHANNEL_FILE); } } fprintf(stderr, _("reading channels from file '%s'\n"), args.confname); parms = dvb_fe_open(args.adapter, args.frontend, args.verbose, args.force_dvbv3); if (!parms) goto err; if (lnb >= 0) parms->lnb = dvb_sat_get_lnb(lnb); if (args.sat_number > 0) parms->sat_number = args.sat_number % 3; parms->diseqc_wait = args.diseqc_wait; parms->freq_bpf = args.freq_bpf; parms->lna = args.lna; r = dvb_fe_set_default_country(parms, args.cc); if (r < 0) fprintf(stderr, _("Failed to set the country code:%s\n"), args.cc); if (parse(&args, parms, channel, &vpid, &apid, &sid)) goto err; if (setup_frontend(&args, parms) < 0) goto err; if (args.exit_after_tuning) { err = 0; check_frontend(&args, parms); goto err; } if (args.traffic_monitor) { signal(SIGTERM, do_timeout); signal(SIGINT, do_timeout); if (args.timeout > 0) { signal(SIGINT, do_timeout); alarm(args.timeout); } err = do_traffic_monitor(&args, parms); goto err; } if (args.rec_psi) { if (sid < 0) { fprintf(stderr, _("Service id 0x%04x was not specified at the file\n"), sid); goto err; } sid_fd = dvb_dmx_open(args.adapter, args.demux); if (sid_fd < 0) { perror(_("opening pat demux failed")); return -1; } pmtpid = dvb_get_pmt_pid(sid_fd, sid); dvb_dmx_close(sid_fd); if (pmtpid <= 0) { fprintf(stderr, _("couldn't find pmt-pid for sid %04x\n"), sid); goto err; } if ((pat_fd = open(args.demux_dev, O_RDWR)) < 0) { perror(_("opening pat demux failed")); goto err; } if (dvb_set_pesfilter(pat_fd, 0, DMX_PES_OTHER, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; if ((pmt_fd = open(args.demux_dev, O_RDWR)) < 0) { perror(_("opening pmt demux failed")); goto err; } if (dvb_set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; } if (args.all_pids++) { vpid = 0x2000; apid = 0; } if (vpid >= 0) { if (args.silent < 2) { if (vpid == 0x2000) fprintf(stderr, _("pass all PID's to TS\n")); else fprintf(stderr, _("video pid %d\n"), vpid); } if ((video_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR(_("failed opening '%s'"), args.demux_dev); goto err; } if (args.silent < 2) fprintf(stderr, _(" dvb_set_pesfilter %d\n"), vpid); if (vpid == 0x2000) { if (ioctl(video_fd, DMX_SET_BUFFER_SIZE, 1024 * 1024) == -1) perror(_("DMX_SET_BUFFER_SIZE failed")); if (dvb_set_pesfilter(video_fd, vpid, DMX_PES_OTHER, DMX_OUT_TS_TAP, 0) < 0) goto err; } else { if (dvb_set_pesfilter(video_fd, vpid, DMX_PES_VIDEO, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; } } if (apid > 0) { if (args.silent < 2) fprintf(stderr, _("audio pid %d\n"), apid); if ((audio_fd = open(args.demux_dev, O_RDWR)) < 0) { PERROR(_("failed opening '%s'"), args.demux_dev); goto err; } if (args.silent < 2) fprintf(stderr, _(" dvb_set_pesfilter %d\n"), apid); if (dvb_set_pesfilter(audio_fd, apid, DMX_PES_AUDIO, args.dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER, args.dvr ? 64 * 1024 : 0) < 0) goto err; } signal(SIGALRM, do_timeout); signal(SIGTERM, do_timeout); if (args.timeout > 0) { signal(SIGINT, do_timeout); alarm(args.timeout); } if (!check_frontend(&args, parms)) { err = 1; fprintf(stderr, _("frontend doesn't lock\n")); goto err; } if (args.dvr) { if (args.filename) { file_fd = STDOUT_FILENO; if (strcmp(args.filename, "-") != 0) { file_fd = open(args.filename, #ifdef O_LARGEFILE O_LARGEFILE | #endif O_WRONLY | O_CREAT, 0644); if (file_fd < 0) { PERROR(_("open of '%s' failed"), args.filename); return -1; } } } if (args.silent < 2) get_show_stats(&args, parms, 0); if (file_fd >= 0) { if ((dvr_fd = open(args.dvr_dev, O_RDONLY)) < 0) { PERROR(_("failed opening '%s'"), args.dvr_dev); goto err; } if (!timeout_flag) fprintf(stderr, _("Record to file '%s' started\n"), args.filename); copy_to_file(dvr_fd, file_fd, args.timeout, args.silent); } else { if (!timeout_flag) fprintf(stderr, _("DVR interface '%s' can now be opened\n"), args.dvr_dev); get_show_stats(&args, parms, 1); } if (args.silent < 2) get_show_stats(&args, parms, 0); } err = 0; err: if (file_fd > 0) close(file_fd); if (dvr_fd > 0) close(dvr_fd); if (pat_fd > 0) close(pat_fd); if (pmt_fd > 0) close(pmt_fd); if (audio_fd > 0) close(audio_fd); if (video_fd > 0) close(video_fd); if (parms) dvb_fe_close(parms); if (args.confname) free(args.confname); if (args.demux_dev) free(args.demux_dev); if (args.dvr_dev) free(args.dvr_dev); return err; }
int do_traffic_monitor(struct arguments *args, struct dvb_v5_fe_parms *parms) { int fd, dvr_fd; long long unsigned pidt[0x2001], wait; int packets = 0; struct timeval startt; memset(pidt, 0, sizeof(pidt)); args->exit_after_tuning = 1; check_frontend(args, parms); if ((dvr_fd = open(args->dvr_dev, O_RDONLY)) < 0) { PERROR(_("failed opening '%s'"), args->dvr_dev); return -1; } if (ioctl(dvr_fd, DMX_SET_BUFFER_SIZE, 1024 * 1024) == -1) perror(_("DMX_SET_BUFFER_SIZE failed")); if ((fd = open(args->demux_dev, O_RDWR)) < 0) { PERROR(_("failed opening '%s'"), args->demux_dev); close(dvr_fd); return -1; } if (args->silent < 2) fprintf(stderr, _(" dvb_set_pesfilter to 0x2000\n")); if (dvb_set_pesfilter(fd, 0x2000, DMX_PES_OTHER, DMX_OUT_TS_TAP, 0) < 0) { PERROR(_("couldn't set filter")); return -1; } gettimeofday(&startt, 0); wait = 1000; while (1) { unsigned char buffer[BSIZE]; struct dvb_ts_packet_header *h = (void *)buffer; int pid, ok; ssize_t r; if (timeout_flag) break; if ((r = read(dvr_fd, buffer, BSIZE)) <= 0) { if (errno == EOVERFLOW) { struct timeval now; int diff; gettimeofday(&now, 0); diff = (now.tv_sec - startt.tv_sec) * 1000 + (now.tv_usec - startt.tv_usec) / 1000; fprintf(stderr, _("%.2fs: buffer overrun\n"), diff / 1000.); continue; } perror(_("read")); break; } if (r != BSIZE) { fprintf(stderr, _("dvbtraffic: only read %zd bytes\n"), r); break; } if (h->sync_byte != 0x47) { continue; } bswap16(h->bitfield); #if 0 /* * ITU-T Rec. H.222.0 decoders shall discard Transport Stream * packets with theadaptation_field_control field set to * a value of '00'. */ if (h->adaptation_field_control == 0) continue; #endif ok = 1; pid = h->pid; if (args->search) { int i, sl = strlen(args->search); ok = 0; if (pid != 0x1fff) { for (i = 0; i < (188 - sl); ++i) { if (!memcmp(buffer + i, args->search, sl)) ok = 1; } } } if (ok) { pidt[pid]++; pidt[0x2000]++; } packets++; if (!(packets & 0xFF)) { struct timeval now; int diff; gettimeofday(&now, 0); diff = (now.tv_sec - startt.tv_sec) * 1000 + (now.tv_usec - startt.tv_usec) / 1000; if (diff > wait) { if (isatty(STDOUT_FILENO)) printf("\x1b[1H\x1b[2J"); args->n_status_lines = 0; printf(_(" PID FREQ SPEED TOTAL\n")); int _pid = 0; for (_pid = 0; _pid < 0x2000; _pid++) { if (pidt[_pid]) { if (!args->low_traffic && (pidt[_pid] * 1000. / diff) < 1) continue; printf("%04x %9.2f p/s %8.1f Kbps ", _pid, pidt[_pid] * 1000. / diff, pidt[_pid] * 1000. / diff * 8 * 188 / 1024); if (pidt[_pid] * 188 / 1024) printf("%8llu KB\n", pidt[_pid] * 188 / 1024); else printf(" %8llu B\n", pidt[_pid] * 188); } } /* 0x2000 is the total traffic */ printf("TOT %10.2f p/s %8.1f Kbps %8llu KB\n", pidt[_pid] * 1000. / diff, pidt[_pid] * 1000. / diff * 8 * 188 / 1024, pidt[_pid] * 188 / 1024); printf("\n\n"); get_show_stats(args, parms, 0); wait += 1000; } } } close(dvr_fd); close(fd); return 0; }