summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPetri Hintukainen <phintuka@users.sourceforge.net>2011-10-17 13:14:43 +0300
committerPetri Hintukainen <phintuka@users.sourceforge.net>2011-10-17 13:14:43 +0300
commit81c84b6bf06482c5988fd16f68050177c1afc358 (patch)
treefd0598beb671b27aef81c91af8ed93fd8330eb55 /src
parent0f53dcaa8cae2d37e886fff0d7a44ed6e679aeb4 (diff)
parent83049ca9ad0d39a5795b586b76f954748a3de316 (diff)
downloadxine-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.c4
-rw-r--r--src/demuxers/demux_ts.c65
-rw-r--r--src/demuxers/ebml.c10
-rw-r--r--src/libw32dll/wine/win32.c2
-rw-r--r--src/xine-utils/utils.c12
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)
{