From daa8c4cb3bd3eaf71448cae646fed9cea83ad9d4 Mon Sep 17 00:00:00 2001 From: Chris Rankin Date: Wed, 5 Oct 2011 15:20:37 +0100 Subject: Bring xine_private.h into line with 1.2 branch, which already has this capability, and force an error if someone tries to include xine_private.h in an unsuitable source file. --- src/xine-engine/xine_private.h | 19 +++++++++++++++++-- src/xine-utils/attributes.h | 9 --------- 2 files changed, 17 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/xine-engine/xine_private.h b/src/xine-engine/xine_private.h index 1f3564cbc..35005e45d 100644 --- a/src/xine-engine/xine_private.h +++ b/src/xine-engine/xine_private.h @@ -21,6 +21,21 @@ #ifndef HAVE_XINE_PRIVATE_H #define HAVE_XINE_PRIVATE_H +#ifndef XINE_LIBRARY_COMPILE +# error xine_private.h is for libxine's private use only! +#endif + +#include "configure.h" + +/* Export internal only for functions that are unavailable to plugins */ +#if defined(SUPPORT_ATTRIBUTE_VISIBILITY_INTERNAL) +# define INTERNAL __attribute__((__visibility__("internal"))) +#elif defined(SUPPORT_ATTRIBUTE_VISIBILITY_DEFAULT) +# define INTERNAL __attribute__((__visibility__("default"))) +#else +# define INTERNAL +#endif + #ifdef __cplusplus extern "C" { #endif @@ -28,9 +43,9 @@ extern "C" { /* * make file descriptors and sockets uninheritable */ -int _x_set_file_close_on_exec(int fd) XINE_INTERNAL; +int _x_set_file_close_on_exec(int fd) INTERNAL; -int _x_set_socket_close_on_exec(int s) XINE_INTERNAL; +int _x_set_socket_close_on_exec(int s) INTERNAL; #ifdef __cplusplus } diff --git a/src/xine-utils/attributes.h b/src/xine-utils/attributes.h index 9f02d9b7b..2326dab18 100644 --- a/src/xine-utils/attributes.h +++ b/src/xine-utils/attributes.h @@ -66,15 +66,6 @@ # define XINE_PROTECTED #endif -/* Export hidden only for private/internal libxine functions */ -#if defined(XINE_LIBRARY_COMPILE) && defined(SUPPORT_ATTRIBUTE_VISIBILITY_INTERNAL) -# define XINE_INTERNAL __attribute__((__visibility__("internal"))) -#elif defined(XINE_LIBRARY_COMPILE) && defined(SUPPORT_ATTRIBUTE_VISIBILITY_DEFAULT) -# define XINE_INTERNAL __attribute__((__visibility__("default"))) -#else -# define XINE_INTERNAL -#endif - #ifdef SUPPORT_ATTRIBUTE_SENTINEL # define XINE_SENTINEL __attribute__((__sentinel__)) #else -- cgit v1.2.3 From 056408cf0fb53273841eb5d8965bffcd85560307 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 6 Oct 2011 14:18:57 +0300 Subject: demux_ts.c: always parse PAT --- src/demuxers/demux_ts.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 8ec2b60eb..64cd7ab01 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -1957,11 +1957,14 @@ static void demux_ts_parse_packet (demux_ts_t*this) { return; } - data_len = PKT_SIZE - data_offset; + /* PAT */ + if (pid == 0) { + demux_ts_parse_pat(this, originalPkt, originalPkt+data_offset-4, + payload_unit_start_indicator); + return; + } - /* - * audio/video pid auto-detection, if necessary - */ + /* PMT */ program_count=0; if(this->media_numprogram_number[program_count] != INVALID_PROGRAM) && @@ -1981,11 +1984,7 @@ static void demux_ts_parse_packet (demux_ts_t*this) { program_count++; } - if (payload_unit_start_indicator && (this->media_num < MAX_PIDS) && (pid == 0)) { - demux_ts_parse_pat(this, originalPkt, originalPkt+data_offset-4, - payload_unit_start_indicator); - return; - } + data_len = PKT_SIZE - data_offset; if (data_len > PKT_SIZE) { -- cgit v1.2.3 From d4414a81492ac0d172b4a89fc91f239d4e63ac4d Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 6 Oct 2011 14:23:44 +0300 Subject: demux_ts: always check if pid is PMT PID --- src/demuxers/demux_ts.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 64cd7ab01..5c681e5e2 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -1966,7 +1966,6 @@ static void demux_ts_parse_packet (demux_ts_t*this) { /* PMT */ program_count=0; - if(this->media_numprogram_number[program_count] != INVALID_PROGRAM) && (program_count < MAX_PMTS)) { if (pid == this->pmt_pid[program_count]) { -- cgit v1.2.3 From 482c6451982d9273e1d6f96e627df7a6511dd5ac Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 6 Oct 2011 14:24:53 +0300 Subject: Cosmetics (fixed indent) --- src/demuxers/demux_ts.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 5c681e5e2..b8d655598 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -1965,23 +1965,23 @@ static void demux_ts_parse_packet (demux_ts_t*this) { } /* PMT */ - program_count=0; - while ((this->program_number[program_count] != INVALID_PROGRAM) && - (program_count < MAX_PMTS)) { - if (pid == this->pmt_pid[program_count]) { + program_count=0; + while ((this->program_number[program_count] != INVALID_PROGRAM) && + (program_count < MAX_PMTS)) { + if (pid == this->pmt_pid[program_count]) { #ifdef TS_LOG - printf ("demux_ts: PMT prog: 0x%.4x pid: 0x%.4x\n", - this->program_number[program_count], - this->pmt_pid[program_count]); + printf ("demux_ts: PMT prog: 0x%.4x pid: 0x%.4x\n", + this->program_number[program_count], + this->pmt_pid[program_count]); #endif - demux_ts_parse_pmt (this, originalPkt, originalPkt+data_offset-4, - payload_unit_start_indicator, - program_count); - return; - } - program_count++; + demux_ts_parse_pmt (this, originalPkt, originalPkt+data_offset-4, + payload_unit_start_indicator, + program_count); + return; } + program_count++; + } data_len = PKT_SIZE - data_offset; -- cgit v1.2.3 From 36fce1928cafcd8e2bd7c19bfb32af18c9969cb8 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 6 Oct 2011 14:57:09 +0300 Subject: demux_ts: Do not parse PAT unless it was changed (CRC) --- src/demuxers/demux_ts.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index b8d655598..76cdb4550 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -318,6 +318,10 @@ typedef struct { int rate; int media_num; demux_ts_media media[MAX_PIDS]; + + /* PAT */ + uint32_t last_pat_crc; + /* programs */ uint32_t program_number[MAX_PMTS]; uint32_t pmt_pid[MAX_PMTS]; uint8_t *pmt[MAX_PMTS]; @@ -634,6 +638,13 @@ static void demux_ts_parse_pat (demux_ts_t*this, unsigned char *original_pkt, } #endif + if (crc32 == this->last_pat_crc) { + lprintf("demux_ts: PAT CRC unchanged\n"); + return; + } + + this->last_pat_crc = crc32; + /* * Process all programs in the program loop. */ @@ -2378,6 +2389,9 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, /* * Initialise our specialised data. */ + + this->last_pat_crc = 0; + for (i = 0; i < MAX_PIDS; i++) { this->media[i].pid = INVALID_PID; this->media[i].buf = NULL; -- cgit v1.2.3 From ed405d729443f414faa9e92094a23bad236ae9c6 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Thu, 6 Oct 2011 15:05:17 +0300 Subject: demux_ts: detect transport stream changes from PAT * * * Make sure initial PAT is parsed even if it's crc is 0 --- src/demuxers/demux_ts.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 76cdb4550..e891a5cbe 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -321,6 +321,7 @@ typedef struct { /* PAT */ uint32_t last_pat_crc; + uint32_t transport_stream_id; /* programs */ uint32_t program_number[MAX_PMTS]; uint32_t pmt_pid[MAX_PMTS]; @@ -638,12 +639,19 @@ static void demux_ts_parse_pat (demux_ts_t*this, unsigned char *original_pkt, } #endif - if (crc32 == this->last_pat_crc) { + if (crc32 == this->last_pat_crc && + this->transport_stream_id == transport_stream_id) { lprintf("demux_ts: PAT CRC unchanged\n"); return; } + if (this->transport_stream_id != transport_stream_id) { + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + "demux_ts: PAT transport_stream_id changed\n"); + } + this->last_pat_crc = crc32; + this->transport_stream_id = transport_stream_id; /* * Process all programs in the program loop. @@ -2391,6 +2399,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, */ this->last_pat_crc = 0; + this->transport_stream_id = -1; for (i = 0; i < MAX_PIDS; i++) { this->media[i].pid = INVALID_PID; -- cgit v1.2.3