コード例 #1
0
ファイル: psdots.c プロジェクト: OpenQCam/qcam
int main(int argc, char **argv)
{
  int    use_stdin = FALSE;
  char  *input_name = NULL;
  int    had_input_name = FALSE;

  PS_reader_p  ps;        // The PS file we're reading
  int    max     = 0;     // The maximum number of PS packets to read (or 0)
  int    verbose = FALSE; // True => output diagnostic/progress messages

  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("-err",argv[ii]))
      {
        CHECKARG("psdots",ii);
        if (!strcmp(argv[ii+1],"stderr"))
          redirect_output_stderr();
        else if (!strcmp(argv[ii+1],"stdout"))
          redirect_output_stdout();
        else
        {
          fprint_err("### psdots: "
                     "Unrecognised option '%s' to -err (not 'stdout' or"
                     " 'stderr')\n",argv[ii+1]);
          return 1;
        }
        ii++;
      }
      else if (!strcmp("-verbose",argv[ii]) || !strcmp("-v",argv[ii]))
      {
        verbose = TRUE;
      }
      else if (!strcmp("-max",argv[ii]) || !strcmp("-m",argv[ii]))
      {
        CHECKARG("psdots",ii);
        err = int_value("psdots",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
      {
        fprint_err("### psdots: "
                   "Unrecognised command line switch '%s'\n",argv[ii]);
        return 1;
      }
    }
    else
    {
      if (had_input_name)
      {
        fprint_err("### psdots: Unexpected '%s'\n",argv[ii]);
        return 1;
      }
      else
      {
        input_name = argv[ii];
        had_input_name = TRUE;
      }
    }
    ii++;
  }

  if (!had_input_name)
  {
    print_err("### psdots: No input file specified\n");
    return 1;
  }


  err = open_PS_file(input_name,FALSE,&ps);
  if (err)
  {
    fprint_err("### psdots: Unable to open input file %s\n",
               (use_stdin?"<stdin>":input_name));
    return 1;
  }
  fprint_msg("Reading from %s\n",(use_stdin?"<stdin>":input_name));

  if (max)
    fprint_msg("Stopping after %d PS packets\n",max);

  err = report_ps_dots(ps,max,verbose);
  if (err)
    print_err("### psdots: Error reporting on input stream\n");


  err = close_PS_file(&ps);
  if (err)
  {
    fprint_err("### psdots: Error closing input file %s\n",
               (use_stdin?"<stdin>":input_name));
    return 1;
  }
  return 0;
}
コード例 #2
0
ファイル: esmerge.c プロジェクト: OpenQCam/qcam
int main(int argc, char **argv)
{
  int    had_video_name = FALSE;
  int    had_audio_name = FALSE;
  int    had_output_name = FALSE;
  char  *video_name = NULL;
  char  *audio_name = NULL;
  char  *output_name = NULL;
  int    err = 0;
  ES_p   video_es = NULL;
  access_unit_context_p h264_video_context = NULL;
  avs_context_p avs_video_context = NULL;
  int    audio_file = -1;
  TS_writer_p output1 = NULL;
//  TS_writer_p output2 = NULL;
  int    quiet = FALSE;
  int    verbose = FALSE;
  int    debugging = FALSE;
  int    audio_samples_per_frame = ADTS_SAMPLES_PER_FRAME;
  int    audio_sample_rate = CD_RATE;
  int    video_frame_rate = DEFAULT_VIDEO_FRAME_RATE;
  int    audio_type = AUDIO_ADTS;
  int    video_type = VIDEO_H264;
  int    pat_pmt_freq = 0;
  int    ii = 1;

#if TEST_PTS_DTS
  test_pts();
  return 0;
#endif

  if (argc < 2)
  {
    print_usage();
    return 0;
  }

  while (ii < argc)
  {
    if (argv[ii][0] == '-')
    {
      if (!strcmp("--help",argv[ii]) || !strcmp("-help",argv[ii]) ||
          !strcmp("-h",argv[ii]))
      {
        print_usage();
        return 0;
      }
      else if (!strcmp("-err",argv[ii]))
      {
        CHECKARG("esmerge",ii);
        if (!strcmp(argv[ii+1],"stderr"))
          redirect_output_stderr();
        else if (!strcmp(argv[ii+1],"stdout"))
          redirect_output_stdout();
        else
        {
          fprint_err("### esmerge: "
                     "Unrecognised option '%s' to -err (not 'stdout' or"
                     " 'stderr')\n",argv[ii+1]);
          return 1;
        }
        ii++;
      }
      else if (!strcmp("-verbose",argv[ii]) || !strcmp("-v",argv[ii]))
      {
        verbose = TRUE;
      }
      else if (!strcmp("-quiet",argv[ii]) || !strcmp("-q",argv[ii]))
      {
        quiet = TRUE;
      }
      else if (!strcmp("-x",argv[ii]))
      {
        debugging = TRUE;
        quiet = FALSE;
      }
      else if (!strcmp("-rate",argv[ii]))
      {
        CHECKARG("esmerge",ii);
        err = int_value("esmerge",argv[ii],argv[ii+1],TRUE,10,&audio_sample_rate);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-cd",argv[ii]))
      {
        audio_sample_rate = CD_RATE;
      }
      else if (!strcmp("-dat",argv[ii]))
      {
        audio_sample_rate = DAT_RATE;
      }
      else if (!strcmp("-vidrate",argv[ii]))
      {
        CHECKARG("esmerge",ii);
        err = int_value("esmerge",argv[ii],argv[ii+1],TRUE,10,&video_frame_rate);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-adts",argv[ii]))
      {
        audio_type = AUDIO_ADTS;
      }
      else if (!strcmp("-l2",argv[ii]))
      {
        audio_type = AUDIO_L2;
      }
      else if (!strcmp("-ac3", argv[ii]))
      {
        audio_type = AUDIO_AC3;
      }
      else if (!strcmp("-h264",argv[ii]))
      {
        video_type = VIDEO_H264;
      }
      else if (!strcmp("-mp2adts", argv[ii]))
      {
        audio_type = AUDIO_ADTS_MPEG2;
      }
      else if (!strcmp("-mp4adts", argv[ii]))
      {
        audio_type = AUDIO_ADTS_MPEG4;
      }
      else if (!strcmp("-avs",argv[ii]))
      {
        video_type = VIDEO_AVS;
      }
      else if (!strcmp("-patpmtfreq", argv[ii]))
      {
        CHECKARG("esmerge",ii);
        err = int_value("esmerge", argv[ii], argv[ii+1], TRUE, 10, &pat_pmt_freq);
        if (err) { return 1; }
        ++ii;
      }
      else
      {
        fprint_err("### esmerge: "
                   "Unrecognised command line switch '%s'\n",argv[ii]);
        return 1;
      }
    }
    else
    {
      if (!had_video_name)
      {
        video_name = argv[ii];
        had_video_name = TRUE;
      }
      else if (!had_audio_name)
      {
        audio_name = argv[ii];
        printf("got audio name 123 %s\n",audio_name);
        had_audio_name = TRUE;
      }
      else if (!had_output_name)
      {
        output_name = argv[ii];
        had_output_name = TRUE;
      }
      else
      {
        fprint_err("### esmerge: Unexpected '%s'\n",argv[ii]);
        return 1;
      }
    }
    ii++;
  }

  if (!had_video_name)
  {
    print_err("### esmerge: No video input file specified\n");
    return 1;
  }
 /*
  if (!had_audio_name)
  {
    print_err("### esmerge: No audio input file specified\n");
    return 1;
  }*/
  if (!had_output_name)
  {
    print_err("### esmerge: No output file specified\n");
    return 1;
  }
  char output_name1[255];
  char output_name2[255];
  strcpy(output_name1, output_name);
  strcpy(output_name2, output_name);
  int num1=atoi(audio_name);
  char fileSerial1[20];
  char fileSerial2[20];
  sprintf(fileSerial1,"%d.ts", num1);
  sprintf(fileSerial2,"%d.te", num1);
  strcat(output_name1,fileSerial1);
  strcat(output_name2,fileSerial2);
  uint32_t timeElapsed=0;

  err = open_elementary_stream(video_name,&video_es);
  if (err)
  {
    print_err("### esmerge: "
              "Problem starting to read video as ES - abandoning reading\n");
    return 1;
  }

  if (video_type == VIDEO_H264)
  {
    err = build_access_unit_context(video_es,&h264_video_context);
    if (err)
    {
      print_err("### esmerge: "
                "Problem starting to read video as H.264 - abandoning reading\n");
      close_elementary_stream(&video_es);
      return 1;
    }
  }
  else if (video_type == VIDEO_AVS)
  {
    err = build_avs_context(video_es,&avs_video_context);
    if (err)
    {
      print_err("### esmerge: "
                "Problem starting to read video as H.264 - abandoning reading\n");
      close_elementary_stream(&video_es);
      return 1;
    }
  }
  else
  {
    print_err("### esmerge: Unknown video type\n");
    return 1;
  }

  /*
  audio_file = open_binary_file(audio_name,FALSE);
  if (audio_file == -1)
  {
    print_err("### esmerge: "
              "Problem opening audio file - abandoning reading\n");
    close_elementary_stream(&video_es);
    free_access_unit_context(&h264_video_context);
    free_avs_context(&avs_video_context);
    return 1;
  }*/

  err = tswrite_open(TS_W_FILE,output_name1,NULL,0,quiet,&output1);
  //err = tswrite_open(TS_W_FILE,output_name2,NULL,0,quiet,&output2);
  if (err)
  {
    fprint_err("### esmerge: "
               "Problem opening output file %s - abandoning reading\n",
               output_name);
    close_elementary_stream(&video_es);
    close_file(audio_file);
    free_access_unit_context(&h264_video_context);
    free_avs_context(&avs_video_context);
    return 1;
  }

/*  switch (audio_type)
  {
  case AUDIO_ADTS:
    audio_samples_per_frame = ADTS_SAMPLES_PER_FRAME;
    break;
  case AUDIO_L2:
    audio_samples_per_frame = L2_SAMPLES_PER_FRAME;
    break;
  case AUDIO_AC3:
    audio_samples_per_frame = AC3_SAMPLES_PER_FRAME;
    break;
  default:              // hmm - or we could give up...
    audio_samples_per_frame = ADTS_SAMPLES_PER_FRAME;
    break;
  }
*/
  if (!quiet)
  {
    fprint_msg("Reading video from %s\n",video_name);
    fprint_msg("Reading audio from %s (as %s)\n",audio_name,AUDIO_STR(audio_type));
    fprint_msg("Writing output to  %s\n",output_name);
    fprint_msg("Audio sample rate: %dHz (%.2fKHz)\n",audio_sample_rate,
               audio_sample_rate/1000.0);
    fprint_msg("Audio samples per frame: %d\n",audio_samples_per_frame);
    fprint_msg("Video frame rate: %dHz\n",video_frame_rate);
  }


  if (video_type == VIDEO_H264)
    err = merge_with_h264(h264_video_context,audio_file,output1,//output2,
                          audio_type,
                          audio_samples_per_frame,audio_sample_rate,
                          video_frame_rate,
                          pat_pmt_freq,
                          quiet,verbose,debugging,num1, &timeElapsed);
  else if (video_type == VIDEO_AVS)
    printf("disable");
    /*err = merge_with_avs(avs_video_context,audio_file,output,
                         audio_type,
                         audio_samples_per_frame,audio_sample_rate,
                         video_frame_rate,
                         pat_pmt_freq,
                         quiet,verbose,debugging);*/
  else
  {
    print_err("### esmerge: Unknown video type\n");
    return 1;
  }
  if (err)
  {
    print_err("### esmerge: Error merging video and audio streams\n");
    close_elementary_stream(&video_es);
    close_file(audio_file);
    free_access_unit_context(&h264_video_context);
    free_avs_context(&avs_video_context);
    (void) tswrite_close(output1,quiet);
    //(void) tswrite_close(output2,quiet);
    return 1;
  }

  FILE *pFileLen = fopen (output_name2,"w");
  fprintf(pFileLen, "%.2f", timeElapsed/100.0);
  fclose(pFileLen);

  close_elementary_stream(&video_es);
  close_file(audio_file);
  free_access_unit_context(&h264_video_context);
  free_avs_context(&avs_video_context);
  err = tswrite_close(output1,quiet);
  //err = tswrite_close(output2,quiet);
  if (err)
  {
    fprint_err("### esmerge: Error closing output %s\n",output_name);
    return 1;
  }
  return 0;
}
コード例 #3
0
ファイル: ts2es.c プロジェクト: BackupTheBerlios/tstools-svn
int main(int argc, char **argv)
{
    int    use_stdout = FALSE;
    int    use_stdin = FALSE;
    char  *input_name = NULL;
    char  *output_name = NULL;
    int    had_input_name = FALSE;
    int    had_output_name = FALSE;
    char  *action_switch = "None";

    EXTRACT   extract = EXTRACT_VIDEO; // What we're meant to extract
    int       input   = -1;    // Our input file descriptor
    FILE     *output  = NULL;  // The stream we're writing to (if any)
    int       max     = 0;     // The maximum number of TS packets to read (or 0)
    uint32_t  pid     = 0;     // The PID of the (single) stream to extract
    int       quiet   = FALSE; // True => be as quiet as possible
    int       verbose = FALSE; // True => output diagnostic/progress messages
    int       use_pes = FALSE;

    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("-quiet",argv[ii]) || !strcmp("-q",argv[ii]))
            {
                verbose = FALSE;
                quiet = TRUE;
            }
            else if (!strcmp("-max",argv[ii]) || !strcmp("-m",argv[ii]))
            {
                CHECKARG("ts2es",ii);
                err = int_value("ts2es",argv[ii],argv[ii+1],TRUE,10,&max);
                if (err) return 1;
                ii++;
            }
            else if (!strcmp("-pes",argv[ii]) || !strcmp("-ps",argv[ii]))
            {
                use_pes = TRUE;
            }
            else if (!strcmp("-pid",argv[ii]))
            {
                CHECKARG("ts2es",ii);
                err = unsigned_value("ts2es",argv[ii],argv[ii+1],0,&pid);
                if (err) return 1;
                ii++;
                extract = EXTRACT_PID;
            }
            else if (!strcmp("-video",argv[ii]))
            {
                extract = EXTRACT_VIDEO;
            }
            else if (!strcmp("-audio",argv[ii]))
            {
                extract = EXTRACT_AUDIO;
            }
            else if (!strcmp("-stdin",argv[ii]))
            {
                use_stdin = TRUE;
                had_input_name = TRUE;  // so to speak
            }
            else if (!strcmp("-stdout",argv[ii]))
            {
                use_stdout = TRUE;
                had_output_name = TRUE;  // so to speak
                redirect_output_stderr();
            }
            else if (!strcmp("-err",argv[ii]))
            {
                CHECKARG("ts2es",ii);
                if (!strcmp(argv[ii+1],"stderr"))
                    redirect_output_stderr();
                else if (!strcmp(argv[ii+1],"stdout"))
                    redirect_output_stdout();
                else
                {
                    fprint_err("### ts2es: "
                               "Unrecognised option '%s' to -err (not 'stdout' or"
                               " 'stderr')\n",argv[ii+1]);
                    return 1;
                }
                ii++;
            }
            else
            {
                fprint_err("### ts2es: "
                           "Unrecognised command line switch '%s'\n",argv[ii]);
                return 1;
            }
        }
        else
        {
            if (had_input_name && had_output_name)
            {
                fprint_err("### ts2es: Unexpected '%s'\n",argv[ii]);
                return 1;
            }
            else if (had_input_name)  // shouldn't do this if had -stdout
            {
                output_name = argv[ii];
                had_output_name = TRUE;
            }
            else
            {
                input_name = argv[ii];
                had_input_name = TRUE;
            }
        }
        ii++;
    }

    if (!had_input_name)
    {
        print_err("### ts2es: No input file specified\n");
        return 1;
    }

    if (!had_output_name)
    {
        fprint_err("### ts2es: "
                   "No output file specified for %s\n",action_switch);
        return 1;
    }

    // ============================================================
    // Testing PES output
    if (use_pes && extract == EXTRACT_PID)
    {
        print_err("### ts2es: -pid is not supported with -pes\n");
        return 1;
    }
    if (use_pes && use_stdout)
    {
        print_err("### ts2es: -stdout is not supported with -pes\n");
        return 1;
    }
    if (use_pes && use_stdin)
    {
        print_err("### ts2es: -stdin is not supported with -pes\n");
        return 1;
    }
    if (use_pes)
    {
        err = extract_av_via_pes(input_name,output_name,(extract==EXTRACT_VIDEO),
                                 quiet);
        if (err)
        {
            print_err("### ts2es: Error writing via PES\n");
            return 1;
        }
        return 0;
    }
    // ============================================================

    // Try to stop extraneous data ending up in our output stream
    if (use_stdout)
    {
        verbose = FALSE;
        quiet = TRUE;
    }

    if (use_stdin)
        input = STDIN_FILENO;
    else
    {
        input = open_binary_file(input_name,FALSE);
        if (input == -1)
        {
            fprint_err("### ts2es: Unable to open input file %s\n",input_name);
            return 1;
        }
    }
    if (!quiet)
        fprint_msg("Reading from %s\n",(use_stdin?"<stdin>":input_name));

    if (had_output_name)
    {
        if (use_stdout)
            output = stdout;
        else
        {
            output = fopen(output_name,"wb");
            if (output == NULL)
            {
                if (!use_stdin) (void) close_file(input);
                fprint_err("### ts2es: "
                           "Unable to open output file %s: %s\n",output_name,
                           strerror(errno));
                return 1;
            }
        }
        if (!quiet)
            fprint_msg("Writing to   %s\n",(use_stdout?"<stdout>":output_name));
    }

    if (!quiet)
    {
        if (extract == EXTRACT_PID)
            fprint_msg("Extracting packets for PID %04x (%d)\n",pid,pid);
        else
            fprint_msg("Extracting %s\n",(extract==EXTRACT_VIDEO?"video":"audio"));
    }

    if (max && !quiet)
        fprint_msg("Stopping after %d TS packets\n",max);

    if (extract == EXTRACT_PID)
        err = extract_pid(input,output,pid,max,verbose,quiet);
    else
        err = extract_av(input,output,(extract==EXTRACT_VIDEO),
                         max,verbose,quiet);
    if (err)
    {
        print_err("### ts2es: Error extracting data\n");
        if (!use_stdin)  (void) close_file(input);
        if (!use_stdout) (void) fclose(output);
        return 1;
    }

    // And tidy up when we're finished
    if (!use_stdout)
    {
        errno = 0;
        err = fclose(output);
        if (err)
        {
            fprint_err("### ts2es: Error closing output file %s: %s\n",
                       output_name,strerror(errno));
            (void) close_file(input);
            return 1;
        }
    }
    if (!use_stdin)
    {
        err = close_file(input);
        if (err)
            fprint_err("### ts2es: Error closing input file %s\n",input_name);
    }
    return 0;
}
コード例 #4
0
ファイル: ps2ts.c プロジェクト: OpenQCam/qcam
int main(int argc, char **argv)
{
  int     use_stdin = FALSE;
  int     use_stdout = FALSE;
  int     use_tcpip = FALSE;
  int     port = 88; // Useful default port number
  char   *input_name = NULL;
  char   *output_name = NULL;
  int     had_input_name = FALSE;
  int     had_output_name = FALSE;
  PS_reader_p ps = NULL;
  TS_writer_p output = NULL;
  int     verbose = FALSE;
  int     quiet = FALSE;
  int     max = 0;
  uint32_t pmt_pid = 0x66;
  uint32_t video_pid = 0x68;
  uint32_t pcr_pid = video_pid;  // Use PCRs from the video stream
  uint32_t audio_pid = 0x67;
  int     keep_audio = TRUE;
  int     repeat_program_every = 100;
  int     pad_start = 8;
  int     err = 0;
  int     ii = 1;

  int     video_type = VIDEO_H262;  // hopefully a sensible default
  int     force_stream_type = FALSE;

  int     video_stream = -1;
  int     audio_stream = -1;
  int     want_ac3_audio = FALSE;

  int     input_is_dvd = TRUE;
  int     want_dolby_as_dvb = TRUE;

  if (argc < 2)
  {
    print_usage();
    return 0;
  }

  while (ii < argc)
  {
    if (argv[ii][0] == '-')
    {
      if (!strcmp("--help",argv[ii]) || !strcmp("-help",argv[ii]) ||
          !strcmp("-h",argv[ii]))
      {
        print_usage();
        return 0;
      }
      else if (!strcmp("-avc",argv[ii]) || !strcmp("-h264",argv[ii]))
      {
        force_stream_type = TRUE;
        video_type = VIDEO_H264;
      }
      else if (!strcmp("-h262",argv[ii]))
      {
        force_stream_type = TRUE;
        video_type = VIDEO_H262;
      }
      else if (!strcmp("-vtype",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = int_value("ps2ts",argv[ii],argv[ii+1],TRUE,0,
                        &video_type);
        if (err) return 1;
        ii++;
        force_stream_type = TRUE;
      }
      else if (!strcmp("-mp42",argv[ii]))
      {
        force_stream_type = TRUE;
        video_type = VIDEO_MPEG4_PART2;
      }
      else if (!strcmp("-dolby",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        if (!strcmp("dvb",argv[ii+1]))
          want_dolby_as_dvb = TRUE;
        else if (!strcmp("atsc",argv[ii+1]))
          want_dolby_as_dvb = FALSE;
        else
        {
          print_err("### ps2ts: -dolby must be followed by dvb or atsc\n");
          return 1;
        }
        ii++;
      }
      else if (!strcmp("-stdin",argv[ii]))
      {
        had_input_name = TRUE; // more or less
        use_stdin = TRUE;
      }
      else if (!strcmp("-stdout",argv[ii]))
      {
        had_output_name = TRUE; // more or less
        use_stdout = TRUE;
        redirect_output_stderr();
      }
      else if (!strcmp("-err",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        if (!strcmp(argv[ii+1],"stderr"))
          redirect_output_stderr();
        else if (!strcmp(argv[ii+1],"stdout"))
          redirect_output_stdout();
        else
        {
          fprint_err("### ps2ts: "
                     "Unrecognised option '%s' to -err (not 'stdout' or"
                     " 'stderr')\n",argv[ii+1]);
          return 1;
        }
        ii++;
      }
      else if (!strcmp("-dvd",argv[ii]))
      {
        input_is_dvd = TRUE;
      }
      else if (!strcmp("-notdvd",argv[ii]) || !strcmp("-nodvd",argv[ii]))
      {
        input_is_dvd = FALSE;
      }
      else if (!strcmp("-host",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = host_value("ps2ts",argv[ii],argv[ii+1],&output_name,&port);
        if (err) return 1;
        had_output_name = TRUE; // more or less
        use_tcpip = TRUE;
        ii++;
      }
      else if (!strcmp("-verbose",argv[ii]) || !strcmp("-v",argv[ii]))
      {
        verbose = TRUE;
        quiet = FALSE;
      }
      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("ps2ts",ii);
        err = int_value("ps2ts",argv[ii],argv[ii+1],TRUE,10,&max);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-prepeat",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = int_value("ps2ts",argv[ii],argv[ii+1],TRUE,10,
                        &repeat_program_every);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-pad",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = int_value("ps2ts",argv[ii],argv[ii+1],TRUE,10,&pad_start);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-vpid",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = unsigned_value("ps2ts",argv[ii],argv[ii+1],0,&video_pid);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-apid",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = unsigned_value("ps2ts",argv[ii],argv[ii+1],0,&audio_pid);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-pmt",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = unsigned_value("ps2ts",argv[ii],argv[ii+1],0,&pmt_pid);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-noaudio",argv[ii]))
      {
        keep_audio = FALSE;
      }
      else if (!strcmp("-vstream",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = int_value_in_range("ps2ts",argv[ii],argv[ii+1],0,0xF,0,
                                 &video_stream);
        if (err) return 1;
        ii++;
      }
      else if (!strcmp("-astream",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = int_value_in_range("ps2ts",argv[ii],argv[ii+1],0,0x1F,0,
                                 &audio_stream);
        if (err) return 1;
        want_ac3_audio = FALSE;
        ii++;
      }
      else if (!strcmp("-ac3stream",argv[ii]))
      {
        CHECKARG("ps2ts",ii);
        err = int_value_in_range("ps2ts",argv[ii],argv[ii+1],0,0x7,0,
                                 &audio_stream);
        if (err) return 1;
        want_ac3_audio = TRUE;
        input_is_dvd = TRUE;
        ii++;
      }
      else
      {
        fprint_err("### ps2ts: "
                   "Unrecognised command line switch '%s'\n",argv[ii]);
        return 1;
      }
    }
    else
    {
      if (had_input_name && had_output_name)
      {
        fprint_err("### ps2ts: Unexpected '%s'\n",argv[ii]);
        return 1;
      }
      else if (had_input_name)
      {
        output_name = argv[ii];
        had_output_name = TRUE;
      }
      else
      {
        input_name = argv[ii];
        had_input_name = TRUE;
      }
    }
    ii++;
  }

  if (!had_input_name)
  {
    print_err("### ps2ts: No input file specified\n");
    return 1;
  }
  if (!had_output_name)
  {
    print_err("### ps2ts: No output file specified\n");
    return 1;
  }

  // Try to stop extraneous data ending up in our output stream
  if (use_stdout)
  {
    verbose = FALSE;
    quiet = TRUE;
  }

  err = open_PS_file(input_name,quiet,&ps);
  if (err)
  {
    fprint_err("### ps2ts: Unable to open input %s\n",
               (use_stdin?"<stdin>":input_name));
    return 1;
  }

  if (!quiet)
    fprint_msg("Reading from %s\n",(use_stdin?"<stdin>":input_name));

  // Try to decide what sort of data stream we have
  if (force_stream_type || use_stdin)
  {
    if (!quiet)
      fprint_msg("Reading input as %s (0x%02x)\n",
                 h222_stream_type_str(video_type),video_type);
  }
  else
  {
    err = determine_PS_video_type(ps,&video_type);
    if (err) return 1;
    if (!quiet)
      fprint_msg("Video appears to be %s (0x%02x)\n",
                 h222_stream_type_str(video_type),video_type);
  }

  if (!quiet)
  {
    if (input_is_dvd)
      print_msg("Treating input as from DVD\n");
    else
      print_msg("Treating input as NOT from DVD\n");

    print_msg("Reading video from ");
    if (video_stream == -1)
      print_msg("first stream found");
    else
      fprint_msg("stream %0#x (%d)",video_stream,video_stream);
    if (keep_audio)
    {
      print_msg(", audio from ");
      if (audio_stream == -1)
        fprint_msg("first %s found",(want_ac3_audio?"AC3 stream":"stream"));
      else
        fprint_msg("%s %0#x (%d)",(want_ac3_audio?"AC3 stream":"stream"),
               audio_stream,audio_stream);
      print_msg("\n");
    }

    fprint_msg("Writing video with PID 0x%02x",video_pid);
    if (keep_audio)
      fprint_msg(", audio with PID 0x%02x,",audio_pid);
    fprint_msg(" PMT PID 0x%02x, PCR PID 0x%02x\n",pmt_pid,pcr_pid);
    if (max)
      fprint_msg("Stopping after %d program stream packets\n",max);
  }

  if (use_stdout)
    err = tswrite_open(TS_W_STDOUT,NULL,NULL,0,quiet,&output);
  else if (use_tcpip)
    err = tswrite_open(TS_W_TCP,output_name,NULL,port,quiet,&output);
  else
    err = tswrite_open(TS_W_FILE,output_name,NULL,0,quiet,&output);
  if (err)
  {
    fprint_err("### ps2ts: Unable to open %s\n",output_name);
    (void) close_PS_file(&ps);
    return 1;
  }

  err = ps_to_ts(ps,output,pad_start,repeat_program_every,
                 video_type,input_is_dvd,
                 video_stream,audio_stream,want_ac3_audio,
                 want_dolby_as_dvb,pmt_pid,pcr_pid,video_pid,
                 keep_audio,audio_pid,max,verbose,quiet);
  if (err)
  {
    print_err("### ps2ts: Error transferring data\n");
    (void) close_PS_file(&ps);
    (void) tswrite_close(output,TRUE);
    return 1;
  }

  // And tidy up when we're finished
  err = tswrite_close(output,quiet);
  if (err)
    fprint_err("### ps2ts: Error closing output %s: %s\n",output_name,
            strerror(errno));
  err = close_PS_file(&ps);
  if (err)
    fprint_err("### ps2ts: Error closing input %s\n",
               (use_stdin?"<stdin>":input_name));
  return 0;
}
コード例 #5
0
ファイル: stream_type.c プロジェクト: OpenQCam/qcam
int main(int argc, char **argv)
{
  char   *input_name = NULL;
  int     had_input_name = FALSE;
  int     input = -1;
  int     verbose = FALSE;
  int     quiet = FALSE;
  int     err = 0;
  int     ii = 1;
  int     decided = FALSE;
  int     result = STREAM_IS_ERROR;
  
  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 STREAM_IS_ERROR;
      }
      else if (!strcmp("-verbose",argv[ii]) || !strcmp("-v",argv[ii]))
      {
        verbose = TRUE;
        quiet = FALSE;
      }
      else if (!strcmp("-err",argv[ii]))
      {
        CHECKARG("stream_type",ii);
        if (!strcmp(argv[ii+1],"stderr"))
          redirect_output_stderr();
        else if (!strcmp(argv[ii+1],"stdout"))
          redirect_output_stdout();
        else
        {
          fprint_err("### stream_type: "
                     "Unrecognised option '%s' to -err (not 'stdout' or"
                     " 'stderr')\n",argv[ii+1]);
          return 1;
        }
        ii++;
      }
      else if (!strcmp("-quiet",argv[ii]) || !strcmp("-q",argv[ii]))
      {
        verbose = FALSE;
        quiet = TRUE;
      }
      else
      {
        fprint_err("### stream_type: "
                   "Unrecognised command line switch '%s'\n",argv[ii]);
        return STREAM_IS_ERROR;
      }
    }
    else
    {
      if (had_input_name)
      {
        fprint_err("### stream_type: Unexpected '%s'\n",argv[ii]);
        return STREAM_IS_ERROR;
      }
      else
      {
        input_name = argv[ii];
        had_input_name = TRUE;
      }
    }
    ii++;
  }
  
  if (!had_input_name)
  {
    print_err("### stream_type: No input file specified\n");
    return STREAM_IS_ERROR;
  }
  
  input = open_binary_file(input_name,FALSE);
  if (input == -1)
  {
    fprint_err("### stream_type: Unable to open input file %s\n",
               input_name);
    return 1;
  }

  if (!quiet)
    fprint_msg("Reading from %s\n",input_name);
  
  // Try to guess
  err = determine_packet_type(input,verbose,&decided,&result);
  if (err)
  {
    print_err("### Unable to decide on stream type due to error\n");
    return STREAM_IS_ERROR;
  }

  if (!quiet)
  {
    if (!decided)
    {
      print_msg("Unable to decide\n");
      result = STREAM_IS_UNSURE;
    }
    else
    {
      switch (result)
      {
      case STREAM_IS_TS:
        print_msg("It appears to be Transport Stream\n");
        break;
      case STREAM_IS_PS:
        print_msg("It appears to be Program Stream\n");
        break;
      case STREAM_IS_H262:
        print_msg("It appears to be Elementary Stream, MPEG-2 (H.262)\n");
        break;
      case STREAM_IS_H264:
        print_msg("It appears to be Elementary Stream, MPEG-4 (H.264)\n");
        break;
      case STREAM_IS_AVS:
        print_msg("It appears to be Elementary Stream, AVS\n");
        break;
      case STREAM_MAYBE_PES:
        print_msg("It looks likely to be PES\n");
        break;
      case STREAM_IS_UNSURE:
        print_msg("It is not recognised\n");
        break;
      default:
        fprint_msg("Unexpected decision value %d\n",result);
        result = STREAM_IS_ERROR;
        break;
      }
    }
  }
  return result;
}