From: Janne Grunau <j@jannau.net>
To: linux-media@vger.kernel.org
Subject: [PATCH 5 of 7] czap: implement -p option to record PAT & PMT (PSI)
Date: Wed, 10 Feb 2010 19:37:10 +0100 [thread overview]
Message-ID: <20100210183710.GP8026@aniel.lan> (raw)
In-Reply-To: <patchbomb.1265826616@aniel.lan>
[-- Attachment #1: Type: text/plain, Size: 127 bytes --]
util/szap/czap.c | 48 ++++++++++++++++++++++++++++++++++++++----------
1 files changed, 38 insertions(+), 10 deletions(-)
[-- Attachment #2: dvb-apps-5.patch --]
[-- Type: text/x-patch, Size: 3902 bytes --]
# HG changeset patch
# User Janne Grunau <j@jannau.net>
# Date 1265820428 -3600
# Node ID c46ead95be23c07b1c95329c713b4dfc649fd67d
# Parent 0163e837905411bb9932bb65fecde5735e5bd7e9
czap: implement -p option to record PAT & PMT (PSI)
diff -r 0163e8379054 -r c46ead95be23 util/szap/czap.c
--- a/util/szap/czap.c Wed Feb 10 18:43:05 2010 +0100
+++ b/util/szap/czap.c Wed Feb 10 17:47:08 2010 +0100
@@ -120,7 +120,7 @@
int parse(const char *fname, int list_channels, int chan_no, const char *channel,
- struct dvb_frontend_parameters *frontend, int *vpid, int *apid)
+ struct dvb_frontend_parameters *frontend, int *vpid, int *apid, int *sid)
{
FILE *f;
char *chan;
@@ -143,10 +143,10 @@
}
printf("%3d %s", chan_no, chan);
- if ((sscanf(chan, "%m[^:]:%d:%m[^:]:%d:%m[^:]:%m[^:]:%d:%d\n",
+ if ((sscanf(chan, "%m[^:]:%d:%m[^:]:%d:%m[^:]:%m[^:]:%d:%d:%d\n",
&name, &frontend->frequency,
&inv, &frontend->u.qam.symbol_rate,
- &fec, &mod, vpid, apid) != 8)
+ &fec, &mod, vpid, apid, sid) != 9)
|| !name || !inv || !fec | !mod) {
ERROR("cannot parse service data");
return -3;
@@ -167,10 +167,10 @@
ERROR("modulation field syntax '%s'", mod);
return -6;
}
- printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x\n",
+ printf("%3d %s: f %d, s %d, i %d, fec %d, qam %d, v %#x, a %#x, s %#x \n",
chan_no, name, frontend->frequency, frontend->u.qam.symbol_rate,
frontend->inversion, frontend->u.qam.fec_inner,
- frontend->u.qam.modulation, *vpid, *apid);
+ frontend->u.qam.modulation, *vpid, *apid, *sid);
free(name);
free(inv);
free(fec);
@@ -253,6 +253,7 @@
" -x : exit after tuning\n"
" -H : human readable output\n"
" -r : set up /dev/dvb/adapterX/dvr0 for TS recording\n"
+ " -p : add pat and pmt to TS recording (implies -r)\n"
;
int main(int argc, char **argv)
@@ -262,12 +263,12 @@
char *confname = NULL;
char *channel = NULL;
int adapter = 0, frontend = 0, demux = 0, dvr = 0;
- int vpid, apid;
- int frontend_fd, video_fd, audio_fd;
+ int vpid, apid, sid, pmtpid = 0;
+ int frontend_fd, video_fd, audio_fd, pat_fd, pmt_fd;
int opt, list_channels = 0, chan_no = 0;
- int human_readable = 0;
+ int human_readable = 0, rec_psi = 0;
- while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x")) != -1) {
+ while ((opt = getopt(argc, argv, "Hln:hrn:a:f:d:c:x:p")) != -1) {
switch (opt) {
case 'a':
adapter = strtoul(optarg, NULL, 0);
@@ -287,6 +288,9 @@
case 'n':
chan_no = strtoul(optarg, NULL, 0);
break;
+ case 'p':
+ rec_psi = 1;
+ break;
case 'x':
exit_after_tuning = 1;
break;
@@ -339,7 +343,7 @@
memset(&frontend_param, 0, sizeof(struct dvb_frontend_parameters));
- if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid))
+ if (parse(confname, list_channels, chan_no, channel, &frontend_param, &vpid, &apid, &sid))
return -1;
if (list_channels)
return 0;
@@ -352,6 +356,28 @@
if (setup_frontend(frontend_fd, &frontend_param) < 0)
return -1;
+ if (rec_psi) {
+ pmtpid = get_pmt_pid(DEMUX_DEV, sid);
+ if (pmtpid <= 0) {
+ fprintf(stderr,"couldn't find pmt-pid for sid %04x\n",sid);
+ return -1;
+ }
+
+ if ((pat_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pat demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pat_fd, 0, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+
+ if ((pmt_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
+ perror("opening pmt demux failed");
+ return -1;
+ }
+ if (set_pesfilter(pmt_fd, pmtpid, DMX_PES_OTHER, dvr) < 0)
+ return -1;
+ }
+
if ((video_fd = open(DEMUX_DEV, O_RDWR)) < 0) {
PERROR("failed opening '%s'", DEMUX_DEV);
return -1;
@@ -370,6 +396,8 @@
check_frontend (frontend_fd, human_readable);
+ close (pat_fd);
+ close (pmt_fd);
close (audio_fd);
close (video_fd);
close (frontend_fd);
next prev parent reply other threads:[~2010-02-10 18:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <patchbomb.1265826616@aniel.lan>
2010-02-10 18:36 ` [PATCH 1 of 7] szap: move duplicate function set_pesfilter|demux to a common object Janne Grunau
2010-02-10 18:36 ` [PATCH 2 of 7] szap: move get_pmt_pid() to utils.c Janne Grunau
2010-02-10 18:36 ` [PATCH 3 of 7] czap: reformat and extend usage string Janne Grunau
2010-02-10 18:37 ` [PATCH 4 of 7] czap: use %m modifier in sscanf instead of %a Janne Grunau
2010-02-10 18:37 ` Janne Grunau [this message]
2010-02-10 18:37 ` [PATCH 6 of 7] tzap: implement recording program and service information with -p Janne Grunau
2010-02-10 18:37 ` [PATCH 7 of 7] azap: implement record " Janne Grunau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100210183710.GP8026@aniel.lan \
--to=j@jannau.net \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.