PAT: rework dvbpsi_GatherPATSections()
[email protected] (Jean-Paul Saman)
| Newsgroups | gmane.comp.video.videolan.libdvbpsi.devel |
|---|---|
| Message-ID | <[email protected]> |
libdvbpsi | branch: master | Jean-Paul Saman <[email protected]> | Wed Jun 13 11:50:37 2012 +0200| [85be9dd9592fd3c9f9a10d302b17b0cfe55f07e8] | committer: Jean-Paul Saman PAT: rework dvbpsi_GatherPATSections() > http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=85be9dd9592fd3c9f9a10d302b17b0cfe55f07e8 --- src/tables/pat.c | 109 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/src/tables/pat.c b/src/tables/pat.c index 49379f8..feaa5ef 100644 --- a/src/tables/pat.c +++ b/src/tables/pat.c @@ -193,19 +193,20 @@ dvbpsi_pat_program_t* dvbpsi_PATAddProgram(dvbpsi_pat_t* p_pat, } /* */ -static void dvbpsi_ReInitPAT(dvbpsi_pat_decoder_t* p_pat_decoder) +static void dvbpsi_ReInitPAT(dvbpsi_pat_decoder_t* p_pat_decoder, const bool b_force) { assert(p_pat_decoder); /* Force redecoding */ - p_pat_decoder->b_current_valid = false; - - /* Free structures */ - if (p_pat_decoder->p_building_pat) + if (b_force) { - free(p_pat_decoder->p_building_pat); - p_pat_decoder->p_building_pat = NULL; + 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++) @@ -255,6 +256,52 @@ static bool dvbpsi_CheckPAT(dvbpsi_t *p_dvbpsi, dvbpsi_psi_section_t *p_section) return b_reinit; } +static bool dvbpsi_IsCompletePAT(dvbpsi_pat_decoder_t* p_pat_decoder) +{ + assert(p_pat_decoder); + + 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]) + break; + if (i == p_pat_decoder->i_last_section_number) + b_complete = true; + } + return b_complete; +} + +static bool dvbpsi_AddSectionPAT(dvbpsi_t *p_dvbpsi, dvbpsi_pat_decoder_t *p_pat_decoder, + dvbpsi_psi_section_t* p_section) +{ + assert(p_dvbpsi); + assert(p_pat_decoder); + assert(p_section); + + /* Initialize the structures if it's the first section received */ + if (p_pat_decoder->p_building_pat == NULL) + { + p_pat_decoder->p_building_pat = dvbpsi_NewPAT(p_section->i_extension, + p_section->i_version, p_section->b_current_next); + if (p_pat_decoder->p_building_pat == NULL) + return false; + + p_pat_decoder->i_last_section_number = p_section->i_last_number; + } + + /* Fill the section array */ + if (p_pat_decoder->ap_sections[p_section->i_number] != NULL) + { + dvbpsi_debug(p_dvbpsi, "PAT decoder", "overwrite section number %d", + p_section->i_number); + dvbpsi_DeletePSISections(p_pat_decoder->ap_sections[p_section->i_number]); + } + p_pat_decoder->ap_sections[p_section->i_number] = p_section; + + return true; +} + /***************************************************************************** * dvbpsi_GatherPATSections ***************************************************************************** @@ -279,7 +326,7 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio /* TS discontinuity check */ if (p_pat_decoder->b_discontinuity) { - dvbpsi_ReInitPAT(p_pat_decoder); + dvbpsi_ReInitPAT(p_pat_decoder, true); p_pat_decoder->b_discontinuity = false; } else @@ -287,7 +334,7 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio if (p_pat_decoder->p_building_pat) { if (dvbpsi_CheckPAT(p_dvbpsi, p_section)) - dvbpsi_ReInitPAT(p_pat_decoder); + dvbpsi_ReInitPAT(p_pat_decoder, true); } else { @@ -306,45 +353,17 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio } } - /* 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*)calloc(1, sizeof(dvbpsi_pat_t)); - if (p_pat_decoder->p_building_pat == NULL) - { - dvbpsi_error(p_dvbpsi, "PAT decoder", "failed decoding section %d", - p_section->i_number); - dvbpsi_DeletePSISections(p_section); - return; - } - - dvbpsi_InitPAT(p_pat_decoder->p_building_pat, p_section->i_extension, - p_section->i_version, p_section->b_current_next); - p_pat_decoder->i_last_section_number = p_section->i_last_number; - } - - /* Fill the section array */ - if (p_pat_decoder->ap_sections[p_section->i_number] != NULL) + /* Add section to PAT */ + if (!dvbpsi_AddSectionPAT(p_dvbpsi, p_pat_decoder, p_section)) { - dvbpsi_debug(p_dvbpsi, "PAT decoder", "overwrite section number %d", + dvbpsi_error(p_dvbpsi, "PAT decoder", "failed decoding section %d", p_section->i_number); - dvbpsi_DeletePSISections(p_pat_decoder->ap_sections[p_section->i_number]); + dvbpsi_DeletePSISections(p_section); + return; } - 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]) - break; - if (i == p_pat_decoder->i_last_section_number) - b_complete = true; - } - - if (b_complete) + if (dvbpsi_IsCompletePAT(p_pat_decoder)) { assert(p_pat_decoder->pf_pat_callback); @@ -373,9 +392,7 @@ void dvbpsi_GatherPATSections(dvbpsi_t* p_dvbpsi, dvbpsi_psi_section_t* p_sectio 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++) - p_pat_decoder->ap_sections[i] = NULL; + dvbpsi_ReInitPAT(p_pat_decoder, false); } } _______________________________________________ libdvbpsi-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libdvbpsi-devel