NIT: refactor dvbpsi_GatherNITSections
[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 16:49:47 2012 +0200| [d1ba16b47c994c906e7f5eb666a48f742c7a7017] | committer: Jean-Paul Saman NIT: refactor dvbpsi_GatherNITSections > http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=d1ba16b47c994c906e7f5eb666a48f742c7a7017 --- src/tables/nit.c | 198 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 121 insertions(+), 77 deletions(-) diff --git a/src/tables/nit.c b/src/tables/nit.c index 8f52dc5..bee4c6e 100644 --- a/src/tables/nit.c +++ b/src/tables/nit.c @@ -1,7 +1,7 @@ /***************************************************************************** * nit.c: NIT decoder/generator *---------------------------------------------------------------------------- - * Copyright (C) 2001-2011 VideoLAN + * Copyright (C) 2001-2012 VideoLAN * $Id$ * * Authors: Johann Hanne @@ -290,6 +290,107 @@ dvbpsi_descriptor_t* dvbpsi_NITTSAddDescriptor(dvbpsi_nit_ts_t* p_ts, return p_descriptor; } +/* */ +static void dvbpsi_ReInitNIT(dvbpsi_nit_decoder_t* p_decoder, const bool b_force) +{ + assert(p_decoder); + + /* Force redecoding */ + if (b_force) + { + p_decoder->b_current_valid = false; + + /* Free structures */ + if (p_decoder->p_building_nit) + dvbpsi_DeleteNIT(p_decoder->p_building_nit); + } + p_decoder->p_building_nit = NULL; + + /* Clear the section array */ + for (unsigned int i = 0; i <= 255; i++) + { + if (p_decoder->ap_sections[i] != NULL) + { + dvbpsi_DeletePSISections(p_decoder->ap_sections[i]); + p_decoder->ap_sections[i] = NULL; + } + } +} + +static bool dvbpsi_CheckNIT(dvbpsi_t *p_dvbpsi, dvbpsi_nit_decoder_t *p_nit_decoder, + dvbpsi_psi_section_t *p_section) +{ + assert(p_dvbpsi); + assert(p_nit_decoder); + + bool b_reinit = false; + + if (p_nit_decoder->p_building_nit->i_version != p_section->i_version) + { + /* version_number */ + dvbpsi_error(p_dvbpsi, "NIT decoder", + "'version_number' differs" + " whereas no discontinuity has occured"); + b_reinit = true; + } + else if (p_nit_decoder->i_last_section_number + != p_section->i_last_number) + { + /* last_section_number */ + dvbpsi_error(p_dvbpsi, "NIT decoder", + "'last_section_number' differs" + " whereas no discontinuity has occured"); + b_reinit = true; + } + + return b_reinit; +} + +static bool dvbpsi_IsCompleteNIT(dvbpsi_nit_decoder_t* p_nit_decoder) +{ + assert(p_nit_decoder); + + bool b_complete = false; + + for (unsigned int i = 0; i <= p_nit_decoder->i_last_section_number; i++) + { + if (!p_nit_decoder->ap_sections[i]) + break; + if (i == p_nit_decoder->i_last_section_number) + b_complete = true; + } + return b_complete; +} + +static bool dvbpsi_AddSectionNIT(dvbpsi_t *p_dvbpsi, dvbpsi_nit_decoder_t *p_nit_decoder, + dvbpsi_psi_section_t* p_section) +{ + assert(p_dvbpsi); + assert(p_nit_decoder); + assert(p_section); + + /* Initialize the structures if it's the first section received */ + if (p_nit_decoder->p_building_nit == NULL) + { + p_nit_decoder->p_building_nit = dvbpsi_NewNIT(p_nit_decoder->i_network_id, + p_section->i_version, p_section->b_current_next); + if (p_nit_decoder->p_building_nit == NULL) + return false; + p_nit_decoder->i_last_section_number = p_section->i_last_number; + } + + /* Fill the section array */ + if (p_nit_decoder->ap_sections[p_section->i_number] != NULL) + { + dvbpsi_debug(p_dvbpsi, "NIT decoder", "overwrite section number %d", + p_section->i_number); + dvbpsi_DeletePSISections(p_nit_decoder->ap_sections[p_section->i_number]); + } + p_nit_decoder->ap_sections[p_section->i_number] = p_section; + + return true; +} + /***************************************************************************** * dvbpsi_GatherNITSections ***************************************************************************** @@ -315,7 +416,7 @@ void dvbpsi_GatherNITSections(dvbpsi_t *p_dvbpsi, dvbpsi_nit_decoder_t* p_nit_decoder = (dvbpsi_nit_decoder_t*)p_private_decoder; - /* Now if b_append is true then we have a valid NIT section */ + /* We have a valid NIT section */ if (p_nit_decoder->i_network_id != p_section->i_extension) { /* Invalid program_number */ @@ -324,12 +425,10 @@ void dvbpsi_GatherNITSections(dvbpsi_t *p_dvbpsi, return; } - bool b_reinit = false; - /* TS discontinuity check */ if (p_nit_decoder->b_discontinuity) { - b_reinit = true; + dvbpsi_ReInitNIT(p_nit_decoder, true); p_nit_decoder->b_discontinuity = false; } else @@ -337,23 +436,8 @@ void dvbpsi_GatherNITSections(dvbpsi_t *p_dvbpsi, /* Perform some few sanity checks */ if (p_nit_decoder->p_building_nit) { - if (p_nit_decoder->p_building_nit->i_version != p_section->i_version) - { - /* version_number */ - dvbpsi_error(p_dvbpsi, "NIT decoder", - "'version_number' differs" - " whereas no discontinuity has occured"); - b_reinit = true; - } - else if (p_nit_decoder->i_last_section_number - != p_section->i_last_number) - { - /* last_section_number */ - dvbpsi_error(p_dvbpsi, "NIT decoder", - "'last_section_number' differs" - " whereas no discontinuity has occured"); - b_reinit = true; - } + if (dvbpsi_CheckNIT(p_dvbpsi, p_nit_decoder, p_section)) + dvbpsi_ReInitNIT(p_nit_decoder, true); } else { @@ -362,73 +446,33 @@ void dvbpsi_GatherNITSections(dvbpsi_t *p_dvbpsi, && (p_nit_decoder->current_nit.b_current_next == p_section->b_current_next)) { /* Don't decode since this version is already decoded */ + dvbpsi_debug(p_dvbpsi, "NIT decoder", + "ignoring already decoded section %d", + p_section->i_number); dvbpsi_DeletePSISections(p_section); return;; } } } - /* Reinit the decoder if wanted */ - if (b_reinit) - { - /* Force redecoding */ - p_nit_decoder->b_current_valid = false; - /* Free structures */ - if(p_nit_decoder->p_building_nit) - { - dvbpsi_DeleteNIT(p_nit_decoder->p_building_nit); - p_nit_decoder->p_building_nit = NULL; - } - /* Clear the section array */ - for (unsigned int i = 0; i <= 255; i++) - { - if (p_nit_decoder->ap_sections[i] != NULL) - { - dvbpsi_DeletePSISections(p_nit_decoder->ap_sections[i]); - p_nit_decoder->ap_sections[i] = NULL; - } - } - } - - /* Initialize the structures if it's the first section received */ - if (!p_nit_decoder->p_building_nit) - { - p_nit_decoder->p_building_nit = (dvbpsi_nit_t*)malloc(sizeof(dvbpsi_nit_t)); - if (p_nit_decoder->p_building_nit) - dvbpsi_InitNIT(p_nit_decoder->p_building_nit, - p_nit_decoder->i_network_id, - p_section->i_version, - p_section->b_current_next); - else - dvbpsi_debug(p_dvbpsi, "NIT decoder", "failed decoding section"); - p_nit_decoder->i_last_section_number = p_section->i_last_number; - } - - /* Fill the section array */ - if (p_nit_decoder->ap_sections[p_section->i_number] != NULL) + /* Add section to NIT */ + if (!dvbpsi_AddSectionNIT(p_dvbpsi, p_nit_decoder, p_section)) { - dvbpsi_debug(p_dvbpsi, "NIT decoder", "overwrite section number %d", - p_section->i_number); - dvbpsi_DeletePSISections(p_nit_decoder->ap_sections[p_section->i_number]); + dvbpsi_error(p_dvbpsi, "NIT decoder", "failed decoding section %d", + p_section->i_number); + dvbpsi_DeletePSISections(p_section); + return; } - p_nit_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_nit_decoder->i_last_section_number; i++) + if (dvbpsi_IsCompleteNIT(p_nit_decoder)) { - if (!p_nit_decoder->ap_sections[i]) - break; - if (i == p_nit_decoder->i_last_section_number) - b_complete = true; - } + assert(p_nit_decoder->pf_nit_callback); - if (b_complete) - { /* Save the current information */ p_nit_decoder->current_nit = *p_nit_decoder->p_building_nit; p_nit_decoder->b_current_valid = true; + /* Chain the sections */ if (p_nit_decoder->i_last_section_number) { @@ -436,19 +480,19 @@ void dvbpsi_GatherNITSections(dvbpsi_t *p_dvbpsi, p_nit_decoder->ap_sections[i]->p_next = p_nit_decoder->ap_sections[i + 1]; } + /* Decode the sections */ dvbpsi_DecodeNITSections(p_nit_decoder->p_building_nit, p_nit_decoder->ap_sections[0]); /* Delete the sections */ dvbpsi_DeletePSISections(p_nit_decoder->ap_sections[0]); p_nit_decoder->ap_sections[0] = NULL; + /* signal the new NIT */ p_nit_decoder->pf_nit_callback(p_nit_decoder->p_cb_data, p_nit_decoder->p_building_nit); /* Reinitialize the structures */ - p_nit_decoder->p_building_nit = NULL; - for (unsigned int i = 0; i <= p_nit_decoder->i_last_section_number; i++) - p_nit_decoder->ap_sections[i] = NULL; + dvbpsi_ReInitNIT(p_nit_decoder, false); } } _______________________________________________ libdvbpsi-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libdvbpsi-devel