diff options
Diffstat (limited to 'src/demuxers/demux_ts.c')
-rw-r--r-- | src/demuxers/demux_ts.c | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index d69c29938..86563fbac 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -351,6 +351,7 @@ typedef struct { fifo_buffer_t *video_fifo; input_plugin_t *input; + unsigned int read_retries; demux_ts_class_t *class; @@ -485,6 +486,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; @@ -577,6 +579,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; @@ -787,6 +790,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; } } @@ -802,11 +806,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; @@ -837,11 +843,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]; @@ -1097,6 +1107,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 @@ -1114,6 +1125,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) { @@ -1123,6 +1135,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 @@ -1143,6 +1156,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 } @@ -1391,11 +1405,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; @@ -1425,11 +1441,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]; @@ -1946,8 +1966,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); @@ -1966,6 +1997,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; @@ -2098,7 +2130,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; @@ -2116,7 +2150,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; @@ -2288,15 +2324,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; @@ -2429,6 +2458,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 ) { |