[libdvbpsi-devel] PSI: add dvbpsi_CheckPSISection() utility function
Jean-Paul Saman
git at videolan.org
Wed Jun 27 14:28:59 CEST 2012
libdvbpsi | branch: master | Jean-Paul Saman <jean-paul.saman at m2x.nl> | Mon Jun 11 14:22:49 2012 +0200| [58617799bd71e106c6c8ec3f5a2118cd2bf236c3] | committer: Jean-Paul Saman
PSI: add dvbpsi_CheckPSISection() utility function
All PSI table check the same common things before accepting a section as
being a valid section. Centralize these checks into a single function.
> http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=58617799bd71e106c6c8ec3f5a2118cd2bf236c3
---
src/psi.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
src/psi.h | 17 +++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/src/psi.c b/src/psi.c
index 821a209..e24492f 100644
--- a/src/psi.c
+++ b/src/psi.c
@@ -30,6 +30,8 @@
#include <stdlib.h>
#include <stdbool.h>
+#include <assert.h>
+
#if defined(HAVE_INTTYPES_H)
#include <inttypes.h>
#elif defined(HAVE_STDINT_H)
@@ -84,6 +86,50 @@ void dvbpsi_DeletePSISections(dvbpsi_psi_section_t *p_section)
free(p_section);
p_section = p_next;
}
+ p_section = NULL;
+}
+
+/*****************************************************************************
+ * dvbpsi_CheckPSISection
+ *****************************************************************************
+ * Check if PSI section has the expected table_id and it the syntax indicator
+ * is true.
+ *****************************************************************************/
+bool dvbpsi_CheckPSISection(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t *p_section,
+ const uint8_t table_id, const char *psz_table_name)
+{
+ assert(p_dvbpsi);
+ assert(p_section);
+
+ if (p_section->i_table_id != table_id)
+ {
+ /* Invalid table_id value */
+ dvbpsi_error(p_dvbpsi, psz_table_name,
+ "invalid section (table_id == 0x%02x)",
+ p_section->i_table_id);
+ goto error;
+ }
+
+ if (!p_section->b_syntax_indicator)
+ {
+ /* Invalid section_syntax_indicator */
+ dvbpsi_error(p_dvbpsi, psz_table_name,
+ "invalid section (section_syntax_indicator == 0)");
+ goto error;
+ }
+
+ /* FIXME: Do we need to check the CRC for ALL tables? */
+
+ dvbpsi_debug(p_dvbpsi, psz_table_name,
+ "Table version %2d, " "i_extension %5d, "
+ "section %3d up to %3d, " "current %1d",
+ p_section->i_version, p_section->i_extension,
+ p_section->i_number, p_section->i_last_number,
+ p_section->b_current_next);
+ return true;
+
+error:
+ return false;
}
/*****************************************************************************
diff --git a/src/psi.h b/src/psi.h
index 62c6ba2..9061030 100644
--- a/src/psi.h
+++ b/src/psi.h
@@ -119,6 +119,23 @@ dvbpsi_psi_section_t * dvbpsi_NewPSISection(int i_max_size);
void dvbpsi_DeletePSISections(dvbpsi_psi_section_t * p_section);
/*****************************************************************************
+ * dvbpsi_CheckPSISection
+ *****************************************************************************/
+/*!
+ * \fn bool dvbpsi_CheckPSISection(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t *p_section,
+ const uint8_t table_id, const char *psz_table_name)
+ * \brief Check if PSI section has the expected table_id and it the syntax indicator
+ * is true.
+ * \param p_dvbpsi pointer to dvbpsi library handle
+ * \param p_section pointer to the PSI section structure
+ * \param table_id expected table id
+ * \param psz_table_name table name to use when reporting errors.
+ * \return boolean value (false if the section did not pass the tests).
+ */
+bool dvbpsi_CheckPSISection(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t *p_section,
+ const uint8_t table_id, const char *psz_table_name);
+
+/*****************************************************************************
* dvbpsi_ValidPSISection
*****************************************************************************/
/*!
More information about the libdvbpsi-devel
mailing list