예제 #1
0
int main(int argc, char **argv)
{
  int  err, ii;
  int  max = ES_UNIT_LIST_START_SIZE + ES_UNIT_LIST_INCREMENT + 3;
  ES_unit_list_p  list = NULL;
  ES_unit_p       unit = NULL;

  printf("Testing ES unit list\n");
  printf("Test 1 - differing ES units\n");
  err = build_ES_unit_list(&list);
  if (err) 
  {
    printf("Test failed - constructing list\n");
    return 1;
  }
  for (ii=0; ii<max; ii++)
  {
    err = build_ES_unit(&unit);
    if (err)
    {
      printf("Test failed - constructing ES unit\n");
      return 1;
    }
    err = append_to_ES_unit_list(list,unit);
    if (err)
    {
      printf("Test failed - appending ES unit %d\n",ii);
      return 1;
    }
    if (list->length > list->size)
    {
      printf("Test failed - list length = %d, size = %d\n",
             list->length,list->size);
      return 1;
    }
    else if (list->length != ii+1)
    {
      printf("Test failed - list length is %d, expected %d\n",
             list->length,ii+1);
      return 1;
    }
    free_ES_unit(&unit);
  }

  printf("Test 1 - resetting list\n");
  reset_ES_unit_list(list);
  if (list->length != 0)
  {
    printf("Test failed - list length is %d, not 0\n",list->length);
    return 1;
  }

  // And try populating the list again, but a bit further this time
  for (ii=0; ii<max+ES_UNIT_LIST_INCREMENT; ii++)
  {
    err = build_ES_unit(&unit);
    if (err)
    {
      printf("Test failed - constructing ES unit\n");
      return 1;
    }
    err = append_to_ES_unit_list(list,unit);
    if (err)
    {
      printf("Test failed - appending ES unit %d\n",ii);
      return 1;
    }
    if (list->length > list->size)
    {
      printf("Test failed - list length = %d, size = %d\n",
             list->length,list->size);
      return 1;
    }
    else if (list->length != ii+1)
    {
      printf("Test failed - list length is %d, expected %d\n",
             list->length,ii+1);
      return 1;
    }
    free_ES_unit(&unit);
  }
  
  printf("Test 1 - clearing list\n");
  free_ES_unit_list(&list);
  printf("Test 1 succeeded\n");
  
  printf("Test 2 - the same ES unit inserted multiple times\n");
  err = build_ES_unit_list(&list);
  if (err) 
  {
    printf("Test failed - constructing list\n");
    return 1;
  }
  err = build_ES_unit(&unit);
  if (err)
  {
    printf("Test failed - constructing ES unit\n");
    return 1;
  }

  // We aren't testing allocation limits this time round
  for (ii=0; ii<5; ii++)
  {
    err = append_to_ES_unit_list(list,unit);
    if (err)
    {
      printf("Test failed - appending ES unit %d\n",ii);
      return 1;
    }
  }

  printf("Test 2 - clearing list\n");
  free_ES_unit_list(&list);
  free_ES_unit(&unit);
  printf("Test 2 succeeded\n");
  return 0;
}
예제 #2
0
/*
 * Extract all the TS packets for either a video or audio stream.
 *
 * Returns 0 if all went well, 1 if something went wrong.
 */
static int extract_av_via_pes(char  *input_name,
                              char  *output_name,
                              int    want_video,
                              int    quiet)
{
    int          err;
    PES_reader_p reader = NULL;
    ES_p         es = NULL;
    FILE        *output;

    if (!want_video)
    {
        print_err("### Audio output is not supported via PES in this utility\n");
        return 1;
    }

    output = fopen(output_name,"wb");
    if (output == NULL)
    {
        fprint_err("### Unable to open output file %s: %s\n",output_name,
                   strerror(errno));
        return 1;
    }

    err = open_PES_reader(input_name,!quiet,!quiet,&reader);
    if (err)
    {
        fprint_err("### Error opening file %s\n",input_name);
        fclose(output);
        return 1;
    }

    set_PES_reader_video_only(reader,TRUE);

    // Wrap our PES stream up as an ES stream
    err = build_elementary_stream_PES(reader,&es);
    if (err)
    {
        print_err("### Error trying to build ES reader from PES reader\n");
        (void) close_PES_reader(&reader);
        (void) fclose(output);
        return 1;
    }

    for (;;)
    {
        ES_unit_p  unit;
        err = find_and_build_next_ES_unit(es,&unit);
        if (err == EOF)
            break;
        else if (err)
        {
            print_err("### Error reading next ES unit\n");
            (void) fclose(output);
            (void) close_PES_reader(&reader);
            close_elementary_stream(&es);
            return 1;
        }
        err = write_ES_unit(output,unit);
        if (err)
        {
            print_err("### Error writing ES unit out to file\n");
            free_ES_unit(&unit);
            (void) fclose(output);
            (void) close_PES_reader(&reader);
            close_elementary_stream(&es);
            return 1;
        }
        free_ES_unit(&unit);
    }

    (void) fclose(output);              // naughtily ignore the return code
    (void) close_PES_reader(&reader);   // naughtily ignore the return code
    close_elementary_stream(&es);
    return 0;
}