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