From 2f35943b5baa4b90cae8a0ac75ace744b1c712d0 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Tue, 13 Dec 2011 10:50:56 +0200 Subject: demux_ts_dynamic_pmt_clear(): set spu_media to 0 --- src/demuxers/demux_ts.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 9c0804fbe..8f804460c 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -565,6 +565,7 @@ static void demux_ts_dynamic_pmt_clear (demux_ts_t *this) { this->audio_tracks_count = 0; this->spu_pid = INVALID_PID; this->spu_langs_count = 0; + this->spu_media = 0; this->pcr_pid = INVALID_PID; -- cgit v1.2.3 From 7e86bfe9d33398d0164663a258e97122f8a28043 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Tue, 13 Dec 2011 10:57:08 +0200 Subject: demux_ts: free pending buffers when handling XINE_EVENT_PIDS_CHANGE --- src/demuxers/demux_ts.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 8f804460c..238adf979 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -2300,15 +2300,8 @@ static void demux_ts_event_handler (demux_ts_t *this) { case XINE_EVENT_PIDS_CHANGE: - this->videoPid = INVALID_PID; - this->pcr_pid = INVALID_PID; - this->audio_tracks_count = 0; - this->media_num = 0; + demux_ts_dynamic_pmt_clear(this); this->send_newpts = 1; - this->spu_pid = INVALID_PID; - this->spu_media = 0; - this->spu_langs_count= 0; - this->last_pmt_crc = 0; _x_demux_control_start (this->stream); break; -- cgit v1.2.3 From 8a4a1ff3385b833526b4d1d10d9b3e793d3828bf Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Tue, 13 Dec 2011 11:02:47 +0200 Subject: hdmv_decoder: log unknown segment type --- src/libspuhdmv/xine_hdmv_decoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/libspuhdmv/xine_hdmv_decoder.c b/src/libspuhdmv/xine_hdmv_decoder.c index d0a82da09..849346ecd 100644 --- a/src/libspuhdmv/xine_hdmv_decoder.c +++ b/src/libspuhdmv/xine_hdmv_decoder.c @@ -267,7 +267,7 @@ static void segbuf_parse_segment_header(segment_buffer_t *buf) if ( buf->segment_type < 0x14 || ( buf->segment_type > 0x18 && buf->segment_type != 0x80)) { - XINE_HDMV_ERROR("unknown segment type, resetting\n"); + XINE_HDMV_ERROR("unknown segment type 0x%02x, resetting\n", buf->segment_type); segbuf_reset(buf); } } else { -- cgit v1.2.3 From a4c49d3fe5ab623e1b3e51bf4e48373bb0f256e5 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Tue, 13 Dec 2011 21:41:03 +0200 Subject: demux_ts: do not count skipped PS1 substream header in PES packet size --- src/demuxers/demux_ts.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 238adf979..42f1061f8 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -1109,6 +1109,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, m->buf->decoder_info[1] = BUF_SPECIAL_LPCM_CONFIG; m->buf->decoder_info[2] = (p[3]<<24) | (p[2]<<16) | (p[1]<<8) | p[0]; + m->pes_bytes_left -= 4; return header_len + 4; } else if (m->descriptor_tag == ISO_13818_PES_PRIVATE @@ -1126,6 +1127,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, spu_id = (p[0] & 0x1f); m->type = BUF_SPU_DVD + spu_id; + m->pes_bytes_left -= 1; return header_len + 1; } else if ((p[0] & 0xF0) == 0x80) { @@ -1135,6 +1137,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, } m->type |= BUF_AUDIO_A52; + m->pes_bytes_left -= 4; return header_len + 4; #if 0 @@ -1155,6 +1158,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, } m->type |= BUF_AUDIO_LPCM_BE; + m->pes_bytes_left -= pcm_offset; return header_len + pcm_offset; #endif } -- cgit v1.2.3 From b31dd77027370a786a5ac891c954481517cddcef Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Tue, 13 Dec 2011 21:41:25 +0200 Subject: Silenced warnings --- src/demuxers/demux_ts.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 42f1061f8..7a76ebd99 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -813,11 +813,13 @@ static void demux_ts_flush(demux_ts_t *this) */ static void demux_ts_parse_pat (demux_ts_t*this, unsigned char *original_pkt, unsigned char *pkt, unsigned int pusi) { +#ifdef TS_PAT_LOG uint32_t table_id; + uint32_t version_number; +#endif uint32_t section_syntax_indicator; int32_t section_length; uint32_t transport_stream_id; - uint32_t version_number; uint32_t current_next_indicator; uint32_t section_number; uint32_t last_section_number; @@ -848,11 +850,15 @@ static void demux_ts_parse_pat (demux_ts_t*this, unsigned char *original_pkt, "demux_ts: demux error! PAT with invalid pointer\n"); return; } +#ifdef TS_PAT_LOG table_id = (unsigned int)pkt[5] ; +#endif section_syntax_indicator = (((unsigned int)pkt[6] >> 7) & 1) ; section_length = (((unsigned int)pkt[6] & 0x03) << 8) | pkt[7]; transport_stream_id = ((uint32_t)pkt[8] << 8) | pkt[9]; +#ifdef TS_PAT_LOG version_number = ((uint32_t)pkt[10] >> 1) & 0x1f; +#endif current_next_indicator = ((uint32_t)pkt[10] & 0x01); section_number = (uint32_t)pkt[11]; last_section_number = (uint32_t)pkt[12]; @@ -1407,11 +1413,13 @@ static void demux_ts_parse_pmt (demux_ts_t *this, unsigned int pusi, uint32_t program_count) { +#ifdef TS_PMT_LOG uint32_t table_id; + uint32_t version_number; +#endif uint32_t section_syntax_indicator; uint32_t section_length = 0; /* to calm down gcc */ uint32_t program_number; - uint32_t version_number; uint32_t current_next_indicator; uint32_t section_number; uint32_t last_section_number; @@ -1441,11 +1449,15 @@ static void demux_ts_parse_pmt (demux_ts_t *this, this->pmt[program_count] = (uint8_t *) calloc(4096, sizeof(unsigned char)); this->pmt_write_ptr[program_count] = this->pmt[program_count]; +#ifdef TS_PMT_LOG table_id = pkt[5] ; +#endif section_syntax_indicator = (pkt[6] >> 7) & 0x01; section_length = (((uint32_t) pkt[6] << 8) | pkt[7]) & 0x03ff; program_number = ((uint32_t) pkt[8] << 8) | pkt[9]; +#ifdef TS_PMT_LOG version_number = (pkt[10] >> 1) & 0x1f; +#endif current_next_indicator = pkt[10] & 0x01; section_number = pkt[11]; last_section_number = pkt[12]; @@ -2114,7 +2126,9 @@ static void demux_ts_parse_packet (demux_ts_t*this) { unsigned int sync_byte; unsigned int transport_error_indicator; unsigned int payload_unit_start_indicator; +#ifdef TS_HEADER_LOG unsigned int transport_priority; +#endif unsigned int pid; unsigned int transport_scrambling_control; unsigned int adaptation_field_control; @@ -2132,7 +2146,9 @@ static void demux_ts_parse_packet (demux_ts_t*this) { sync_byte = originalPkt[0]; transport_error_indicator = (originalPkt[1] >> 7) & 0x01; payload_unit_start_indicator = (originalPkt[1] >> 6) & 0x01; +#ifdef TS_HEADER_LOG transport_priority = (originalPkt[1] >> 5) & 0x01; +#endif pid = ((originalPkt[1] << 8) | originalPkt[2]) & 0x1fff; transport_scrambling_control = (originalPkt[3] >> 6) & 0x03; -- cgit v1.2.3 From 66de7b968dcfd2c3f3426a6a1f89b76954b2cbec Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Wed, 14 Dec 2011 10:39:54 +0200 Subject: demux_ts: set corrupted_pes flag when pid is flushed --- src/demuxers/demux_ts.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 7a76ebd99..9bbf6ffab 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -798,6 +798,7 @@ static void demux_ts_flush(demux_ts_t *this) unsigned int i; for (i = 0; i < this->media_num; ++i) { demux_ts_flush_media(&this->media[i]); + this->media[i].corrupted_pes = 1; } } -- cgit v1.2.3 From b723173e991c1ad3302fc28c568a70acc6b27131 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Wed, 14 Dec 2011 10:49:52 +0200 Subject: demux:ts: flush buffers at EOF. Allows decoding of last video frame. --- src/demuxers/demux_ts.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 9bbf6ffab..8e89145b9 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -1995,6 +1995,7 @@ static unsigned char * demux_synchronise(demux_ts_t* this) { */ if (this->npkt_read == 0) { + demux_ts_flush(this); xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_ts: read 0 packets\n"); this->status = DEMUX_FINISHED; return NULL; -- cgit v1.2.3 From 981a3c413789f0194a1b9c351994f0fb70b9b524 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Wed, 14 Dec 2011 10:54:59 +0200 Subject: demux_ts: Retry read few times after failure. Allow handling events and checking for demux_action_pending flag before retry. Input can return -1 with errno set to EAGAIN or EINTR. --- src/demuxers/demux_ts.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 8e89145b9..fb1d63ad8 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -332,6 +332,7 @@ typedef struct { fifo_buffer_t *video_fifo; input_plugin_t *input; + unsigned int read_retries; int status; @@ -1975,8 +1976,19 @@ static unsigned char * demux_synchronise(demux_ts_t* this) { this->frame_pos = this->input->get_current_pos (this->input); read_length = this->input->read(this->input, this->buf, - this->pkt_size * NPKT_PER_READ); - if (read_length < 0 || read_length % this->pkt_size) { + this->pkt_size * NPKT_PER_READ); + + if (read_length < 0) { + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + "demux_ts: read returned %d\n", read_length); + if (this->read_retries > 2) + this->status = DEMUX_FINISHED; + this->read_retries++; + return NULL; + } + this->read_retries = 0; + + if (read_length % this->pkt_size) { xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_ts: read returned %d bytes (not a multiple of %d!)\n", read_length, this->pkt_size); -- cgit v1.2.3 From a6b260bca5d264faa7e59b7371e1c8636be3adb6 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Wed, 14 Dec 2011 14:36:00 +0200 Subject: demux_ts: make sure old pts is not passed to metronom after seek / changed pids --- src/demuxers/demux_ts.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index fb1d63ad8..88ccf49f4 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -474,6 +474,7 @@ static int demux_ts_dynamic_pmt_find (demux_ts_t *this, } m->counter = INVALID_CC; m->corrupted_pes = 1; + m->pts = 0; m->descriptor_tag = descriptor_tag; @@ -2470,6 +2471,7 @@ static int demux_ts_seek (demux_plugin_t *this_gen, m->buf = NULL; m->counter = INVALID_CC; m->corrupted_pes = 1; + m->pts = 0; } if( !playing ) { -- cgit v1.2.3