Ejemplo n.º 1
0
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;
    }
}
Ejemplo n.º 2
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;
}