int main(int argn, char *args[]) { int ii = 1; int verbose = FALSE; int invert = 0; unsigned int max_pkts = (unsigned int)-1; const char *input_file = NULL, *output_file = NULL; if (argn < 2) { print_usage(); return 0; } ensurePidList(1024); while (ii < argn) { if (args[ii][0] == '-') { if (!strcmp("--help", args[ii]) || !strcmp("-h", args[ii]) || !strcmp("-help", args[ii])) { print_usage(); return 0; } else if (!strcmp("-verbose", args[ii]) || !strcmp("-v", args[ii])) { verbose = TRUE; } else if (!strcmp("-m", args[ii]) || !strcmp("-max", args[ii])) { if (argn <= ii) { fprint_err("### tsfilter: -max requires an argument\n"); return 1; } max_pkts = atoi(args[ii+1]); ++ii; } else if (!strcmp("-!", args[ii]) || !strcmp("-invert", args[ii])) { invert = 1; } else if (!strcmp("-i", args[ii]) || !strcmp("-input", args[ii])) { if (argn <= ii) { fprint_err("### tsfilter: -input requires an argument\n"); return 1; } input_file = args[ii+1]; ++ii; } else if (!strcmp("-o", args[ii]) || !strcmp("-output", args[ii])) { if (argn <= ii) { fprint_err("### tsfilter: -output requires an argument\n"); return 1; } output_file = args[ii+1]; ++ii; } else { fprint_err("### tsfilter: " "Unrecognised command line switch '%s'\n", args[ii]); return 1; } } else { char *p = NULL; // It's a pid. if (pidListUsed >= pidListAlloc) { ensurePidList(pidListAlloc + 1024); } pidList[pidListUsed] = strtoul(args[ii], &p, 0); if (!(p && *p == '\0')) { fprint_err("### tsfilter: '%s' wasn't a valid number. \n", args[ii]); return 1; } ++pidListUsed; } ++ii; } if (!pidListUsed) { fprint_err("### tsfilter: No pids to filter. \n"); return 1; } // Now .. { int err; TS_reader_p tsreader; TS_writer_p tswriter; byte *pkt = NULL; unsigned int pid, pkt_num; int pusi, adapt_len, payload_len; byte *adapt, *payload; pkt_num = 0; err = open_file_for_TS_read((char *)input_file, &tsreader); if (err) { fprint_err("## tsfilter: Unable to open stdin for reading TS.\n"); return 1; } if (output_file) { err = tswrite_open(TS_W_FILE, (char *)output_file, NULL, 0, 1, &tswriter); } else { err = tswrite_open(TS_W_STDOUT, NULL, NULL, 0, 1, &tswriter); } if (err) { fprint_err("## tsfilter: Unable to open stdout for writing TS. \n"); return 1; } while (1) { err = read_next_TS_packet(tsreader, &pkt); if (err == EOF) { /* We're done */ break; } err = split_TS_packet(pkt, &pid, &pusi, &adapt, &adapt_len, &payload, &payload_len); if (err) { fprint_err("### Error splitting TS packet - continuing. \n"); } else { int i; int found = 0; for (i = 0 ;i < pidListUsed; ++i) { if (pid == pidList[i]) { ++found; // Yes! break; } } if (max_pkts != (unsigned int)-1 && pkt_num > max_pkts) { // We're done processing. If invert is on, // copy the rest of the output, otherwise quit. if (!invert) { break; } else { found = 0; } } // Invert the result, whatever it was. if (invert) { found = !found; } if (found) { // Write it out. err = tswrite_write(tswriter, pkt, pid, 0, 0); if (err) { fprint_err("### Error writing output - %d \n", err); return 2; } } ++pkt_num; } } // It's the end! tswrite_close(tswriter, 1); close_TS_reader(&tsreader); return 0; } }
int main(int argc, char **argv) { int use_stdin = FALSE; char *input_name = NULL; int had_input_name = FALSE; TS_reader_p tsreader = NULL; int max = 0; // The maximum number of TS packets to read (or 0) int verbose = FALSE; // True => output diagnostic/progress messages int quiet = FALSE; int report_timing = FALSE; int report_buffering = FALSE; int show_data = FALSE; char *output_name = NULL; uint32_t continuity_cnt_pid = INVALID_PID; uint64_t report_mask = ~0; // report as many bits as we get int select_pid = FALSE; uint32_t just_pid = 0; int err = 0; int ii = 1; if (argc < 2) { print_usage(); return 0; } while (ii < argc) { if (argv[ii][0] == '-') { if (!strcmp("--help",argv[ii]) || !strcmp("-h",argv[ii]) || !strcmp("-help",argv[ii])) { print_usage(); return 0; } else if (!strcmp("-verbose",argv[ii]) || !strcmp("-v",argv[ii])) { verbose = TRUE; quiet = FALSE; } else if (!strcmp("-timing",argv[ii]) || !strcmp("-t",argv[ii])) { report_timing = TRUE; quiet = FALSE; } else if (!strcmp("-buffering",argv[ii]) || !strcmp("-b",argv[ii])) { report_buffering = TRUE; quiet = FALSE; } else if (!strcmp("-o",argv[ii])) { output_name = argv[ii+1]; ii ++; } else if (!strcmp("-cnt",argv[ii])) { err = unsigned_value("tsreport",argv[ii],argv[ii+1],10,&continuity_cnt_pid); if (err) return 1; printf("Reporting on continuity_counter for pid = %04x (%u)\n", continuity_cnt_pid,continuity_cnt_pid); report_buffering = TRUE; quiet = FALSE; ii ++; } else if (!strcmp("-data",argv[ii])) { show_data = TRUE; quiet = FALSE; } else if (!strcmp("-32",argv[ii])) { report_mask = 0xFFFFFFFF; // i.e., bottom 32 bits only } else if (!strcmp("-tfmt",argv[ii])) { CHECKARG("tsreport",ii); if ((tfmt_diff = fmtx_str_to_timestamp_flags(argv[ii + 1])) < 0) { printf("### tsreport: Bad timestamp format '%s'\n",argv[ii+1]); return 1; } ii++; } else if (!strcmp("-tafmt",argv[ii])) { CHECKARG("tsreport",ii); if ((tfmt_abs = fmtx_str_to_timestamp_flags(argv[ii + 1])) < 0) { printf("### tsreport: Bad timestamp format '%s'\n",argv[ii+1]); return 1; } ii++; } else if (!strcmp("-justpid",argv[ii])) { CHECKARG("tsreport",ii); err = unsigned_value("tsreport",argv[ii],argv[ii+1],0,&just_pid); if (err) return 1; select_pid = TRUE; ii++; } else if (!strcmp("-quiet",argv[ii]) || !strcmp("-q",argv[ii])) { verbose = FALSE; quiet = TRUE; } else if (!strcmp("-max",argv[ii]) || !strcmp("-m",argv[ii])) { CHECKARG("tsreport",ii); err = int_value("tsreport",argv[ii],argv[ii+1],TRUE,10,&max); if (err) return 1; ii++; } else if (!strcmp("-stdin",argv[ii])) { use_stdin = TRUE; had_input_name = TRUE; // so to speak } else { fprintf(stderr,"### tsreport: " "Unrecognised command line switch '%s'\n",argv[ii]); return 1; } } else { if (had_input_name) { fprintf(stderr,"### tsreport: Unexpected '%s'\n",argv[ii]); return 1; } else { input_name = argv[ii]; had_input_name = TRUE; } } ii++; } if (!had_input_name) { fprintf(stderr,"### tsreport: No input file specified\n"); return 1; } err = open_file_for_TS_read((use_stdin?NULL:input_name),&tsreader); if (err) { fprintf(stderr, "### tsreport: Unable to open input file %s for reading TS\n", use_stdin?"<stdin>":input_name); return 1; } printf("Reading from %s\n",(use_stdin?"<stdin>":input_name)); if (max) printf("Stopping after %d TS packets\n",max); if (select_pid) err = report_single_pid(tsreader,max,quiet,just_pid); else if (report_buffering) err = report_buffering_stats(tsreader,max,verbose,quiet, output_name,continuity_cnt_pid,report_mask); else err = report_ts(tsreader,max,verbose,show_data,report_timing); if (err) { fprintf(stderr,"### tsreport: Error reporting on input stream\n"); (void) close_TS_reader(&tsreader); return 1; } err = close_TS_reader(&tsreader); if (err) return 1; return 0; }