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; }
/* * 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; }