From 2926c8f9b3bc53f933d6f367f258f2abe08da413 Mon Sep 17 00:00:00 2001 From: Lorenzo Desole Date: Thu, 13 Oct 2011 21:50:00 +0200 Subject: mkv fix: null dereferences, skipping of unknown elements --- src/demuxers/demux_matroska.c | 4 ++-- src/demuxers/ebml.c | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c index c47cd2657..3d1935587 100644 --- a/src/demuxers/demux_matroska.c +++ b/src/demuxers/demux_matroska.c @@ -3030,7 +3030,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); @@ -3040,7 +3040,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/ebml.c b/src/demuxers/ebml.c index 75fbfde75..ce53e6c8a 100644 --- a/src/demuxers/ebml.c +++ b/src/demuxers/ebml.c @@ -211,14 +211,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); } @@ -473,6 +472,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); } -- cgit v1.2.3 From 031efcfba644acddec5fb45c096afcdd5559b2ea Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Sat, 15 Oct 2011 21:22:27 +0100 Subject: Kill some "discarded qualifier" warnings in libw32dll. --- src/libw32dll/wine/win32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/libw32dll/wine/win32.c b/src/libw32dll/wine/win32.c index d9744ae35..38193a649 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) -- cgit v1.2.3 From 82eccdbd9a348225c04d2e3c7caa7830eb5da08a Mon Sep 17 00:00:00 2001 From: Torsten Jager Date: Thu, 13 Oct 2011 21:54:11 +0300 Subject: demux_ts: Fixed frame normpos. Cache current PES packet position in input stream. --- src/demuxers/demux_ts.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index e891a5cbe..5d6b8cb8c 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -274,6 +274,8 @@ typedef struct { int corrupted_pes; uint32_t buffered_bytes; + int input_normpos; + int input_time; } demux_ts_media; /* DVBSUB */ @@ -368,6 +370,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; typedef struct { @@ -1019,13 +1023,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 */ @@ -1048,6 +1047,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 */ @@ -1058,13 +1066,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); @@ -1732,10 +1735,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) { -- cgit v1.2.3 From 68a893cefd56a81ff3af304cda6ee897a1506ed3 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Sun, 16 Oct 2011 20:52:49 +0300 Subject: Added internal event XINE_EVENT_END_OF_CLIP This event is used by BluRay input plugin to flush demux_ts caches at end of clip. --- src/demuxers/demux_ts.c | 29 +++++++++++++++++++++++++++++ src/xine-engine/xine_internal.h | 2 ++ 2 files changed, 31 insertions(+) (limited to 'src') diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index 5d6b8cb8c..f22526054 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -540,6 +540,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 * @@ -2076,6 +2100,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/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h index 7566c83e0..939876ebe 100644 --- a/src/xine-engine/xine_internal.h +++ b/src/xine-engine/xine_internal.h @@ -519,6 +519,8 @@ int _x_get_spu_channel (xine_stream_t *stream) XINE_PROTECTED; /* sent by dvb frontend to inform ts demuxer of new pids */ #define XINE_EVENT_PIDS_CHANGE 0x80000000 +/* sent by BluRay input plugin to inform ts demuxer about end of clip */ +#define XINE_EVENT_END_OF_CLIP 0x80000001 /* * pids change event - inform ts demuxer of new pids -- cgit v1.2.3 From 83049ca9ad0d39a5795b586b76f954748a3de316 Mon Sep 17 00:00:00 2001 From: Petri Hintukainen Date: Mon, 10 Oct 2011 00:52:08 +0300 Subject: Added asprintf wrapper --- src/xine-utils/utils.c | 12 ++++++++++++ src/xine-utils/xineutils.h | 8 ++++++++ 2 files changed, 20 insertions(+) (limited to 'src') diff --git a/src/xine-utils/utils.c b/src/xine-utils/utils.c index 3d21a2935..82cf5c0d4 100644 --- a/src/xine-utils/utils.c +++ b/src/xine-utils/utils.c @@ -706,6 +706,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) { diff --git a/src/xine-utils/xineutils.h b/src/xine-utils/xineutils.h index d0946e471..5b16e6e3c 100644 --- a/src/xine-utils/xineutils.h +++ b/src/xine-utils/xineutils.h @@ -215,6 +215,14 @@ void xine_strdupa(char *dest, char *src) XINE_PROTECTED XINE_DEPRECATED; */ char *xine_strcat_realloc (char **dest, char *append) XINE_PROTECTED; +/** + * asprintf wrapper + * allocate a string large enough to hold the output, and return a pointer to + * it. This pointer should be passed to free when it is no longer needed. + * return NULL on error. + */ +char *_x_asprintf(const char *format, ...) XINE_PROTECTED XINE_MALLOC XINE_FORMAT_PRINTF(1, 2); + /** * opens a file, ensuring that the descriptor will be closed * automatically after a fork/execute. -- cgit v1.2.3