[libdvbpsi-devel] PAT: refactor dvbpsi_GatherPATSections()
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:10:49 2012 +0200| [caed81f65b96d9a5a836990ce45ef40b537e5895] | committer: Jean-Paul Saman
PAT: refactor dvbpsi_GatherPATSections()
Refactor dvbpsi_GatherPATSections().
> http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=caed81f65b96d9a5a836990ce45ef40b537e5895
---
src/tables/pat.c | 174 ++++++++++++++++++++++++++++++++----------------------
1 file changed, 105 insertions(+), 69 deletions(-)
diff --git a/src/tables/pat.c b/src/tables/pat.c
index 5cd5ee3..19ecf08 100644
--- a/src/tables/pat.c
+++ b/src/tables/pat.c
@@ -192,38 +192,115 @@ dvbpsi_pat_program_t* dvbpsi_PATAddProgram(dvbpsi_pat_t* p_pat,
return p_program;
}
-/*****************************************************************************
- * dvbpsi_GatherPATSections
- *****************************************************************************
- * Callback for the PSI decoder.
- *****************************************************************************/
-void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_section)
+/* */
+static void dvbpsi_ReInitPAT(dvbpsi_pat_decoder_t* p_pat_decoder)
+{
+ assert(p_pat_decoder);
+
+ /* Force redecoding */
+ p_pat_decoder->b_current_valid = false;
+
+ /* Free structures */
+ if (p_pat_decoder->p_building_pat)
+ {
+ free(p_pat_decoder->p_building_pat);
+ p_pat_decoder->p_building_pat = NULL;
+ }
+
+ /* Clear the section array */
+ for (unsigned int i = 0; i <= 255; i++)
+ {
+ if (p_pat_decoder->ap_sections[i] != NULL)
+ {
+ dvbpsi_DeletePSISections(p_pat_decoder->ap_sections[i]);
+ p_pat_decoder->ap_sections[i] = NULL;
+ }
+ }
+}
+
+static bool dvbpsi_CheckPAT(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t *p_section)
{
- dvbpsi_pat_decoder_t* p_pat_decoder;
bool b_reinit = false;
+ assert(p_dvbpsi->p_private);
+ dvbpsi_pat_decoder_t* p_pat_decoder;
+ p_pat_decoder = (dvbpsi_pat_decoder_t *)p_dvbpsi->p_private;
+
+ /* Perform a few sanity checks */
+ if (p_pat_decoder->p_building_pat->i_ts_id != p_section->i_extension)
+ {
+ /* transport_stream_id */
+ dvbpsi_error(p_dvbpsi, "PAT decoder",
+ "'transport_stream_id' differs"
+ " whereas no TS discontinuity has occured");
+ b_reinit = true;
+ }
+ else if (p_pat_decoder->p_building_pat->i_version != p_section->i_version)
+ {
+ /* version_number */
+ dvbpsi_error(p_dvbpsi, "PAT decoder",
+ "'version_number' differs"
+ " whereas no discontinuity has occured");
+ b_reinit = true;
+ }
+ else if (p_pat_decoder->i_last_section_number != p_section->i_last_number)
+ {
+ /* last_section_number */
+ dvbpsi_error(p_dvbpsi, "PAT decoder",
+ "'last_section_number' differs"
+ " whereas no discontinuity has occured");
+ b_reinit = true;
+ }
+
+ return b_reinit;
+}
+
+static bool dvbpsi_CheckTable(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_dvbpsi->p_private);
+ assert(p_section);
- if (p_section->i_table_id != 0x00)
+ if (p_section->i_table_id != table_id)
{
/* Invalid table_id value */
- dvbpsi_error(p_dvbpsi, "PAT decoder",
+ dvbpsi_error(p_dvbpsi, psz_table_name,
"invalid section (table_id == 0x%02x)",
p_section->i_table_id);
- dvbpsi_DeletePSISections(p_section);
- return;
+ goto error;
}
if (!p_section->b_syntax_indicator)
{
/* Invalid section_syntax_indicator */
- dvbpsi_error(p_dvbpsi, "PAT decoder",
+ dvbpsi_error(p_dvbpsi, psz_table_name,
"invalid section (section_syntax_indicator == 0)");
- dvbpsi_DeletePSISections(p_section);
- return;
+ goto error;
}
+ return true;
+
+error:
+ dvbpsi_DeletePSISections(p_section);
+ p_section = NULL;
+ return false;
+}
+
+/*****************************************************************************
+ * dvbpsi_GatherPATSections
+ *****************************************************************************
+ * Callback for the PSI decoder.
+ *****************************************************************************/
+void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_section)
+{
+ dvbpsi_pat_decoder_t* p_pat_decoder;
+
+ assert(p_dvbpsi);
+ assert(p_dvbpsi->p_private);
+
+ if (!dvbpsi_CheckTable(p_dvbpsi, p_section, 0x00, "PAT decoder"))
+ return;
+
/* Now we have a valid PAT section */
dvbpsi_debug(p_dvbpsi, "PAT decoder",
"Table version %2d, " "i_extension %5d, "
@@ -237,40 +314,15 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio
/* TS discontinuity check */
if (p_pat_decoder->b_discontinuity)
{
- b_reinit = true;
+ dvbpsi_ReInitPAT(p_pat_decoder);
p_pat_decoder->b_discontinuity = false;
}
else
{
- /* Perform a few sanity checks */
if (p_pat_decoder->p_building_pat)
{
- if (p_pat_decoder->p_building_pat->i_ts_id != p_section->i_extension)
- {
- /* transport_stream_id */
- dvbpsi_error(p_dvbpsi, "PAT decoder",
- "'transport_stream_id' differs"
- " whereas no TS discontinuity has occured");
- b_reinit = true;
- }
- else if(p_pat_decoder->p_building_pat->i_version
- != p_section->i_version)
- {
- /* version_number */
- dvbpsi_error(p_dvbpsi, "PAT decoder",
- "'version_number' differs"
- " whereas no discontinuity has occured");
- b_reinit = true;
- }
- else if(p_pat_decoder->i_last_section_number !=
- p_section->i_last_number)
- {
- /* last_section_number */
- dvbpsi_error(p_dvbpsi, "PAT decoder",
- "'last_section_number' differs"
- " whereas no discontinuity has occured");
- b_reinit = true;
- }
+ if (dvbpsi_CheckPAT(p_dvbpsi, p_section))
+ dvbpsi_ReInitPAT(p_pat_decoder);
}
else
{
@@ -289,36 +341,11 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio
}
}
- /* Reinit the decoder if wanted */
- if (b_reinit)
- {
- /* Force redecoding */
- p_pat_decoder->b_current_valid = false;
- /* Free structures */
- if (p_pat_decoder->p_building_pat)
- {
- free(p_pat_decoder->p_building_pat);
- p_pat_decoder->p_building_pat = NULL;
- }
- /* Clear the section array */
- for (unsigned int i = 0; i <= 255; i++)
- {
- if (p_pat_decoder->ap_sections[i] != NULL)
- {
- dvbpsi_DeletePSISections(p_pat_decoder->ap_sections[i]);
- p_pat_decoder->ap_sections[i] = NULL;
- }
- }
- }
-
- /* Append the section to the list */
- bool b_complete = false;
-
/* Initialize the structures if it's the first section received */
if (!p_pat_decoder->p_building_pat)
{
p_pat_decoder->p_building_pat =
- (dvbpsi_pat_t*)malloc(sizeof(dvbpsi_pat_t));
+ (dvbpsi_pat_t*)calloc(1, sizeof(dvbpsi_pat_t));
if (p_pat_decoder->p_building_pat == NULL)
{
dvbpsi_error(p_dvbpsi, "PAT decoder", "failed decoding section %d",
@@ -342,6 +369,8 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio
p_pat_decoder->ap_sections[p_section->i_number] = p_section;
/* Check if we have all the sections */
+ bool b_complete = false;
+
for (unsigned int i = 0; i <= p_pat_decoder->i_last_section_number; i++)
{
if (!p_pat_decoder->ap_sections[i])
@@ -352,9 +381,12 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio
if (b_complete)
{
+ assert(p_pat_decoder->pf_pat_callback);
+
/* Save the current information */
p_pat_decoder->current_pat = *p_pat_decoder->p_building_pat;
p_pat_decoder->b_current_valid = true;
+
/* Chain the sections */
if (p_pat_decoder->i_last_section_number)
{
@@ -362,15 +394,19 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio
p_pat_decoder->ap_sections[i]->p_next =
p_pat_decoder->ap_sections[i + 1];
}
+
/* Decode the sections */
dvbpsi_DecodePATSections(p_pat_decoder->p_building_pat,
p_pat_decoder->ap_sections[0]);
+
/* Delete the sections */
dvbpsi_DeletePSISections(p_pat_decoder->ap_sections[0]);
p_pat_decoder->ap_sections[0] = NULL;
+
/* signal the new PAT */
p_pat_decoder->pf_pat_callback(p_pat_decoder->p_cb_data,
p_pat_decoder->p_building_pat);
+
/* Reinitialize the structures */
p_pat_decoder->p_building_pat = NULL;
for (unsigned int i = 0; i <= p_pat_decoder->i_last_section_number; i++)
More information about the libdvbpsi-devel
mailing list