PAT: refactor 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]> | 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++)

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libdvbpsi-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.