mpegtsdemux: dynamically adjust the sync LUT table

Make the sync LUT table adjusted dynamically according to the size
of scanned data. Fixes demuxing buffers of any size.
This commit is contained in:
Josep Torra 2009-03-03 18:28:10 +00:00 committed by Zaheer Merali
parent b02708a2f6
commit 84860befdf
2 changed files with 17 additions and 5 deletions

View file

@ -325,6 +325,8 @@ gst_mpegts_demux_init (GstMpegTSDemux * demux)
demux->program_number = DEFAULT_PROP_PROGRAM_NUMBER;
demux->packetsize = MPEGTS_NORMAL_TS_PACKETSIZE;
demux->m2ts_mode = FALSE;
demux->sync_lut = NULL;
demux->sync_lut_len = 0;
#ifdef USE_LIBOIL
oil_init ();
@ -2503,7 +2505,17 @@ gst_mpegts_demux_sync_scan (GstMpegTSDemux * demux, const guint8 * in_data,
const guint8 *end_scan = in_data + size - demux->packetsize;
guint8 *ptr_data = (guint8 *) in_data;
while (ptr_data <= end_scan && sync_count < LENGTH_SYNC_LUT) {
/* Check if the LUT table is big enough */
if (G_UNLIKELY (demux->sync_lut_len < (size / MPEGTS_NORMAL_TS_PACKETSIZE))) {
demux->sync_lut_len = size / MPEGTS_NORMAL_TS_PACKETSIZE;
if (demux->sync_lut)
g_free (demux->sync_lut);
demux->sync_lut = g_new0 (guint8 *, demux->sync_lut_len);
GST_DEBUG_OBJECT (demux, "created sync LUT table with %u entries",
demux->sync_lut_len);
}
while (ptr_data <= end_scan && sync_count < demux->sync_lut_len) {
/* if sync code is found try to store it in the LUT */
guint chance = is_mpegts_sync (ptr_data, end_scan, demux->packetsize);
if (G_LIKELY (chance > 50)) {
@ -2592,7 +2604,6 @@ gst_mpegts_demux_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
demux->adapter = gst_adapter_new ();
demux->sync_lut = g_new0 (guint8 *, LENGTH_SYNC_LUT);
break;
case GST_STATE_CHANGE_READY_TO_PAUSED:
break;
@ -2608,7 +2619,9 @@ gst_mpegts_demux_change_state (GstElement * element, GstStateChange transition)
break;
case GST_STATE_CHANGE_READY_TO_NULL:
g_object_unref (demux->adapter);
g_free (demux->sync_lut);
if (demux->sync_lut)
g_free (demux->sync_lut);
demux->sync_lut = NULL;
break;
default:
break;

View file

@ -60,8 +60,6 @@ G_BEGIN_DECLS
#define MPEGTS_NORMAL_TS_PACKETSIZE 188
#define MPEGTS_M2TS_TS_PACKETSIZE 192
#define LENGTH_SYNC_LUT 256
#define IS_MPEGTS_SYNC(data) (((data)[0] == 0x47) && \
(((data)[1] & 0x80) == 0x00) && \
(((data)[3] & 0x10) == 0x10))
@ -182,6 +180,7 @@ struct _GstMpegTSDemux {
GstPad * sinkpad;
GstAdapter * adapter;
guint8 ** sync_lut;
guint sync_lut_len;
/* current PMT PID */
guint16 current_PMT;