fix broken interfaces in ETT parser

[email protected] (Michael Krufky)
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <[email protected]>
libdvbpsi | branch: master | Michael Krufky <[email protected]> | Sat Jan  7 16:40:13 2012 -0500| [981844678f3f03e671c6e7a592756f42bb1c2200] | committer: Jean-Paul Saman

fix broken interfaces in ETT parser

Signed-off-by: Michael Krufky <[email protected]>

> http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=981844678f3f03e671c6e7a592756f42bb1c2200
---

 src/tables/atsc_ett.c |   84 +++++++++++++++++++++++++++++++++++--------------
 src/tables/atsc_ett.h |   17 +++++++---
 2 files changed, 73 insertions(+), 28 deletions(-)

diff --git a/src/tables/atsc_ett.c b/src/tables/atsc_ett.c
index bd036c5..5b80edd 100644
--- a/src/tables/atsc_ett.c
+++ b/src/tables/atsc_ett.c
@@ -26,8 +26,10 @@ Decode PSIP Extended Text Table.
 #include <string.h>
 
 #include "dvbpsi.h"
+#include "dvbpsi_private.h"
 #include "psi.h"
 #include "descriptor.h"
+#include "demux.h"
 #include "atsc_ett.h"
 
 /*****************************************************************************
@@ -60,7 +62,8 @@ typedef struct dvbpsi_atsc_ett_decoder_s
  *****************************************************************************
  * Callback for the PSI decoder.
  *****************************************************************************/
-void dvbpsi_atsc_GatherETTSections(dvbpsi_decoder_t* p_decoder,
+void dvbpsi_atsc_GatherETTSections(dvbpsi_decoder_t * p_psi_decoder,
+                              void * p_private_decoder,
                               dvbpsi_psi_section_t* p_section);
 /*****************************************************************************
  * dvbpsi_atsc_DecodeETTSection
@@ -75,37 +78,52 @@ void dvbpsi_atsc_DecodeETTSection(dvbpsi_atsc_ett_t* p_ett,
  *****************************************************************************
  * Initialize a ETT decoder and return a handle on it.
  *****************************************************************************/
-dvbpsi_handle dvbpsi_atsc_AttachETT(dvbpsi_atsc_ett_callback pf_callback, void* p_cb_data)
+int dvbpsi_atsc_AttachETT(dvbpsi_decoder_t * p_psi_decoder, uint8_t i_table_id, uint16_t i_extension,
+                          dvbpsi_atsc_ett_callback pf_callback, void* p_cb_data)
 {
-  dvbpsi_handle h_dvbpsi = (dvbpsi_decoder_t*)malloc(sizeof(dvbpsi_decoder_t));
+  dvbpsi_demux_t* p_demux = (dvbpsi_demux_t*)p_psi_decoder->p_private_decoder;
+  dvbpsi_demux_subdec_t* p_subdec;
   dvbpsi_atsc_ett_decoder_t* p_ett_decoder;
 
-  if(h_dvbpsi == NULL)
-    return NULL;
+  if(dvbpsi_demuxGetSubDec(p_demux, i_table_id, i_extension))
+  {
+    DVBPSI_ERROR_ARG("ETT decoder",
+                     "Already a decoder for (table_id == 0x%02x extension == 0x%04x)",
+                     i_table_id, i_extension);
+
+    return 1;
+  }
+
+  p_subdec = (dvbpsi_demux_subdec_t*)malloc(sizeof(dvbpsi_demux_subdec_t));
+  if(p_subdec == NULL)
+  {
+    return 1;
+  }
 
   p_ett_decoder = (dvbpsi_atsc_ett_decoder_t*)malloc(sizeof(dvbpsi_atsc_ett_decoder_t));
 
   if(p_ett_decoder == NULL)
   {
-    free(h_dvbpsi);
-    return NULL;
+    free(p_subdec);
+    return 1;
   }
 
   /* PSI decoder configuration */
-  h_dvbpsi->pf_callback = &dvbpsi_atsc_GatherETTSections;
-  h_dvbpsi->p_private_decoder = p_ett_decoder;
-  h_dvbpsi->i_section_max_size = 4096;
-  /* PSI decoder initial state */
-  h_dvbpsi->i_continuity_counter = 31;
-  h_dvbpsi->b_discontinuity = 1;
-  h_dvbpsi->p_current_section = NULL;
+  p_subdec->pf_callback = &dvbpsi_atsc_GatherETTSections;
+  p_subdec->p_cb_data = p_ett_decoder;
+  p_subdec->i_id = ((uint32_t)i_table_id << 16) | i_extension;
+  p_subdec->pf_detach = dvbpsi_atsc_DetachETT;
+
+  /* Attach the subtable decoder to the demux */
+  p_subdec->p_next = p_demux->p_first_subdec;
+  p_demux->p_first_subdec = p_subdec;
 
   /* ETT decoder information */
   p_ett_decoder->pf_callback = pf_callback;
   p_ett_decoder->p_cb_data = p_cb_data;
   p_ett_decoder->p_etm_versions = NULL;
 
-  return h_dvbpsi;
+  return 0;
 }
 
 
@@ -114,10 +132,23 @@ dvbpsi_handle dvbpsi_atsc_AttachETT(dvbpsi_atsc_ett_callback pf_callback, void*
  *****************************************************************************
  * Close a ETT decoder. The handle isn't valid any more.
  *****************************************************************************/
-void dvbpsi_atsc_DetachETT(dvbpsi_handle h_dvbpsi)
+void dvbpsi_atsc_DetachETT(dvbpsi_demux_t * p_demux, uint8_t i_table_id, uint16_t i_extension)
 {
-  dvbpsi_atsc_ett_decoder_t* p_ett_decoder
-                    = (dvbpsi_atsc_ett_decoder_t*)h_dvbpsi->p_private_decoder;
+  dvbpsi_demux_subdec_t* p_subdec;
+  dvbpsi_demux_subdec_t** pp_prev_subdec;
+  dvbpsi_atsc_ett_decoder_t* p_ett_decoder;
+  p_subdec = dvbpsi_demuxGetSubDec(p_demux, i_table_id, i_extension);
+
+  if(p_demux == NULL)
+  {
+    DVBPSI_ERROR_ARG("ETT Decoder",
+                     "No such ETT decoder (table_id == 0x%02x,"
+                     "extension == 0x%04x)",
+                     i_table_id, i_extension);
+    return;
+  }
+
+  p_ett_decoder = (dvbpsi_atsc_ett_decoder_t*)p_subdec->p_cb_data;
   dvbpsi_atsc_ett_etm_version_t *p_etm_version, *p_next;
   for (p_etm_version = p_ett_decoder->p_etm_versions; p_etm_version; p_etm_version = p_next)
   {
@@ -125,10 +156,14 @@ void dvbpsi_atsc_DetachETT(dvbpsi_handle h_dvbpsi)
     free(p_etm_version);
   }
 
-  free(h_dvbpsi->p_private_decoder);
-  if(h_dvbpsi->p_current_section)
-    dvbpsi_DeletePSISections(h_dvbpsi->p_current_section);
-  free(h_dvbpsi);
+  free(p_subdec->p_cb_data);
+
+  pp_prev_subdec = &p_demux->p_first_subdec;
+  while(*pp_prev_subdec != p_subdec)
+    pp_prev_subdec = &(*pp_prev_subdec)->p_next;
+
+  *pp_prev_subdec = p_subdec->p_next;
+  free(p_subdec);
 }
 
 
@@ -178,11 +213,12 @@ void dvbpsi_atsc_EmptyETT(dvbpsi_atsc_ett_t *p_ett)
  *****************************************************************************
  * Callback for the PSI decoder.
  *****************************************************************************/
-void dvbpsi_atsc_GatherETTSections(dvbpsi_decoder_t* p_decoder,
+void dvbpsi_atsc_GatherETTSections(dvbpsi_decoder_t* p_psi_decoder,
+                              void * p_private_decoder,
                               dvbpsi_psi_section_t* p_section)
 {
   dvbpsi_atsc_ett_decoder_t* p_ett_decoder
-                        = (dvbpsi_atsc_ett_decoder_t*)p_decoder->p_private_decoder;
+                        = (dvbpsi_atsc_ett_decoder_t*)p_private_decoder;
 
   if(p_section->i_table_id == 0xCC)
   {
diff --git a/src/tables/atsc_ett.h b/src/tables/atsc_ett.h
index f137472..96a673a 100644
--- a/src/tables/atsc_ett.h
+++ b/src/tables/atsc_ett.h
@@ -23,6 +23,9 @@ Decode PSIP Extended Text Table.
 #ifndef _ATSC_ETT_H
 #define _ATSC_ETT_H 
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 /*****************************************************************************
  * dvbpsi_atsc_ett_t
@@ -68,11 +71,13 @@ typedef void (* dvbpsi_atsc_ett_callback)(void* p_cb_data, dvbpsi_atsc_ett_t* p_
             dvbpsi_atsc_ett_callback pf_callback, void* p_cb_data)
  *
  * \brief Creation and initialization of a ETT decoder.
+ * \param i_extension Table ID extension, normally 0x0000.
  * \param pf_callback function to call back on new ETT.
  * \param p_cb_data private data given in argument to the callback.
  * \return 0 if everything went ok.
  */
-dvbpsi_handle dvbpsi_atsc_AttachETT(dvbpsi_atsc_ett_callback pf_callback, void* p_cb_data);
+int dvbpsi_atsc_AttachETT(dvbpsi_decoder_t * p_psi_decoder, uint8_t i_table_id,
+          uint16_t i_extension, dvbpsi_atsc_ett_callback pf_callback, void* p_cb_data);
 
 
 /*****************************************************************************
@@ -84,11 +89,11 @@ dvbpsi_handle dvbpsi_atsc_AttachETT(dvbpsi_atsc_ett_callback pf_callback, void*
  * \brief Destroy a ETT decoder.
  * \param p_demux Subtable demultiplexor to which the decoder is attached.
  * \param i_table_id Table ID, 0xCD.
- * \param i_extension Table extension, ignored as this should always be 0.
- *                    (Required to match prototype for demux)
+ * \param i_extension Table ID extension, normally 0x0000.
  * \return nothing.
  */
-void dvbpsi_atsc_DetachETT(dvbpsi_handle h_dvbpsi);
+void dvbpsi_atsc_DetachETT(dvbpsi_demux_t * p_demux, uint8_t i_table_id,
+          uint16_t i_extension);
 
 
 /*****************************************************************************
@@ -148,4 +153,8 @@ void dvbpsi_atsc_EmptyETT(dvbpsi_atsc_ett_t *p_ett);
     free(p_ett);							\
   } while(0);
 
+#ifdef __cplusplus
+};
+#endif
+
 #endif

_______________________________________________
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.