vlc | branch: master | Francois Cartegnie <[email protected]> | Sat Feb 6 17:36:28 2016 +0100| [42bce5b921c5a3f73eb81b6f56be91fb0319bf13] | committer: Francois Cartegnie
demux: ts: add dvbpsi based raw tables subdecoder > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=42bce5b921c5a3f73eb81b6f56be91fb0319bf13 --- modules/demux/mpeg/ts_decoders.c | 130 ++++++++++++++++++++++++++++++++++++++ modules/demux/mpeg/ts_decoders.h | 34 ++++++++++ 2 files changed, 164 insertions(+) diff --git a/modules/demux/mpeg/ts_decoders.c b/modules/demux/mpeg/ts_decoders.c new file mode 100644 index 0000000..59819f1 --- /dev/null +++ b/modules/demux/mpeg/ts_decoders.c @@ -0,0 +1,130 @@ +/***************************************************************************** + * ts_decoders.c: TS Demux custom tables decoders + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <vlc_common.h> + +#ifndef _DVBPSI_DVBPSI_H_ + #include <dvbpsi/dvbpsi.h> +#endif +#ifndef _DVBPSI_DEMUX_H_ + #include <dvbpsi/demux.h> +#endif +#include <dvbpsi/psi.h> + +#include "ts_decoders.h" + +typedef struct +{ + DVBPSI_DECODER_COMMON + + ts_dvbpsi_rawsections_callback_t pf_callback; + void * p_cb_data; + +} ts_dvbpsi_rawtable_decoder_t; + +static void ts_dvbpsi_RawSubDecoderGatherSections( dvbpsi_t *p_dvbpsi, + dvbpsi_decoder_t *p_decoder, + dvbpsi_psi_section_t * p_section ) +{ + dvbpsi_demux_t *p_demux = (dvbpsi_demux_t *) p_dvbpsi->p_decoder; + ts_dvbpsi_rawtable_decoder_t *p_tabledec = (ts_dvbpsi_rawtable_decoder_t*)p_decoder; + if ( !p_tabledec ) + { + dvbpsi_DeletePSISections( p_section ); + return; + } + + if ( p_demux->b_discontinuity ) + { + dvbpsi_decoder_reset( DVBPSI_DECODER(p_decoder), true ); + p_tabledec->b_discontinuity = false; + p_demux->b_discontinuity = false; + } + else if( p_decoder->i_last_section_number != p_section->i_last_number ) + { + dvbpsi_decoder_reset( DVBPSI_DECODER(p_decoder), true ); + } + + /* Add to linked list of sections */ + (void) dvbpsi_decoder_psi_section_add( DVBPSI_DECODER(p_decoder), p_section ); + + /* Check if we have all the sections */ + if ( dvbpsi_decoder_psi_sections_completed( DVBPSI_DECODER(p_decoder) ) ) + { + p_tabledec->b_current_valid = true; + + p_tabledec->pf_callback( p_dvbpsi, + p_decoder->p_sections, + p_tabledec->p_cb_data ); + + /* Delete sections */ + dvbpsi_decoder_reset( DVBPSI_DECODER(p_decoder), false ); + } +} + +void ts_dvbpsi_DetachRawSubDecoder( dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_extension ) +{ + dvbpsi_demux_t *p_demux = (dvbpsi_demux_t *) p_dvbpsi->p_decoder; + + dvbpsi_demux_subdec_t* p_subdec; + p_subdec = dvbpsi_demuxGetSubDec( p_demux, i_table_id, i_extension ); + if ( p_subdec == NULL || !p_subdec->p_decoder ) + return; + + dvbpsi_DetachDemuxSubDecoder( p_demux, p_subdec ); + dvbpsi_DeleteDemuxSubDecoder( p_subdec ); +} + +bool ts_dvbpsi_AttachRawSubDecoder( dvbpsi_t* p_dvbpsi, + uint8_t i_table_id, uint16_t i_extension, + ts_dvbpsi_rawsections_callback_t pf_callback, + void *p_cb_data ) +{ + dvbpsi_demux_t *p_demux = (dvbpsi_demux_t*)p_dvbpsi->p_decoder; + if ( dvbpsi_demuxGetSubDec(p_demux, i_table_id, i_extension) ) + return false; + + ts_dvbpsi_rawtable_decoder_t *p_decoder; + p_decoder = (ts_dvbpsi_rawtable_decoder_t *) dvbpsi_decoder_new( NULL, 0, true, sizeof(*p_decoder) ); + if ( p_decoder == NULL ) + return false; + + /* subtable decoder configuration */ + dvbpsi_demux_subdec_t* p_subdec; + p_subdec = dvbpsi_NewDemuxSubDecoder( i_table_id, i_extension, + ts_dvbpsi_DetachRawSubDecoder, + ts_dvbpsi_RawSubDecoderGatherSections, + DVBPSI_DECODER(p_decoder) ); + if (p_subdec == NULL) + { + dvbpsi_decoder_delete( DVBPSI_DECODER(p_decoder) ); + return false; + } + + /* Attach the subtable decoder to the demux */ + dvbpsi_AttachDemuxSubDecoder( p_demux, p_subdec ); + + p_decoder->pf_callback = pf_callback; + p_decoder->p_cb_data = p_cb_data; + + return true; +} diff --git a/modules/demux/mpeg/ts_decoders.h b/modules/demux/mpeg/ts_decoders.h new file mode 100644 index 0000000..0b50a10 --- /dev/null +++ b/modules/demux/mpeg/ts_decoders.h @@ -0,0 +1,34 @@ +/***************************************************************************** + * ts_decoders.h: TS Demux custom tables decoders + ***************************************************************************** + * Copyright (C) 2016 VLC authors and VideoLAN + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + *****************************************************************************/ +#ifndef VLC_TS_DECODERS_H +#define VLC_TS_DECODERS_H + +typedef void (* ts_dvbpsi_rawsections_callback_t)( dvbpsi_t *p_dvbpsi, + const dvbpsi_psi_section_t* p_section, + void* p_cb_data ); + +bool ts_dvbpsi_AttachRawSubDecoder( dvbpsi_t* p_dvbpsi, + uint8_t i_table_id, uint16_t i_extension, + ts_dvbpsi_rawsections_callback_t pf_callback, + void* p_cb_data ); + +void ts_dvbpsi_DetachRawSubDecoder( dvbpsi_t *p_dvbpsi, uint8_t i_table_id, uint16_t i_extension ); + + +#endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
