Commit 9313f054 authored by Christophe Massiot's avatar Christophe Massiot

* mpeg/psi_print.h: Move DVB-specific functions to dvb/si_print.h. *...

* mpeg/psi_print.h: Move DVB-specific functions to dvb/si_print.h. * examples/dvb_print_si.c: Fix a number of end-of-lines.
parent 2b64da5e
/*****************************************************************************
* si_print.h: ETSI EN 300 468 Service Information (printing)
*****************************************************************************
* Copyright (C) 2010 VideoLAN
* $Id: psi_print.h -1 $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*****************************************************************************/
/*
* Placed here for dependancy reasons
*/
#ifndef __BITSTREAM_DVB_SI_PRINT_H__
#define __BITSTREAM_DVB_SI_PRINT_H__
#include <bitstream/common.h>
#include <bitstream/mpeg/psi.h>
#include <bitstream/dvb/si.h>
#ifdef __cplusplus
extern "C"
{
#endif
/*****************************************************************************
* Descriptors list
*****************************************************************************/
static inline void descs_print(uint8_t *p_descs,
f_print pf_print, void *print_opaque,
f_iconv pf_iconv, void *iconv_opaque)
{
uint16_t j = 0;
uint8_t *p_desc;
while ((p_desc = descs_get_desc(p_descs, j)) != NULL) {
uint8_t i_tag = desc_get_tag(p_desc);
j++;
/* I am not proud of this */
switch (i_tag) {
case 0x05:
if (desc05_validate(p_desc))
desc05_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x09:
if (desc09_validate(p_desc))
desc09_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x0a:
if (desc0a_validate(p_desc))
desc0a_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x40:
if (desc40_validate(p_desc))
desc40_print(p_desc, pf_print, print_opaque,
pf_iconv, iconv_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x43:
if (desc43_validate(p_desc))
desc43_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x44:
if (desc44_validate(p_desc))
desc44_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x46:
if (desc46_validate(p_desc))
desc46_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x48:
if (desc48_validate(p_desc))
desc48_print(p_desc, pf_print, print_opaque,
pf_iconv, iconv_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x56:
if (desc56_validate(p_desc))
desc56_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x59:
if (desc59_validate(p_desc))
desc59_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x5a:
if (desc5a_validate(p_desc))
desc5a_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x6a:
if (desc6a_validate(p_desc))
desc6a_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
default:
desc_print(p_desc, pf_print, print_opaque);
break;
}
}
}
/*****************************************************************************
* Network Information Table
*****************************************************************************/
static inline void nit_table_print(uint8_t **pp_sections,
f_print pf_print, void *print_opaque,
f_iconv pf_iconv, void *iconv_opaque)
{
uint8_t i_last_section = psi_table_get_lastsection(pp_sections);
uint8_t i;
pf_print(print_opaque, "new NIT %s networkid=%hu version=%hhu%s",
psi_table_get_tableid(pp_sections) == NIT_TABLE_ID_ACTUAL ?
"actual" : "other",
psi_table_get_tableidext(pp_sections),
psi_table_get_version(pp_sections),
!psi_table_get_current(pp_sections) ? " (next)" : "");
descs_print(nit_get_descs(psi_table_get_section(pp_sections, 0)),
pf_print, print_opaque, pf_iconv, iconv_opaque);
for (i = 0; i <= i_last_section; i++) {
uint8_t *p_section = psi_table_get_section(pp_sections, i);
uint8_t *p_ts;
int j = 0;
while ((p_ts = nit_get_ts(p_section, j)) != NULL) {
j++;
pf_print(print_opaque, " * ts tsid=%hu onid=%hu",
nitn_get_tsid(p_ts), nitn_get_onid(p_ts));
descs_print(nitn_get_descs(p_ts), pf_print, print_opaque,
pf_iconv, iconv_opaque);
}
}
pf_print(print_opaque, "end NIT");
}
/*****************************************************************************
* Service Description Table
*****************************************************************************/
static inline void sdt_table_print(uint8_t **pp_sections,
f_print pf_print, void *print_opaque,
f_iconv pf_iconv, void *iconv_opaque)
{
uint8_t i_last_section = psi_table_get_lastsection(pp_sections);
uint8_t i;
pf_print(print_opaque, "new SDT %s tsid=%hu version=%hhu%s onid=%hu",
psi_table_get_tableid(pp_sections) == SDT_TABLE_ID_ACTUAL ?
"actual" : "other",
psi_table_get_tableidext(pp_sections),
psi_table_get_version(pp_sections),
!psi_table_get_current(pp_sections) ? " (next)" : "",
sdt_get_onid(psi_table_get_section(pp_sections, 0)));
for (i = 0; i <= i_last_section; i++) {
uint8_t *p_section = psi_table_get_section(pp_sections, i);
uint8_t *p_service;
int j = 0;
while ((p_service = sdt_get_service(p_section, j)) != NULL) {
j++;
pf_print(print_opaque, " * service sid=%hu eit%s%s running=%hhu%s",
sdtn_get_sid(p_service),
sdtn_get_eitschedule(p_service) ? " schedule" : "",
sdtn_get_eitpresent(p_service) ? " present" : "",
sdtn_get_running(p_service),
sdtn_get_ca(p_service) ? " scrambled" : "");
descs_print(sdtn_get_descs(p_service), pf_print, print_opaque,
pf_iconv, iconv_opaque);
}
}
pf_print(print_opaque, "end SDT");
}
#ifdef __cplusplus
}
#endif
#endif
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <bitstream/mpeg/ts.h> #include <bitstream/mpeg/ts.h>
#include <bitstream/mpeg/psi.h> #include <bitstream/mpeg/psi.h>
#include <bitstream/dvb/si.h> #include <bitstream/dvb/si.h>
#include <bitstream/dvb/si_print.h>
#include <bitstream/mpeg/psi_print.h> #include <bitstream/mpeg/psi_print.h>
/***************************************************************************** /*****************************************************************************
...@@ -104,7 +105,7 @@ static char *iconv_wrapper(void *_unused, const char *psz_encoding, ...@@ -104,7 +105,7 @@ static char *iconv_wrapper(void *_unused, const char *psz_encoding,
if (iconv_handle == (iconv_t)-1) if (iconv_handle == (iconv_t)-1)
iconv_handle = iconv_open(psz_native_encoding, psz_encoding); iconv_handle = iconv_open(psz_native_encoding, psz_encoding);
if (iconv_handle == (iconv_t)-1) { if (iconv_handle == (iconv_t)-1) {
fprintf(stderr, "couldn't convert from %s to %s (%m)", psz_encoding, fprintf(stderr, "couldn't convert from %s to %s (%m)\n", psz_encoding,
psz_native_encoding); psz_native_encoding);
return iconv_append_null(p_string, i_length); return iconv_append_null(p_string, i_length);
} }
...@@ -113,13 +114,13 @@ static char *iconv_wrapper(void *_unused, const char *psz_encoding, ...@@ -113,13 +114,13 @@ static char *iconv_wrapper(void *_unused, const char *psz_encoding,
i_out_length = i_length * 6; i_out_length = i_length * 6;
p = psz_string = malloc(i_out_length); p = psz_string = malloc(i_out_length);
if (iconv(iconv_handle, &p_string, &i_length, &p, &i_out_length) == -1) { if (iconv(iconv_handle, &p_string, &i_length, &p, &i_out_length) == -1) {
fprintf(stderr, "couldn't convert from %s to %s (%m)", psz_encoding, fprintf(stderr, "couldn't convert from %s to %s (%m)\n", psz_encoding,
psz_native_encoding); psz_native_encoding);
free(psz_string); free(psz_string);
return iconv_append_null(p_string, i_length); return iconv_append_null(p_string, i_length);
} }
if (i_length) if (i_length)
fprintf(stderr, "partial conversion from %s to %s", psz_encoding, fprintf(stderr, "partial conversion from %s to %s\n", psz_encoding,
psz_native_encoding); psz_native_encoding);
*p = '\0'; *p = '\0';
...@@ -145,7 +146,7 @@ static void handle_pat(void) ...@@ -145,7 +146,7 @@ static void handle_pat(void)
} }
if (!pat_table_validate(pp_next_pat_sections)) { if (!pat_table_validate(pp_next_pat_sections)) {
printf("invalid PAT received"); printf("invalid PAT received\n");
psi_table_free(pp_next_pat_sections); psi_table_free(pp_next_pat_sections);
psi_table_init(pp_next_pat_sections); psi_table_init(pp_next_pat_sections);
return; return;
...@@ -170,7 +171,7 @@ static void handle_pat(void) ...@@ -170,7 +171,7 @@ static void handle_pat(void)
if (i_sid == 0) { if (i_sid == 0) {
if (i_pid != NIT_PID) if (i_pid != NIT_PID)
printf( printf(
"NIT is carried on PID %hu which isn't DVB compliant", "NIT is carried on PID %hu which isn't DVB compliant\n",
i_pid); i_pid);
continue; /* NIT */ continue; /* NIT */
} }
...@@ -242,7 +243,7 @@ static void handle_pat(void) ...@@ -242,7 +243,7 @@ static void handle_pat(void)
static void handle_pat_section(uint16_t i_pid, uint8_t *p_section) static void handle_pat_section(uint16_t i_pid, uint8_t *p_section)
{ {
if (i_pid != PAT_PID || !pat_validate(p_section)) { if (i_pid != PAT_PID || !pat_validate(p_section)) {
printf("invalid PAT section received on PID %hu", i_pid); printf("invalid PAT section received on PID %hu\n", i_pid);
free(p_section); free(p_section);
return; return;
} }
...@@ -264,7 +265,7 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt) ...@@ -264,7 +265,7 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt)
/* we do this before checking the service ID */ /* we do this before checking the service ID */
if (!pmt_validate(p_pmt)) { if (!pmt_validate(p_pmt)) {
printf("invalid PMT section received on PID %hu", i_pid); printf("invalid PMT section received on PID %hu\n", i_pid);
free(p_pmt); free(p_pmt);
return; return;
} }
...@@ -274,7 +275,7 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt) ...@@ -274,7 +275,7 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt)
break; break;
if (i == i_nb_sids) { if (i == i_nb_sids) {
printf("ghost PMT for service %hu carried on PID %hu", i_sid, i_pid); printf("ghost PMT for service %hu carried on PID %hu\n", i_sid, i_pid);
p_sid = malloc(sizeof(sid_t)); p_sid = malloc(sizeof(sid_t));
pp_sids = realloc(pp_sids, ++i_nb_sids * sizeof(sid_t *)); pp_sids = realloc(pp_sids, ++i_nb_sids * sizeof(sid_t *));
pp_sids[i] = p_sid; pp_sids[i] = p_sid;
...@@ -284,7 +285,7 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt) ...@@ -284,7 +285,7 @@ static void handle_pmt(uint16_t i_pid, uint8_t *p_pmt)
} else { } else {
p_sid = pp_sids[i]; p_sid = pp_sids[i];
if (i_pid != p_sid->i_pmt_pid) if (i_pid != p_sid->i_pmt_pid)
printf("ghost PMT for service %hu carried on PID %hu", i_sid, printf("ghost PMT for service %hu carried on PID %hu\n", i_sid,
i_pid); i_pid);
} }
...@@ -316,7 +317,7 @@ static void handle_nit(void) ...@@ -316,7 +317,7 @@ static void handle_nit(void)
} }
if (!nit_table_validate(pp_next_nit_sections)) { if (!nit_table_validate(pp_next_nit_sections)) {
printf("invalid NIT received"); printf("invalid NIT received\n");
psi_table_free( pp_next_nit_sections ); psi_table_free( pp_next_nit_sections );
psi_table_init( pp_next_nit_sections ); psi_table_init( pp_next_nit_sections );
return; return;
...@@ -334,7 +335,7 @@ static void handle_nit(void) ...@@ -334,7 +335,7 @@ static void handle_nit(void)
static void handle_nit_section(uint16_t i_pid, uint8_t *p_section) static void handle_nit_section(uint16_t i_pid, uint8_t *p_section)
{ {
if (i_pid != NIT_PID || !nit_validate(p_section)) { if (i_pid != NIT_PID || !nit_validate(p_section)) {
printf("invalid NIT section received on PID %hu", i_pid); printf("invalid NIT section received on PID %hu\n", i_pid);
free(p_section); free(p_section);
return; return;
} }
...@@ -360,7 +361,7 @@ static void handle_sdt(void) ...@@ -360,7 +361,7 @@ static void handle_sdt(void)
} }
if (!sdt_table_validate(pp_next_sdt_sections)) { if (!sdt_table_validate(pp_next_sdt_sections)) {
printf("invalid SDT received"); printf("invalid SDT received\n");
psi_table_free(pp_next_sdt_sections); psi_table_free(pp_next_sdt_sections);
psi_table_init(pp_next_sdt_sections); psi_table_init(pp_next_sdt_sections);
return; return;
...@@ -378,7 +379,7 @@ static void handle_sdt(void) ...@@ -378,7 +379,7 @@ static void handle_sdt(void)
static void handle_sdt_section(uint16_t i_pid, uint8_t *p_section) static void handle_sdt_section(uint16_t i_pid, uint8_t *p_section)
{ {
if (i_pid != SDT_PID || !sdt_validate(p_section)) { if (i_pid != SDT_PID || !sdt_validate(p_section)) {
printf("invalid SDT section received on PID %hu", i_pid); printf("invalid SDT section received on PID %hu\n", i_pid);
free(p_section); free(p_section);
return; return;
} }
...@@ -397,7 +398,7 @@ static void handle_section(uint16_t i_pid, uint8_t *p_section) ...@@ -397,7 +398,7 @@ static void handle_section(uint16_t i_pid, uint8_t *p_section)
uint8_t i_table_id = psi_get_tableid(p_section); uint8_t i_table_id = psi_get_tableid(p_section);
if (!psi_validate(p_section)) { if (!psi_validate(p_section)) {
printf("invalid section on PID %hu", i_pid); printf("invalid section on PID %hu\n", i_pid);
free(p_section); free(p_section);
return; return;
} }
...@@ -488,7 +489,7 @@ int main(int i_argc, char **ppsz_argv) ...@@ -488,7 +489,7 @@ int main(int i_argc, char **ppsz_argv)
size_t i_ret = fread(p_ts, sizeof(p_ts), 1, stdin); size_t i_ret = fread(p_ts, sizeof(p_ts), 1, stdin);
if (i_ret != 1) continue; if (i_ret != 1) continue;
if (!ts_validate(p_ts)) if (!ts_validate(p_ts))
printf("invalid TS packet"); printf("invalid TS packet\n");
else { else {
uint16_t i_pid = ts_get_pid(p_ts); uint16_t i_pid = ts_get_pid(p_ts);
ts_pid_t *p_pid = &p_pids[i_pid]; ts_pid_t *p_pid = &p_pids[i_pid];
......
...@@ -22,110 +22,15 @@ ...@@ -22,110 +22,15 @@
#include <bitstream/common.h> #include <bitstream/common.h>
#include <bitstream/mpeg/psi.h> #include <bitstream/mpeg/psi.h>
#include <bitstream/dvb/si.h>
/* here you must manually include <bitstream/dvb/si.h> or the ATSC equivalent
* if/when it is available */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
/*****************************************************************************
* Descriptors list
*****************************************************************************/
static inline void descs_print(uint8_t *p_descs,
f_print pf_print, void *print_opaque,
f_iconv pf_iconv, void *iconv_opaque)
{
uint16_t j = 0;
uint8_t *p_desc;
while ((p_desc = descs_get_desc(p_descs, j)) != NULL) {
uint8_t i_tag = desc_get_tag(p_desc);
j++;
/* I am not proud of this */
switch (i_tag) {
case 0x05:
if (desc05_validate(p_desc))
desc05_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x09:
if (desc09_validate(p_desc))
desc09_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x0a:
if (desc0a_validate(p_desc))
desc0a_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x40:
if (desc40_validate(p_desc))
desc40_print(p_desc, pf_print, print_opaque,
pf_iconv, iconv_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x43:
if (desc43_validate(p_desc))
desc43_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x44:
if (desc44_validate(p_desc))
desc44_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x46:
if (desc46_validate(p_desc))
desc46_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x48:
if (desc48_validate(p_desc))
desc48_print(p_desc, pf_print, print_opaque,
pf_iconv, iconv_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x56:
if (desc56_validate(p_desc))
desc56_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x59:
if (desc59_validate(p_desc))
desc59_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x5a:
if (desc5a_validate(p_desc))
desc5a_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
case 0x6a:
if (desc6a_validate(p_desc))
desc6a_print(p_desc, pf_print, print_opaque);
else
pf_print(print_opaque, "desc %hhx invalid", i_tag);
break;
default:
desc_print(p_desc, pf_print, print_opaque);
break;
}
}
}
/***************************************************************************** /*****************************************************************************
* Program Map Table * Program Map Table
*****************************************************************************/ *****************************************************************************/
...@@ -154,81 +59,6 @@ static inline void pmt_print(uint8_t *p_pmt, ...@@ -154,81 +59,6 @@ static inline void pmt_print(uint8_t *p_pmt,
pf_print(print_opaque, "end PMT"); pf_print(print_opaque, "end PMT");
} }
/*****************************************************************************
* Network Information Table
*****************************************************************************/
static inline void nit_table_print(uint8_t **pp_sections,
f_print pf_print, void *print_opaque,
f_iconv pf_iconv, void *iconv_opaque)
{
uint8_t i_last_section = psi_table_get_lastsection(pp_sections);
uint8_t i;
pf_print(print_opaque, "new NIT %s networkid=%hu version=%hhu%s",
psi_table_get_tableid(pp_sections) == NIT_TABLE_ID_ACTUAL ?
"actual" : "other",
psi_table_get_tableidext(pp_sections),
psi_table_get_version(pp_sections),
!psi_table_get_current(pp_sections) ? " (next)" : "");
descs_print(nit_get_descs(psi_table_get_section(pp_sections, 0)),
pf_print, print_opaque, pf_iconv, iconv_opaque);
for (i = 0; i <= i_last_section; i++) {
uint8_t *p_section = psi_table_get_section(pp_sections, i);
uint8_t *p_ts;
int j = 0;
while ((p_ts = nit_get_ts(p_section, j)) != NULL) {
j++;
pf_print(print_opaque, " * ts tsid=%hu onid=%hu",
nitn_get_tsid(p_ts), nitn_get_onid(p_ts));
descs_print(nitn_get_descs(p_ts), pf_print, print_opaque,
pf_iconv, iconv_opaque);
}
}
pf_print(print_opaque, "end NIT");
}
/*****************************************************************************
* Service Description Table
*****************************************************************************/
static inline void sdt_table_print(uint8_t **pp_sections,
f_print pf_print, void *print_opaque,
f_iconv pf_iconv, void *iconv_opaque)
{
uint8_t i_last_section = psi_table_get_lastsection(pp_sections);
uint8_t i;
pf_print(print_opaque, "new SDT %s tsid=%hu version=%hhu%s onid=%hu",
psi_table_get_tableid(pp_sections) == SDT_TABLE_ID_ACTUAL ?
"actual" : "other",
psi_table_get_tableidext(pp_sections),
psi_table_get_version(pp_sections),
!psi_table_get_current(pp_sections) ? " (next)" : "",
sdt_get_onid(psi_table_get_section(pp_sections, 0)));
for (i = 0; i <= i_last_section; i++) {
uint8_t *p_section = psi_table_get_section(pp_sections, i);
uint8_t *p_service;
int j = 0;
while ((p_service = sdt_get_service(p_section, j)) != NULL) {
j++;
pf_print(print_opaque, " * service sid=%hu eit%s%s running=%hhu%s",
sdtn_get_sid(p_service),
sdtn_get_eitschedule(p_service) ? " schedule" : "",
sdtn_get_eitpresent(p_service) ? " present" : "",
sdtn_get_running(p_service),
sdtn_get_ca(p_service) ? " scrambled" : "");
descs_print(sdtn_get_descs(p_service), pf_print, print_opaque,
pf_iconv, iconv_opaque);
}
}
pf_print(print_opaque, "end SDT");
}
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment