File:  [DVB] / multiplexer / showts.c
Revision 1.2: download - view: text, annotated - select for diffs
Fri Aug 15 22:54:37 2003 UTC (20 years, 9 months ago) by oskar
Branches: MAIN
CVS tags: HEAD
report continuity counter mismatches

/*
 * tiny debugging tool.
 * when fed with a transport stream to stdin, produces one char
 * per packet to stdout, and a few informative messages to stderr.
 * Upper case letters denote a continuity counter mismatch.
 *
 * Author: Jacob Schroeder (jacob@convergence.de)
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#define MAXPID 0x1fff

int main (int argc, char **argv)
{

  int           pids[MAXPID+1];
  int           ccs[MAXPID+1];
  int           pid_count = 0;
  int           i;
      int count = 0;

  for (i = 0; i <= MAXPID; i++)
    {
      pids[i] = -1;
      ccs[i] = -1;
    }

  while (1)
    {
      unsigned char buffer[188];
      int           bytes_read;

      int n;


      bytes_read = 0;

      do 
        {
          n = read (0, buffer + bytes_read, sizeof (buffer) - bytes_read);

          if (n < 0)
            {
              perror ("read");
              exit (1);
            }

          bytes_read += n;
        }
      while (bytes_read < sizeof (buffer) && n > 0);

      if (n == 0)
        {
          if (bytes_read && bytes_read < sizeof (buffer))
            {
              fprintf (stderr, "incomplete ts packet read, size = %d\n", bytes_read);
            }
          exit (0);
        }

      // printf ("%02x%02x%02x%02x\n", buffer[0], buffer[1], buffer[2], buffer[3]);
      {
        int   sync;
        int   pid;
        int   cc;
        int   ccok;

        char  outbuf[1];

        int   pidtype;

        sync = buffer[0];
        pid  = ((buffer[1] & 0x1f) << 8) | buffer[2];
        cc   = buffer[3] & 0x0f;

        // fprintf (stderr, "pid = 0x%04x, cc = 0x%x\n", pid, cc);

        if (sync != 0x47)
          {
            // TODO, skip to next package
            write (1, "#", 1);
          }
        else
          {
            pidtype = pids[pid];

            if (pidtype == -1)
              {
                if (pid == 0)
                  {
                    fprintf (stderr, "# =  pid 0x0000 (PAT)\n");
                    pidtype = pids[pid] = 0;
                  }
                else if (pid == 0x1fff)
                  {
                    fprintf (stderr, "\" '  pid 0x1fff (invalid)\n");
                    pidtype = pids[pid] = 0;
                  }
                else
                  {
                    if (pid_count < 26)
                      pid_count++;

                    pidtype = pids[pid] = pid_count;
                    fprintf (stderr, "%c %c  pid 0x%04x\n", 
                             0x40 + pidtype, 0x60 + pidtype,  pid);
                  }
                ccok = 1;
              }
            else
              {
                ccok = ccs[pid] == cc ? 1 : 0;
              }

            if (pid == 0)
              outbuf[0] = ccok ? '=' : '#';
            else if (pid == 0x1fff)
              outbuf[0] = ccok ? '\'' : '"';
            else
              outbuf[0] = 0x40 + pidtype + (ccok ? 0x20 : 0);

            ccs[pid] = (cc + 1) & 0x0F;
                
            write (1, outbuf, 1);
          }

        count++;
        if ((count % 64) == 0)
          write (1, "\n", 1);
      }
    }
}

LinuxTV legacy CVS <linuxtv.org/cvs>