diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | include/xine.h | 5 | ||||
-rw-r--r-- | include/xine/xine_internal.h | 3 | ||||
-rw-r--r-- | src/demuxers/demux_ts.c | 14 | ||||
-rw-r--r-- | src/input/input_http.c | 5 | ||||
-rw-r--r-- | src/input/vcd/xine-extra.c | 10 | ||||
-rw-r--r-- | src/xine-engine/load_plugins.c | 21 | ||||
-rw-r--r-- | src/xine-engine/xine.c | 11 |
8 files changed, 54 insertions, 16 deletions
@@ -75,6 +75,7 @@ xine-lib (1.1.12.1) 2008-??-?? * Fixed display of some MJPEG streams (YUVJ420P). * Deprecate xine_xmalloc() function, see src/xine-utils/utils.c for more information about the reason. + * Provide a useful implementation of xine_register_log_cb(). xine-lib (1.1.12) 2008-04-14 * Security fixes: diff --git a/include/xine.h b/include/xine.h index ba022c389..9df9fceae 100644 --- a/include/xine.h +++ b/include/xine.h @@ -802,6 +802,11 @@ void xine_vlog(xine_t *self, int buf, /* get log messages of specified section */ char *const *xine_get_log (xine_t *self, int buf) XINE_PROTECTED; +/* log callback will be called whenever something is logged */ +typedef void (*xine_log_cb_t) (void *user_data, int section); +void xine_register_log_cb (xine_t *self, xine_log_cb_t cb, + void *user_data) XINE_PROTECTED XINE_DEPRECATED; + /* * error handling / engine status */ diff --git a/include/xine/xine_internal.h b/include/xine/xine_internal.h index eecae9c30..b876030ee 100644 --- a/include/xine/xine_internal.h +++ b/include/xine/xine_internal.h @@ -98,6 +98,9 @@ struct xine_s { #ifdef XINE_ENGINE_INTERNAL xine_ticket_t *port_ticket; pthread_mutex_t log_lock; + + xine_log_cb_t log_cb; + void *log_cb_user_data; #endif }; diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c index a9224d4c4..2192c67e3 100644 --- a/src/demuxers/demux_ts.c +++ b/src/demuxers/demux_ts.c @@ -732,7 +732,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, (p[0] == 0x0B && p[1] == 0x77)) { /* ac3 - syncword */ m->content = p; m->size = packet_len; - m->type |= BUF_AUDIO_A52; + m->type = BUF_AUDIO_A52; return 1; } else if (m->descriptor_tag == ISO_13818_PES_PRIVATE @@ -742,7 +742,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, m->content = p; m->size = packet_len; - m->type |= BUF_SPU_DVB; + m->type = BUF_SPU_DVB; m->buf->decoder_info[2] = payload_len; return 1; } else if ((p[0] & 0xE0) == 0x20) { @@ -756,7 +756,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, m->content = p+4; m->size = packet_len - 4; - m->type |= BUF_AUDIO_A52; + m->type = BUF_AUDIO_A52; return 1; } else if ((p[0]&0xf0) == 0xa0) { @@ -772,7 +772,7 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, m->content = p+pcm_offset; m->size = packet_len-pcm_offset; - m->type |= BUF_AUDIO_LPCM_BE; + m->type = BUF_AUDIO_LPCM_BE; return 1; } @@ -810,16 +810,16 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m, case ISO_11172_AUDIO: case ISO_13818_AUDIO: lprintf ("demux_ts: found MPEG audio track.\n"); - m->type |= BUF_AUDIO_MPEG; + m->type = BUF_AUDIO_MPEG; break; case ISO_13818_PART7_AUDIO: case ISO_14496_PART3_AUDIO: lprintf ("demux_ts: found AAC audio track.\n"); - m->type |= BUF_AUDIO_AAC; + m->type = BUF_AUDIO_AAC; break; default: lprintf ("demux_ts: unknown audio type: %d, defaulting to MPEG.\n", m->descriptor_tag); - m->type |= BUF_AUDIO_MPEG; + m->type = BUF_AUDIO_MPEG; break; } return 1; diff --git a/src/input/input_http.c b/src/input/input_http.c index 2dc7a18dc..2ba92808f 100644 --- a/src/input/input_http.c +++ b/src/input/input_http.c @@ -927,7 +927,10 @@ static int http_plugin_open (input_plugin_t *this_gen ) { /* content type */ if (!strncasecmp(this->buf, TAG_CONTENT_TYPE, sizeof(TAG_CONTENT_TYPE) - 1)) { - if (!strncasecmp(this->buf + sizeof(TAG_CONTENT_TYPE) - 1, "video/nsv", 9)) { + const char *type = this->buf + sizeof (TAG_CONTENT_TYPE) - 1; + while (isspace (*type)) + ++type; + if (!strncasecmp (type, "video/nsv", 9)) { lprintf("shoutcast nsv detected\n"); this->is_nsv = 1; } diff --git a/src/input/vcd/xine-extra.c b/src/input/vcd/xine-extra.c index 79c962a79..e3b6da912 100644 --- a/src/input/vcd/xine-extra.c +++ b/src/input/vcd/xine-extra.c @@ -45,8 +45,10 @@ static xine_t *my_xine = NULL; void xine_vlog_msg(xine_t *this, int buf, const char *format, va_list args) { + va_list copy; + va_copy (copy, args); xine_vlog(this, buf, format, args); - vfprintf(stdout, format, args); + vfprintf(stdout, format, copy); } /*! This routine is like xine_log, except it takes a va_list instead @@ -59,8 +61,10 @@ xine_vlog_msg(xine_t *this, int buf, const char *format, va_list args) void xine_vlog_err(xine_t *this, int buf, const char *format, va_list args) { + va_list copy; + va_copy (copy, args); xine_vlog(this, buf, format, args); - vfprintf(stderr, format, args); + vfprintf(stderr, format, copy); } /*! Call this before calling any of the xine_log_msg or xine_log_err @@ -116,8 +120,8 @@ xine_log_err(const char *format, ...) { va_list args; - va_start(args, format); if (NULL == my_xine) return false; + va_start(args, format); xine_vlog_err(my_xine, XINE_LOG_MSG, format, args); va_end(args); return true; diff --git a/src/xine-engine/load_plugins.c b/src/xine-engine/load_plugins.c index 39d97f521..050a01832 100644 --- a/src/xine-engine/load_plugins.c +++ b/src/xine-engine/load_plugins.c @@ -2664,21 +2664,32 @@ char *xine_get_demux_for_mime_type (xine_t *self, const char *mime_type) { plugin_node_t *node; char *id = NULL; int list_id, list_size; + const size_t mime_type_len = strlen (mime_type); pthread_mutex_lock (&catalog->lock); list_size = xine_sarray_size (catalog->plugin_lists[PLUGIN_DEMUX - 1]); for (list_id = 0; (list_id < list_size) && !id; list_id++) { - demux_class_t *cls; node = xine_sarray_get (catalog->plugin_lists[PLUGIN_DEMUX - 1], list_id); if (node->plugin_class || _load_plugin_class(self, node, NULL)) { - cls = (demux_class_t *)node->plugin_class; - - if (cls->mimetypes && strcasestr(cls->mimetypes, mime_type) ) - id = strdup(node->info->id); + demux_class_t *cls = (demux_class_t *)node->plugin_class; + const char *mime = cls->mimetypes; + while (mime) + { + while (*mime == ';' || isspace (*mime)) + ++mime; + if (!strncmp (mime, mime_type, mime_type_len) && + (!mime[mime_type_len] || mime[mime_type_len] == ':' || mime[mime_type_len] == ';')) + { + free (id); + id = strdup(node->info->id); + break; + } + mime = strchr (mime, ';'); + } } } diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c index 9780052ca..39bef61d8 100644 --- a/src/xine-engine/xine.c +++ b/src/xine-engine/xine.c @@ -2278,6 +2278,9 @@ void xine_log (xine_t *this, int buf, const char *format, ...) { printf("%s", buffer); va_end (argp); } + + if (this->log_cb) + this->log_cb (this->log_cb_user_data, buf); } void xine_vlog(xine_t *this, int buf, const char *format, @@ -2286,6 +2289,9 @@ void xine_vlog(xine_t *this, int buf, const char *format, check_log_alloc (this, buf); this->log_buffers[buf]->scratch_printf(this->log_buffers[buf], format, args); + + if (this->log_cb) + this->log_cb (this->log_cb_user_data, buf); } char *const *xine_get_log (xine_t *this, int buf) { @@ -2299,6 +2305,11 @@ char *const *xine_get_log (xine_t *this, int buf) { return NULL; } +void xine_register_log_cb (xine_t *this, xine_log_cb_t cb, void *user_data) { + this->log_cb = cb; + this->log_cb_user_data = user_data; +} + int xine_get_error (xine_stream_t *stream) { return stream->err; } |