diff --git a/examples/dvb_print_si.c b/examples/dvb_print_si.c index b5f719e..469428d 100644 --- a/examples/dvb_print_si.c +++ b/examples/dvb_print_si.c @@ -1,7 +1,7 @@ /***************************************************************************** * dvb_print_si.c: Prints tables from a TS file ***************************************************************************** - * Copyright (C) 2010 VideoLAN + * Copyright (C) 2010-2011 VideoLAN * * Authors: Christophe Massiot * @@ -31,7 +31,9 @@ #include #include #include +#include #include +#include #include #include @@ -82,6 +84,29 @@ static const char *psz_current_encoding = ""; static iconv_t iconv_handle = (iconv_t)-1; static print_type_t i_print_type = PRINT_TEXT; +/* Please keep those two in sync */ +enum tables_t { + TABLE_PAT = 0, + TABLE_CAT, + TABLE_TSDT, + TABLE_NIT, + TABLE_BAT, + TABLE_SDT, + TABLE_EIT, + TABLE_TOT, + TABLE_TDT, + TABLE_RST, + TABLE_DIT, + TABLE_SIT, + TABLE_PMT, + TABLE_END +}; +static const char * const ppsz_all_tables[TABLE_END] = { + "pat", "cat", "tsdt", "nit", "bat", "sdt", "eit", "tot", "tdt", "rst", + "dit", "sit", "pmt" +}; +static bool pb_print_table[TABLE_END]; + /***************************************************************************** * print_wrapper *****************************************************************************/ @@ -262,7 +287,9 @@ static void handle_pat(void) psi_table_free(pp_old_pat_sections); } - pat_table_print(pp_current_pat_sections, print_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_PAT]) + pat_table_print(pp_current_pat_sections, print_wrapper, NULL, + i_print_type); } static void handle_pat_section(uint16_t i_pid, uint8_t *p_section) @@ -321,7 +348,9 @@ static void handle_cat(void) if (psi_table_validate(pp_old_cat_sections)) psi_table_free(pp_old_cat_sections); - cat_table_print(pp_current_cat_sections, print_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_CAT]) + cat_table_print(pp_current_cat_sections, print_wrapper, NULL, + i_print_type); } static void handle_cat_section(uint16_t i_pid, uint8_t *p_section) @@ -380,7 +409,9 @@ static void handle_tsdt(void) if (psi_table_validate(pp_old_tsdt_sections)) psi_table_free(pp_old_tsdt_sections); - tsdt_table_print(pp_current_tsdt_sections, print_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_TSDT]) + tsdt_table_print(pp_current_tsdt_sections, print_wrapper, NULL, + i_print_type); } static void handle_tsdt_section(uint16_t i_pid, uint8_t *p_section) @@ -471,7 +502,9 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt) free(p_sid->p_current_pmt); p_sid->p_current_pmt = p_pmt; - pmt_print(p_pmt, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_PMT]) + pmt_print(p_pmt, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); } /***************************************************************************** @@ -505,8 +538,9 @@ static void handle_nit(void) psi_table_copy(pp_current_nit_sections, pp_next_nit_sections); psi_table_init(pp_next_nit_sections); - nit_table_print(pp_current_nit_sections, print_wrapper, NULL, - iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_NIT]) + nit_table_print(pp_current_nit_sections, print_wrapper, NULL, + iconv_wrapper, NULL, i_print_type); } static void handle_nit_section(uint16_t i_pid, uint8_t *p_section) @@ -561,8 +595,9 @@ static void handle_bat(void) psi_table_copy(pp_current_bat_sections, pp_next_bat_sections); psi_table_init(pp_next_bat_sections); - bat_table_print(pp_current_bat_sections, print_wrapper, NULL, - iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_BAT]) + bat_table_print(pp_current_bat_sections, print_wrapper, NULL, + iconv_wrapper, NULL, i_print_type); } static void handle_bat_section(uint16_t i_pid, uint8_t *p_section) @@ -617,8 +652,9 @@ static void handle_sdt(void) psi_table_copy(pp_current_sdt_sections, pp_next_sdt_sections); psi_table_init(pp_next_sdt_sections); - sdt_table_print(pp_current_sdt_sections, print_wrapper, NULL, - iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_SDT]) + sdt_table_print(pp_current_sdt_sections, print_wrapper, NULL, + iconv_wrapper, NULL, i_print_type); } static void handle_sdt_section(uint16_t i_pid, uint8_t *p_section) @@ -660,7 +696,9 @@ static void handle_eit_section(uint16_t i_pid, uint8_t *p_eit) return; } - eit_print(p_eit, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_EIT]) + eit_print(p_eit, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); free(p_eit); } @@ -683,7 +721,9 @@ static void handle_tdt_section(uint16_t i_pid, uint8_t *p_tdt) return; } - tdt_print(p_tdt, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_TDT]) + tdt_print(p_tdt, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); free(p_tdt); } @@ -706,7 +746,9 @@ static void handle_tot_section(uint16_t i_pid, uint8_t *p_tot) return; } - tot_print(p_tot, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_TOT]) + tot_print(p_tot, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); free(p_tot); } @@ -729,7 +771,9 @@ static void handle_dit_section(uint16_t i_pid, uint8_t *p_dit) return; } - dit_print(p_dit, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_DIT]) + dit_print(p_dit, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); free(p_dit); } @@ -752,7 +796,9 @@ static void handle_rst_section(uint16_t i_pid, uint8_t *p_rst) return; } - rst_print(p_rst, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_RST]) + rst_print(p_rst, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); free(p_rst); } @@ -775,7 +821,9 @@ static void handle_sit_section(uint16_t i_pid, uint8_t *p_sit) return; } - sit_print(p_sit, print_wrapper, NULL, iconv_wrapper, NULL, i_print_type); + if (pb_print_table[TABLE_SIT]) + sit_print(p_sit, print_wrapper, NULL, iconv_wrapper, NULL, + i_print_type); free(p_sit); } @@ -907,29 +955,53 @@ static void handle_psi_packet(uint8_t *p_ts) *****************************************************************************/ static void usage(const char *psz) { - fprintf(stderr, "usage: %s [-x xml] < [> ]\n", psz); + fprintf(stderr, "usage: %s [-x xml] [-T ] < [> ]\n", psz); exit(EXIT_FAILURE); } int main(int i_argc, char **ppsz_argv) { - int i; + int i, c; + char *psz_tables = NULL; + + static const struct option long_options[] = { + { "print", required_argument, NULL, 'x' }, + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, 'V' }, + { "tables", no_argument, NULL, 'T' }, + { 0, 0, 0, 0 } + }; + + while ((c = getopt_long(i_argc, ppsz_argv, "x:hVT:", long_options, NULL)) != -1) + { + switch (c) { + case 'x': + if (!strcmp(optarg, "text")) + i_print_type = PRINT_TEXT; + else if (!strcmp(optarg, "xml")) + i_print_type = PRINT_XML; + else + fprintf(stderr, "unrecognized print type %s\n", optarg); + break; - if (ppsz_argv[1] != NULL && - (!strcmp(ppsz_argv[1], "-h") || !strcmp(ppsz_argv[1], "--help"))) - usage(ppsz_argv[0]); + case 'T': + psz_tables = strdup(optarg); + break; - if (ppsz_argv[1] != NULL && - (!strcmp(ppsz_argv[1], "-x") || !strcmp(ppsz_argv[1], "--print"))) { - if (ppsz_argv[2] == NULL) - usage(ppsz_argv[0]); - if (!strcmp(ppsz_argv[2], "text")) - i_print_type = PRINT_TEXT; - else if (!strcmp(ppsz_argv[2], "xml")) - i_print_type = PRINT_XML; - else + case 'V': + fprintf(stderr, "biTStream %d.%d.%d\n", BITSTREAM_VERSION_MAJOR, + BITSTREAM_VERSION_MINOR, BITSTREAM_VERSION_REVISION); + exit(0); + break; + + + case 'h': + default: usage(ppsz_argv[0]); + } } + if (optind < i_argc) + usage(ppsz_argv[0]); setvbuf(stdout, NULL, _IOLBF, 0); @@ -953,6 +1025,27 @@ int main(int i_argc, char **ppsz_argv) p_pids[DIT_PID].i_psi_refcount++; p_pids[SIT_PID].i_psi_refcount++; + if (psz_tables != NULL) { + char *psz_table = psz_tables; + for (i = 0; i < TABLE_END; i++) + pb_print_table[i] = false; + + do { + char *psz_next = strpbrk(psz_table, ","); + if (psz_next != NULL) *psz_next++ = '\0'; + + for (i = 0; i < TABLE_END; i++) + if (!strcasecmp(psz_table, ppsz_all_tables[i])) + pb_print_table[i] = true; + + psz_table = psz_next; + } while (psz_table != NULL); + + free(psz_tables); + } else + for (i = 0; i < TABLE_END; i++) + pb_print_table[i] = true; + switch (i_print_type) { case PRINT_XML: printf("\n");