diff options
author | Petri Hintukainen <phintuka@users.sourceforge.net> | 2011-10-17 13:14:43 +0300 |
---|---|---|
committer | Petri Hintukainen <phintuka@users.sourceforge.net> | 2011-10-17 13:14:43 +0300 |
commit | 81c84b6bf06482c5988fd16f68050177c1afc358 (patch) | |
tree | fd0598beb671b27aef81c91af8ed93fd8330eb55 /src | |
parent | 0f53dcaa8cae2d37e886fff0d7a44ed6e679aeb4 (diff) | |
parent | 83049ca9ad0d39a5795b586b76f954748a3de316 (diff) | |
download | xine-lib-81c84b6bf06482c5988fd16f68050177c1afc358.tar.gz xine-lib-81c84b6bf06482c5988fd16f68050177c1afc358.tar.bz2 |
Merge from 1.1
--HG--
rename : src/xine-engine/xine_internal.h => include/xine/xine_internal.h
rename : src/xine-utils/xineutils.h => include/xine/xineutils.h
Diffstat (limited to 'src')
-rw-r--r-- | src/demuxers/demux_matroska.c | 4 | ||||
-rw-r--r-- | src/demuxers/demux_ts.c | 65 | ||||
-rw-r--r-- | src/demuxers/ebml.c | 10 | ||||
-rw-r--r-- | src/libw32dll/wine/win32.c | 2 | ||||
-rw-r--r-- | src/xine-utils/utils.c | 12 |
5 files changed, 71 insertions, 22 deletions
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c index 4fab784f7..f9f0b23d5 100644 --- a/src/demuxers/demux_matroska.c +++ b/src/demuxers/demux_matroska.c @@ -3009,7 +3009,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str if (ebml->max_size_len > 8) goto error; /* handle both Matroska and WebM here; we don't (presently) differentiate */ - if (strcmp(ebml->doctype, "matroska") && strcmp(ebml->doctype, "webm")) + if (!ebml->doctype || (strcmp(ebml->doctype, "matroska") && strcmp(ebml->doctype, "webm"))) goto error; this->event_queue = xine_event_new_queue(this->stream); @@ -3019,7 +3019,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str error: dispose_ebml_parser(ebml); - if (NULL != this) { + if (this != NULL && this->event_queue != NULL) { xine_event_dispose_queue(this->event_queue); free(this); } diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index ec5e638cf..4736a9c82 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -281,6 +281,8 @@ typedef struct { int corrupted_pes; uint32_t buffered_bytes; + int input_normpos; + int input_time; } demux_ts_media; /* DVBSUB */ @@ -389,6 +391,8 @@ typedef struct { uint8_t buf[BUF_SIZE]; /* == PKT_SIZE * NPKT_PER_READ */ + off_t frame_pos; /* current ts packet position in input stream (bytes from beginning) */ + } demux_ts_t; /* redefine abs as macro to handle 64-bit diffs. @@ -524,6 +528,30 @@ static void demux_ts_update_spu_channel(demux_ts_t *this) this->video_fifo->put(this->video_fifo, buf); } +static void demux_ts_flush_media(demux_ts_media *m) +{ + if (m->buf) { + m->buf->content = m->buf->mem; + m->buf->size = m->buffered_bytes; + m->buf->type = m->type; + m->buf->decoder_flags |= BUF_FLAG_FRAME_END; + m->buf->pts = m->pts; + m->buf->extra_info->input_normpos = m->input_normpos; + m->buf->extra_info->input_time = m->input_time; + m->fifo->put(m->fifo, m->buf); + m->buffered_bytes = 0; + m->buf = NULL; + } +} + +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]); + } +} + /* * demux_ts_parse_pat * @@ -1006,13 +1034,8 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts, m->buf->decoder_flags |= BUF_FLAG_FRAME_END; m->buf->pts = m->pts; m->buf->decoder_info[0] = 1; - - if( this->input->get_length (this->input) ) - m->buf->extra_info->input_normpos = (int)( (double) this->input->get_current_pos (this->input) * - 65535 / this->input->get_length (this->input) ); - if (this->rate) - m->buf->extra_info->input_time = (int)((int64_t)this->input->get_current_pos (this->input) - * 1000 / (this->rate * 50)); + m->buf->extra_info->input_normpos = m->input_normpos; + m->buf->extra_info->input_time = m->input_time; m->fifo->put(m->fifo, m->buf); m->buffered_bytes = 0; m->buf = NULL; /* forget about buf -- not our responsibility anymore */ @@ -1035,6 +1058,15 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts, m->corrupted_pes = 0; memcpy(m->buf->mem, ts+len-m->size, m->size); m->buffered_bytes = m->size; + + /* cache frame position */ + off_t length = this->input->get_length (this->input); + if (length > 0) { + m->input_normpos = (double)this->frame_pos * 65535.0 / length; + } + if (this->rate) { + m->input_time = this->frame_pos * 1000 / (this->rate * 50); + } } } else if (!m->corrupted_pes) { /* no pus -- PES packet continuation */ @@ -1045,13 +1077,8 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts, m->buf->type = m->type; m->buf->pts = m->pts; m->buf->decoder_info[0] = 1; - if( this->input->get_length (this->input) ) - m->buf->extra_info->input_normpos = (int)( (double) this->input->get_current_pos (this->input) * - 65535 / this->input->get_length (this->input) ); - if (this->rate) - m->buf->extra_info->input_time = (int)((int64_t)this->input->get_current_pos (this->input) - * 1000 / (this->rate * 50)); - + m->buf->extra_info->input_normpos = m->input_normpos; + m->buf->extra_info->input_time = m->input_time; m->fifo->put(m->fifo, m->buf); m->buffered_bytes = 0; m->buf = m->fifo->buffer_pool_alloc(m->fifo); @@ -1719,10 +1746,15 @@ static unsigned char * demux_synchronise(demux_ts_t* this) { uint8_t *return_pointer = NULL; int32_t read_length; + + this->frame_pos += this->pkt_size; + if ( (this->packet_number) >= this->npkt_read) { /* NEW: handle read returning less packets than NPKT_PER_READ... */ do { + 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) { @@ -2055,6 +2087,11 @@ static void demux_ts_event_handler (demux_ts_t *this) { switch (event->type) { + case XINE_EVENT_END_OF_CLIP: + /* flush all streams */ + demux_ts_flush(this); + /* fall thru */ + case XINE_EVENT_PIDS_CHANGE: this->videoPid = INVALID_PID; diff --git a/src/demuxers/ebml.c b/src/demuxers/ebml.c index 2676156fd..c979d290d 100644 --- a/src/demuxers/ebml.c +++ b/src/demuxers/ebml.c @@ -201,14 +201,13 @@ int ebml_skip(ebml_parser_t *ebml, ebml_elem_t *elem) { int ebml_read_elem_head(ebml_parser_t *ebml, ebml_elem_t *elem) { - if (!ebml_read_elem_id(ebml, &elem->id)) - return 0; + int ret_id = ebml_read_elem_id(ebml, &elem->id); - if (!ebml_read_elem_len(ebml, &elem->len)) - return 0; + int ret_len = ebml_read_elem_len(ebml, &elem->len); elem->start = ebml->input->get_current_pos(ebml->input); - return 1; + + return (ret_id && ret_len); } @@ -466,6 +465,7 @@ int ebml_check_header(ebml_parser_t *ebml) { default: xprintf(ebml->xine, XINE_VERBOSITY_LOG, "ebml: Unknown data type 0x%x in EBML header (ignored)\n", elem.id); + ebml_skip(ebml, &elem); } next_level = ebml_get_next_level(ebml, &elem); } diff --git a/src/libw32dll/wine/win32.c b/src/libw32dll/wine/win32.c index 274c78de3..aba172711 100644 --- a/src/libw32dll/wine/win32.c +++ b/src/libw32dll/wine/win32.c @@ -184,7 +184,7 @@ static void longcount_stub(long long* z) int LOADER_DEBUG=1; // active only if compiled with -DDETAILED_OUT //#define DETAILED_OUT -static inline void XINE_FORMAT_PRINTF(1, 2) dbgprintf(char* fmt, ...) +static inline void XINE_FORMAT_PRINTF(1, 2) dbgprintf(const char* fmt, ...) { #ifdef DETAILED_OUT if(LOADER_DEBUG) diff --git a/src/xine-utils/utils.c b/src/xine-utils/utils.c index bc5f1a228..e2aac22f5 100644 --- a/src/xine-utils/utils.c +++ b/src/xine-utils/utils.c @@ -726,6 +726,18 @@ char *xine_strcat_realloc (char **dest, char *append) return newstr; } +char *_x_asprintf(const char *format, ...) +{ + va_list ap; + char *buf = NULL; + + va_start (ap, format); + if (vasprintf (&buf, format, ap) < 0) + buf = NULL; + va_end (ap); + + return buf; +} int _x_set_file_close_on_exec(int fd) { |