summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2007-12-14 21:45:16 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2007-12-14 21:45:16 +0000
commit35de2d5310582d38d59df87432ae3c37ad84edbd (patch)
treeaac5644f379d28ee8dcb378f6546f41c926f20ff /src
parent32c1ac5c77e9d6c972689d8dc31b4c5d4ff80d78 (diff)
parent6bbfd480d0d173887305db527b641f832b6c4310 (diff)
downloadxine-lib-35de2d5310582d38d59df87432ae3c37ad84edbd.tar.gz
xine-lib-35de2d5310582d38d59df87432ae3c37ad84edbd.tar.bz2
Merge from 1.1.
--HG-- rename : src/demuxers/demux_ogg.c => src/combined/xine_ogg_demuxer.c rename : src/libfaad/xine_faad_decoder.c => src/libxineadec/xine_faad_decoder.c
Diffstat (limited to 'src')
-rw-r--r--src/xine-engine/video_out.c1
-rw-r--r--src/xine-utils/xmllexer.c62
2 files changed, 63 insertions, 0 deletions
diff --git a/src/xine-engine/video_out.c b/src/xine-engine/video_out.c
index 575017301..8c9810da1 100644
--- a/src/xine-engine/video_out.c
+++ b/src/xine-engine/video_out.c
@@ -979,6 +979,7 @@ static vo_frame_t *get_next_frame (vos_t *this, int64_t cur_vpts,
if (!img->stream ||
_x_stream_info_get(img->stream, XINE_STREAM_INFO_VIDEO_HAS_STILL) ||
+ !img->stream->video_fifo ||
img->stream->video_fifo->size(img->stream->video_fifo) < 10) {
lprintf ("possible still frame\n");
diff --git a/src/xine-utils/xmllexer.c b/src/xine-utils/xmllexer.c
index 39632938f..3f0383c48 100644
--- a/src/xine-utils/xmllexer.c
+++ b/src/xine-utils/xmllexer.c
@@ -40,6 +40,8 @@
#include <iconv.h>
#endif
+#include "bswap.h"
+
/* private constants*/
/* private global variables */
@@ -47,6 +49,45 @@ static const char * lexbuf;
static int lexbuf_size = 0;
static int lexbuf_pos = 0;
static int in_comment = 0;
+static char *lex_malloc = NULL;
+
+enum utf { UTF32BE, UTF32LE, UTF16BE, UTF16LE };
+
+static void lex_convert (const char * buf, int size, enum utf utf)
+{
+ char *utf8 = malloc (size * (utf >= UTF16BE ? 3 : 6) + 1);
+ char *bp = utf8;
+ while (size > 0)
+ {
+ uint32_t c = 0;
+ switch (utf)
+ {
+ case UTF32BE: c = _X_BE_32 (buf); buf += 4; break;
+ case UTF32LE: c = _X_LE_32 (buf); buf += 4; break;
+ case UTF16BE: c = _X_BE_16 (buf); buf += 2; break;
+ case UTF16LE: c = _X_LE_16 (buf); buf += 2; break;
+ }
+ if (!c)
+ break; /* embed a NUL, get a truncated string */
+ if (c < 128)
+ *bp++ = c;
+ else
+ {
+ int count = (c >= 0x04000000) ? 5 :
+ (c >= 0x00200000) ? 4 :
+ (c >= 0x00010000) ? 3 :
+ (c >= 0x00000800) ? 2 : 1;
+ *bp = (char)(0x1F80 >> count);
+ count *= 6;
+ *bp++ |= c >> count;
+ while ((count -= 6) >= 0)
+ *bp++ = 128 | ((c >> count) & 0x3F);
+ }
+ }
+ *bp = 0;
+ lexbuf_size = bp - utf8;
+ lexbuf = lex_malloc = realloc (utf8, lexbuf_size + 1);
+}
static enum {
NORMAL,
@@ -55,8 +96,29 @@ static enum {
} lex_mode = NORMAL;
void lexer_init(const char * buf, int size) {
+ static const char boms[] = { 0xFF, 0xFE, 0, 0, 0xFE, 0xFF },
+ bom_utf8[] = { 0xEF, 0xBB, 0xBF };
+
+ free (lex_malloc);
+ lex_malloc = NULL;
+
lexbuf = buf;
lexbuf_size = size;
+
+ if (size >= 4 && !memcmp (buf, boms + 2, 4))
+ lex_convert (buf + 4, size - 4, UTF32BE);
+ else if (size >= 4 && !memcmp (buf, boms, 4))
+ lex_convert (buf + 4, size - 4, UTF32LE);
+ else if (size >= 3 && !memcmp (buf, bom_utf8, 4))
+ {
+ lexbuf += 3;
+ lexbuf_size -= 3;
+ }
+ else if (size >= 2 && !memcmp (buf, boms + 4, 2))
+ lex_convert (buf + 2, size - 2, UTF16BE);
+ else if (size >= 2 && !memcmp (buf, boms, 2))
+ lex_convert (buf + 2, size - 2, UTF16LE);
+
lexbuf_pos = 0;
lex_mode = NORMAL;
in_comment = 0;