summaryrefslogtreecommitdiff
path: root/src/demuxers
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers')
-rw-r--r--src/demuxers/Makefile.am71
-rw-r--r--src/demuxers/asfheader.c14
-rw-r--r--src/demuxers/demux_4xm.c38
-rw-r--r--src/demuxers/demux_aac.c2
-rw-r--r--src/demuxers/demux_ac3.c9
-rw-r--r--src/demuxers/demux_aiff.c16
-rw-r--r--src/demuxers/demux_asf.c24
-rw-r--r--src/demuxers/demux_aud.c8
-rw-r--r--src/demuxers/demux_avi.c76
-rw-r--r--src/demuxers/demux_dts.c9
-rw-r--r--src/demuxers/demux_eawve.c2
-rw-r--r--src/demuxers/demux_film.c26
-rw-r--r--src/demuxers/demux_flac.c50
-rw-r--r--src/demuxers/demux_fli.c16
-rw-r--r--src/demuxers/demux_flv.c32
-rw-r--r--src/demuxers/demux_idcin.c17
-rw-r--r--src/demuxers/demux_iff.c98
-rw-r--r--src/demuxers/demux_image.c2
-rw-r--r--src/demuxers/demux_ipmovie.c22
-rw-r--r--src/demuxers/demux_matroska.c23
-rw-r--r--src/demuxers/demux_mod.c16
-rw-r--r--src/demuxers/demux_mpc.c14
-rw-r--r--src/demuxers/demux_mpeg.c14
-rw-r--r--src/demuxers/demux_mpeg_pes.c25
-rw-r--r--src/demuxers/demux_mpgaudio.c39
-rw-r--r--src/demuxers/demux_nsf.c392
-rw-r--r--src/demuxers/demux_nsv.c22
-rw-r--r--src/demuxers/demux_ogg.c2202
-rw-r--r--src/demuxers/demux_pva.c12
-rw-r--r--src/demuxers/demux_qt.c511
-rw-r--r--src/demuxers/demux_real.c118
-rw-r--r--src/demuxers/demux_realaudio.c18
-rw-r--r--src/demuxers/demux_roq.c18
-rw-r--r--src/demuxers/demux_smjpeg.c20
-rw-r--r--src/demuxers/demux_snd.c12
-rw-r--r--src/demuxers/demux_str.c28
-rw-r--r--src/demuxers/demux_ts.c90
-rw-r--r--src/demuxers/demux_tta.c13
-rw-r--r--src/demuxers/demux_vmd.c18
-rw-r--r--src/demuxers/demux_voc.c2
-rw-r--r--src/demuxers/demux_vqa.c16
-rw-r--r--src/demuxers/demux_wav.c4
-rw-r--r--src/demuxers/demux_wc3movie.c42
-rw-r--r--src/demuxers/ebml.c4
-rw-r--r--src/demuxers/flacutils.h14
-rw-r--r--src/demuxers/group_audio.c16
-rw-r--r--src/demuxers/group_audio.h5
-rw-r--r--src/demuxers/id3.c80
-rw-r--r--src/demuxers/id3.h48
-rw-r--r--src/demuxers/matroska.h1
50 files changed, 928 insertions, 3441 deletions
diff --git a/src/demuxers/Makefile.am b/src/demuxers/Makefile.am
index 8a931c2d6..ac132463b 100644
--- a/src/demuxers/Makefile.am
+++ b/src/demuxers/Makefile.am
@@ -1,30 +1,38 @@
include $(top_srcdir)/misc/Makefile.common
-AM_CFLAGS = $(VISIBILITY_FLAG)
+AM_CFLAGS = $(DEFAULT_OCFLAGS) $(VISIBILITY_FLAG)
AM_LDFLAGS = $(xineplug_ldflags)
-if HAVE_VORBIS
-ogg_module = xineplug_dmx_ogg.la
-endif
+##
+# IMPORTANT:
+# ---------
+# All of xine demuxer plugins should be named like the scheme "xineplug_dmx_"
-if BUILD_ASF
+xineinclude_HEADERS = demux.h
+
+noinst_HEADERS = asfheader.h qtpalette.h group_games.h group_audio.h id3.h ebml.h matroska.h iff.h flacutils.h
+
+if ENABLE_ASF
asf_module = xineplug_dmx_asf.la
endif
-if HAVE_LIBMNG
+if ENABLE_MNG
mng_module = xineplug_dmx_mng.la
endif
+if ENABLE_MODPLUG
+modplug_module = xineplug_dmx_modplug.la
+endif
+
if BUILD_DMX_IMAGE
image_module = xineplug_dmx_image.la
endif
-##
-# IMPORTANT:
-# ---------
-# All of xine demuxer plugins should be named like the scheme "xineplug_dmx_"
-
-xineplug_LTLIBRARIES = $(ogg_module) $(asf_module) $(mng_module) $(image_module) \
+xineplug_LTLIBRARIES = \
+ $(asf_module) \
+ $(mng_module) \
+ $(image_module) \
+ $(modplug_module) \
xineplug_dmx_games.la \
xineplug_dmx_audio.la \
xineplug_dmx_mpeg_ts.la \
@@ -46,15 +54,11 @@ xineplug_LTLIBRARIES = $(ogg_module) $(asf_module) $(mng_module) $(image_module)
xineplug_dmx_iff.la \
xineplug_dmx_flv.la
-xineplug_dmx_ogg_la_SOURCES = demux_ogg.c
-xineplug_dmx_ogg_la_LIBADD = $(VORBIS_LIBS) $(SPEEX_LIBS) $(THEORA_LIBS) $(OGG_LIBS) $(XINE_LIB)
-xineplug_dmx_ogg_la_CFLAGS = $(AM_CFLAGS) $(VORBIS_CFLAGS) $(SPEEX_CFLAGS) $(THEORA_CFLAGS) $(OGG_CFLAGS)
-
xineplug_dmx_avi_la_SOURCES = demux_avi.c
-xineplug_dmx_avi_la_LIBADD = $(XINE_LIB)
+xineplug_dmx_avi_la_LIBADD = $(XINE_LIB) $(LTLIBINTL)
xineplug_dmx_mpeg_block_la_SOURCES = demux_mpeg_block.c
-xineplug_dmx_mpeg_block_la_LIBADD = $(XINE_LIB)
+xineplug_dmx_mpeg_block_la_LIBADD = $(XINE_LIB) $(LTLIBINTL)
xineplug_dmx_mpeg_la_SOURCES = demux_mpeg.c
xineplug_dmx_mpeg_la_LIBADD = $(XINE_LIB)
@@ -63,17 +67,17 @@ xineplug_dmx_mpeg_elem_la_SOURCES = demux_elem.c
xineplug_dmx_mpeg_elem_la_LIBADD = $(XINE_LIB)
xineplug_dmx_mpeg_pes_la_SOURCES = demux_mpeg_pes.c
-xineplug_dmx_mpeg_pes_la_LIBADD = $(XINE_LIB)
+xineplug_dmx_mpeg_pes_la_LIBADD = $(XINE_LIB) $(LTLIBINTL)
xineplug_dmx_mpeg_ts_la_SOURCES = demux_ts.c
xineplug_dmx_mpeg_ts_la_LIBADD = $(XINE_LIB)
xineplug_dmx_qt_la_SOURCES = demux_qt.c
xineplug_dmx_qt_la_LIBADD = $(XINE_LIB) $(ZLIB_LIBS)
-xineplug_dmx_qt_la_CPPFLAGS = $(ZLIB_CPPFLAGS)
+xineplug_dmx_qt_la_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CPPFLAGS)
xineplug_dmx_asf_la_SOURCES = demux_asf.c asfheader.c
-xineplug_dmx_asf_la_LIBADD = $(XINE_LIB)
+xineplug_dmx_asf_la_LIBADD = $(XINE_LIB) $(LTLIBINTL) $(LTLIBICONV)
xineplug_dmx_asf_la_CFLAGS = $(AM_CFLAGS) -fno-strict-aliasing
xineplug_dmx_fli_la_SOURCES = demux_fli.c
@@ -90,7 +94,7 @@ xineplug_dmx_rawdv_la_LIBADD = $(XINE_LIB)
xineplug_dmx_mng_la_SOURCES = demux_mng.c
xineplug_dmx_mng_la_LIBADD = $(XINE_LIB) $(ZLIB_LIBS) $(MNG_LIBS)
-xineplug_dmx_mng_la_CPPFLAGS = $(ZLIB_CPPFLAGS)
+xineplug_dmx_mng_la_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CPPFLAGS)
xineplug_dmx_pva_la_SOURCES = demux_pva.c
xineplug_dmx_pva_la_LIBADD = $(XINE_LIB)
@@ -100,18 +104,20 @@ xineplug_dmx_games_la_SOURCES = group_games.c demux_eawve.c \
demux_vqa.c demux_wc3movie.c demux_str.c \
demux_film.c demux_smjpeg.c demux_4xm.c \
demux_vmd.c
-xineplug_dmx_games_la_LIBADD = $(XINE_LIB)
-xineplug_dmx_games_la_LDFLAGS = -avoid-version -module
+xineplug_dmx_games_la_LIBADD = $(XINE_LIB) $(LTLIBINTL)
xineplug_dmx_audio_la_SOURCES = group_audio.c demux_aud.c demux_aiff.c \
- demux_cdda.c demux_mpgaudio.c demux_nsf.c \
+ demux_cdda.c demux_mpgaudio.c \
demux_realaudio.c demux_snd.c demux_voc.c \
demux_vox.c demux_wav.c demux_ac3.c id3.c \
- demux_aac.c demux_mod.c demux_flac.c \
+ demux_aac.c demux_flac.c \
demux_mpc.c demux_dts.c demux_shn.c \
demux_tta.c
-xineplug_dmx_audio_la_LIBADD = $(XINE_LIB) $(LIBMODPLUG_LIBS)
-xineplug_dmx_audio_la_CFLAGS = $(AM_CFLAGS) $(LIBMODPLUG_CFLAGS)
+xineplug_dmx_audio_la_LIBADD = $(XINE_LIB)
+
+xineplug_dmx_modplug_la_SOURCES = demux_mod.c
+xineplug_dmx_modplug_la_LIBADD = $(XINE_LIB) $(LIBMODPLUG_LIBS)
+xineplug_dmx_modplug_la_CFLAGS = $(AM_CFLAGS) $(LIBMODPLUG_CFLAGS)
xineplug_dmx_yuv_frames_la_SOURCES = demux_yuv_frames.c
xineplug_dmx_yuv_frames_la_LIBADD = $(XINE_LIB)
@@ -127,14 +133,11 @@ xineplug_dmx_nsv_la_LIBADD = $(XINE_LIB)
xineplug_dmx_matroska_la_SOURCES = demux_matroska.c ebml.c
xineplug_dmx_matroska_la_LIBADD = $(XINE_LIB) $(ZLIB_LIBS)
-xineplug_dmx_matroska_la_CPPFLAGS = $(ZLIB_CPPFLAGS)
xineplug_dmx_matroska_la_CFLAGS = $(AM_CFLAGS) -fno-strict-aliasing
+xineplug_dmx_matroska_la_CPPFLAGS = $(AM_CPPFLAGS) $(ZLIB_CPPFLAGS)
xineplug_dmx_iff_la_SOURCES = demux_iff.c
-xineplug_dmx_iff_la_LIBADD = $(XINE_LIB)
+xineplug_dmx_iff_la_LIBADD = $(XINE_LIB) $(LTLIBINTL)
xineplug_dmx_flv_la_SOURCES = demux_flv.c
-xineplug_dmx_flv_la_LIBADD = $(XINE_LIB)
-
-xineinclude_HEADERS = demux.h
-noinst_HEADERS = asfheader.h qtpalette.h group_games.h group_audio.h id3.h ebml.h matroska.h iff.h flacutils.h
+xineplug_dmx_flv_la_LIBADD = $(XINE_LIB) $(LTLIBINTL)
diff --git a/src/demuxers/asfheader.c b/src/demuxers/asfheader.c
index 3c3cdb689..26a61d8fd 100644
--- a/src/demuxers/asfheader.c
+++ b/src/demuxers/asfheader.c
@@ -95,7 +95,7 @@ static int asf_reader_get_8(asf_reader_t *reader, uint8_t *value) {
static int asf_reader_get_16(asf_reader_t *reader, uint16_t *value) {
if ((reader->size - reader->pos) < 2)
return 0;
- *value = LE_16(reader->buffer + reader->pos);
+ *value = _X_LE_16(reader->buffer + reader->pos);
reader->pos += 2;
return 1;
}
@@ -103,7 +103,7 @@ static int asf_reader_get_16(asf_reader_t *reader, uint16_t *value) {
static int asf_reader_get_32(asf_reader_t *reader, uint32_t *value) {
if ((reader->size - reader->pos) < 4)
return 0;
- *value = LE_32(reader->buffer + reader->pos);
+ *value = _X_LE_32(reader->buffer + reader->pos);
reader->pos += 4;
return 1;
}
@@ -111,7 +111,7 @@ static int asf_reader_get_32(asf_reader_t *reader, uint32_t *value) {
static int asf_reader_get_64(asf_reader_t *reader, uint64_t *value) {
if ((reader->size - reader->pos) < 8)
return 0;
- *value = LE_64(reader->buffer + reader->pos);
+ *value = _X_LE_64(reader->buffer + reader->pos);
reader->pos += 8;
return 1;
}
@@ -152,7 +152,7 @@ static char *asf_reader_get_string(asf_reader_t *reader, size_t size, iconv_t cd
outbuf = scratch;
outbytesleft = sizeof(scratch);
reader->pos += size;
- if (iconv (cd, (ICONV_CONST char **)&inbuf, &inbytesleft, &outbuf, &outbytesleft) != -1) {
+ if (iconv (cd, (ICONV_CONST char **)&inbuf, &inbytesleft, &outbuf, &outbytesleft) != (size_t)-1) {
return strdup(scratch);
} else {
lprintf("iconv error\n");
@@ -187,9 +187,9 @@ static size_t asf_reader_get_size(asf_reader_t *reader) {
void asf_get_guid(uint8_t *buffer, GUID *value) {
int i;
- value->Data1 = LE_32(buffer);
- value->Data2 = LE_16(buffer + 4);
- value->Data3 = LE_16(buffer + 6);
+ value->Data1 = _X_LE_32(buffer);
+ value->Data2 = _X_LE_16(buffer + 4);
+ value->Data3 = _X_LE_16(buffer + 6);
for(i = 0; i < 8; i++) {
value->Data4[i] = *(buffer + i + 8);
}
diff --git a/src/demuxers/demux_4xm.c b/src/demuxers/demux_4xm.c
index 56360542c..6d599adac 100644
--- a/src/demuxers/demux_4xm.c
+++ b/src/demuxers/demux_4xm.c
@@ -144,8 +144,8 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
return 0;
/* check for the signature tags */
- if ((LE_32(&preview[0]) != RIFF_TAG) ||
- (LE_32(&preview[8]) != _4XMV_TAG))
+ if ((_X_LE_32(&preview[0]) != RIFF_TAG) ||
+ (_X_LE_32(&preview[8]) != _4XMV_TAG))
return 0;
/* file is qualified; skip over the header bytes in the stream */
@@ -154,12 +154,12 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
/* fetch the LIST-HEAD header */
if (fourxm->input->read(fourxm->input, preview, 12) != 12)
return 0;
- if ((LE_32(&preview[0]) != LIST_TAG) ||
- (LE_32(&preview[8]) != HEAD_TAG))
+ if ((_X_LE_32(&preview[0]) != LIST_TAG) ||
+ (_X_LE_32(&preview[8]) != HEAD_TAG))
return 0;
/* read the whole header */
- header_size = LE_32(&preview[4]) - 4;
+ header_size = _X_LE_32(&preview[4]) - 4;
header = xine_xmalloc(header_size);
if (fourxm->input->read(fourxm->input, header, header_size) != header_size) {
free(header);
@@ -174,8 +174,8 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
/* take the lazy approach and search for any and all vtrk and strk chunks */
for (i = 0; i < header_size - 8; i++) {
- fourcc_tag = LE_32(&header[i]);
- size = LE_32(&header[i + 4]);
+ fourcc_tag = _X_LE_32(&header[i]);
+ size = _X_LE_32(&header[i + 4]);
if (fourcc_tag == std__TAG) {
fps = get_le_float(&header[i + 12]);
@@ -186,13 +186,13 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
free(header);
return 0;
}
- total_frames = LE_32(&header[i + 24]);
+ total_frames = _X_LE_32(&header[i + 24]);
fourxm->duration_in_ms = total_frames;
fourxm->duration_in_ms *= fourxm->video_pts_inc;
fourxm->duration_in_ms /= 90000;
fourxm->duration_in_ms *= 1000;
- fourxm->bih.biWidth = LE_32(&header[i + 36]);
- fourxm->bih.biHeight = LE_32(&header[i + 40]);
+ fourxm->bih.biWidth = _X_LE_32(&header[i + 36]);
+ fourxm->bih.biHeight = _X_LE_32(&header[i + 40]);
i += 8 + size;
} else if (fourcc_tag == strk_TAG) {
/* check that there is enough data */
@@ -200,7 +200,7 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
free(header);
return 0;
}
- current_track = LE_32(&header[i + 8]);
+ current_track = _X_LE_32(&header[i + 8]);
if (current_track + 1 > fourxm->track_count) {
fourxm->track_count = current_track + 1;
fourxm->tracks = realloc(fourxm->tracks,
@@ -211,10 +211,10 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
}
}
- fourxm->tracks[current_track].channels = LE_32(&header[i + 36]);
- fourxm->tracks[current_track].sample_rate = LE_32(&header[i + 40]);
- fourxm->tracks[current_track].bits = LE_32(&header[i + 44]);
- audio_type = LE_32(&header[i + 12]);
+ fourxm->tracks[current_track].channels = _X_LE_32(&header[i + 36]);
+ fourxm->tracks[current_track].sample_rate = _X_LE_32(&header[i + 40]);
+ fourxm->tracks[current_track].bits = _X_LE_32(&header[i + 44]);
+ audio_type = _X_LE_32(&header[i + 12]);
if (audio_type == 0)
fourxm->tracks[current_track].audio_type = BUF_AUDIO_LPCM_LE;
else if (audio_type == 1)
@@ -253,8 +253,8 @@ static int demux_fourxm_send_chunk(demux_plugin_t *this_gen) {
return this->status;
}
- fourcc_tag = LE_32(&header[0]);
- size = LE_32(&header[4]);
+ fourcc_tag = _X_LE_32(&header[0]);
+ size = _X_LE_32(&header[4]);
switch (fourcc_tag) {
@@ -314,8 +314,8 @@ static int demux_fourxm_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- current_track = LE_32(&header[0]);
-// size = LE_32(&header[4]);
+ current_track = _X_LE_32(&header[0]);
+// size = _X_LE_32(&header[4]);
if (current_track >= this->track_count) {
lprintf ("bad audio track number (%d >= %d)\n",
diff --git a/src/demuxers/demux_aac.c b/src/demuxers/demux_aac.c
index ab71e8382..1a89cb328 100644
--- a/src/demuxers/demux_aac.c
+++ b/src/demuxers/demux_aac.c
@@ -84,7 +84,7 @@ static int open_aac_file(demux_aac_t *this) {
/* Check if there's an ID3v2 tag at the start */
if ( id3v2_istag(peak) ) {
- id3size = id3v2_tagsize(&peak[6]);
+ id3size = _X_BE_32_synchsafe(&peak[6]);
this->input->seek(this->input, 4, SEEK_SET);
diff --git a/src/demuxers/demux_ac3.c b/src/demuxers/demux_ac3.c
index 279da6336..ce33ab3c8 100644
--- a/src/demuxers/demux_ac3.c
+++ b/src/demuxers/demux_ac3.c
@@ -36,6 +36,9 @@
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
#define LOG_MODULE "demux_ac3"
#define LOG_VERBOSE
@@ -175,10 +178,10 @@ static int open_ac3_file(demux_ac3_t *this) {
lprintf("looks like a cd audio wav file\n");
/* Find the data chunk */
- offset = 20 + LE_32(&peak[16]);
+ offset = 20 + _X_LE_32(&peak[16]);
while (offset < peak_size-8) {
- unsigned int chunk_tag = LE_32(&peak[offset]);
- unsigned int chunk_size = LE_32(&peak[offset+4]);
+ unsigned int chunk_tag = _X_LE_32(&peak[offset]);
+ unsigned int chunk_size = _X_LE_32(&peak[offset+4]);
if (chunk_tag == DATA_TAG) {
offset += 8;
diff --git a/src/demuxers/demux_aiff.c b/src/demuxers/demux_aiff.c
index f88c58572..2039a3958 100644
--- a/src/demuxers/demux_aiff.c
+++ b/src/demuxers/demux_aiff.c
@@ -96,8 +96,8 @@ static int open_aiff_file(demux_aiff_t *this) {
return 0;
/* check the signature */
- if ((BE_32(&signature[0]) != FORM_TAG) ||
- (BE_32(&signature[8]) != AIFF_TAG))
+ if ((_X_BE_32(&signature[0]) != FORM_TAG) ||
+ (_X_BE_32(&signature[8]) != AIFF_TAG))
return 0;
/* file is qualified; skip over the header bytes in the stream */
@@ -118,8 +118,8 @@ static int open_aiff_file(demux_aiff_t *this) {
this->status = DEMUX_FINISHED;
return 0;
}
- chunk_type = BE_32(&preamble[0]);
- chunk_size = BE_32(&preamble[4]);
+ chunk_type = _X_BE_32(&preamble[0]);
+ chunk_size = _X_BE_32(&preamble[4]);
if (chunk_size > sizeof(buffer) / sizeof(buffer[0])) {
/* the chunk is too large to fit in the buffer -> this cannot be an aiff chunk */
@@ -134,10 +134,10 @@ static int open_aiff_file(demux_aiff_t *this) {
return 0;
}
- this->audio_channels = BE_16(&buffer[0]);
- this->audio_frames = BE_32(&buffer[2]);
- this->audio_bits = BE_16(&buffer[6]);
- this->audio_sample_rate = BE_16(&buffer[0x0A]);
+ this->audio_channels = _X_BE_16(&buffer[0]);
+ this->audio_frames = _X_BE_32(&buffer[2]);
+ this->audio_bits = _X_BE_16(&buffer[6]);
+ this->audio_sample_rate = _X_BE_16(&buffer[0x0A]);
this->audio_bytes_per_second = this->audio_channels *
(this->audio_bits / 8) * this->audio_sample_rate;
diff --git a/src/demuxers/demux_asf.c b/src/demuxers/demux_asf.c
index 65838138f..a147068f9 100644
--- a/src/demuxers/demux_asf.c
+++ b/src/demuxers/demux_asf.c
@@ -201,7 +201,7 @@ static uint16_t get_le16 (demux_asf_t *this) {
this->status = DEMUX_FINISHED;
}
- return LE_16(buf);
+ return _X_LE_16(buf);
}
static uint32_t get_le32 (demux_asf_t *this) {
@@ -218,7 +218,7 @@ static uint32_t get_le32 (demux_asf_t *this) {
this->status = DEMUX_FINISHED;
}
- return LE_32(buf);
+ return _X_LE_32(buf);
}
static uint64_t get_le64 (demux_asf_t *this) {
@@ -233,7 +233,7 @@ static uint64_t get_le64 (demux_asf_t *this) {
this->status = DEMUX_FINISHED;
}
- return LE_64(buf);
+ return _X_LE_64(buf);
}
static int get_guid_id (demux_asf_t *this, GUID *g) {
@@ -483,10 +483,10 @@ static int asf_read_header (demux_asf_t *this) {
uint16_t bmiheader_size;
xine_bmiheader *bmiheader;
- width = LE_32(asf_stream->private_data);
- height = LE_32(asf_stream->private_data + 4);
+ width = _X_LE_32(asf_stream->private_data);
+ height = _X_LE_32(asf_stream->private_data + 4);
/* there is one unknown byte between height and the bmiheader size */
- bmiheader_size = LE_16(asf_stream->private_data + 9);
+ bmiheader_size = _X_LE_16(asf_stream->private_data + 9);
/* FIXME: bmiheader_size must be >= sizeof(xine_bmiheader) */
@@ -935,9 +935,9 @@ static int asf_parse_packet_ecd(demux_asf_t *this, uint32_t *p_hdr_size) {
return 1;
}
*p_hdr_size += 15;
- guid->Data1 = LE_32(buf);
- guid->Data2 = LE_16(buf + 4);
- guid->Data3 = LE_16(buf + 6);
+ guid->Data1 = _X_LE_32(buf);
+ guid->Data2 = _X_LE_16(buf + 4);
+ guid->Data3 = _X_LE_16(buf + 6);
if (get_guid_id(this, guid) == GUID_ASF_HEADER) {
lprintf("new asf header detected\n");
_x_demux_control_end(this->stream, 0);
@@ -2042,10 +2042,8 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen,
!strstr(buf,"ASX") &&
strncmp(buf,"[Reference]", 11) &&
strncmp(buf,"ASF ", 4) &&
- ((buf[0] != 0x30)
- || (buf[1] != 0x26)
- || (buf[2] != 0xb2)
- || (buf[3] != 0x75)))
+ memcmp(buf, "\x30\x26\xB2\x75", 4)
+ )
return NULL;
}
diff --git a/src/demuxers/demux_aud.c b/src/demuxers/demux_aud.c
index ea57a6939..23ba15df8 100644
--- a/src/demuxers/demux_aud.c
+++ b/src/demuxers/demux_aud.c
@@ -97,7 +97,7 @@ static int open_aud_file(demux_aud_t *this) {
* of numbers. There is a 80002/16777216 = 0.48% chance of a false
* positive.
*/
- this->audio_samplerate = LE_16(&header[0]);
+ this->audio_samplerate = _X_LE_16(&header[0]);
if ((this->audio_samplerate < 8000) || (this->audio_samplerate > 48000))
return 0;
@@ -133,7 +133,7 @@ static int demux_aud_send_chunk(demux_plugin_t *this_gen) {
demux_aud_t *this = (demux_aud_t *) this_gen;
unsigned char chunk_preamble[AUD_CHUNK_PREAMBLE_SIZE];
- unsigned int chunk_size;
+ int chunk_size;
off_t current_file_pos;
int64_t audio_pts;
buf_element_t *buf;
@@ -145,12 +145,12 @@ static int demux_aud_send_chunk(demux_plugin_t *this_gen) {
}
/* validate the chunk */
- if (LE_32(&chunk_preamble[4]) != 0x0000DEAF) {
+ if (_X_LE_32(&chunk_preamble[4]) != 0x0000DEAF) {
this->status = DEMUX_FINISHED;
return this->status;
}
- chunk_size = LE_16(&chunk_preamble[0]);
+ chunk_size = _X_LE_16(&chunk_preamble[0]);
current_file_pos = this->input->get_current_pos(this->input) -
this->data_start;
diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c
index fe324c2f4..960d396f3 100644
--- a/src/demuxers/demux_avi.c
+++ b/src/demuxers/demux_avi.c
@@ -333,13 +333,13 @@ typedef struct {
/* bit 31 denotes a keyframe */
static uint32_t odml_len (unsigned char *str)
{
- return LE_32(str) & 0x7fffffff;
+ return _X_LE_32(str) & 0x7fffffff;
}
/* if bit 31 is 0, its a keyframe */
static uint32_t odml_key (unsigned char *str)
{
- return (LE_32(str) & 0x80000000)?0:0x10;
+ return (_X_LE_32(str) & 0x80000000)?0:0x10;
}
static void check_newpts (demux_avi_t *this, int64_t pts, int video) {
@@ -554,7 +554,7 @@ static int idx_grow(demux_avi_t *this, int (*stopper)(demux_avi_t *, void *),
continue;
}
- chunk_len = LE_32(data + 4);
+ chunk_len = _X_LE_32(data + 4);
this->idx_grow.nexttagoffset += PAD_EVEN(chunk_len + AVI_HEADER_SIZE);
@@ -777,7 +777,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
break; /* We assume it's EOF */
}
- n = LE_32(data + 4);
+ n = _X_LE_32(data + 4);
n = PAD_EVEN(n);
next_chunk = this->idx_grow.nexttagoffset + 8 + n;
@@ -850,7 +850,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
continue;
}
- n = LE_32(hdrl_data + i + 4);
+ n = _X_LE_32(hdrl_data + i + 4);
n = PAD_EVEN(n);
/* Interpret the tag and its args */
@@ -862,10 +862,10 @@ static avi_t *AVI_init(demux_avi_t *this) {
if(strncasecmp(hdrl_data + i, "vids", 4) == 0 && !vids_strh_seen) {
AVI->compressor = *(uint32_t *) (hdrl_data + i + 4);
- AVI->dwInitialFrames = LE_32(hdrl_data + i + 16);
- AVI->dwScale = LE_32(hdrl_data + i + 20);
- AVI->dwRate = LE_32(hdrl_data + i + 24);
- AVI->dwStart = LE_32(hdrl_data + i + 28);
+ AVI->dwInitialFrames = _X_LE_32(hdrl_data + i + 16);
+ AVI->dwScale = _X_LE_32(hdrl_data + i + 20);
+ AVI->dwRate = _X_LE_32(hdrl_data + i + 24);
+ AVI->dwStart = _X_LE_32(hdrl_data + i + 28);
if(AVI->dwScale!=0)
AVI->fps = (double)AVI->dwRate/(double)AVI->dwScale;
@@ -890,15 +890,15 @@ static avi_t *AVI_init(demux_avi_t *this) {
AVI->audio[AVI->n_audio] = a;
a->audio_strn = num_stream;
- a->dwInitialFrames = LE_32(hdrl_data + i + 16);
- a->dwScale = LE_32(hdrl_data + i + 20);
- a->dwRate = LE_32(hdrl_data + i + 24);
- a->dwStart = LE_32(hdrl_data + i + 28);
+ a->dwInitialFrames = _X_LE_32(hdrl_data + i + 16);
+ a->dwScale = _X_LE_32(hdrl_data + i + 20);
+ a->dwRate = _X_LE_32(hdrl_data + i + 24);
+ a->dwStart = _X_LE_32(hdrl_data + i + 28);
lprintf("dwScale=%d, dwRate=%d, dwInitialFrames=%d, dwStart=%d, num_stream=%d\n",
a->dwScale, a->dwRate, a->dwInitialFrames, a->dwStart, num_stream);
- a->dwSampleSize = LE_32(hdrl_data + i + 44);
+ a->dwSampleSize = _X_LE_32(hdrl_data + i + 44);
a->audio_tot = 0;
auds_strh_seen = 1;
lprintf("audio stream header, num_stream=%d\n", num_stream);
@@ -913,7 +913,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
num_stream++;
} else if(strncasecmp(hdrl_data+i,"dmlh",4) == 0) {
- AVI->total_frames = LE_32(hdrl_data+i+8);
+ AVI->total_frames = _X_LE_32(hdrl_data+i+8);
#ifdef DEBUG_ODML
lprintf( "AVI: real number of frames %d\n", AVI->total_frames);
#endif
@@ -921,7 +921,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
} else if(strncasecmp(hdrl_data + i, "strf", 4) == 0) {
i += 4;
- strf_size = LE_32(hdrl_data + i);
+ strf_size = _X_LE_32(hdrl_data + i);
i += 4;
if(lasttag == 1) {
/* lprintf ("size : %d\n",sizeof(AVI->bih)); */
@@ -1000,11 +1000,11 @@ static avi_t *AVI_init(demux_avi_t *this) {
superindex = (avisuperindex_chunk *) malloc (sizeof (avisuperindex_chunk));
a = hdrl_data + i;
memcpy (superindex->fcc, a, 4); a += 4;
- superindex->dwSize = LE_32(a); a += 4;
- superindex->wLongsPerEntry = LE_16(a); a += 2;
+ superindex->dwSize = _X_LE_32(a); a += 4;
+ superindex->wLongsPerEntry = _X_LE_16(a); a += 2;
superindex->bIndexSubType = *a; a += 1;
superindex->bIndexType = *a; a += 1;
- superindex->nEntriesInUse = LE_32(a); a += 4;
+ superindex->nEntriesInUse = _X_LE_32(a); a += 4;
memcpy (superindex->dwChunkId, a, 4); a += 4;
#ifdef DEBUG_ODML
@@ -1038,9 +1038,9 @@ static avi_t *AVI_init(demux_avi_t *this) {
superindex->aIndex = malloc (superindex->nEntriesInUse * sizeof (avisuperindex_entry));
/* position of ix## chunks */
for (j = 0; j < superindex->nEntriesInUse; ++j) {
- superindex->aIndex[j].qwOffset = LE_64 (a); a += 8;
- superindex->aIndex[j].dwSize = LE_32 (a); a += 4;
- superindex->aIndex[j].dwDuration = LE_32 (a); a += 4;
+ superindex->aIndex[j].qwOffset = _X_LE_64 (a); a += 8;
+ superindex->aIndex[j].dwSize = _X_LE_32 (a); a += 4;
+ superindex->aIndex[j].dwDuration = _X_LE_32 (a); a += 4;
#ifdef DEBUG_ODML
printf("[%d] 0x%llx 0x%x %u\n", j,
(uint64_t)superindex->aIndex[j].qwOffset,
@@ -1148,21 +1148,21 @@ static avi_t *AVI_init(demux_avi_t *this) {
ERR_EXIT(AVI_ERR_NO_VIDS);
}
- pos = LE_32(AVI->idx[i] + 8);
- len = LE_32(AVI->idx[i] + 12);
+ pos = _X_LE_32(AVI->idx[i] + 8);
+ len = _X_LE_32(AVI->idx[i] + 12);
this->input->seek(this->input, pos, SEEK_SET);
if(this->input->read(this->input, data, 8) != 8)
ERR_EXIT(AVI_ERR_READ) ;
- if( (strncasecmp(data, AVI->idx[i], 4) == 0) && (LE_32(data + 4) == len) ) {
+ if( (strncasecmp(data, AVI->idx[i], 4) == 0) && (_X_LE_32(data + 4) == len) ) {
idx_type = 1; /* Index from start of file */
} else {
this->input->seek(this->input, pos + AVI->movi_start - 4, SEEK_SET);
if(this->input->read(this->input, data, 8) != 8)
ERR_EXIT(AVI_ERR_READ) ;
- if( strncasecmp(data,AVI->idx[i], 4) == 0 && LE_32(data + 4) == len ) {
+ if( strncasecmp(data,AVI->idx[i], 4) == 0 && _X_LE_32(data + 4) == len ) {
idx_type = 2; /* Index from start of movi list */
}
}
@@ -1183,9 +1183,9 @@ static avi_t *AVI_init(demux_avi_t *this) {
if((AVI->idx[i][0] == AVI->video_tag[0]) &&
(AVI->idx[i][1] == AVI->video_tag[1])) {
- off_t pos = LE_32(AVI->idx[i] + 8) + ioff;
- uint32_t len = LE_32(AVI->idx[i] + 12);
- uint32_t flags = LE_32(AVI->idx[i] + 4);
+ off_t pos = _X_LE_32(AVI->idx[i] + 8) + ioff;
+ uint32_t len = _X_LE_32(AVI->idx[i] + 12);
+ uint32_t flags = _X_LE_32(AVI->idx[i] + 4);
if (video_index_append(AVI, pos, len, flags) == -1) {
ERR_EXIT(AVI_ERR_NO_MEM) ;
@@ -1196,8 +1196,8 @@ static avi_t *AVI_init(demux_avi_t *this) {
if((AVI->idx[i][0] == audio->audio_tag[0]) &&
(AVI->idx[i][1] == audio->audio_tag[1])) {
- off_t pos = LE_32(AVI->idx[i] + 8) + ioff;
- uint32_t len = LE_32(AVI->idx[i] + 12);
+ off_t pos = _X_LE_32(AVI->idx[i] + 8) + ioff;
+ uint32_t len = _X_LE_32(AVI->idx[i] + 12);
/* VBR streams (hack from mplayer) */
if (audio->wavex && audio->wavex->nBlockAlign) {
@@ -1255,11 +1255,11 @@ static avi_t *AVI_init(demux_avi_t *this) {
continue;
}
- nrEntries = LE_32(en + 12);
+ nrEntries = _X_LE_32(en + 12);
#ifdef DEBUG_ODML
printf("[%d:0] Video nrEntries %ld\n", j, (long)nrEntries);
#endif
- offset = LE_64(en + 20);
+ offset = _X_LE_64(en + 20);
/* skip header */
en += hdrl_len;
@@ -1270,7 +1270,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
uint32_t len;
uint32_t flags;
- pos = offset + LE_32(en); en += 4;
+ pos = offset + _X_LE_32(en); en += 4;
len = odml_len(en);
flags = odml_key(en); en += 4;
video_index_append(AVI, pos, len, flags);
@@ -1325,11 +1325,11 @@ static avi_t *AVI_init(demux_avi_t *this) {
continue;
}
- nrEntries = LE_32(en + 12);
+ nrEntries = _X_LE_32(en + 12);
#ifdef DEBUG_ODML
/*printf("[%d:%d] Audio nrEntries %ld\n", j, audtr, nrEntries); */
#endif
- offset = LE_64(en + 20);
+ offset = _X_LE_64(en + 20);
/* skip header */
en += hdrl_len;
@@ -1340,7 +1340,7 @@ static avi_t *AVI_init(demux_avi_t *this) {
off_t pos;
uint32_t len;
- pos = offset + LE_32(en); en += 4;
+ pos = offset + _X_LE_32(en); en += 4;
len = odml_len(en); en += 4;
/* VBR streams (hack from mplayer) */
@@ -1647,7 +1647,7 @@ static int get_chunk_header(demux_avi_t *this, uint32_t *len, int *audio_stream)
while (1) {
if (this->input->read(this->input, data, AVI_HEADER_SIZE) != AVI_HEADER_SIZE)
break;
- *len = LE_32(data + 4);
+ *len = _X_LE_32(data + 4);
lprintf("header: %c%c%c%c, pos=%" PRIdMAX ", len=%u\n",
data[0], data[1], data[2], data[3],
diff --git a/src/demuxers/demux_dts.c b/src/demuxers/demux_dts.c
index a9541b6f7..0fe758e70 100644
--- a/src/demuxers/demux_dts.c
+++ b/src/demuxers/demux_dts.c
@@ -32,6 +32,9 @@
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
#define LOG_MODULE "demux_dts"
#define LOG_VERBOSE
@@ -125,10 +128,10 @@ static int open_dts_file(demux_dts_t *this) {
lprintf("looks like a cd audio wav file\n");
/* Find the data chunk */
- offset = 20 + LE_32(&peak[16]);
+ offset = 20 + _X_LE_32(&peak[16]);
while (offset < peak_size-8) {
- unsigned int chunk_tag = LE_32(&peak[offset]);
- unsigned int chunk_size = LE_32(&peak[offset+4]);
+ unsigned int chunk_tag = _X_LE_32(&peak[offset]);
+ unsigned int chunk_size = _X_LE_32(&peak[offset+4]);
if (chunk_tag == DATA_TAG) {
offset += 8;
diff --git a/src/demuxers/demux_eawve.c b/src/demuxers/demux_eawve.c
index 67c087208..c1718d803 100644
--- a/src/demuxers/demux_eawve.c
+++ b/src/demuxers/demux_eawve.c
@@ -247,7 +247,7 @@ static int demux_eawve_send_chunk(demux_eawve_t *this){
if (first_segment) {
buf->decoder_flags |= BUF_FLAG_FRAME_START;
- this->sample_counter += LE_32(buf->content);
+ this->sample_counter += _X_LE_32(buf->content);
first_segment = 0;
}
diff --git a/src/demuxers/demux_film.c b/src/demuxers/demux_film.c
index d3cedc0e1..e4c1c1895 100644
--- a/src/demuxers/demux_film.c
+++ b/src/demuxers/demux_film.c
@@ -152,7 +152,7 @@ static int open_film_file(demux_film_t *film) {
film->input->seek(film->input, 16, SEEK_SET);
/* header size = header size - 16-byte FILM signature */
- film_header_size = BE_32(&scratch[4]) - 16;
+ film_header_size = _X_BE_32(&scratch[4]) - 16;
film_header = xine_xmalloc(film_header_size);
if (!film_header)
return 0;
@@ -180,8 +180,8 @@ static int open_film_file(demux_film_t *film) {
/* traverse the FILM header */
i = 0;
while (i < film_header_size) {
- chunk_type = BE_32(&film_header[i]);
- chunk_size = BE_32(&film_header[i + 4]);
+ chunk_type = _X_BE_32(&film_header[i]);
+ chunk_size = _X_BE_32(&film_header[i + 4]);
/* sanity check the chunk size */
if (i + chunk_size > film_header_size) {
@@ -197,8 +197,8 @@ static int open_film_file(demux_film_t *film) {
llprintf(DEBUG_FILM_LOAD, "parsing FDSC chunk\n");
/* always fetch the video information */
- film->bih.biWidth = BE_32(&film_header[i + 16]);
- film->bih.biHeight = BE_32(&film_header[i + 12]);
+ film->bih.biWidth = _X_BE_32(&film_header[i + 16]);
+ film->bih.biHeight = _X_BE_32(&film_header[i + 12]);
film->video_codec = *(uint32_t *)&film_header[i + 8];
film->video_type = _x_fourcc_to_buf_video(*(uint32_t *)&film_header[i + 8]);
@@ -209,7 +209,7 @@ static int open_film_file(demux_film_t *film) {
if (chunk_size == 32) {
film->audio_channels = film_header[21];
film->audio_bits = film_header[22];
- film->sample_rate = BE_16(&film_header[24]);
+ film->sample_rate = _X_BE_16(&film_header[24]);
} else {
/* If the FDSC chunk is not 32 bytes long, this is an early FILM
* file. Make a few assumptions about the audio parms based on the
@@ -255,21 +255,21 @@ static int open_film_file(demux_film_t *film) {
/* load the sample table */
if (film->sample_table)
free(film->sample_table);
- film->frequency = BE_32(&film_header[i + 8]);
- film->sample_count = BE_32(&film_header[i + 12]);
+ film->frequency = _X_BE_32(&film_header[i + 8]);
+ film->sample_count = _X_BE_32(&film_header[i + 12]);
film->sample_table =
- xine_xmalloc(film->sample_count * sizeof(film_sample_t));
+ xine_xcalloc(film->sample_count, sizeof(film_sample_t));
for (j = 0; j < film->sample_count; j++) {
film->sample_table[j].sample_offset =
- BE_32(&film_header[(i + 16) + j * 16 + 0])
+ _X_BE_32(&film_header[(i + 16) + j * 16 + 0])
+ film_header_size + 16;
film->sample_table[j].sample_size =
- BE_32(&film_header[(i + 16) + j * 16 + 4]);
+ _X_BE_32(&film_header[(i + 16) + j * 16 + 4]);
pts =
- BE_32(&film_header[(i + 16) + j * 16 + 8]);
+ _X_BE_32(&film_header[(i + 16) + j * 16 + 8]);
film->sample_table[j].duration =
- BE_32(&film_header[(i + 16) + j * 16 + 12]);
+ _X_BE_32(&film_header[(i + 16) + j * 16 + 12]);
if (pts == 0xFFFFFFFF) {
diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c
index f52da4d03..488a909cb 100644
--- a/src/demuxers/demux_flac.c
+++ b/src/demuxers/demux_flac.c
@@ -90,37 +90,24 @@ static int open_flac_file(demux_flac_t *flac) {
flac->seekpoints = NULL;
- /* fetch the file signature, get enough bytes so that id3 can also
- be skipped and/or parsed */
- if (_x_demux_read_header(flac->input, preamble, 10) != 10)
+ /* fetch the file signature, 4 bytes will read both the fLaC
+ * signature and the */
+ if (_x_demux_read_header(flac->input, preamble, 4) != 4)
return 0;
+ flac->input->seek(flac->input, 4, SEEK_SET);
+
/* Unfortunately some FLAC files have an ID3 flag prefixed on them
* before the actual FLAC headers... these are barely legal, but
* users use them and want them working, so check and skip the ID3
* tag if present.
*/
if ( id3v2_istag(preamble) ) {
- uint32_t id3size;
-
- /* First 3 bytes are the ID3 signature as above, then comes two bytes
- * encoding the major and minor version of ID3 used, that we can ignore
- * as long as we don't try to read the metadata; after those there's a
- * single byte with flags that depends on the ID3 version used; and now
- * after all that stuff, there's the size of the rest of the tag, which
- * is encoded as four bytes.. but only 7 out of 8 bits of every byte is
- * used... don't ask.
- */
- id3size = id3v2_tagsize(&preamble[6]);
-
id3v2_parse_tag(flac->input, flac->stream, preamble);
- flac->input->seek(flac->input, id3size, SEEK_SET);
-
if ( flac->input->read(flac->input, preamble, 4) != 4 )
return 0;
- } else
- flac->input->seek(flac->input, 4, SEEK_SET);
+ }
/* validate signature */
if ((preamble[0] != 'f') || (preamble[1] != 'L') ||
@@ -153,11 +140,11 @@ static int open_flac_file(demux_flac_t *flac) {
flac->streaminfo + sizeof(xine_waveformatex),
FLAC_STREAMINFO_SIZE) != FLAC_STREAMINFO_SIZE)
return 0;
- flac->sample_rate = BE_32(&streaminfo[10]);
+ flac->sample_rate = _X_BE_32(&streaminfo[10]);
flac->channels = ((flac->sample_rate >> 9) & 0x07) + 1;
flac->bits_per_sample = ((flac->sample_rate >> 4) & 0x1F) + 1;
flac->sample_rate >>= 12;
- flac->total_samples = BE_64(&streaminfo[10]) & UINT64_C(0x0FFFFFFFFF); /* 36 bits */
+ flac->total_samples = _X_BE_64(&streaminfo[10]) & UINT64_C(0x0FFFFFFFFF); /* 36 bits */
lprintf ("%d Hz, %d bits, %d channels, %"PRId64" total samples\n",
flac->sample_rate, flac->bits_per_sample,
flac->channels, flac->total_samples);
@@ -179,15 +166,15 @@ static int open_flac_file(demux_flac_t *flac) {
case 3:
lprintf ("SEEKTABLE metadata, %d bytes\n", block_length);
flac->seekpoint_count = block_length / FLAC_SEEKPOINT_SIZE;
- flac->seekpoints = xine_xmalloc(flac->seekpoint_count *
- sizeof(flac_seekpoint_t));
+ flac->seekpoints = xine_xcalloc(flac->seekpoint_count,
+ sizeof(flac_seekpoint_t));
for (i = 0; i < flac->seekpoint_count; i++) {
if (flac->input->read(flac->input, buffer, FLAC_SEEKPOINT_SIZE) != FLAC_SEEKPOINT_SIZE)
return 0;
- flac->seekpoints[i].sample_number = BE_64(&buffer[0]);
+ flac->seekpoints[i].sample_number = _X_BE_64(&buffer[0]);
lprintf (" %d: sample %"PRId64", ", i, flac->seekpoints[i].sample_number);
- flac->seekpoints[i].offset = BE_64(&buffer[8]);
- flac->seekpoints[i].size = BE_16(&buffer[16]);
+ flac->seekpoints[i].offset = _X_BE_64(&buffer[8]);
+ flac->seekpoints[i].size = _X_BE_16(&buffer[16]);
lprintf ("@ 0x%"PRIX64", size = %d bytes, ",
flac->seekpoints[i].offset, flac->seekpoints[i].size);
flac->seekpoints[i].pts = flac->seekpoints[i].sample_number;
@@ -205,9 +192,8 @@ static int open_flac_file(demux_flac_t *flac) {
lprintf ("VORBIS_COMMENT metadata\n");
{
char comments[block_length];
- void *ptr = comments;
- uint32_t length, user_comment_list_length;
- int cn;
+ char *ptr = comments;
+ uint32_t length, user_comment_list_length, cn;
char *comment;
char c;
@@ -215,15 +201,15 @@ static int open_flac_file(demux_flac_t *flac) {
int tracknumber = -1;
int tracktotal = -1;
- length = LE_32(ptr);
+ length = _X_LE_32(ptr);
ptr += 4 + length;
- user_comment_list_length = LE_32(ptr);
+ user_comment_list_length = _X_LE_32(ptr);
ptr += 4;
cn = 0;
for (; cn < user_comment_list_length; cn++) {
- length = LE_32(ptr);
+ length = _X_LE_32(ptr);
ptr += 4;
comment = (char*) ptr;
diff --git a/src/demuxers/demux_fli.c b/src/demuxers/demux_fli.c
index c9cc26cf1..921f08294 100644
--- a/src/demuxers/demux_fli.c
+++ b/src/demuxers/demux_fli.c
@@ -86,7 +86,7 @@ static int open_fli_file(demux_fli_t *this) {
return 0;
/* validate the file */
- this->magic_number = LE_16(&this->fli_header[4]);
+ this->magic_number = _X_LE_16(&this->fli_header[4]);
if ((this->magic_number != FLI_FILE_MAGIC_1) &&
(this->magic_number != FLI_FILE_MAGIC_2))
return 0;
@@ -95,7 +95,7 @@ static int open_fli_file(demux_fli_t *this) {
this->input->seek(this->input, FLI_HEADER_SIZE, SEEK_SET);
/* check if this is a special FLI file from Magic Carpet game */
- if (LE_16(&this->fli_header[16]) == FLI_CHUNK_MAGIC_1) {
+ if (_X_LE_16(&this->fli_header[16]) == FLI_CHUNK_MAGIC_1) {
/* if the input is non-seekable, do not bother with playing the
* special file type */
if (INPUT_IS_SEEKABLE(this->input)) {
@@ -108,11 +108,11 @@ static int open_fli_file(demux_fli_t *this) {
this->magic_number = FLI_FILE_MAGIC_3;
}
- this->frame_count = LE_16(&this->fli_header[6]);
- this->bih.biWidth = LE_16(&this->fli_header[8]);
- this->bih.biHeight = LE_16(&this->fli_header[10]);
+ this->frame_count = _X_LE_16(&this->fli_header[6]);
+ this->bih.biWidth = _X_LE_16(&this->fli_header[8]);
+ this->bih.biHeight = _X_LE_16(&this->fli_header[10]);
- this->speed = LE_32(&this->fli_header[16]);
+ this->speed = _X_LE_32(&this->fli_header[16]);
if (this->magic_number == FLI_FILE_MAGIC_1) {
/*
* in this case, the speed (n) is number of 1/70s ticks between frames:
@@ -169,8 +169,8 @@ static int demux_fli_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- chunk_size = LE_32(&fli_buf[0]);
- chunk_magic = LE_16(&fli_buf[4]);
+ chunk_size = _X_LE_32(&fli_buf[0]);
+ chunk_magic = _X_LE_16(&fli_buf[4]);
if ((chunk_magic == FLI_CHUNK_MAGIC_1) ||
(chunk_magic == FLI_CHUNK_MAGIC_2)) {
diff --git a/src/demuxers/demux_flv.c b/src/demuxers/demux_flv.c
index 0588b408e..e8ba46ee5 100644
--- a/src/demuxers/demux_flv.c
+++ b/src/demuxers/demux_flv.c
@@ -180,7 +180,7 @@ static int open_flv_file(demux_flv_t *this) {
return 0;
}
- this->start = BE_32(&buffer[5]);
+ this->start = _X_BE_32(&buffer[5]);
this->size = this->input->get_length(this->input);
if (INPUT_IS_SEEKABLE(this->input))
@@ -196,7 +196,7 @@ static int open_flv_file(demux_flv_t *this) {
#define BE_F64(buf) ({\
union { uint64_t q; double d; } _tmp;\
- _tmp.q = BE_64(buf);\
+ _tmp.q = _X_BE_64(buf);\
_tmp.d;\
})\
@@ -244,11 +244,11 @@ static int parse_flv_var(demux_flv_t *this,
break;
case FLV_DATA_TYPE_STRING:
lprintf(" got string (%s)\n", tmp+2);
- len = BE_16(tmp);
+ len = _X_BE_16(tmp);
tmp += len + 2;
break;
case FLV_DATA_TYPE_OBJECT:
- while ((len = BE_16(tmp)) && tmp < end) {
+ while ((len = _X_BE_16(tmp)) && tmp < end) {
lprintf(" got object var (%s)\n", tmp+2);
str = tmp + 2;
tmp += len + 2;
@@ -259,12 +259,12 @@ static int parse_flv_var(demux_flv_t *this,
return 0;
break;
case FLV_DATA_TYPE_ECMARRAY:
- lprintf(" got EMCA array (%d indices)\n", BE_32(tmp));
- num = BE_32(tmp);
+ lprintf(" got EMCA array (%d indices)\n", _X_BE_32(tmp));
+ num = _X_BE_32(tmp);
tmp += 4;
while (num-- && tmp < end) {
lprintf(" got array key (%s)\n", tmp+2);
- len = BE_16(tmp);
+ len = _X_BE_16(tmp);
str = tmp + 2;
tmp += len + 2;
len = parse_flv_var(this, tmp, end-tmp, str, len);
@@ -272,13 +272,13 @@ static int parse_flv_var(demux_flv_t *this,
}
break;
case FLV_DATA_TYPE_ARRAY:
- lprintf(" got array (%d indices)\n", BE_32(tmp));
- num = BE_32(tmp);
+ lprintf(" got array (%d indices)\n", _X_BE_32(tmp));
+ num = _X_BE_32(tmp);
tmp += 4;
if (key && keylen == 5 && !strncmp(key, "times", 5)) {
if (this->index)
free (this->index);
- this->index = xine_xmalloc(num*sizeof(flv_index_entry_t));
+ this->index = xine_xcalloc(num, sizeof(flv_index_entry_t));
this->num_indices = num;
for (num = 0; num < this->num_indices && tmp < end; num++) {
if (*tmp++ == FLV_DATA_TYPE_NUMBER) {
@@ -307,7 +307,7 @@ static int parse_flv_var(demux_flv_t *this,
}
break;
case FLV_DATA_TYPE_DATE:
- lprintf(" got date (%"PRId64", %d)\n", BE_64(tmp), BE_16(tmp+8));
+ lprintf(" got date (%"PRId64", %d)\n", _X_BE_64(tmp), _X_BE_16(tmp+8));
tmp += 10;
break;
default:
@@ -359,8 +359,8 @@ static int read_flv_packet(demux_flv_t *this) {
}
tag_type = buffer[0];
- remaining_bytes = BE_24(&buffer[1]);
- pts = BE_24(&buffer[4]) | (buffer[7] << 24);
+ remaining_bytes = _X_BE_24(&buffer[1]);
+ pts = _X_BE_24(&buffer[4]) | (buffer[7] << 24);
lprintf(" tag_type = 0x%02X, 0x%X bytes, pts %u\n",
tag_type, remaining_bytes, pts/90);
@@ -577,10 +577,10 @@ static void seek_flv_file(demux_flv_t *this, int seek_pts) {
break;
}
- ptag_size = BE_32(&buffer[0]);
+ ptag_size = _X_BE_32(&buffer[0]);
tag_type = buffer[4];
- data_size = BE_24(&buffer[5]);
- pts = BE_24(&buffer[8]) | (buffer[11] << 24);
+ data_size = _X_BE_24(&buffer[5]);
+ pts = _X_BE_24(&buffer[8]) | (buffer[11] << 24);
if (do_rewind) {
if (!ptag_size) break; /* beginning of movie */
diff --git a/src/demuxers/demux_idcin.c b/src/demuxers/demux_idcin.c
index 461771425..5c440ad6e 100644
--- a/src/demuxers/demux_idcin.c
+++ b/src/demuxers/demux_idcin.c
@@ -130,7 +130,7 @@ static int demux_idcin_send_chunk(demux_plugin_t *this_gen) {
unsigned char disk_palette[PALETTE_SIZE * 3];
palette_entry_t palette[PALETTE_SIZE];
int i;
- unsigned int remaining_sample_bytes;
+ int remaining_sample_bytes;
int scale_bits;
/* figure out what the next data is */
@@ -191,7 +191,7 @@ static int demux_idcin_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- remaining_sample_bytes = LE_32(&preamble[0]) - 4;
+ remaining_sample_bytes = _X_LE_32(&preamble[0]) - 4;
lprintf("dispatching %d video bytes\n", remaining_sample_bytes);
while (remaining_sample_bytes) {
@@ -293,28 +293,28 @@ static int open_idcin_file(demux_idcin_t *this) {
*/
/* check the width */
- bih->biWidth = LE_32(&header[0]);
+ bih->biWidth = _X_LE_32(&header[0]);
if ((bih->biWidth == 0) || (bih->biWidth > 1024))
return 0;
/* check the height */
- bih->biHeight = LE_32(&header[4]);
+ bih->biHeight = _X_LE_32(&header[4]);
if ((bih->biHeight == 0) || (bih->biHeight > 1024))
return 0;
/* check the audio sample rate */
- this->wave.nSamplesPerSec = LE_32(&header[8]);
+ this->wave.nSamplesPerSec = _X_LE_32(&header[8]);
if ((this->wave.nSamplesPerSec != 0) &&
((this->wave.nSamplesPerSec < 8000) || (this->wave.nSamplesPerSec > 48000)))
return 0;
/* check the audio bytes/sample */
- this->wave.wBitsPerSample = LE_32(&header[12]) * 8;
+ this->wave.wBitsPerSample = _X_LE_32(&header[12]) * 8;
if (this->wave.wBitsPerSample > 16)
return 0;
/* check the audio channels */
- this->wave.nChannels = LE_32(&header[16]);
+ this->wave.nChannels = _X_LE_32(&header[16]);
if (this->wave.nChannels > 2)
return 0;
@@ -359,7 +359,8 @@ static void demux_idcin_send_headers(demux_plugin_t *this_gen) {
demux_idcin_t *this = (demux_idcin_t *) this_gen;
buf_element_t *buf;
xine_bmiheader *bih = (xine_bmiheader *)this->bih;
- uint32_t i, size;
+ uint32_t i;
+ int size;
this->video_fifo = this->stream->video_fifo;
this->audio_fifo = this->stream->audio_fifo;
diff --git a/src/demuxers/demux_iff.c b/src/demuxers/demux_iff.c
index 7ca851718..7323c061d 100644
--- a/src/demuxers/demux_iff.c
+++ b/src/demuxers/demux_iff.c
@@ -187,8 +187,8 @@ static int read_iff_chunk(demux_iff_t *this) {
if (this->input->read(this->input, &signature[7], 1) != 1)
return 0;
}
- junk_size = BE_32(&signature[4]);
- switch( BE_32(&signature[0]) ) {
+ junk_size = _X_BE_32(&signature[4]);
+ switch( _X_BE_32(&signature[0]) ) {
case IFF_CMAP_CHUNK:
case IFF_BODY_CHUNK:
case IFF_DLTA_CHUNK:
@@ -206,19 +206,19 @@ static int read_iff_chunk(demux_iff_t *this) {
break;
}
- switch( BE_32(&signature[0]) ) {
+ switch( _X_BE_32(&signature[0]) ) {
case IFF_FORM_CHUNK:
if (this->input->read(this->input, buffer, 4) != 4)
return 0;
- this->iff_sub_type = BE_32(&buffer[0]);
+ this->iff_sub_type = _X_BE_32(&buffer[0]);
break;
case IFF_VHDR_CHUNK:
if( this->vhdr == NULL )
this->vhdr = (Voice8Header *)xine_xmalloc(sizeof(Voice8Header));
- this->vhdr->oneShotHiSamples = BE_32(&buffer[0]);
- this->vhdr->repeatHiSamples = BE_32(&buffer[4]);
- this->vhdr->samplesPerHiCycle = BE_32(&buffer[8]);
- this->vhdr->samplesPerSec = BE_16(&buffer[12]);
+ this->vhdr->oneShotHiSamples = _X_BE_32(&buffer[0]);
+ this->vhdr->repeatHiSamples = _X_BE_32(&buffer[4]);
+ this->vhdr->samplesPerHiCycle = _X_BE_32(&buffer[8]);
+ this->vhdr->samplesPerSec = _X_BE_16(&buffer[12]);
this->vhdr->ctOctave = buffer[14];
this->vhdr->sCompression = buffer[15];
this->audio_channels = 1;
@@ -237,7 +237,7 @@ static int read_iff_chunk(demux_iff_t *this) {
return 0;
break;
}
- this->vhdr->volume = BE_32(&buffer[16]);
+ this->vhdr->volume = _X_BE_32(&buffer[16]);
if (this->vhdr->volume > max_volume)
this->vhdr->volume = max_volume;
xprintf (this->stream->xine, XINE_VERBOSITY_LOG, "vhdr->oneShotHiSamples %d\n",
@@ -300,7 +300,7 @@ static int read_iff_chunk(demux_iff_t *this) {
/* not yet implemented */
break;
case IFF_CHAN_CHUNK:
- this->chan_settings = BE_32(&buffer[0]);
+ this->chan_settings = _X_BE_32(&buffer[0]);
switch( this->chan_settings ) {
case STEREO:
this->audio_volume_left = this->vhdr->volume;
@@ -325,7 +325,7 @@ static int read_iff_chunk(demux_iff_t *this) {
break;
case IFF_PAN_CHUNK:
this->chan_settings = PAN;
- this->pan_sposition = BE_32(&buffer[0]);
+ this->pan_sposition = _X_BE_32(&buffer[0]);
this->audio_channels = 2;
this->audio_volume_left = this->vhdr->volume / (max_volume / this->pan_sposition);
this->audio_volume_right = this->vhdr->volume - this->audio_volume_left;
@@ -333,19 +333,19 @@ static int read_iff_chunk(demux_iff_t *this) {
case IFF_BMHD_CHUNK:
if( this->bmhd == NULL )
this->bmhd = (BitMapHeader *)xine_xmalloc(sizeof(BitMapHeader));
- this->bmhd->w = BE_16(&buffer[0]);
- this->bmhd->h = BE_16(&buffer[2]);
- this->bmhd->x = BE_16(&buffer[4]);
- this->bmhd->y = BE_16(&buffer[6]);
+ this->bmhd->w = _X_BE_16(&buffer[0]);
+ this->bmhd->h = _X_BE_16(&buffer[2]);
+ this->bmhd->x = _X_BE_16(&buffer[4]);
+ this->bmhd->y = _X_BE_16(&buffer[6]);
this->bmhd->nplanes = buffer[8];
this->bmhd->masking = buffer[9];
this->bmhd->compression = buffer[10];
this->bmhd->pad1 = buffer[11];
- this->bmhd->transparentColor = BE_16(&buffer[12]);
+ this->bmhd->transparentColor = _X_BE_16(&buffer[12]);
this->bmhd->xaspect = buffer[14];
this->bmhd->yaspect = buffer[15];
- this->bmhd->pagewidth = BE_16(&buffer[16]);
- this->bmhd->pageheight = BE_16(&buffer[18]);
+ this->bmhd->pagewidth = _X_BE_16(&buffer[16]);
+ this->bmhd->pageheight = _X_BE_16(&buffer[18]);
if (this->bmhd->w > 0)
this->bih.biWidth = this->bmhd->w;
@@ -409,25 +409,25 @@ static int read_iff_chunk(demux_iff_t *this) {
case IFF_GRAB_CHUNK:
if( this->grab == NULL )
this->grab = (Point2D *)xine_xmalloc(sizeof(Point2D));
- this->grab->x = BE_16(&buffer[0]);
- this->grab->y = BE_16(&buffer[2]);
+ this->grab->x = _X_BE_16(&buffer[0]);
+ this->grab->y = _X_BE_16(&buffer[2]);
break;
case IFF_DEST_CHUNK:
if( this->dest == NULL )
this->dest = (DestMerge *)xine_xmalloc(sizeof(DestMerge));
this->dest->depth = buffer[0];
this->dest->pad1 = buffer[1];
- this->dest->plane_pick = BE_16(&buffer[2]);
- this->dest->plane_onoff = BE_16(&buffer[4]);
- this->dest->plane_mask = BE_16(&buffer[6]);
+ this->dest->plane_pick = _X_BE_16(&buffer[2]);
+ this->dest->plane_onoff = _X_BE_16(&buffer[4]);
+ this->dest->plane_mask = _X_BE_16(&buffer[6]);
break;
case IFF_SPRT_CHUNK:
- this->sprt = BE_16(&buffer[0]);
+ this->sprt = _X_BE_16(&buffer[0]);
break;
case IFF_CAMG_CHUNK:
if( this->camg == NULL )
this->camg = (CamgChunk *)xine_xmalloc(sizeof(CamgChunk));
- this->camg->view_modes = BE_32(&buffer[0]);
+ this->camg->view_modes = _X_BE_32(&buffer[0]);
this->bih.biCompression = this->camg->view_modes;
if( this->camg->view_modes & CAMG_PAL &&
this->video_pts_inc == 4500 )
@@ -435,9 +435,9 @@ static int read_iff_chunk(demux_iff_t *this) {
break;
case IFF_CRNG_CHUNK:
if (this->crng_used < 256) {
- this->crng[this->crng_used].pad1 = BE_16(&buffer[0]);
- this->crng[this->crng_used].rate = BE_16(&buffer[2]);
- this->crng[this->crng_used].active = BE_16(&buffer[4]);
+ this->crng[this->crng_used].pad1 = _X_BE_16(&buffer[0]);
+ this->crng[this->crng_used].rate = _X_BE_16(&buffer[2]);
+ this->crng[this->crng_used].active = _X_BE_16(&buffer[4]);
this->crng[this->crng_used].low = buffer[6];
this->crng[this->crng_used].high = buffer[7];
this->crng_used++;
@@ -446,33 +446,33 @@ static int read_iff_chunk(demux_iff_t *this) {
case IFF_CCRT_CHUNK:
if( this->ccrt == NULL )
this->ccrt = (CcrtChunk *)xine_xmalloc(sizeof(CcrtChunk));
- this->ccrt->direction = BE_16(&buffer[0]);
+ this->ccrt->direction = _X_BE_16(&buffer[0]);
this->ccrt->start = buffer[2];
this->ccrt->end = buffer[3];
- this->ccrt->seconds = BE_32(&buffer[4]);
- this->ccrt->microseconds = BE_32(&buffer[8]);
- this->ccrt->pad = BE_16(&buffer[12]);
+ this->ccrt->seconds = _X_BE_32(&buffer[4]);
+ this->ccrt->microseconds = _X_BE_32(&buffer[8]);
+ this->ccrt->pad = _X_BE_16(&buffer[12]);
break;
case IFF_DPI_CHUNK:
if( this->dpi == NULL )
this->dpi = (DPIHeader *)xine_xmalloc(sizeof(DPIHeader));
- this->dpi->x = BE_16(&buffer[0]);
- this->dpi->y = BE_16(&buffer[0]);
+ this->dpi->x = _X_BE_16(&buffer[0]);
+ this->dpi->y = _X_BE_16(&buffer[0]);
break;
case IFF_ANHD_CHUNK:
if( this->anhd == NULL )
this->anhd = (AnimHeader *)xine_xmalloc(sizeof(AnimHeader));
this->anhd->operation = buffer[0];
this->anhd->mask = buffer[1];
- this->anhd->w = BE_16(&buffer[2]);
- this->anhd->h = BE_16(&buffer[4]);
- this->anhd->x = BE_16(&buffer[6]);
- this->anhd->y = BE_16(&buffer[8]);
- this->anhd->abs_time = BE_32(&buffer[10]);
- this->anhd->rel_time = BE_32(&buffer[14]);
+ this->anhd->w = _X_BE_16(&buffer[2]);
+ this->anhd->h = _X_BE_16(&buffer[4]);
+ this->anhd->x = _X_BE_16(&buffer[6]);
+ this->anhd->y = _X_BE_16(&buffer[8]);
+ this->anhd->abs_time = _X_BE_32(&buffer[10]);
+ this->anhd->rel_time = _X_BE_32(&buffer[14]);
this->anhd->interleave = buffer[18];
this->anhd->pad0 = buffer[19];
- this->anhd->bits = BE_32(&buffer[20]);
+ this->anhd->bits = _X_BE_32(&buffer[20]);
/* Using rel_time deaktivated, seems to be broken in most animations */
/*if( this->dpan == NULL )
this->video_pts += this->video_pts_inc *
@@ -503,8 +503,8 @@ static int read_iff_chunk(demux_iff_t *this) {
case IFF_DPAN_CHUNK:
if( this->dpan == NULL )
this->dpan = (DPAnimChunk *)xine_xmalloc(sizeof(DPAnimChunk));
- this->dpan->version = BE_16(&buffer[0]);
- this->dpan->nframes = BE_16(&buffer[2]);
+ this->dpan->version = _X_BE_16(&buffer[0]);
+ this->dpan->nframes = _X_BE_16(&buffer[2]);
this->dpan->fps = buffer[4];
this->dpan->unused1 = buffer[5];
this->dpan->unused2 = buffer[6];
@@ -626,7 +626,7 @@ static int open_iff_file(demux_iff_t *this) {
this->anhd = NULL;
this->dpan = NULL;
- this->iff_type = BE_32(&signature[8]);
+ this->iff_type = _X_BE_32(&signature[8]);
this->iff_sub_type = this->iff_type;
this->video_type = 0;
@@ -647,7 +647,7 @@ static int open_iff_file(demux_iff_t *this) {
this->bih.biClrImportant = 0;
/* check the signature */
- if (BE_32(&signature[0]) == IFF_FORM_CHUNK)
+ if (_X_BE_32(&signature[0]) == IFF_FORM_CHUNK)
{
switch( this->iff_type )
{
@@ -827,13 +827,13 @@ static int demux_iff_send_chunk(demux_plugin_t *this_gen) {
}
} else {
for (j = 0, k = (interleave_index / 2); j < (buf->size / 2); j += this->audio_channels) {
- zw_16 = BE_16(&pointer16_from[k]);
+ zw_16 = _X_BE_16(&pointer16_from[k]);
k++;
zw_rescale = zw_16;
zw_rescale *= this->audio_volume_left;
zw_rescale /= max_volume;
zw_16 = (zw_rescale>32767) ? 32767 : ((zw_rescale<-32768) ? -32768 : zw_rescale);
- pointer16_to[j] = BE_16(&zw_16);
+ pointer16_to[j] = _X_BE_16(&zw_16);
}
}
} else {
@@ -857,13 +857,13 @@ static int demux_iff_send_chunk(demux_plugin_t *this_gen) {
}
} else {
for (j = 1; j < (buf->size / 2); j += this->audio_channels) {
- zw_16 = BE_16(&pointer16_from[k]);
+ zw_16 = _X_BE_16(&pointer16_from[k]);
k++;
zw_rescale = zw_16;
zw_rescale *= this->audio_volume_left;
zw_rescale /= max_volume;
zw_16 = (zw_rescale>32767) ? 32767 : ((zw_rescale<-32768) ? -32768 : zw_rescale);
- pointer16_to[j] = BE_16(&zw_16);
+ pointer16_to[j] = _X_BE_16(&zw_16);
}
}
} else if (this->chan_settings == LEFT) {
diff --git a/src/demuxers/demux_image.c b/src/demuxers/demux_image.c
index d799c2324..629299281 100644
--- a/src/demuxers/demux_image.c
+++ b/src/demuxers/demux_image.c
@@ -168,7 +168,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen,
}
if (memcmp (header, "GIF", 3) == 0 /* GIF */
|| memcmp (header, "\377\330\377", 3) == 0 /* JPEG */
- || (BE_16(&header[0]) == 0xffd8) /* another JPEG */
+ || (_X_BE_16(&header[0]) == 0xffd8) /* another JPEG */
|| memcmp (header, "\x89PNG", 4) == 0) { /* PNG */
break;
}
diff --git a/src/demuxers/demux_ipmovie.c b/src/demuxers/demux_ipmovie.c
index 6fe185b1a..26392c73b 100644
--- a/src/demuxers/demux_ipmovie.c
+++ b/src/demuxers/demux_ipmovie.c
@@ -144,8 +144,8 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
if (this->input->read(this->input, chunk_preamble, CHUNK_PREAMBLE_SIZE) !=
CHUNK_PREAMBLE_SIZE)
return CHUNK_BAD;
- chunk_size = LE_16(&chunk_preamble[0]);
- chunk_type = LE_16(&chunk_preamble[2]);
+ chunk_size = _X_LE_16(&chunk_preamble[0]);
+ chunk_type = _X_LE_16(&chunk_preamble[2]);
lprintf("chunk type 0x%04X, 0x%04X bytes:\n", chunk_type, chunk_size);
@@ -191,7 +191,7 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
break;
}
- opcode_size = LE_16(&opcode_preamble[0]);
+ opcode_size = _X_LE_16(&opcode_preamble[0]);
opcode_type = opcode_preamble[2];
opcode_version = opcode_preamble[3];
@@ -228,10 +228,10 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
chunk_type = CHUNK_BAD;
break;
}
- this->fps = 1000000.0 / (LE_32(&scratch[0]) * LE_16(&scratch[4]));
+ this->fps = 1000000.0 / (_X_LE_32(&scratch[0]) * _X_LE_16(&scratch[4]));
this->frame_pts_inc = (int)(90000.0 / this->fps);
lprintf("%.1f frames/second (timer div = %d, subdiv = %d)\n",
- this->fps, LE_32(&scratch[0]), LE_16(&scratch[4]));
+ this->fps, _X_LE_32(&scratch[0]), _X_LE_16(&scratch[4]));
break;
case OPCODE_INIT_AUDIO_BUFFERS:
@@ -246,8 +246,8 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
chunk_type = CHUNK_BAD;
break;
}
- this->wave.nSamplesPerSec = LE_16(&scratch[4]);
- audio_flags = LE_16(&scratch[2]);
+ this->wave.nSamplesPerSec = _X_LE_16(&scratch[4]);
+ audio_flags = _X_LE_16(&scratch[2]);
/* bit 0 of the flags: 0 = mono, 1 = stereo */
this->wave.nChannels = (audio_flags & 1) + 1;
/* bit 1 of the flags: 0 = 8 bit, 1 = 16 bit */
@@ -282,8 +282,8 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
chunk_type = CHUNK_BAD;
break;
}
- this->bih.biWidth = LE_16(&scratch[0]) * 8;
- this->bih.biHeight = LE_16(&scratch[2]) * 8;
+ this->bih.biWidth = _X_LE_16(&scratch[0]) * 8;
+ this->bih.biHeight = _X_LE_16(&scratch[2]) * 8;
/* set up staging area for decode map */
this->decode_map_size = (this->bih.biWidth * this->bih.biHeight) /
(8 * 8) / 2;
@@ -392,8 +392,8 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
}
/* load the palette into internal data structure */
- first_color = LE_16(&scratch[0]);
- color_count = LE_16(&scratch[2]);
+ first_color = _X_LE_16(&scratch[0]);
+ color_count = _X_LE_16(&scratch[2]);
/* sanity check (since they are 16 bit values) */
if ((first_color > 0xFF) || (first_color + color_count > 0x100)) {
lprintf("set_palette indices out of range (%d -> %d)\n",
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c
index 2bd8f3540..8d1019dc0 100644
--- a/src/demuxers/demux_matroska.c
+++ b/src/demuxers/demux_matroska.c
@@ -68,13 +68,6 @@
#define MAX(a, b) ((a)>(b)?(a):(b))
#endif
-/* FOURCC will be manipulated using machine endian */
-#ifdef WORDS_BIGENDIAN
-#define meFOURCC BE_FOURCC
-#else
-#define meFOURCC LE_FOURCC
-#endif
-
typedef struct {
int track_num;
off_t *pos;
@@ -617,8 +610,7 @@ static void init_codec_real(demux_matroska_t *this, matroska_track_t * track) {
track->fifo->put (track->fifo, buf);
}
-
-static void init_codec_vorbis(demux_matroska_t *this, matroska_track_t *track) {
+static void init_codec_xiph(demux_matroska_t *this, matroska_track_t *track) {
buf_element_t *buf;
uint8_t nb_lace;
int frame[3];
@@ -1320,7 +1312,7 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
/* create a bitmap info header struct for MPEG 4 */
bih = malloc(sizeof(xine_bmiheader) + track->codec_private_len);
bih->biSize = sizeof(xine_bmiheader) + track->codec_private_len;
- bih->biCompression = meFOURCC('M', 'P', '4', 'S');
+ bih->biCompression = ME_FOURCC('M', 'P', '4', 'S');
bih->biWidth = track->video_track->pixel_width;
bih->biHeight = track->video_track->pixel_height;
_x_bmiheader_le2me(bih);
@@ -1341,7 +1333,7 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
/* create a bitmap info header struct for h264 */
bih = malloc(sizeof(xine_bmiheader) + track->codec_private_len);
bih->biSize = sizeof(xine_bmiheader) + track->codec_private_len;
- bih->biCompression = meFOURCC('a', 'v', 'c', '1');
+ bih->biCompression = ME_FOURCC('a', 'v', 'c', '1');
bih->biWidth = track->video_track->pixel_width;
bih->biHeight = track->video_track->pixel_height;
_x_bmiheader_le2me(bih);
@@ -1380,6 +1372,10 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
init_codec = init_codec_real;
} else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_MJPEG)) {
+ } else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_V_THEORA)) {
+ lprintf("MATROSKA_CODEC_ID_V_THEORA\n");
+ track->buf_type = BUF_VIDEO_THEORA_RAW;
+ init_codec = init_codec_xiph;
} else if ((!strcmp(track->codec_id, MATROSKA_CODEC_ID_A_MPEG1_L1)) ||
(!strcmp(track->codec_id, MATROSKA_CODEC_ID_A_MPEG1_L2)) ||
(!strcmp(track->codec_id, MATROSKA_CODEC_ID_A_MPEG1_L3))) {
@@ -1404,7 +1400,7 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
lprintf("MATROSKA_CODEC_ID_A_VORBIS\n");
track->buf_type = BUF_AUDIO_VORBIS;
- init_codec = init_codec_vorbis;
+ init_codec = init_codec_xiph;
} else if (!strcmp(track->codec_id, MATROSKA_CODEC_ID_A_ACM)) {
xine_waveformatex *wfh;
@@ -1850,7 +1846,7 @@ static int parse_block (demux_matroska_t *this, uint64_t block_size,
return 0;
data += num_len;
- timecode_diff = (int)BE_16(data);
+ timecode_diff = (int)_X_BE_16(data);
data += 2;
flags = *data;
@@ -1860,6 +1856,7 @@ static int parse_block (demux_matroska_t *this, uint64_t block_size,
gap = flags & 1;
lacing = (flags >> 1) & 0x3;
+ fprintf(stderr, "lacing: %x\n", lacing);
if (!find_track_by_id(this, (int)track_num, &track)) {
xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
diff --git a/src/demuxers/demux_mod.c b/src/demuxers/demux_mod.c
index 37e066b13..5f8361801 100644
--- a/src/demuxers/demux_mod.c
+++ b/src/demuxers/demux_mod.c
@@ -31,8 +31,6 @@
#include "config.h"
#endif
-#ifdef HAVE_MODPLUG
-
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
@@ -48,7 +46,6 @@
#include "xineutils.h"
#include "compat.h"
#include "demux.h"
-#include "group_audio.h"
#include "modplug.h"
#include "bswap.h"
@@ -109,7 +106,7 @@ static int probe_mod_file(demux_mod_t *this) {
return 0;
/* Magic numbers taken from GNU file's magic description */
- switch( ABE_32(header.values + (1080/sizeof(uint32_t))) ) {
+ switch( _X_ABE_32(header.values + (1080/sizeof(uint32_t))) ) {
case FOURCC_32('M', '.', 'K', '.'): /* 4-channel Protracker module sound data */
case FOURCC_32('M', '!', 'K', '!'): /* 4-channel Protracker module sound data */
case FOURCC_32('F', 'L', 'T', '4'): /* 4-channel Startracker module sound data */
@@ -377,7 +374,7 @@ static void class_dispose (demux_class_t *this_gen) {
free (this);
}
-void *demux_mod_init_plugin (xine_t *xine, void *data) {
+static void *demux_mod_init_plugin (xine_t *xine, void *data) {
demux_mod_class_t *this;
this = xine_xmalloc (sizeof (demux_mod_class_t));
@@ -392,4 +389,11 @@ void *demux_mod_init_plugin (xine_t *xine, void *data) {
return this;
}
-#endif /* HAVE_MODPLUG */
+static const demuxer_info_t demux_info_mod = {
+ 10 /* priority */
+};
+
+const plugin_info_t xine_plugin_info[] EXPORTED = {
+ { PLUGIN_DEMUX, 26, "modplug", XINE_VERSION_CODE, &demux_info_mod, demux_mod_init_plugin },
+ { PLUGIN_NONE, 0, "", 0, NULL, NULL }
+};
diff --git a/src/demuxers/demux_mpc.c b/src/demuxers/demux_mpc.c
index e1a3f28b9..86eb7bf3a 100644
--- a/src/demuxers/demux_mpc.c
+++ b/src/demuxers/demux_mpc.c
@@ -128,11 +128,11 @@ static int open_mpc_file(demux_mpc_t *this) {
/* Get frame count */
this->current_frame = 0;
- this->frames = LE_32(&this->header[4]);
+ this->frames = _X_LE_32(&this->header[4]);
lprintf("number of frames: %u\n", this->frames);
/* Get sample rate */
- switch ((LE_32(&this->header[8]) >> 16) & 0x3) {
+ switch ((_X_LE_32(&this->header[8]) >> 16) & 0x3) {
case 0:
this->samplerate = 44.1;
break;
@@ -155,7 +155,7 @@ static int open_mpc_file(demux_mpc_t *this) {
lprintf("stream length: %d ms\n", this->length);
/* Calculate the number of bits of the first frame that are still be sent */
- first_frame_size = (LE_32(&this->header[24]) >> 4) & 0xFFFFF;
+ first_frame_size = (_X_LE_32(&this->header[24]) >> 4) & 0xFFFFF;
this->next_frame_bits = first_frame_size - 4;
lprintf("first frame size: %u\n", first_frame_size);
@@ -164,7 +164,7 @@ static int open_mpc_file(demux_mpc_t *this) {
/* Set stream info */
_x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO, 1);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC, ME_32(this->header));
+ _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC, _X_ME_32(this->header));
return 1;
}
@@ -229,10 +229,10 @@ static int demux_mpc_send_chunk(demux_plugin_t *this_gen) {
extra_bits_read = bits_to_read - (this->next_frame_bits+20);
if(extra_bits_read <= 12)
- next_frame_size = (LE_32(&buf->content[bytes_to_read-4]) >> extra_bits_read) & 0xFFFFF;
+ next_frame_size = (_X_LE_32(&buf->content[bytes_to_read-4]) >> extra_bits_read) & 0xFFFFF;
else
- next_frame_size = ((LE_32(&buf->content[bytes_to_read-8]) << (32-extra_bits_read)) |
- (LE_32(&buf->content[bytes_to_read-4]) >> extra_bits_read)) & 0xFFFFF;
+ next_frame_size = ((_X_LE_32(&buf->content[bytes_to_read-8]) << (32-extra_bits_read)) |
+ (_X_LE_32(&buf->content[bytes_to_read-4]) >> extra_bits_read)) & 0xFFFFF;
lprintf("next frame size: %u\n", next_frame_size);
diff --git a/src/demuxers/demux_mpeg.c b/src/demuxers/demux_mpeg.c
index c9d49efa2..145721ce3 100644
--- a/src/demuxers/demux_mpeg.c
+++ b/src/demuxers/demux_mpeg.c
@@ -140,8 +140,8 @@ static void find_mdat_atom(input_plugin_t *input, off_t *mdat_offset,
ATOM_PREAMBLE_SIZE)
break;
- atom_size = BE_32(&atom_preamble[0]);
- atom = BE_32(&atom_preamble[4]);
+ atom_size = _X_BE_32(&atom_preamble[0]);
+ atom = _X_BE_32(&atom_preamble[4]);
if (atom == MDAT_ATOM) {
*mdat_offset = input->get_current_pos(input) - ATOM_PREAMBLE_SIZE;
@@ -165,9 +165,9 @@ static void find_mdat_atom(input_plugin_t *input, off_t *mdat_offset,
ATOM_PREAMBLE_SIZE)
break;
- atom_size = BE_32(&atom_preamble[0]);
+ atom_size = _X_BE_32(&atom_preamble[0]);
atom_size <<= 32;
- atom_size |= BE_32(&atom_preamble[4]);
+ atom_size |= _X_BE_32(&atom_preamble[4]);
atom_size -= ATOM_PREAMBLE_SIZE * 2;
} else
atom_size -= ATOM_PREAMBLE_SIZE;
@@ -1157,7 +1157,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
}
/* special case for MPEG streams with a RIFF header */
- fourcc_tag = BE_32(&buf[0]);
+ fourcc_tag = _X_BE_32(&buf[0]);
if (fourcc_tag == RIFF_TAG) {
uint8_t large_buf[1024];
@@ -1165,7 +1165,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
free(this);
return NULL;
}
- fourcc_tag = BE_32(&large_buf[8]);
+ fourcc_tag = _X_BE_32(&large_buf[8]);
/* disregard the RIFF file if it is certainly a better known
* format like AVI or WAVE */
if ((fourcc_tag == WAVE_TAG) ||
@@ -1185,7 +1185,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
if (input->read(input, large_buf, 1024) != 1024)
break;
for (j = 0; j < 1024 - 4; j++) {
- if (BE_32(&large_buf[j]) == MPEG_MARKER) {
+ if (_X_BE_32(&large_buf[j]) == MPEG_MARKER) {
ok = 1;
break;
}
diff --git a/src/demuxers/demux_mpeg_pes.c b/src/demuxers/demux_mpeg_pes.c
index c5769e3e3..fbfde4e60 100644
--- a/src/demuxers/demux_mpeg_pes.c
+++ b/src/demuxers/demux_mpeg_pes.c
@@ -1135,17 +1135,20 @@ static int32_t parse_video_stream(demux_mpeg_pes_t *this, uint8_t *p, buf_elemen
*/
if (this->mpeg12_h264_detected & 1) {
buf_type = BUF_VIDEO_H264;
- int nal_type_code = -1;
- if (payload_size >= 4 && p[2] == 0x01 && p[1] == 0x00 && p[0] == 0x00)
- nal_type_code = p[3] & 0x1f;
- if (nal_type_code == 9) { /* access unit delimiter */
- buf_element_t *b = this->video_fifo->buffer_pool_alloc (this->video_fifo);
- b->content = b->mem;
- b->size = 0;
- b->pts = 0;
- b->type = buf_type;
- b->decoder_flags = BUF_FLAG_FRAME_END;
- this->video_fifo->put (this->video_fifo, b);
+ /* omit sending BUF_FLAG_FRAME_END for the first AUD occurence */
+ if (this->mpeg12_h264_detected > 2) {
+ int nal_type_code = -1;
+ if (payload_size >= 4 && p[2] == 0x01 && p[1] == 0x00 && p[0] == 0x00)
+ nal_type_code = p[3] & 0x1f;
+ if (nal_type_code == 9) { /* access unit delimiter */
+ buf_element_t *b = this->video_fifo->buffer_pool_alloc (this->video_fifo);
+ b->content = b->mem;
+ b->size = 0;
+ b->pts = 0;
+ b->type = buf_type;
+ b->decoder_flags = BUF_FLAG_FRAME_END;
+ this->video_fifo->put (this->video_fifo, b);
+ }
}
}
diff --git a/src/demuxers/demux_mpgaudio.c b/src/demuxers/demux_mpgaudio.c
index 31b2d33ff..ef22af16b 100644
--- a/src/demuxers/demux_mpgaudio.c
+++ b/src/demuxers/demux_mpgaudio.c
@@ -205,7 +205,7 @@ static int parse_frame_header(mpg_audio_frame_t *const frame, const uint8_t *con
#endif
} frame_header;
- const uint32_t head = BE_32(buf);
+ const uint32_t head = _X_BE_32(buf);
const uint16_t frame_sync = head >> 21;
lprintf("header: %08X\n", head);
@@ -324,21 +324,21 @@ static xing_header_t* parse_xing_header(mpg_audio_frame_t *frame,
if (ptr >= (buf + bufsize - 4)) return 0;
lprintf("checking %08X\n", *ptr);
- if (BE_32(ptr) == XING_TAG) {
+ if (_X_BE_32(ptr) == XING_TAG) {
lprintf("Xing header found\n");
ptr += 4;
if (ptr >= (buf + bufsize - 4)) return 0;
- xing->flags = BE_32(ptr); ptr += 4;
+ xing->flags = _X_BE_32(ptr); ptr += 4;
if (xing->flags & XING_FRAMES_FLAG) {
if (ptr >= (buf + bufsize - 4)) return 0;
- xing->stream_frames = BE_32(ptr); ptr += 4;
+ xing->stream_frames = _X_BE_32(ptr); ptr += 4;
lprintf("stream frames: %d\n", xing->stream_frames);
}
if (xing->flags & XING_BYTES_FLAG) {
if (ptr >= (buf + bufsize - 4)) return 0;
- xing->stream_size = BE_32(ptr); ptr += 4;
+ xing->stream_size = _X_BE_32(ptr); ptr += 4;
lprintf("stream size: %d\n", xing->stream_size);
}
if (xing->flags & XING_TOC_FLAG) {
@@ -357,7 +357,7 @@ static xing_header_t* parse_xing_header(mpg_audio_frame_t *frame,
xing->vbr_scale = -1;
if (xing->flags & XING_VBR_SCALE_FLAG) {
if (ptr >= (buf + bufsize - 4)) return 0;
- xing->vbr_scale = BE_32(ptr);
+ xing->vbr_scale = _X_BE_32(ptr);
lprintf("vbr_scale: %d\n", xing->vbr_scale);
}
@@ -388,20 +388,20 @@ static vbri_header_t* parse_vbri_header(mpg_audio_frame_t *frame,
if ((ptr + 4) >= (buf + bufsize)) return 0;
lprintf("Checking %08X\n", *ptr);
- if (BE_32(ptr) == VBRI_TAG) {
+ if (_X_BE_32(ptr) == VBRI_TAG) {
lprintf("Vbri header found\n");
ptr += 4;
if ((ptr + 22) >= (buf + bufsize)) return 0;
- vbri->version = BE_16(ptr); ptr += 2;
- vbri->delai = BE_16(ptr); ptr += 2;
- vbri->quality = BE_16(ptr); ptr += 2;
- vbri->stream_size = BE_32(ptr); ptr += 4;
- vbri->stream_frames = BE_32(ptr); ptr += 4;
- vbri->toc_entries = BE_16(ptr); ptr += 2;
- vbri->toc_scale_factor = BE_16(ptr); ptr += 2;
- vbri->entry_size = BE_16(ptr); ptr += 2;
- vbri->entry_frames = BE_16(ptr); ptr += 2;
+ vbri->version = _X_BE_16(ptr); ptr += 2;
+ vbri->delai = _X_BE_16(ptr); ptr += 2;
+ vbri->quality = _X_BE_16(ptr); ptr += 2;
+ vbri->stream_size = _X_BE_32(ptr); ptr += 4;
+ vbri->stream_frames = _X_BE_32(ptr); ptr += 4;
+ vbri->toc_entries = _X_BE_16(ptr); ptr += 2;
+ vbri->toc_scale_factor = _X_BE_16(ptr); ptr += 2;
+ vbri->entry_size = _X_BE_16(ptr); ptr += 2;
+ vbri->entry_frames = _X_BE_16(ptr); ptr += 2;
lprintf("version: %d\n", vbri->version);
lprintf("delai: %d\n", vbri->delai);
lprintf("quality: %d\n", vbri->quality);
@@ -413,7 +413,7 @@ static vbri_header_t* parse_vbri_header(mpg_audio_frame_t *frame,
lprintf("entry_frames: %d\n", vbri->entry_frames);
if ((ptr + (vbri->toc_entries + 1) * vbri->entry_size) >= (buf + bufsize)) return 0;
- vbri->toc = xine_xmalloc (sizeof(int) * (vbri->toc_entries + 1));
+ vbri->toc = xine_xcalloc ((vbri->toc_entries + 1), sizeof(int));
if (!vbri->toc) {
free (vbri);
return NULL;
@@ -688,7 +688,7 @@ static int detect_mpgaudio_file(input_plugin_t *input) {
lprintf("got preview %02x %02x %02x %02x\n",
buf[0], buf[1], buf[2], buf[3]);
- head = BE_32(buf);
+ head = _X_BE_32(buf);
if ((head == ID3V22_TAG) ||
(head == ID3V23_TAG) ||
@@ -697,8 +697,7 @@ static int detect_mpgaudio_file(input_plugin_t *input) {
* id3v2 are not specific to mp3 files,
* flac files can contain id3v2 tags
*/
- uint8_t *ptr = &buf[6];
- uint32_t tag_size = id3v2_tagsize(ptr);
+ int tag_size = _X_BE_32_synchsafe(&buf[6]);
lprintf("try to skip id3v2 tag (%d bytes)\n", tag_size);
if ((10 + tag_size) >= preview_len) {
lprintf("cannot skip id3v2 tag\n");
diff --git a/src/demuxers/demux_nsf.c b/src/demuxers/demux_nsf.c
deleted file mode 100644
index 7408274d5..000000000
--- a/src/demuxers/demux_nsf.c
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * Copyright (C) 2000-2003 the xine project
- *
- * This file is part of xine, a free video player.
- *
- * xine is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * xine is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-/*
- * NSF File "Demuxer" by Mike Melanson (melanson@pcisys.net)
- * This is really just a loader for NES Music File Format (extension NSF)
- * which loads an entire NSF file and passes it over to the NSF audio
- * decoder.
- *
- * After the file is sent over, the demuxer controls the playback by
- * sending empty buffers with incrementing pts values.
- *
- * For more information regarding the NSF format, visit:
- * http://www.tripoint.org/kevtris/nes/nsfspec.txt
- *
- * $Id: demux_nsf.c,v 1.24 2007/03/29 17:03:06 dgp85 Exp $
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-
-/********** logging **********/
-#define LOG_MODULE "demux_nsf"
-/* #define LOG_VERBOSE */
-/* #define LOG */
-
-#include "xine_internal.h"
-#include "xineutils.h"
-#include "compat.h"
-#include "demux.h"
-#include "bswap.h"
-#include "group_audio.h"
-
-#define NSF_HEADER_SIZE 0x80
-#define NSF_SAMPLERATE 44100
-#define NSF_BITS 8
-#define NSF_CHANNELS 1
-#define NSF_REFRESH_RATE 60
-#define NSF_PTS_INC (90000 / NSF_REFRESH_RATE)
-
-typedef struct {
- demux_plugin_t demux_plugin;
-
- xine_stream_t *stream;
- fifo_buffer_t *video_fifo;
- fifo_buffer_t *audio_fifo;
- input_plugin_t *input;
- int status;
-
- int total_songs;
- int current_song;
- int new_song; /* indicates song change */
-
- char *title;
- char *artist;
- char *copyright;
-
- off_t filesize;
-
- int64_t current_pts;
- int file_sent;
-} demux_nsf_t;
-
-typedef struct {
- demux_class_t demux_class;
-} demux_nsf_class_t;
-
-/* returns 1 if the NSF file was opened successfully, 0 otherwise */
-static int open_nsf_file(demux_nsf_t *this) {
- unsigned char header[NSF_HEADER_SIZE];
-
- this->input->seek(this->input, 0, SEEK_SET);
- if (this->input->read(this->input, header, NSF_HEADER_SIZE) !=
- NSF_HEADER_SIZE)
- return 0;
-
- /* check for the signature */
- if ((header[0] != 'N') ||
- (header[1] != 'E') ||
- (header[2] != 'S') ||
- (header[3] != 'M') ||
- (header[4] != 0x1A))
- return 0;
-
- this->total_songs = header[6];
- this->current_song = header[7];
- this->title = strdup(&header[0x0E]);
- this->artist = strdup(&header[0x2E]);
- this->copyright = strdup(&header[0x4E]);
-
- this->filesize = this->input->get_length(this->input);
-
- return 1;
-}
-
-static int demux_nsf_send_chunk(demux_plugin_t *this_gen) {
- demux_nsf_t *this = (demux_nsf_t *) this_gen;
- buf_element_t *buf;
- int bytes_read;
- char title[100];
-
- /* send chunks of the file to the decoder until file is completely
- * loaded; then send control buffers */
- if (!this->file_sent) {
- buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
- buf->type = BUF_AUDIO_NSF;
- bytes_read = this->input->read(this->input, buf->content, buf->max_size);
-
- if (bytes_read == 0) {
- /* the file has been completely loaded, free the buffer and start
- * sending control buffers */
- buf->free_buffer(buf);
- this->file_sent = 1;
-
- } else {
-
- /* keep loading the file */
- if (bytes_read < buf->max_size)
- buf->size = bytes_read;
- else
- buf->size = buf->max_size;
-
- buf->extra_info->input_normpos = 0;
- buf->extra_info->input_time = 0;
- buf->pts = 0;
-
- this->audio_fifo->put (this->audio_fifo, buf);
- }
- }
-
- /* this is not an 'else' because control might fall through from above */
- if (this->file_sent) {
- /* send a control buffer */
- buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
-
- if (this->new_song) {
-
- buf->decoder_info[1] = this->current_song;
- this->new_song = 0;
- sprintf(title, "%s, song %d/%d",
- this->title, this->current_song, this->total_songs);
-
- _x_meta_info_set(this->stream, XINE_META_INFO_TITLE, title);
-
- _x_demux_control_newpts(this->stream, this->current_pts, 0);
-
- } else
- buf->decoder_info[1] = 0;
-
- buf->type = BUF_AUDIO_NSF;
- if(this->total_songs)
- buf->extra_info->input_normpos = (this->current_song - 1) * 65535 / this->total_songs;
- buf->extra_info->input_time = this->current_pts / 90;
- buf->pts = this->current_pts;
- buf->size = 0;
- this->audio_fifo->put (this->audio_fifo, buf);
-
- this->current_pts += NSF_PTS_INC;
- }
-
- return this->status;
-}
-
-static void demux_nsf_send_headers(demux_plugin_t *this_gen) {
- demux_nsf_t *this = (demux_nsf_t *) this_gen;
- buf_element_t *buf;
- char copyright[100];
-
- this->video_fifo = this->stream->video_fifo;
- this->audio_fifo = this->stream->audio_fifo;
-
- this->status = DEMUX_OK;
-
- /* load stream information */
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_VIDEO, 0);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO, 1);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_CHANNELS,
- NSF_CHANNELS);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE,
- NSF_SAMPLERATE);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITS,
- NSF_BITS);
-
- _x_meta_info_set(this->stream, XINE_META_INFO_TITLE, this->title);
- _x_meta_info_set(this->stream, XINE_META_INFO_ARTIST, this->artist);
- sprintf(copyright, "(C) %s", this->copyright);
- _x_meta_info_set(this->stream, XINE_META_INFO_COMMENT, copyright);
-
- /* send start buffers */
- _x_demux_control_start(this->stream);
-
- /* send init info to the audio decoder */
- if (this->audio_fifo) {
- buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
- buf->type = BUF_AUDIO_NSF;
- buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_FRAME_END;
- buf->decoder_info[0] = 5;
- buf->decoder_info[1] = NSF_SAMPLERATE;
- buf->decoder_info[2] = NSF_BITS;
- buf->decoder_info[3] = NSF_CHANNELS;
-
- /* send the NSF filesize in the body, big endian format */
- buf->content[0] = (this->filesize >> 24) & 0xFF;
- buf->content[1] = (this->filesize >> 16) & 0xFF;
- buf->content[2] = (this->filesize >> 8) & 0xFF;
- buf->content[3] = (this->filesize >> 0) & 0xFF;
- /* send the requested song */
- buf->content[4] = this->current_song + 5;
-
- this->audio_fifo->put (this->audio_fifo, buf);
- }
-}
-
-static int demux_nsf_seek (demux_plugin_t *this_gen,
- off_t start_pos, int start_time, int playing) {
-
- demux_nsf_t *this = (demux_nsf_t *) this_gen;
- start_pos = (off_t) ( (double) start_pos / 65535 *
- this->total_songs );
-
- /* if thread is not running, initialize demuxer */
- if( !playing ) {
-
- /* send new pts */
- _x_demux_control_newpts(this->stream, 0, 0);
-
- this->status = DEMUX_OK;
-
- /* reposition stream at the start for loading */
- this->input->seek(this->input, 0, SEEK_SET);
-
- this->file_sent = 0;
- this->current_pts = 0;
- this->new_song = 1;
- } else {
- this->current_song = start_pos + 1;
- this->new_song = 1;
- this->current_pts = 0;
- _x_demux_flush_engine(this->stream);
- }
-
- return this->status;
-}
-
-static void demux_nsf_dispose (demux_plugin_t *this_gen) {
- demux_nsf_t *this = (demux_nsf_t *) this_gen;
-
- free(this->title);
- free(this->artist);
- free(this->copyright);
- free(this);
-}
-
-static int demux_nsf_get_status (demux_plugin_t *this_gen) {
- demux_nsf_t *this = (demux_nsf_t *) this_gen;
-
- return this->status;
-}
-
-/* return the approximate length in miliseconds */
-static int demux_nsf_get_stream_length (demux_plugin_t *this_gen) {
- return 0;
-}
-
-static uint32_t demux_nsf_get_capabilities(demux_plugin_t *this_gen) {
- return DEMUX_CAP_NOCAP;
-}
-
-static int demux_nsf_get_optional_data(demux_plugin_t *this_gen,
- void *data, int data_type) {
- return DEMUX_OPTIONAL_UNSUPPORTED;
-}
-
-static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *stream,
- input_plugin_t *input) {
-
- demux_nsf_t *this;
-
- if (!INPUT_IS_SEEKABLE(input)) {
- xprintf(stream->xine, XINE_VERBOSITY_DEBUG, "input not seekable, can not handle!\n");
- return NULL;
- }
-
- this = xine_xmalloc (sizeof (demux_nsf_t));
- this->stream = stream;
- this->input = input;
-
- this->demux_plugin.send_headers = demux_nsf_send_headers;
- this->demux_plugin.send_chunk = demux_nsf_send_chunk;
- this->demux_plugin.seek = demux_nsf_seek;
- this->demux_plugin.dispose = demux_nsf_dispose;
- this->demux_plugin.get_status = demux_nsf_get_status;
- this->demux_plugin.get_stream_length = demux_nsf_get_stream_length;
- this->demux_plugin.get_capabilities = demux_nsf_get_capabilities;
- this->demux_plugin.get_optional_data = demux_nsf_get_optional_data;
- this->demux_plugin.demux_class = class_gen;
-
- this->status = DEMUX_FINISHED;
-
- switch (stream->content_detection_method) {
-
- case METHOD_BY_EXTENSION: {
- const char *extensions, *mrl;
-
- mrl = input->get_mrl (input);
- extensions = class_gen->get_extensions (class_gen);
-
- if (!_x_demux_check_extension (mrl, extensions)) {
- free (this);
- return NULL;
- }
- }
- /* falling through is intended */
-
- case METHOD_BY_CONTENT:
- case METHOD_EXPLICIT:
-
- if (!open_nsf_file(this)) {
- free (this);
- return NULL;
- }
-
- break;
-
- default:
- free (this);
- return NULL;
- }
-
- return &this->demux_plugin;
-}
-
-static const char *get_description (demux_class_t *this_gen) {
- return "NES Music file demux plugin";
-}
-
-static const char *get_identifier (demux_class_t *this_gen) {
- return "NSF";
-}
-
-static const char *get_extensions (demux_class_t *this_gen) {
- return "nsf";
-}
-
-static const char *get_mimetypes (demux_class_t *this_gen) {
- return NULL;
-}
-
-static void class_dispose (demux_class_t *this_gen) {
- demux_nsf_class_t *this = (demux_nsf_class_t *) this_gen;
-
- free (this);
-}
-
-void *demux_nsf_init_plugin (xine_t *xine, void *data) {
- demux_nsf_class_t *this;
-
- this = xine_xmalloc (sizeof (demux_nsf_class_t));
-
- this->demux_class.open_plugin = open_plugin;
- this->demux_class.get_description = get_description;
- this->demux_class.get_identifier = get_identifier;
- this->demux_class.get_mimetypes = get_mimetypes;
- this->demux_class.get_extensions = get_extensions;
- this->demux_class.dispose = class_dispose;
-
- return this;
-}
diff --git a/src/demuxers/demux_nsv.c b/src/demuxers/demux_nsv.c
index 6d43b247c..4f730a935 100644
--- a/src/demuxers/demux_nsv.c
+++ b/src/demuxers/demux_nsv.c
@@ -172,7 +172,7 @@ static off_t nsv_read(demux_nsv_t *this, uint8_t *buffer, off_t len) {
return -1;
}
/* read packet payload len */
- this->ultravox_size = BE_16(&ultravox_buf[5]);
+ this->ultravox_size = _X_BE_16(&ultravox_buf[5]);
this->ultravox_pos = 0;
lprintf("ultravox_size: %d\n", this->ultravox_size);
} else {
@@ -287,11 +287,11 @@ static int open_nsv_file(demux_nsv_t *this) {
return 0;
lprintf("found NSVf chunk\n");
- /* this->data_size = LE_32(&preview[8]);*/
+ /* this->data_size = _X_LE_32(&preview[8]);*/
/*lprintf("data_size: %lld\n", this->data_size);*/
/* skip the rest of the data */
- chunk_size = LE_32(&preview[4]);
+ chunk_size = _X_LE_32(&preview[4]);
nsv_seek(this, chunk_size - 28, SEEK_CUR);
}
break;
@@ -303,21 +303,21 @@ static int open_nsv_file(demux_nsv_t *this) {
if (nsv_read(this, &preview[4], 15) != 15)
return 0;
- this->video_fourcc = ME_32(&preview[4]);
- if (BE_32(&preview[4]) == NONE_TAG)
+ this->video_fourcc = _X_ME_32(&preview[4]);
+ if (_X_BE_32(&preview[4]) == NONE_TAG)
this->video_type = 0;
else
this->video_type = _x_fourcc_to_buf_video(this->video_fourcc);
- this->audio_fourcc = ME_32(&preview[8]);
- if (BE_32(&preview[8]) == NONE_TAG)
+ this->audio_fourcc = _X_ME_32(&preview[8]);
+ if (_X_BE_32(&preview[8]) == NONE_TAG)
this->audio_type = 0;
else
this->audio_type = _x_formattag_to_buf_audio(this->audio_fourcc);
this->bih.biSize = sizeof(this->bih);
- this->bih.biWidth = LE_16(&preview[12]);
- this->bih.biHeight = LE_16(&preview[14]);
+ this->bih.biWidth = _X_LE_16(&preview[12]);
+ this->bih.biHeight = _X_LE_16(&preview[14]);
this->bih.biCompression = this->video_fourcc;
this->video_pts = 0;
@@ -493,10 +493,10 @@ static int demux_nsv_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- video_size = LE_32(&buffer[0]);
+ video_size = _X_LE_32(&buffer[0]);
video_size >>= 4;
video_size &= 0xFFFFF;
- audio_size = LE_16(&buffer[3]);
+ audio_size = _X_LE_16(&buffer[3]);
nsv_parse_payload(this, video_size, audio_size);
break;
diff --git a/src/demuxers/demux_ogg.c b/src/demuxers/demux_ogg.c
deleted file mode 100644
index f868018af..000000000
--- a/src/demuxers/demux_ogg.c
+++ /dev/null
@@ -1,2202 +0,0 @@
-/*
- * Copyright (C) 2000-2004 the xine project
- *
- * This file is part of xine, a free video player.
- *
- * xine is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * xine is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- */
-
-/*
- * $Id: demux_ogg.c,v 1.177 2007/03/29 19:38:51 dgp85 Exp $
- *
- * demultiplexer for ogg streams
- *
- */
-/* 2003.02.09 (dilb) update of the handling for audio/video infos for strongarm cpus. */
-
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <inttypes.h>
-
-#include <ogg/ogg.h>
-#include <vorbis/codec.h>
-
-#ifdef HAVE_SPEEX
-#include <speex/speex.h>
-#include <speex/speex_header.h>
-#include <speex/speex_stereo.h>
-#include <speex/speex_callbacks.h>
-#endif
-
-#ifdef HAVE_THEORA
-#include <theora/theora.h>
-#endif
-
-#define LOG_MODULE "demux_ogg"
-#define LOG_VERBOSE
-
-/*
-#define LOG
-*/
-
-#define DEBUG_PACKETS 0
-#define DEBUG_PREVIEWS 0
-#define DEBUG_PTS 0
-#define DEBUG_VIDEO_PACKETS 0
-
-#include "xine_internal.h"
-#include "xineutils.h"
-#include "demux.h"
-#include "bswap.h"
-#include "flacutils.h"
-
-#define CHUNKSIZE 8500
-#define PACKET_TYPE_HEADER 0x01
-#define PACKET_TYPE_COMMENT 0x03
-#define PACKET_TYPE_CODEBOOK 0x05
-#define PACKET_TYPE_BITS 0x07
-#define PACKET_LEN_BITS01 0xc0
-#define PACKET_LEN_BITS2 0x02
-#define PACKET_IS_SYNCPOINT 0x08
-
-#define MAX_STREAMS 32
-
-#define PTS_AUDIO 0
-#define PTS_VIDEO 1
-
-#define WRAP_THRESHOLD 900000
-
-#define SUB_BUFSIZE 1024
-
-typedef struct chapter_entry_s {
- int64_t start_pts;
- char *name;
-} chapter_entry_t;
-
-typedef struct chapter_info_s {
- int current_chapter;
- int max_chapter;
- chapter_entry_t *entries;
-} chapter_info_t;
-
-typedef struct stream_info_s {
- ogg_stream_state oss;
- uint32_t buf_types;
- int headers;
- int64_t header_granulepos;
- int64_t factor;
- int64_t quotient;
- int resync;
- char *language;
- /* CMML, Ogg Skeleton stream information */
- int granuleshift;
- /* Annodex v2 stream information */
- int hide_first_header;
- int delivered_bos;
- int delivered_eos;
-} stream_info_t;
-
-typedef struct demux_ogg_s {
- demux_plugin_t demux_plugin;
-
- xine_stream_t *stream;
- fifo_buffer_t *audio_fifo;
- fifo_buffer_t *video_fifo;
- input_plugin_t *input;
- int status;
-
- int frame_duration;
-
-#ifdef HAVE_THEORA
- theora_info t_info;
- theora_comment t_comment;
-#endif
-
- ogg_sync_state oy;
- ogg_page og;
-
- int64_t start_pts;
- int64_t last_pts[2];
-
- int time_length;
-
- int num_streams;
- stream_info_t *si[MAX_STREAMS]; /* stream info */
-
- int num_audio_streams;
- int num_video_streams;
- int unhandled_video_streams;
- int num_spu_streams;
-
- off_t avg_bitrate;
-
- char *title;
- chapter_info_t *chapter_info;
- xine_event_queue_t *event_queue;
-
- uint8_t send_newpts:1;
- uint8_t buf_flag_seek:1;
- uint8_t keyframe_needed:1;
- uint8_t ignore_keyframes:1;
-} demux_ogg_t ;
-
-typedef struct {
- demux_class_t demux_class;
-} demux_ogg_class_t;
-
-typedef struct {
- demux_class_t demux_class;
-} demux_anx_class_t;
-
-
-#ifdef HAVE_THEORA
-static int intlog(int num) {
- int ret=0;
-
- while(num>0){
- num=num/2;
- ret=ret+1;
- }
- return(ret);
-}
-#endif
-
-static int get_stream (demux_ogg_t *this, int serno) {
- /*finds the stream_num, which belongs to a ogg serno*/
- int i;
-
- for (i = 0; i<this->num_streams; i++) {
- if (this->si[i]->oss.serialno == serno) {
- return i;
- }
- }
- return -1;
-}
-
-static int new_stream_info (demux_ogg_t *this, const int cur_serno) {
- int stream_num;
-
- this->si[this->num_streams] = (stream_info_t *)xine_xmalloc(sizeof(stream_info_t));
- ogg_stream_init(&this->si[this->num_streams]->oss, cur_serno);
- stream_num = this->num_streams;
- this->si[stream_num]->buf_types = 0;
- this->si[stream_num]->header_granulepos = -1;
- this->si[stream_num]->headers = 0;
- this->num_streams++;
-
- return stream_num;
-}
-
-static int64_t get_pts (demux_ogg_t *this, int stream_num , int64_t granulepos ) {
- /*calculates an pts from an granulepos*/
- if (granulepos<0) {
- if ( this->si[stream_num]->header_granulepos>=0 ) {
- /*return the smallest valid pts*/
- return 1;
- } else
- return 0;
- } else if (this->si[stream_num]->buf_types == BUF_VIDEO_THEORA ||
- (this->si[stream_num]->buf_types & 0xFFFF0000) == BUF_SPU_CMML) {
- int64_t iframe, pframe;
- int granuleshift;
- granuleshift = this->si[stream_num]->granuleshift;
- iframe = granulepos >> granuleshift;
- pframe = granulepos - (iframe << granuleshift);
- if (this->si[stream_num]->quotient)
- return 1+((iframe+pframe) * this->si[stream_num]->factor / this->si[stream_num]->quotient);
- else
- return 0;
- } else if (this->si[stream_num]->quotient)
- return 1+(granulepos * this->si[stream_num]->factor / this->si[stream_num]->quotient);
- else
- return 0;
-}
-
-static int read_ogg_packet (demux_ogg_t *this) {
- char *buffer;
- long bytes;
- while (ogg_sync_pageout(&this->oy,&this->og)!=1) {
- buffer = ogg_sync_buffer(&this->oy, CHUNKSIZE);
- bytes = this->input->read(this->input, buffer, CHUNKSIZE);
- ogg_sync_wrote(&this->oy, bytes);
- if (bytes < CHUNKSIZE/2) {
- return 0;
- }
- }
- return 1;
-}
-
-static void get_stream_length (demux_ogg_t *this) {
- /*determine the streamlenght and set this->time_length accordingly.
- ATTENTION:current_pos and oggbuffers will be destroyed by this function,
- there will be no way to continue playback uninterrupted.
-
- You have to seek afterwards, because after get_stream_length, the
- current_position is at the end of the file */
-
- off_t filelength;
- int done=0;
- int stream_num;
-
- this->time_length=-1;
-
- if (this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) {
- filelength=this->input->get_length(this->input);
-
- if (filelength!=-1) {
- if (filelength>70000) {
- this->demux_plugin.seek(&this->demux_plugin,
- (off_t) ( (double)(filelength-65536)/filelength*65535), 0, 0);
- }
- done=0;
- while (!done) {
- if (!read_ogg_packet (this)) {
- if (this->time_length) {
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_BITRATE,
- ((int64_t) 8000*filelength)/this->time_length);
- /*this is a fine place to compute avg_bitrate*/
- this->avg_bitrate= 8000*filelength/this->time_length;
- }
- return;
- }
- stream_num=get_stream(this, ogg_page_serialno (&this->og) );
- if (stream_num!=-1) {
- if (this->time_length < (get_pts(this, stream_num, ogg_page_granulepos(&this->og) / 90)))
- this->time_length = get_pts(this, stream_num, ogg_page_granulepos(&this->og)) / 90;
- }
- }
- }
- }
-}
-
-#ifdef HAVE_THEORA
-static void send_ogg_packet (demux_ogg_t *this,
- fifo_buffer_t *fifo,
- ogg_packet *op,
- int64_t pts,
- uint32_t decoder_flags,
- int stream_num) {
-
- buf_element_t *buf;
-
- int done=0,todo=op->bytes;
- int op_size = sizeof(ogg_packet);
-
- while (done<todo) {
- int offset=0;
- buf = fifo->buffer_pool_alloc (fifo);
- buf->decoder_flags = decoder_flags;
- if (done==0) {
- memcpy (buf->content, op, op_size);
- offset=op_size;
- buf->decoder_flags = buf->decoder_flags | BUF_FLAG_FRAME_START;
- }
-
- if (done+buf->max_size-offset < todo) {
- memcpy (buf->content+offset, op->packet+done, buf->max_size-offset);
- buf->size = buf->max_size;
- done=done+buf->max_size-offset;
- } else {
- memcpy (buf->content+offset , op->packet+done, todo-done);
- buf->size = todo-done+offset;
- done=todo;
- buf->decoder_flags = buf->decoder_flags | BUF_FLAG_FRAME_END;
- }
-
- buf->pts = pts;
- if( this->input->get_length (this->input) )
- buf->extra_info->input_normpos = (int)( (double) this->input->get_current_pos (this->input) *
- 65535 / this->input->get_length (this->input) );
- buf->extra_info->input_time = buf->pts / 90 ;
- buf->type = this->si[stream_num]->buf_types;
-
- fifo->put (fifo, buf);
- }
-}
-#endif
-
-/* redefine abs as macro to handle 64-bit diffs.
- i guess llabs may not be available everywhere */
-#define abs(x) ( ((x)<0) ? -(x) : (x) )
-
-static void check_newpts (demux_ogg_t *this, int64_t pts, int video, int preview) {
- int64_t diff;
-
- llprintf(DEBUG_PTS, "new pts %" PRId64 " found in stream\n",pts);
-
- diff = pts - this->last_pts[video];
-
- if (!preview && (pts>=0) &&
- (this->send_newpts || (this->last_pts[video] && abs(diff)>WRAP_THRESHOLD) ) ) {
-
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "diff=%" PRId64 " (pts=%" PRId64 ", last_pts=%" PRId64 ")\n", diff, pts, this->last_pts[video]);
-
- if (this->buf_flag_seek) {
- _x_demux_control_newpts(this->stream, pts, BUF_FLAG_SEEK);
- this->buf_flag_seek = 0;
- } else {
- _x_demux_control_newpts(this->stream, pts, 0);
- }
- this->send_newpts = 0;
- this->last_pts[1-video] = 0;
- }
-
- if (!preview && (pts>=0) )
- this->last_pts[video] = pts;
-
- /* use pts for bitrate measurement */
-
- /*compute avg_bitrate if time_length isn't set*/
- if ((pts>180000) && !(this->time_length)) {
- this->avg_bitrate = this->input->get_current_pos (this->input) * 8 * 90000/ pts;
-
- if (this->avg_bitrate<1)
- this->avg_bitrate = 1;
-
- }
-}
-
-static void ogg_handle_event (demux_ogg_t *this) {
- xine_event_t *event;
-
- while ((event = xine_event_get(this->event_queue))) {
- switch(event->type) {
- case XINE_EVENT_INPUT_NEXT:
- {
- if (this->chapter_info) {
- int c_chap = this->chapter_info->current_chapter;
- if (c_chap+1 < this->chapter_info->max_chapter) {
- int start_time = this->chapter_info->entries[c_chap+1].start_pts / 90;
- this->demux_plugin.seek((demux_plugin_t *)this, 0, start_time, 1);
- }
- }
- }
- break;
- case XINE_EVENT_INPUT_PREVIOUS:
- {
- if (this->chapter_info) {
- int c_chap = this->chapter_info->current_chapter;
- if (c_chap >= 1) {
- int start_time = this->chapter_info->entries[c_chap-1].start_pts / 90;
- this->demux_plugin.seek((demux_plugin_t *)this, 0, start_time, 1);
- }
- }
- }
- break;
- }
- xine_event_free(event);
- }
- return;
-}
-
-/*
- * utility function to read a LANGUAGE= line from the user_comments,
- * to label audio and spu streams
- */
-static void read_language_comment (demux_ogg_t *this, ogg_packet *op, int stream_num) {
- char **ptr;
- char *comment;
- vorbis_comment vc;
- vorbis_info vi;
-
- vorbis_comment_init(&vc);
- vorbis_info_init(&vi);
-
- /* this is necessary to make libvorbis accept this vorbis_info*/
- vi.rate=1;
-
- if ( vorbis_synthesis_headerin(&vi, &vc, op) >= 0) {
- ptr=vc.user_comments;
- while(*ptr) {
- comment=*ptr;
- if ( !strncasecmp ("LANGUAGE=", comment, 9) ) {
- this->si[stream_num]->language = strdup (comment + strlen ("LANGUAGE=") );
- }
- ++ptr;
- }
- }
- vorbis_comment_clear(&vc);
- vorbis_info_clear(&vi);
-}
-
-/*
- * utility function to read CHAPTER*= and TITLE= from the user_comments,
- * to name parts of the videostream
- */
-static void read_chapter_comment (demux_ogg_t *this, ogg_packet *op) {
- char **ptr;
- char *comment;
- vorbis_comment vc;
- vorbis_info vi;
-
- vorbis_comment_init(&vc);
- vorbis_info_init(&vi);
-
- /* this is necessary to make libvorbis accept this vorbis_info*/
- vi.rate=1;
-
- if ( vorbis_synthesis_headerin(&vi, &vc, op) >= 0) {
- char *chapter_time = 0;
- char *chapter_name = 0;
- int chapter_no = 0;
- ptr=vc.user_comments;
- while(*ptr) {
- comment=*ptr;
- if ( !strncasecmp ("TITLE=", comment,6) ) {
- this->title = strdup (comment + strlen ("TITLE=") );
- _x_meta_info_set(this->stream, XINE_META_INFO_TITLE, this->title);
- }
- if ( !chapter_time && strlen(comment) == 22 &&
- !strncasecmp ("CHAPTER" , comment, 7) &&
- isdigit(*(comment+7)) && isdigit(*(comment+8)) &&
- (*(comment+9) == '=')) {
-
- chapter_time = strdup(comment+10);
- chapter_no = strtol(comment+7, NULL, 10);
- }
- if ( !chapter_name && !strncasecmp("CHAPTER", comment, 7) &&
- isdigit(*(comment+7)) && isdigit(*(comment+8)) &&
- !strncasecmp ("NAME=", comment+9, 5)) {
-
- if (strtol(comment+7,NULL,10) == chapter_no) {
- chapter_name = strdup(comment+14);
- }
- }
- if (chapter_time && chapter_name && chapter_no){
- int hour, min, sec, msec;
-
- lprintf("create chapter entry: no=%d name=%s time=%s\n", chapter_no, chapter_name, chapter_time);
- hour= strtol(chapter_time, NULL, 10);
- min = strtol(chapter_time+3, NULL, 10);
- sec = strtol(chapter_time+6, NULL, 10);
- msec = strtol(chapter_time+9, NULL, 10);
- lprintf("time: %d %d %d %d\n", hour, min,sec,msec);
-
- if (!this->chapter_info) {
- this->chapter_info = (chapter_info_t *)xine_xmalloc(sizeof(chapter_info_t));
- this->chapter_info->current_chapter = -1;
- }
- this->chapter_info->max_chapter = chapter_no;
- this->chapter_info->entries = realloc( this->chapter_info->entries, chapter_no*sizeof(chapter_entry_t));
- this->chapter_info->entries[chapter_no-1].name = chapter_name;
- this->chapter_info->entries[chapter_no-1].start_pts = (msec + (1000.0 * sec) + (60000.0 * min) + (3600000.0 * hour))*90;
-
- free (chapter_time);
- chapter_no = 0;
- chapter_time = chapter_name = 0;
- }
- ++ptr;
- }
- }
- vorbis_comment_clear(&vc);
- vorbis_info_clear(&vi);
-}
-
-/*
- * update the display of the title, if needed
- */
-static void update_chapter_display (demux_ogg_t *this, int stream_num, ogg_packet *op) {
- int chapter = 0;
- int64_t pts = get_pts(this, stream_num, op->granulepos );
-
- while (chapter < this->chapter_info->max_chapter &&
- this->chapter_info->entries[chapter].start_pts < pts) {
- chapter++;
- }
- chapter--;
-
- if (chapter != this->chapter_info->current_chapter){
- xine_event_t uevent;
- xine_ui_data_t data;
- int title_len;
- char *title;
-
- this->chapter_info->current_chapter = chapter;
- if (chapter >= 0) {
- char t_title[256];
-
- if (this->title) {
- snprintf(t_title, sizeof (t_title), "%s / %s", this->title, this->chapter_info->entries[chapter].name);
- } else {
- snprintf(t_title, sizeof (t_title), "%s", this->chapter_info->entries[chapter].name);
- }
- title = t_title;
- } else {
- title = this->title;
- }
- _x_meta_info_set(this->stream, XINE_META_INFO_TITLE, title);
- lprintf("new TITLE: %s\n", title);
-
- uevent.type = XINE_EVENT_UI_SET_TITLE;
- uevent.stream = this->stream;
- uevent.data = &data;
- uevent.data_length = sizeof(data);
- title_len = strlen(title) + 1;
- memcpy(data.str, title, title_len);
- data.str_len = title_len;
- xine_event_send(this->stream, &uevent);
- }
-}
-
-/*
- * utility function to pack one ogg_packet into a xine
- * buffer, fill out all needed fields
- * and send it to the right fifo
- */
-
-static void send_ogg_buf (demux_ogg_t *this,
- ogg_packet *op,
- int stream_num,
- uint32_t decoder_flags) {
-
- int hdrlen;
- int normpos = 0;
-
- if( this->input->get_length (this->input) )
- normpos = (int)( (double) this->input->get_current_pos (this->input) *
- 65535 / this->input->get_length (this->input) );
-
-
- hdrlen = (*op->packet & PACKET_LEN_BITS01) >> 6;
- hdrlen |= (*op->packet & PACKET_LEN_BITS2) << 1;
-
- /* for Annodex files: the first packet after the AnxData info packet needs
- * to have its BOS flag set: we set it here */
- if (!this->si[stream_num]->delivered_bos) {
- op->b_o_s = 1;
- this->si[stream_num]->delivered_bos = 1;
- }
-
- if ( this->audio_fifo
- && (this->si[stream_num]->buf_types & 0xFF000000) == BUF_AUDIO_BASE) {
- uint8_t *data;
- int size;
- int64_t pts;
-
- if (op->packet[0] == PACKET_TYPE_COMMENT ) {
- read_language_comment(this, op, stream_num);
- }
-
- if ((this->si[stream_num]->buf_types & 0xFFFF0000) == BUF_AUDIO_SPEEX ||
- (this->si[stream_num]->buf_types & 0xFFFF0000) == BUF_AUDIO_FLAC ||
- (this->si[stream_num]->buf_types & 0xFFFF0000) == BUF_AUDIO_VORBIS) {
- data = op->packet;
- size = op->bytes;
- } else {
- data = op->packet+1+hdrlen;
- size = op->bytes-1-hdrlen;
- }
- llprintf(DEBUG_PACKETS, "audio data size %d\n", size);
-
- if ((op->granulepos != -1) || (this->si[stream_num]->header_granulepos != -1)) {
- pts = get_pts(this, stream_num, op->granulepos );
- check_newpts( this, pts, PTS_AUDIO, decoder_flags );
- } else
- pts = 0;
-
- llprintf(DEBUG_PACKETS,
- "audiostream %d op-gpos %" PRId64 " hdr-gpos %" PRId64 " pts %" PRId64 " \n",
- stream_num,
- op->granulepos,
- this->si[stream_num]->header_granulepos,
- pts);
-
- _x_demux_send_data(this->audio_fifo, data, size,
- pts, this->si[stream_num]->buf_types, decoder_flags,
- normpos,
- pts / 90, this->time_length, 0);
-
-#ifdef HAVE_THEORA
- } else if ((this->si[stream_num]->buf_types & 0xFFFF0000) == BUF_VIDEO_THEORA) {
-
- int64_t pts;
- theora_info t_info;
- theora_comment t_comment;
-
- theora_info_init (&t_info);
- theora_comment_init (&t_comment);
-
- /*Lets see if this is an Header*/
- if ((theora_decode_header(&t_info, &t_comment, op))>=0) {
- decoder_flags=decoder_flags|BUF_FLAG_HEADER;
- lprintf ("found an header\n");
- }
-
- if ((op->granulepos != -1) || (this->si[stream_num]->header_granulepos != -1)) {
- pts = get_pts(this, stream_num, op->granulepos );
- check_newpts( this, pts, PTS_VIDEO, decoder_flags );
- } else
- pts = 0;
-
- llprintf(DEBUG_PACKETS,
- "theorastream %d op-gpos %" PRId64 " hdr-gpos %" PRId64 " pts %" PRId64 " \n",
- stream_num,
- op->granulepos,
- this->si[stream_num]->header_granulepos,
- pts);
-
- send_ogg_packet (this, this->video_fifo, op, pts, decoder_flags, stream_num);
-
- theora_comment_clear (&t_comment);
- theora_info_clear (&t_info);
-#endif
-
- } else if ((this->si[stream_num]->buf_types & 0xFF000000) == BUF_VIDEO_BASE) {
-
- uint8_t *data;
- int size;
- int64_t pts;
-
- llprintf(DEBUG_VIDEO_PACKETS,
- "video buffer, type=%08x\n", this->si[stream_num]->buf_types);
-
- if (op->packet[0] == PACKET_TYPE_COMMENT ) {
- read_chapter_comment(this, op);
- }else{
- data = op->packet+1+hdrlen;
- size = op->bytes-1-hdrlen;
-
- if ((op->granulepos != -1) || (this->si[stream_num]->header_granulepos != -1)) {
- pts = get_pts(this, stream_num, op->granulepos );
- check_newpts( this, pts, PTS_VIDEO, decoder_flags );
- } else
- pts = 0;
-
- llprintf(DEBUG_VIDEO_PACKETS,
- "videostream %d op-gpos %" PRId64 " hdr-gpos %" PRId64 " pts %" PRId64 " \n",
- stream_num,
- op->granulepos,
- this->si[stream_num]->header_granulepos,
- pts);
-
- _x_demux_send_data(this->video_fifo, data, size,
- pts, this->si[stream_num]->buf_types, decoder_flags,
- normpos,
- pts / 90, this->time_length, 0);
-
- if (this->chapter_info && op->granulepos != -1) {
- update_chapter_display(this, stream_num, op);
- }
- }
- } else if ((this->si[stream_num]->buf_types & 0xFFFF0000) == BUF_SPU_CMML) {
- buf_element_t *buf;
- uint32_t *val;
- char *str;
-
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
-
- buf->type = this->si[stream_num]->buf_types;
-
- buf->pts = get_pts (this, stream_num, op->granulepos);
-
- val = (uint32_t * )buf->content;
- str = (char *)val;
-
- memcpy(str, op->packet, op->bytes);
- str[op->bytes] = '\0';
-
- buf->size = 12 + op->bytes + 1;
-
- lprintf ("CMML stream %d (bytes=%ld): PTS %"PRId64": %s\n",
- stream_num, op->bytes, buf->pts, str);
-
- this->video_fifo->put (this->video_fifo, buf);
- } else if ((this->si[stream_num]->buf_types & 0xFF000000) == BUF_SPU_BASE) {
-
- buf_element_t *buf;
- int i;
- char *subtitle,*str;
- int lenbytes;
- int start,end;
- uint32_t *val;
-
- for (i = 0, lenbytes = 0; i < hdrlen; i++) {
- lenbytes = lenbytes << 8;
- lenbytes += *((unsigned char *) op->packet + hdrlen - i);
- }
-
- if (op->packet[0] == PACKET_TYPE_HEADER ) {
- lprintf ("Textstream-header-packet\n");
- } else if (op->packet[0] == PACKET_TYPE_COMMENT ) {
- lprintf ("Textstream-comment-packet\n");
- read_language_comment(this, op, stream_num);
- } else {
- subtitle = (char *)&op->packet[hdrlen + 1];
-
- if ((strlen(subtitle) > 1) || (*subtitle != ' ')) {
- start = op->granulepos;
- end = start+lenbytes;
- lprintf ("subtitlestream %d: %d -> %d :%s\n",stream_num,start,end,subtitle);
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
-
- buf->type = this->si[stream_num]->buf_types;
- buf->pts = 0;
-
- val = (uint32_t * )buf->content;
- *val++ = start;
- *val++ = end;
- str = (char *)val;
-
- memcpy (str, subtitle, 1+strlen(subtitle));
-
- this->video_fifo->put (this->video_fifo, buf);
- }
- }
- } else {
- lprintf("unknown stream type %x\n", this->si[stream_num]->buf_types);
- }
-}
-
-static void decode_vorbis_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- vorbis_info vi;
- vorbis_comment vc;
-
- this->si[stream_num]->buf_types = BUF_AUDIO_VORBIS
- +this->num_audio_streams++;
-
- this->si[stream_num]->headers = 3;
-
- vorbis_info_init(&vi);
- vorbis_comment_init(&vc);
- if (vorbis_synthesis_headerin(&vi, &vc, op) >= 0) {
-
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE, vi.bitrate_nominal);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE, vi.rate);
-
- this->si[stream_num]->factor = 90000;
- this->si[stream_num]->quotient = vi.rate;
-
- if (vi.bitrate_nominal<1)
- this->avg_bitrate += 100000; /* assume 100 kbit */
- else
- this->avg_bitrate += vi.bitrate_nominal;
-
- } else {
- this->si[stream_num]->factor = 900;
- this->si[stream_num]->quotient = 441;
-
- this->si[stream_num]->headers = 0;
- xine_log (this->stream->xine, XINE_LOG_MSG,
- _("ogg: vorbis audio track indicated but no vorbis stream header found.\n"));
- }
- vorbis_comment_clear(&vc);
- vorbis_info_clear(&vi);
-}
-
-static void decode_speex_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
-#ifdef HAVE_SPEEX
- void *st;
- SpeexMode *mode;
- SpeexHeader *header;
-
- this->si[stream_num]->buf_types = BUF_AUDIO_SPEEX
- +this->num_audio_streams++;
-
- this->si[stream_num]->headers = 1;
-
- header = speex_packet_to_header (op->packet, op->bytes);
-
- if (header) {
- int bitrate;
- mode = (SpeexMode *) speex_mode_list[header->mode];
-
- st = speex_decoder_init (mode);
-
- speex_decoder_ctl (st, SPEEX_GET_BITRATE, &bitrate);
-
- if (bitrate <= 1)
- bitrate = 16000; /* assume 16 kbit */
-
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE, bitrate);
-
- this->si[stream_num]->factor = 90000;
- this->si[stream_num]->quotient = header->rate;
-
- this->avg_bitrate += bitrate;
-
- lprintf ("detected Speex stream,\trate %d\tbitrate %d\n", header->rate, bitrate);
-
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE, header->rate);
- this->si[stream_num]->headers += header->extra_headers;
- }
-#else
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "Speex stream detected, unable to play\n");
-
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
-#endif
-}
-
-static void decode_video_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- buf_element_t *buf;
- xine_bmiheader bih;
- int channel;
-
- int16_t locbits_per_sample;
- uint32_t locsubtype;
- int32_t locsize, locdefault_len, locbuffersize, locwidth, locheight;
- int64_t loctime_unit, locsamples_per_unit;
-
- /* read fourcc with machine endianness */
- locsubtype = *((uint32_t *)&op->packet[9]);
-
- /* everything else little endian */
- locsize = LE_32(&op->packet[13]);
- loctime_unit = LE_64(&op->packet[17]);
- locsamples_per_unit = LE_64(&op->packet[25]);
- locdefault_len = LE_32(&op->packet[33]);
- locbuffersize = LE_32(&op->packet[37]);
- locbits_per_sample = LE_16(&op->packet[41]);
- locwidth = LE_32(&op->packet[45]);
- locheight = LE_32(&op->packet[49]);
-
- lprintf ("direct show filter created stream detected, hexdump:\n");
-#ifdef LOG
- xine_hexdump (op->packet, op->bytes);
-#endif
-
- channel = this->num_video_streams++;
-
- this->si[stream_num]->buf_types = _x_fourcc_to_buf_video (locsubtype);
- if( !this->si[stream_num]->buf_types )
- this->si[stream_num]->buf_types = BUF_VIDEO_UNKNOWN;
- this->si[stream_num]->buf_types |= channel;
- this->si[stream_num]->headers = 0; /* header is sent below */
-
- lprintf ("subtype %.4s\n", (char*)&locsubtype);
- lprintf ("time_unit %" PRId64 "\n", loctime_unit);
- lprintf ("samples_per_unit %" PRId64 "\n", locsamples_per_unit);
- lprintf ("default_len %d\n", locdefault_len);
- lprintf ("buffersize %d\n", locbuffersize);
- lprintf ("bits_per_sample %d\n", locbits_per_sample);
- lprintf ("width %d\n", locwidth);
- lprintf ("height %d\n", locheight);
- lprintf ("buf_type %08x\n",this->si[stream_num]->buf_types);
-
- bih.biSize=sizeof(xine_bmiheader);
- bih.biWidth = locwidth;
- bih.biHeight= locheight;
- bih.biPlanes= 0;
- memcpy(&bih.biCompression, &locsubtype, 4);
- bih.biBitCount= 0;
- bih.biSizeImage=locwidth*locheight;
- bih.biXPelsPerMeter=1;
- bih.biYPelsPerMeter=1;
- bih.biClrUsed=0;
- bih.biClrImportant=0;
-
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
- buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAMERATE|
- BUF_FLAG_FRAME_END;
- this->frame_duration = loctime_unit * 9 / 1000;
- this->si[stream_num]->factor = loctime_unit * 9;
- this->si[stream_num]->quotient = 1000;
- buf->decoder_info[0] = this->frame_duration;
- memcpy (buf->content, &bih, sizeof (xine_bmiheader));
- buf->size = sizeof (xine_bmiheader);
- buf->type = this->si[stream_num]->buf_types;
-
- /* video metadata */
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_FOURCC, locsubtype);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH, locwidth);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HEIGHT, locheight);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->frame_duration);
-
- this->avg_bitrate += 500000; /* FIXME */
-
- this->video_fifo->put (this->video_fifo, buf);
-}
-
-static void decode_audio_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
-
- if (this->audio_fifo) {
- buf_element_t *buf;
- int codec;
- char str[5];
- int channel;
-
- int16_t locbits_per_sample, locchannels, locblockalign;
- int32_t locsize, locdefault_len, locbuffersize, locavgbytespersec;
- int64_t loctime_unit, locsamples_per_unit;
-
- locsize = LE_32(&op->packet[13]);
- loctime_unit = LE_64(&op->packet[17]);
- locsamples_per_unit = LE_64(&op->packet[25]);
- locdefault_len = LE_32(&op->packet[33]);
- locbuffersize = LE_32(&op->packet[37]);
- locbits_per_sample = LE_16(&op->packet[41]);
- locchannels = LE_16(&op->packet[45]);
- locblockalign = LE_16(&op->packet[47]);
- locavgbytespersec= LE_32(&op->packet[49]);
-
- lprintf ("direct show filter created audio stream detected, hexdump:\n");
-#ifdef LOG
- xine_hexdump (op->packet, op->bytes);
-#endif
-
- memcpy(str, &op->packet[9], 4);
- str[4] = 0;
- codec = strtoul(str, NULL, 16);
-
- channel= this->num_audio_streams++;
-
- this->si[stream_num]->buf_types = _x_formattag_to_buf_audio(codec);
- if( this->si[stream_num]->buf_types ) {
- this->si[stream_num]->buf_types |= channel;
- } else {
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "demux_ogg: unknown audio codec type 0x%x\n", codec);
- this->si[stream_num]->buf_types = BUF_AUDIO_UNKNOWN;
- /*break;*/
- }
-
- lprintf ("subtype 0x%x\n", codec);
- lprintf ("time_unit %" PRId64 "\n", loctime_unit);
- lprintf ("samples_per_unit %" PRId64 "\n", locsamples_per_unit);
- lprintf ("default_len %d\n", locdefault_len);
- lprintf ("buffersize %d\n", locbuffersize);
- lprintf ("bits_per_sample %d\n", locbits_per_sample);
- lprintf ("channels %d\n", locchannels);
- lprintf ("blockalign %d\n", locblockalign);
- lprintf ("avgbytespersec %d\n", locavgbytespersec);
- lprintf ("buf_type %08x\n",this->si[stream_num]->buf_types);
-
- buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
- buf->type = this->si[stream_num]->buf_types;
- buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAME_END;
- buf->decoder_info[0] = 0;
- buf->decoder_info[1] = locsamples_per_unit;
- buf->decoder_info[2] = locbits_per_sample;
- buf->decoder_info[3] = locchannels;
- this->audio_fifo->put (this->audio_fifo, buf);
-
- this->si[stream_num]->headers = 0; /* header already sent */
- this->si[stream_num]->factor = 90000;
- this->si[stream_num]->quotient = locsamples_per_unit;
-
- this->avg_bitrate += locavgbytespersec*8;
-
- /* audio metadata */
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC, codec);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_CHANNELS, locchannels);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITS, locbits_per_sample);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE, locsamples_per_unit);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITRATE, locavgbytespersec * 8);
-
- } else /* no audio_fifo there */
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
-}
-
-static void decode_dshow_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
-
- lprintf ("older Direct Show filter-generated stream header detected. Hexdump:\n");
-#ifdef LOG
- xine_hexdump (op->packet, op->bytes);
-#endif
-
- this->si[stream_num]->headers = 0; /* header is sent below */
-
- if ( (LE_32(&op->packet[96]) == 0x05589f80) && (op->bytes >= 184)) {
-
- buf_element_t *buf;
- xine_bmiheader bih;
- int channel;
- uint32_t fcc;
-
- lprintf ("seems to be a video stream.\n");
-
- channel = this->num_video_streams++;
- fcc = *(uint32_t*)(op->packet+68);
- lprintf ("fourcc %08x\n", fcc);
-
- this->si[stream_num]->buf_types = _x_fourcc_to_buf_video (fcc);
- if( !this->si[stream_num]->buf_types )
- this->si[stream_num]->buf_types = BUF_VIDEO_UNKNOWN;
- this->si[stream_num]->buf_types |= channel;
-
- bih.biSize = sizeof(xine_bmiheader);
- bih.biWidth = LE_32(&op->packet[176]);
- bih.biHeight = LE_32(&op->packet[180]);
- bih.biPlanes = 0;
- memcpy (&bih.biCompression, op->packet+68, 4);
- bih.biBitCount = LE_16(&op->packet[182]);
- if (!bih.biBitCount)
- bih.biBitCount = 24; /* FIXME ? */
- bih.biSizeImage = (bih.biBitCount>>3)*bih.biWidth*bih.biHeight;
- bih.biXPelsPerMeter = 1;
- bih.biYPelsPerMeter = 1;
- bih.biClrUsed = 0;
- bih.biClrImportant = 0;
-
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
- buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAMERATE|
- BUF_FLAG_FRAME_END;
- this->frame_duration = (*(int64_t*)(op->packet+164)) * 9 / 1000;
- this->si[stream_num]->factor = (*(int64_t*)(op->packet+164)) * 9;
- this->si[stream_num]->quotient = 1000;
-
- buf->decoder_info[0] = this->frame_duration;
- memcpy (buf->content, &bih, sizeof (xine_bmiheader));
- buf->size = sizeof (xine_bmiheader);
- buf->type = this->si[stream_num]->buf_types;
- this->video_fifo->put (this->video_fifo, buf);
-
- lprintf ("subtype %.4s\n", (char*)&fcc);
- lprintf ("buf_type %08x\n", this->si[stream_num]->buf_types);
- lprintf ("video size %d x %d\n", bih.biWidth, bih.biHeight);
- lprintf ("frame duration %d\n", this->frame_duration);
-
- /* video metadata */
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH, bih.biWidth);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HEIGHT, bih.biHeight);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->frame_duration);
-
- this->avg_bitrate += 500000; /* FIXME */
-
- this->ignore_keyframes = 1;
-
- } else if (LE_32(&op->packet[96]) == 0x05589F81) {
-
-#if 0
- /* FIXME: no test streams */
-
- buf_element_t *buf;
- int codec;
- char str[5];
- int channel;
- int extra_size;
-
- extra_size = *(int16_t*)(op->packet+140);
- format = *(int16_t*)(op->packet+124);
- channels = *(int16_t*)(op->packet+126);
- samplerate = *(int32_t*)(op->packet+128);
- nAvgBytesPerSec = *(int32_t*)(op->packet+132);
- nBlockAlign = *(int16_t*)(op->packet+136);
- wBitsPerSample = *(int16_t*)(op->packet+138);
- samplesize = (sh_a->wf->wBitsPerSample+7)/8;
- cbSize = extra_size;
- if(extra_size > 0)
- memcpy(wf+sizeof(WAVEFORMATEX),op->packet+142,extra_size);
-#endif
-
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "FIXME, old audio format not handled\n");
-
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
-
- } else {
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "old header detected but stream type is unknown\n");
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
- }
-}
-
-static void decode_text_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- int channel=0;
- uint32_t *val;
- buf_element_t *buf;
-
- lprintf ("textstream detected.\n");
- this->si[stream_num]->headers = 2;
- channel = this->num_spu_streams++;
- this->si[stream_num]->buf_types = BUF_SPU_OGM | channel;
-
- /*send an empty spu to inform the video_decoder, that there is a stream*/
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
- buf->type = this->si[stream_num]->buf_types;
- buf->pts = 0;
- val = (uint32_t * )buf->content;
- *val++=0;
- *val++=0;
- *val++=0;
- this->video_fifo->put (this->video_fifo, buf);
-}
-
-static void decode_theora_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
-
-#ifdef HAVE_THEORA
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "demux_ogg: Theorastreamsupport is highly alpha at the moment\n");
-
- if (theora_decode_header(&this->t_info, &this->t_comment, op) >= 0) {
-
- this->num_video_streams++;
-
- this->si[stream_num]->factor = (int64_t) 90000 * (int64_t) this->t_info.fps_denominator;
-
- if (!this->t_info.fps_numerator) {
- this->t_info.fps_numerator = 1; /* FIXME: default value ? */
- }
- this->si[stream_num]->quotient = this->t_info.fps_numerator;
-
- this->frame_duration = ((int64_t) 90000*this->t_info.fps_denominator);
- this->frame_duration /= this->t_info.fps_numerator;
-
- this->si[stream_num]->granuleshift = intlog(this->t_info.keyframe_frequency_force-1);
-
- this->si[stream_num]->headers=3;
- this->si[stream_num]->buf_types = BUF_VIDEO_THEORA;
-
- _x_meta_info_set(this->stream, XINE_META_INFO_VIDEOCODEC, "theora");
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH, this->t_info.frame_width);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HEIGHT, this->t_info.frame_height);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_FRAME_DURATION, this->frame_duration);
-
- /*currently aspect_nominator and -denumerator are 0?*/
- if (this->t_info.aspect_denominator) {
- int64_t ratio = ((int64_t) this->t_info.aspect_numerator * 10000);
-
- ratio /= this->t_info.aspect_denominator;
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_RATIO, ratio);
- }
-
- lprintf ("decoded theora header \n");
- lprintf ("frameduration %d\n",this->frame_duration);
- lprintf ("w:%d h:%d \n",this->t_info.frame_width,this->t_info.frame_height);
- lprintf ("an:%d ad:%d \n",this->t_info.aspect_numerator,this->t_info.aspect_denominator);
- } else {
- /*Rejected stream*/
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "A theora header was rejected by libtheora\n");
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
- this->si[stream_num]->headers = 0; /* FIXME: don't know */
- }
-#else
- this->si[stream_num]->buf_types = BUF_VIDEO_THEORA;
- this->num_video_streams++;
- this->unhandled_video_streams++;
- _x_meta_info_set(this->stream, XINE_META_INFO_VIDEOCODEC, "theora");
-#endif
-}
-
-static void decode_flac_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- xine_flac_metadata_header header;
- xine_flac_streaminfo_block streaminfo;
- buf_element_t *buf;
- xine_waveformatex wave;
-
- /* Packet type */
- _x_assert(op->packet[0] == 0x7F);
-
- /* OggFLAC signature */
- _x_assert(op->packet[1] == 'F'); _x_assert(op->packet[2] == 'L');
- _x_assert(op->packet[3] == 'A'); _x_assert(op->packet[4] == 'C');
-
- /* Version: supported only 1.0 */
- _x_assert(op->packet[5] == 1); _x_assert(op->packet[6] == 0);
-
- /* Header count */
- this->si[stream_num]->headers = 0/*BE_16(&op->packet[7]) +1*/;
-
- /* fLaC signature */
- _x_assert(op->packet[9] == 'f'); _x_assert(op->packet[10] == 'L');
- _x_assert(op->packet[11] == 'a'); _x_assert(op->packet[12] == 'C');
-
- _x_parse_flac_metadata_header(&op->packet[13], &header);
-
- switch ( header.blocktype ) {
- case FLAC_BLOCKTYPE_STREAMINFO:
- _x_assert(header.length == FLAC_STREAMINFO_SIZE);
- _x_parse_flac_streaminfo_block(&op->packet[17], &streaminfo);
- break;
- }
-
- this->si[stream_num]->buf_types = BUF_AUDIO_FLAC
- +this->num_audio_streams++;
-
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_SAMPLERATE, streaminfo.samplerate);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_CHANNELS, streaminfo.channels);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_BITS, streaminfo.bits_per_sample);
-
- this->si[stream_num]->factor = 90000;
-
- buf = this->audio_fifo->buffer_pool_alloc(this->audio_fifo);
-
- buf->type = BUF_AUDIO_FLAC;
- buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_STDHEADER|BUF_FLAG_FRAME_END;
-
- buf->decoder_info[0] = 0;
- buf->decoder_info[1] = streaminfo.samplerate;
- buf->decoder_info[2] = streaminfo.bits_per_sample;
- buf->decoder_info[3] = streaminfo.channels;
- buf->size = sizeof(xine_waveformatex) + FLAC_STREAMINFO_SIZE;
- memcpy(buf->content+sizeof(xine_waveformatex), &op->packet[17], FLAC_STREAMINFO_SIZE);
- xine_hexdump(&op->packet[17], FLAC_STREAMINFO_SIZE);
- wave.cbSize = FLAC_STREAMINFO_SIZE;
- memcpy(buf->content, &wave, sizeof(xine_waveformatex));
-
- this->audio_fifo->put(this->audio_fifo, buf);
-
- /* Skip the Ogg framing info */
- op->bytes -= 9;
- op->packet += 9;
-}
-
-static void decode_annodex_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- lprintf ("Annodex stream detected\n");
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
- this->si[stream_num]->headers = 1;
- this->si[stream_num]->header_granulepos = op->granulepos;
- _x_meta_info_set(this->stream, XINE_META_INFO_SYSTEMLAYER, "Annodex");
-}
-
-static void decode_anxdata_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- int64_t granule_rate_n, granule_rate_d;
- uint32_t secondary_headers;
- char content_type[1024];
- int content_type_length;
-
- lprintf("AnxData stream detected\n");
-
- /* read granule rate */
- granule_rate_n = LE_64(&op->packet[8]);
- granule_rate_d = LE_64(&op->packet[16]);
- secondary_headers = LE_32(&op->packet[24]);
-
- lprintf("granule_rate %" PRId64 "/%" PRId64 ", %d secondary headers\n",
- granule_rate_n, granule_rate_d, secondary_headers);
-
- /* read "Content-Tyoe" MIME header */
- sscanf(&op->packet[28], "Content-Type: %1023s\r\n", content_type);
- content_type_length = strlen(content_type);
-
- lprintf("Content-Type: %s (length:%d)\n", content_type, content_type_length);
-
- /* how many header packets in the AnxData stream? */
- this->si[stream_num]->headers = secondary_headers + 1;
- this->si[stream_num]->hide_first_header = 1;
-
- /* set factor and quotient */
- this->si[stream_num]->factor = (int64_t) 90000 * granule_rate_d;
- this->si[stream_num]->quotient = granule_rate_n;
-
- lprintf("factor: %" PRId64 ", quotient: %" PRId64 "\n",
- this->si[stream_num]->factor, this->si[stream_num]->quotient);
-
- /* what type of stream are we dealing with? */
- if (!strncmp(content_type, "audio/x-vorbis", content_type_length)) {
- this->si[stream_num]->buf_types = BUF_AUDIO_VORBIS;
- this->num_audio_streams++;
- } else if (!strncmp(content_type, "audio/x-speex", content_type_length)) {
- this->num_audio_streams++;
-#ifdef HAVE_SPEEX
- this->si[stream_num]->buf_types = BUF_AUDIO_SPEEX;
-#else
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
-#endif
- } else if (!strncmp(content_type, "video/x-theora", content_type_length)) {
- this->num_video_streams++;
-#ifdef HAVE_THEORA
- this->si[stream_num]->buf_types = BUF_VIDEO_THEORA;
-#else
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
-#endif
- } else if (!strncmp(content_type, "text/x-cmml", content_type_length)) {
- unsigned int channel = this->num_spu_streams++;
- this->si[stream_num]->headers = 0;
- this->si[stream_num]->buf_types = BUF_SPU_CMML | channel;
- this->si[stream_num]->granuleshift = 0;
- } else {
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
- }
-
-}
-
-static void decode_cmml_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
- unsigned int channel = this->num_spu_streams++;
- this->si[stream_num]->headers = 0;
- this->si[stream_num]->buf_types = BUF_SPU_CMML | channel;
-
- this->si[stream_num]->factor = 90000 * LE_64(&op->packet[20]);
- this->si[stream_num]->quotient = LE_64(&op->packet[12]);
- this->si[stream_num]->granuleshift = (int)op->packet[28];
-}
-
-/*
- * interpret stream start packages, send headers
- */
-static void send_header (demux_ogg_t *this) {
-
- int stream_num = -1;
- int cur_serno;
- int done = 0;
- ogg_packet op;
- xine_event_t ui_event;
-
- lprintf ("detecting stream types...\n");
-
- this->ignore_keyframes = 0;
-
- while (!done) {
- if (!read_ogg_packet(this)) {
- this->status = DEMUX_FINISHED;
- return;
- }
- /* now we've got at least one new page */
-
- cur_serno = ogg_page_serialno (&this->og);
-
- if (ogg_page_bos(&this->og)) {
- lprintf ("beginning of stream\n");
- lprintf ("serial number %d\n", cur_serno);
-
- if( this->num_streams == MAX_STREAMS ) {
- xprintf (this->stream->xine, XINE_VERBOSITY_LOG, "demux_ogg: MAX_STREAMS exceeded, aborting.\n");
- this->status = DEMUX_FINISHED;
- return;
- }
- stream_num = new_stream_info(this, cur_serno);
-
- } else {
- stream_num = get_stream(this, cur_serno);
- if (stream_num == -1) {
- xprintf (this->stream->xine, XINE_VERBOSITY_LOG, "demux_ogg: stream with no beginning!\n");
- this->status = DEMUX_FINISHED;
- return;
- }
- }
-
- ogg_stream_pagein(&this->si[stream_num]->oss, &this->og);
-
- while (ogg_stream_packetout(&this->si[stream_num]->oss, &op) == 1) {
-
- if (!this->si[stream_num]->buf_types) {
-
- /* detect buftype */
- if (!strncmp (&op.packet[1], "vorbis", 6)) {
- decode_vorbis_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[0], "Speex", 5)) {
- decode_speex_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[1], "video", 5)) {
- decode_video_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[1], "audio", 5)) {
- decode_audio_header(this, stream_num, &op);
- } else if (op.bytes >= 142
- && !strncmp (&op.packet[1], "Direct Show Samples embedded in Ogg", 35) ) {
- decode_dshow_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[1], "text", 4)) {
- decode_text_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[1], "theora", 6)) {
- decode_theora_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[1], "FLAC", 4)) {
- decode_flac_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[0], "Annodex", 7)) {
- decode_annodex_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[0], "AnxData", 7)) {
- decode_anxdata_header(this, stream_num, &op);
- } else if (!strncmp (&op.packet[0], "CMML", 4)) {
- decode_cmml_header(this, stream_num, &op);
- } else {
- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
- "demux_ogg: unknown stream type (signature >%.8s<). hex dump of bos packet follows:\n",
- op.packet);
- if(this->stream->xine->verbosity >= XINE_VERBOSITY_DEBUG)
- xine_hexdump (op.packet, op.bytes);
-
- this->si[stream_num]->buf_types = BUF_CONTROL_NOP;
- }
- }
-
- /* send preview buffer */
- if (this->si[stream_num]->headers > 0 ||
- op.packet[0] == PACKET_TYPE_COMMENT) {
- if (this->si[stream_num]->hide_first_header)
- this->si[stream_num]->hide_first_header = 0;
- else {
- lprintf ("sending preview buffer of stream type %08x\n",
- this->si[stream_num]->buf_types);
-
- send_ogg_buf (this, &op, stream_num, BUF_FLAG_HEADER);
- this->si[stream_num]->headers --;
- }
- }
-
- /* are we finished ? */
- if (!ogg_page_bos(&this->og)) {
- int i;
- done = 1;
-
- for (i=0; i<this->num_streams; i++) {
- if (this->si[i]->headers > 0)
- done = 0;
-
- llprintf(DEBUG_PREVIEWS,
- "%d preview buffers left to send from stream %d\n",
- this->si[i]->headers, i);
- }
- }
- }
- }
-
- ui_event.type = XINE_EVENT_UI_CHANNELS_CHANGED;
- ui_event.data_length = 0;
- xine_event_send(this->stream, &ui_event);
-
- /*get the streamlength*/
- get_stream_length (this);
-
-}
-
-static int demux_ogg_send_chunk (demux_plugin_t *this_gen) {
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
-
- int stream_num;
- int cur_serno;
-
- ogg_packet op;
-
- ogg_handle_event(this);
-
- llprintf(DEBUG_PACKETS, "send package...\n");
-
- if (!read_ogg_packet(this)) {
- this->status = DEMUX_FINISHED;
- lprintf ("EOF\n");
- return this->status;
- }
-
- /* now we've got one new page */
-
- cur_serno = ogg_page_serialno (&this->og);
- stream_num = get_stream(this, cur_serno);
- if (stream_num < 0) {
- lprintf ("error: unknown stream, serialnumber %d\n", cur_serno);
-
- if (!ogg_page_bos(&this->og)) {
- lprintf ("help, stream with no beginning!\n");
- }
- lprintf ("adding late stream with serial number %d (all content will be discarded)\n", cur_serno);
-
- if( this->num_streams == MAX_STREAMS ) {
- xprintf (this->stream->xine, XINE_VERBOSITY_LOG, "demux_ogg: MAX_STREAMS exceeded, aborting.\n");
- this->status = DEMUX_FINISHED;
- return this->status;
- }
- stream_num = new_stream_info(this, cur_serno);
- }
-
- ogg_stream_pagein(&this->si[stream_num]->oss, &this->og);
-
- if (ogg_page_bos(&this->og)) {
- lprintf ("beginning of stream: serial number %d - discard\n",
- ogg_page_serialno (&this->og));
- while (ogg_stream_packetout(&this->si[stream_num]->oss, &op) == 1) ;
- return this->status;
- }
-
- /*while keyframeseeking only process videostream*/
- if (!this->ignore_keyframes && this->keyframe_needed
- && ((this->si[stream_num]->buf_types & 0xFF000000) != BUF_VIDEO_BASE))
- return this->status;
-
- while (ogg_stream_packetout(&this->si[stream_num]->oss, &op) == 1) {
- /* printf("demux_ogg: packet: %.8s\n", op.packet); */
- /* printf("demux_ogg: got a packet\n"); */
-
- if ((*op.packet & PACKET_TYPE_HEADER) &&
- (this->si[stream_num]->buf_types!=BUF_VIDEO_THEORA) && (this->si[stream_num]->buf_types!=BUF_AUDIO_SPEEX) && (this->si[stream_num]->buf_types!=BUF_AUDIO_FLAC)) {
- if (op.granulepos != -1) {
- this->si[stream_num]->header_granulepos = op.granulepos;
- lprintf ("header with granulepos, remembering granulepos\n");
- } else {
- lprintf ("header => discard\n");
- }
- continue;
- }
-
- /*discard granulepos-less packets and to early audiopackets*/
- if (this->si[stream_num]->resync) {
- if ((this->si[stream_num]->buf_types & 0xFF000000) == BUF_SPU_BASE) {
- /*never drop subtitles*/
- this->si[stream_num]->resync=0;
- } else if ((op.granulepos == -1) && (this->si[stream_num]->header_granulepos == -1)) {
- continue;
- } else {
-
- /*dump too early packets*/
- if ((get_pts(this,stream_num,op.granulepos)-this->start_pts) > -90000)
- this->si[stream_num]->resync=0;
- else
- continue;
- }
- }
-
- if (!this->ignore_keyframes && this->keyframe_needed) {
- lprintf ("keyframe needed... buf_type=%08x\n", this->si[stream_num]->buf_types);
- if (this->si[stream_num]->buf_types == BUF_VIDEO_THEORA) {
-#ifdef HAVE_THEORA
-
- int keyframe_granule_shift;
- int64_t pframe=-1,iframe=-1;
-
- keyframe_granule_shift = this->si[stream_num]->granuleshift;
-
- if(op.granulepos>=0){
- iframe=op.granulepos>>keyframe_granule_shift;
- pframe=op.granulepos-(iframe<<keyframe_granule_shift);
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "seeking keyframe i %" PRId64 " p %" PRId64 "\n", iframe, pframe);
- if (pframe!=0)
- continue;
- } else
- continue;
- this->keyframe_needed = 0;
- this->start_pts=get_pts(this,stream_num,op.granulepos);
-#endif
- } else if ((this->si[stream_num]->buf_types & 0xFF000000) == BUF_VIDEO_BASE) {
-
- /*calculate the current pts*/
- if (op.granulepos!=-1) {
- this->start_pts=get_pts(this, stream_num, op.granulepos);
- } else if (this->start_pts!=-1)
- this->start_pts=this->start_pts+this->frame_duration;
-
- /*seek the keyframe*/
- if ((*op.packet == PACKET_IS_SYNCPOINT) && (this->start_pts!=-1))
- this->keyframe_needed = 0;
- else
- continue;
-
- } else if ((this->si[stream_num]->buf_types & 0xFF000000) == BUF_VIDEO_BASE) continue;
- }
- send_ogg_buf (this, &op, stream_num, 0);
-
- /*delete used header_granulepos*/
- if (op.granulepos == -1)
- this->si[stream_num]->header_granulepos = -1;
-
- }
- if (ogg_page_eos(&this->og)) {
- int i;
- int finished_streams = 0;
-
- lprintf("end of stream, serialnumber %d\n", cur_serno);
- this->si[stream_num]->delivered_eos = 1;
-
- /* check if all logical streams are finished */
- for (i = 0; i < this->num_streams; i++) {
- finished_streams += this->si[i]->delivered_eos;
- }
-
- /* if all streams are finished, perhaps a chained stream follows */
- if (finished_streams == this->num_streams) {
- /* delete current logical streams */
- for (i = 0; i < this->num_streams; i++) {
- ogg_stream_clear(&this->si[i]->oss);
- if (this->si[i]->language) {
- free (this->si[i]->language);
- }
- free (this->si[i]);
- }
- this->num_streams = 0;
- this->num_audio_streams = 0;
- this->num_video_streams = 0;
- this->unhandled_video_streams = 0;
- this->num_spu_streams = 0;
- this->avg_bitrate = 1;
-
- /* try to read a chained stream */
- this->send_newpts = 1;
- this->last_pts[0] = 0;
- this->last_pts[1] = 0;
-
- /* send control buffer to avoid buffer leak */
- _x_demux_control_end(this->stream, 0);
- _x_demux_control_start(this->stream);
- send_header(this);
- }
- }
-
- return this->status;
-}
-
-static void demux_ogg_dispose (demux_plugin_t *this_gen) {
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
- int i;
-
- for (i=0; i<this->num_streams; i++) {
- ogg_stream_clear(&this->si[i]->oss);
-
- if (this->si[i]->language) {
- free (this->si[i]->language);
- }
- free(this->si[i]);
- }
-
- ogg_sync_clear(&this->oy);
-
-#ifdef HAVE_THEORA
- theora_comment_clear (&this->t_comment);
- theora_info_clear (&this->t_info);
-#endif
-
- if (this->chapter_info){
- free (this->chapter_info->entries);
- free (this->chapter_info);
- }
- if (this->title){
- free (this->title);
- }
- if (this->event_queue)
- xine_event_dispose_queue (this->event_queue);
-
- free (this);
-}
-
-static int demux_ogg_get_status (demux_plugin_t *this_gen) {
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
-
- return this->status;
-}
-
-static void demux_ogg_send_headers (demux_plugin_t *this_gen) {
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
-
- this->video_fifo = this->stream->video_fifo;
- this->audio_fifo = this->stream->audio_fifo;
-
- this->status = DEMUX_OK;
-
- /*
- * send start buffers
- */
-
- this->last_pts[0] = 0;
- this->last_pts[1] = 0;
-
- /*
- * initialize ogg engine
- */
- ogg_sync_init(&this->oy);
-
- this->num_streams = 0;
- this->num_audio_streams = 0;
- this->num_video_streams = 0;
- this->num_spu_streams = 0;
- this->avg_bitrate = 1;
-
- this->input->seek (this->input, 0, SEEK_SET);
-
- if (this->status == DEMUX_OK) {
- _x_demux_control_start(this->stream);
- send_header (this);
- lprintf ("headers sent, avg bitrate is %" PRId64 "\n", this->avg_bitrate);
- }
-
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_VIDEO,
- this->num_video_streams > 0);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_HANDLED,
- this->num_video_streams > this->unhandled_video_streams);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_HAS_AUDIO,
- this->num_audio_streams > 0);
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_MAX_SPU_CHANNEL,
- this->num_spu_streams);
-}
-
-static int demux_ogg_seek (demux_plugin_t *this_gen,
- off_t start_pos, int start_time, int playing) {
-
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
- int i;
- start_time /= 1000;
- start_pos = (off_t) ( (double) start_pos / 65535 *
- this->input->get_length (this->input) );
- /*
- * seek to start position
- */
-
- if (INPUT_IS_SEEKABLE(this->input)) {
-
- this->keyframe_needed = (this->num_video_streams>0);
-
- if ( (!start_pos) && (start_time)) {
- if (this->time_length != -1) {
- /*do the seek via time*/
- int current_time=-1;
- off_t current_pos;
- current_pos=this->input->get_current_pos(this->input);
-
- /*try to find out the current time*/
- if (this->last_pts[PTS_VIDEO]) {
- current_time=this->last_pts[PTS_VIDEO]/90000;
- } else if (this->last_pts[PTS_AUDIO]) {
- current_time=this->last_pts[PTS_AUDIO]/90000;
- }
-
- /*fixme, the file could grow, do something
- about this->time_length using get_lenght to verify, that the stream
- hasn` changed its length, otherwise no seek to "new" data is possible*/
-
- lprintf ("seek to time %d called\n",start_time);
- lprintf ("current time is %d\n",current_time);
-
- if (current_time > start_time) {
- /*seek between beginning and current_pos*/
-
- /*fixme - sometimes we seek backwards and during
- keyframeseeking, we undo the seek*/
-
- start_pos = start_time * current_pos
- / current_time ;
- } else {
- /*seek between current_pos and end*/
- start_pos = current_pos +
- ((start_time - current_time) *
- ( this->input->get_length(this->input) - current_pos ) /
- ( (this->time_length / 1000) - current_time)
- );
- }
-
- lprintf ("current_pos is %" PRId64 "\n",current_pos);
- lprintf ("new_pos is %" PRId64 "\n",start_pos);
-
- } else {
- /*seek using avg_bitrate*/
- start_pos = start_time * this->avg_bitrate/8;
- }
-
- lprintf ("seeking to %d seconds => %" PRId64 " bytes\n",
- start_time, start_pos);
-
- }
-
- ogg_sync_reset(&this->oy);
-
- for (i=0; i<this->num_streams; i++) {
- this->si[i]->header_granulepos = -1;
- ogg_stream_reset(&this->si[i]->oss);
- }
-
- /*some strange streams have no syncpoint flag set at the beginning*/
- if (start_pos == 0)
- this->keyframe_needed = 0;
-
- lprintf ("seek to %" PRId64 " called\n",start_pos);
-
- this->input->seek (this->input, start_pos, SEEK_SET);
-
- }
-
- /* fixme - this would be a nice position to do the following tasks
- 1. adjust an ogg videostream to a keyframe
- 2. compare the keyframe_pts with start_time. if the difference is to
- high (e.g. larger than max keyframe_intervall, do a new seek or
- continue reading
- 3. adjust the audiostreams in such a way, that the
- difference is not to high.
-
- In short words, do all the cleanups necessary to continue playback
- without further actions
- */
-
- this->send_newpts = 1;
- this->status = DEMUX_OK;
-
- if( !playing ) {
-
- this->buf_flag_seek = 0;
-
- } else {
- if (start_pos!=0) {
- this->buf_flag_seek = 1;
- /*each stream has to continue with a packet that has an
- granulepos*/
- for (i=0; i<this->num_streams; i++) {
- this->si[i]->resync = 1;
- }
-
- this->start_pts=-1;
- }
-
- _x_demux_flush_engine(this->stream);
- }
-
- return this->status;
-}
-
-static int demux_ogg_get_stream_length (demux_plugin_t *this_gen) {
-
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
-
- if (this->time_length==-1){
- if (this->avg_bitrate) {
- return (int)((int64_t)1000 * this->input->get_length (this->input) * 8 /
- this->avg_bitrate);
- } else {
- return 0;
- }
- } else {
- return this->time_length;
- }
-}
-
-static uint32_t demux_ogg_get_capabilities(demux_plugin_t *this_gen) {
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
- int cap_chapter = 0;
-
- if (this->chapter_info)
- cap_chapter = DEMUX_CAP_CHAPTERS;
-
- return DEMUX_CAP_SPULANG | DEMUX_CAP_AUDIOLANG | cap_chapter;
-}
-
-static int format_lang_string (demux_ogg_t * this, uint32_t buf_mask, uint32_t buf_type, int channel, char *str) {
- int stream_num;
-
- for (stream_num=0; stream_num<this->num_streams; stream_num++) {
- if ((this->si[stream_num]->buf_types & buf_mask) == buf_type) {
- if (this->si[stream_num]->language) {
- if (snprintf (str, XINE_LANG_MAX, "%s", this->si[stream_num]->language) >= XINE_LANG_MAX)
- /* the string got truncated */
- str[XINE_LANG_MAX - 2] = str[XINE_LANG_MAX - 3] = str[XINE_LANG_MAX - 4] = '.';
- /* TODO: provide long version in XINE_META_INFO_FULL_LANG */
- } else {
- snprintf(str, XINE_LANG_MAX, "channel %d",channel);
- }
- return DEMUX_OPTIONAL_SUCCESS;
- }
- }
- return DEMUX_OPTIONAL_UNSUPPORTED;
-}
-
-static int demux_ogg_get_optional_data(demux_plugin_t *this_gen,
- void *data, int data_type) {
-
- demux_ogg_t *this = (demux_ogg_t *) this_gen;
-
- char *str=(char *) data;
- int channel = *((int *)data);
-
- switch (data_type) {
- case DEMUX_OPTIONAL_DATA_SPULANG:
- lprintf ("DEMUX_OPTIONAL_DATA_SPULANG channel = %d\n",channel);
- if (channel==-1) {
- strcpy( str, "none");
- return DEMUX_OPTIONAL_SUCCESS;
- } else if ((channel>=0) && (channel<this->num_streams)) {
- return format_lang_string (this, 0xFFFFFFFF, BUF_SPU_OGM+channel, channel, str);
- }
- return DEMUX_OPTIONAL_UNSUPPORTED;
- case DEMUX_OPTIONAL_DATA_AUDIOLANG:
- lprintf ("DEMUX_OPTIONAL_DATA_AUDIOLANG channel = %d\n",channel);
- if (channel==-1) {
- return format_lang_string (this, 0xFF00001F, BUF_AUDIO_BASE, channel, str);
- } else if ((channel>=0) && (channel<this->num_streams)) {
- return format_lang_string (this, 0xFF00001F, BUF_AUDIO_BASE+channel, channel, str);
- }
- return DEMUX_OPTIONAL_UNSUPPORTED;
- default:
- return DEMUX_OPTIONAL_UNSUPPORTED;
- }
-}
-
-static int detect_ogg_content (int detection_method, demux_class_t *class_gen,
- input_plugin_t *input) {
-
- switch (detection_method) {
-
- case METHOD_BY_CONTENT: {
- uint8_t buf[4];
-
- if (_x_demux_read_header(input, buf, 4) != 4)
- return 0;
-
- if ((buf[0] == 'O') && (buf[1] == 'g') && (buf[2] == 'g') &&
- (buf[3] == 'S'))
- return 1;
- else
- return 0;
- }
-
- case METHOD_BY_EXTENSION: {
- const char *extensions, *mrl;
-
- mrl = input->get_mrl (input);
- extensions = class_gen->get_extensions (class_gen);
-
- if (_x_demux_check_extension (mrl, extensions))
- return 1;
- else
- return 0;
- }
-
- case METHOD_EXPLICIT:
- return 1;
-
- default:
- return 0;
- }
-}
-
-static int detect_anx_content (int detection_method, demux_class_t *class_gen,
- input_plugin_t *input) {
-
- if (detect_ogg_content(detection_method, class_gen, input) == 0)
- return 0;
-
- switch (detection_method) {
-
-#define ANNODEX_SIGNATURE_SEARCH 128
-
- case METHOD_BY_CONTENT: {
- uint8_t buf[ANNODEX_SIGNATURE_SEARCH];
- int found_annodex_signature = 0;
- const char *annodex_signature = "Annodex";
- int annodex_signature_length = 7; /* = strlen(annodex_signature) */
- int i, j;
-
- if (_x_demux_read_header(input, buf, ANNODEX_SIGNATURE_SEARCH) !=
- ANNODEX_SIGNATURE_SEARCH)
- return 0;
-
- /* scan for 'Annodex' signature in the first 64 bytes */
- for (i = 0, j = 0; i < ANNODEX_SIGNATURE_SEARCH; i++) {
- if (buf[i] == annodex_signature[j]) {
- if (j >= annodex_signature_length) {
- /* found signature */
- found_annodex_signature = 1;
- break;
- } else {
- j++;
- }
- }
- }
-
- if (found_annodex_signature)
- return 1;
- else
- return 0;
- }
-
-#undef ANNODEX_SIGNATURE_SEARCH
-
- case METHOD_BY_EXTENSION: {
- const char *extensions, *mrl;
-
- mrl = input->get_mrl (input);
- extensions = class_gen->get_extensions (class_gen);
-
- if (_x_demux_check_extension (mrl, extensions))
- return 1;
- else
- return 0;
- }
-
- case METHOD_EXPLICIT:
- return 1;
-
- default:
- return 0;
- }
-}
-
-static demux_plugin_t *anx_open_plugin (demux_class_t *class_gen,
- xine_stream_t *stream,
- input_plugin_t *input) {
-
- demux_ogg_t *this;
-
- if (detect_anx_content(stream->content_detection_method, class_gen, input) == 0)
- return NULL;
-
- /*
- * if we reach this point, the input has been accepted.
- */
-
- this = xine_xmalloc (sizeof (demux_ogg_t));
- memset (this, 0, sizeof(demux_ogg_t));
- this->stream = stream;
- this->input = input;
-
- /* the Annodex demuxer currently calls into exactly the same functions as
- * the Ogg demuxer, which seems to make this function a bit redundant, but
- * this design leaves us a bit more room to change an Annodex demuxer's
- * behaviour in the future if necessary */
- this->demux_plugin.send_headers = demux_ogg_send_headers;
- this->demux_plugin.send_chunk = demux_ogg_send_chunk;
- this->demux_plugin.seek = demux_ogg_seek;
- this->demux_plugin.dispose = demux_ogg_dispose;
- this->demux_plugin.get_status = demux_ogg_get_status;
- this->demux_plugin.get_stream_length = demux_ogg_get_stream_length;
- this->demux_plugin.get_capabilities = demux_ogg_get_capabilities;
- this->demux_plugin.get_optional_data = demux_ogg_get_optional_data;
- this->demux_plugin.demux_class = class_gen;
-
- this->status = DEMUX_FINISHED;
-
-#ifdef HAVE_THEORA
- theora_info_init (&this->t_info);
- theora_comment_init (&this->t_comment);
-#endif
-
- this->chapter_info = 0;
- this->title = 0;
- this->event_queue = xine_event_new_queue (this->stream);
-
- return &this->demux_plugin;
-}
-
-static demux_plugin_t *ogg_open_plugin (demux_class_t *class_gen,
- xine_stream_t *stream,
- input_plugin_t *input) {
-
- demux_ogg_t *this;
-
- if (detect_ogg_content(stream->content_detection_method, class_gen, input) == 0)
- return NULL;
-
- /*
- * if we reach this point, the input has been accepted.
- */
-
- this = xine_xmalloc (sizeof (demux_ogg_t));
- memset (this, 0, sizeof(demux_ogg_t));
- this->stream = stream;
- this->input = input;
-
- this->demux_plugin.send_headers = demux_ogg_send_headers;
- this->demux_plugin.send_chunk = demux_ogg_send_chunk;
- this->demux_plugin.seek = demux_ogg_seek;
- this->demux_plugin.dispose = demux_ogg_dispose;
- this->demux_plugin.get_status = demux_ogg_get_status;
- this->demux_plugin.get_stream_length = demux_ogg_get_stream_length;
- this->demux_plugin.get_capabilities = demux_ogg_get_capabilities;
- this->demux_plugin.get_optional_data = demux_ogg_get_optional_data;
- this->demux_plugin.demux_class = class_gen;
-
- this->status = DEMUX_FINISHED;
-
-#ifdef HAVE_THEORA
- theora_info_init (&this->t_info);
- theora_comment_init (&this->t_comment);
-#endif
-
- this->chapter_info = 0;
- this->title = 0;
- this->event_queue = xine_event_new_queue (this->stream);
-
- return &this->demux_plugin;
-}
-
-/*
- * Annodex demuxer class
- */
-
-static const char *anx_get_description (demux_class_t *this_gen) {
- return "Annodex demux plugin";
-}
-
-static const char *anx_get_identifier (demux_class_t *this_gen) {
- return "Annodex";
-}
-
-static const char *anx_get_extensions (demux_class_t *this_gen) {
- return "anx axa axv";
-}
-
-static const char *anx_get_mimetypes (demux_class_t *this_gen) {
- return "application/x-annodex: ogg: Annodex media;";
-}
-
-static void anx_class_dispose (demux_class_t *this_gen) {
- demux_anx_class_t *this = (demux_anx_class_t *) this_gen;
-
- free (this);
-}
-
-static void *anx_init_class (xine_t *xine, void *data) {
- demux_anx_class_t *this;
-
- this = xine_xmalloc (sizeof (demux_anx_class_t));
-
- this->demux_class.open_plugin = anx_open_plugin;
- this->demux_class.get_description = anx_get_description;
- this->demux_class.get_identifier = anx_get_identifier;
- this->demux_class.get_mimetypes = anx_get_mimetypes;
- this->demux_class.get_extensions = anx_get_extensions;
- this->demux_class.dispose = anx_class_dispose;
-
- return this;
-}
-
-/*
- * ogg demuxer class
- */
-
-static const char *ogg_get_description (demux_class_t *this_gen) {
- return "OGG demux plugin";
-}
-
-static const char *ogg_get_identifier (demux_class_t *this_gen) {
- return "OGG";
-}
-
-static const char *ogg_get_extensions (demux_class_t *this_gen) {
- return "ogg ogm spx";
-}
-
-static const char *ogg_get_mimetypes (demux_class_t *this_gen) {
- return "audio/x-ogg: ogg: OggVorbis Audio;"
- "audio/x-speex: ogg: Speex Audio;"
- "application/x-ogg: ogg: Ogg Stream;"
- "application/ogg: ogg: Ogg Stream;";
-}
-
-static void ogg_class_dispose (demux_class_t *this_gen) {
- demux_ogg_class_t *this = (demux_ogg_class_t *) this_gen;
-
- free (this);
-}
-
-static void *ogg_init_class (xine_t *xine, void *data) {
- demux_ogg_class_t *this;
-
- this = xine_xmalloc (sizeof (demux_ogg_class_t));
-
- this->demux_class.open_plugin = ogg_open_plugin;
- this->demux_class.get_description = ogg_get_description;
- this->demux_class.get_identifier = ogg_get_identifier;
- this->demux_class.get_mimetypes = ogg_get_mimetypes;
- this->demux_class.get_extensions = ogg_get_extensions;
- this->demux_class.dispose = ogg_class_dispose;
-
- return this;
-}
-
-/*
- * exported plugin catalog entry
- */
-static const demuxer_info_t demux_info_anx = {
- 20 /* priority */
-};
-
-static const demuxer_info_t demux_info_ogg = {
- 10 /* priority */
-};
-
-const plugin_info_t xine_plugin_info[] EXPORTED = {
- /* type, API, "name", version, special_info, init_function */
- { PLUGIN_DEMUX, 26, "ogg", XINE_VERSION_CODE, &demux_info_ogg, ogg_init_class },
- { PLUGIN_DEMUX, 26, "anx", XINE_VERSION_CODE, &demux_info_anx, anx_init_class },
- { PLUGIN_NONE, 0, "", 0, NULL, NULL }
-};
diff --git a/src/demuxers/demux_pva.c b/src/demuxers/demux_pva.c
index 55b1f7644..1b358eb1f 100644
--- a/src/demuxers/demux_pva.c
+++ b/src/demuxers/demux_pva.c
@@ -145,7 +145,7 @@ static int demux_pva_send_chunk(demux_plugin_t *this_gen) {
return this->status;
}
- chunk_size = BE_16(&preamble[6]);
+ chunk_size = _X_BE_16(&preamble[6]);
current_file_pos = this->input->get_current_pos(this->input);
@@ -160,7 +160,7 @@ static int demux_pva_send_chunk(demux_plugin_t *this_gen) {
return this->status;
}
chunk_size -= 4;
- pts = BE_32(&pts_buf[0]);
+ pts = _X_BE_32(&pts_buf[0]);
check_newpts( this, pts, PTS_VIDEO );
} else
pts = 0;
@@ -207,11 +207,11 @@ static int demux_pva_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- if (BE_32(&preamble[0]) != 0x000001C0) {
+ if (_X_BE_32(&preamble[0]) != 0x000001C0) {
this->status = DEMUX_FINISHED;
return this->status;
}
- chunk_size = BE_16(&preamble[4]);
+ chunk_size = _X_BE_16(&preamble[4]);
/* get next 3 header bytes */
if (this->input->read(this->input, preamble, 3) != 3) {
@@ -234,8 +234,8 @@ static int demux_pva_send_chunk(demux_plugin_t *this_gen) {
}
pts = (int64_t)(preamble[0] & 0x0e) << 29 ;
- pts |= (BE_16(&preamble[1]) & 0xFFFE) << 14;
- pts |= (BE_16(&preamble[3]) & 0xFFFE) >> 1;
+ pts |= (_X_BE_16(&preamble[1]) & 0xFFFE) << 14;
+ pts |= (_X_BE_16(&preamble[3]) & 0xFFFE) >> 1;
header_len -= 5 ;
diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c
index 0624dc673..dffcfac55 100644
--- a/src/demuxers/demux_qt.c
+++ b/src/demuxers/demux_qt.c
@@ -110,6 +110,8 @@ typedef unsigned int qt_atom;
#define UDTA_ATOM QT_ATOM('u', 'd', 't', 'a')
#define META_ATOM QT_ATOM('m', 'e', 't', 'a')
+#define HDLR_ATOM QT_ATOM('h', 'd', 'l', 'r')
+#define ILST_ATOM QT_ATOM('i', 'l', 's', 't')
#define NAM_ATOM QT_ATOM(0xA9, 'n', 'a', 'm')
#define CPY_ATOM QT_ATOM(0xA9, 'c', 'p', 'y')
#define DES_ATOM QT_ATOM(0xA9, 'd', 'e', 's')
@@ -121,6 +123,7 @@ typedef unsigned int qt_atom;
#define WRT_ATOM QT_ATOM(0xA9, 'w', 'r', 't')
#define DAY_ATOM QT_ATOM(0xA9, 'd', 'a', 'y')
+#define RMRA_ATOM QT_ATOM('r', 'm', 'r', 'a')
#define RMDA_ATOM QT_ATOM('r', 'm', 'd', 'a')
#define RDRF_ATOM QT_ATOM('r', 'd', 'r', 'f')
#define RMDR_ATOM QT_ATOM('r', 'm', 'd', 'r')
@@ -135,8 +138,10 @@ typedef unsigned int qt_atom;
#define MAX_PTS_DIFF 100000
-/* network bandwidth, cribbed from src/input/input_mms.c */
-const int64_t bandwidths[]={14400,19200,28800,33600,34430,57600,
+/**
+ * @brief Network bandwidth, cribbed from src/input/input_mms.c
+ */
+static const int64_t bandwidths[]={14400,19200,28800,33600,34430,57600,
115200,262200,393216,524300,1544000,10485800};
/* these are things that can go wrong */
@@ -403,6 +408,10 @@ typedef struct {
* demuxer is sending off to the audio decoder */
#define DEBUG_AUDIO_DEMUX 0
+/* define DEBUG_META_LOAD as 1 to see details about the metadata chunks the
+ * demuxer is reading from the file */
+#define DEBUG_META_LOAD 0
+
/* Define DEBUG_DUMP_MOOV as 1 to dump the raw moov atom to disk. This is
* particularly useful in debugging a file with a compressed moov (cmov)
* atom. The atom will be dumped to the filename specified as
@@ -410,10 +419,6 @@ typedef struct {
#define DEBUG_DUMP_MOOV 0
#define RAW_MOOV_FILENAME "moovatom.raw"
-#ifndef __GNUC__
-#define __attribute__(x)
-#endif
-
#if DEBUG_ATOM_LOAD
#define debug_atom_load printf
#else
@@ -444,6 +449,12 @@ static inline void XINE_FORMAT_PRINTF(1, 2) debug_video_demux(const char *format
static inline void XINE_FORMAT_PRINTF(1, 2) debug_audio_demux(const char *format, ...) {}
#endif
+#if DEBUG_META_LOAD
+#define debug_meta_load printf
+#else
+static inline void XINE_FORMAT_PRINTF(1, 2) debug_meta_load(const char *format, ...) {}
+#endif
+
static inline void dump_moov_atom(unsigned char *moov_atom, int moov_atom_size) {
#if DEBUG_DUMP_MOOV
@@ -500,8 +511,8 @@ static void find_moov_atom(input_plugin_t *input, off_t *moov_offset,
ATOM_PREAMBLE_SIZE)
break;
- atom_size = BE_32(&atom_preamble[0]);
- atom = BE_32(&atom_preamble[4]);
+ atom_size = _X_BE_32(&atom_preamble[0]);
+ atom = _X_BE_32(&atom_preamble[4]);
/* Special case alert: 'free' atoms sometimes masquerade as 'moov'
* atoms. If this is a free atom, check for 'cmov' or 'mvhd' immediately
@@ -515,8 +526,8 @@ static void find_moov_atom(input_plugin_t *input, off_t *moov_offset,
/* if there is a cmov, qualify this free atom as the 'moov' atom
* if no actual 'moov' atom is found. */
- if ((BE_32(&atom_preamble[4]) == CMOV_ATOM) ||
- (BE_32(&atom_preamble[4]) == MVHD_ATOM)) {
+ if ((_X_BE_32(&atom_preamble[4]) == CMOV_ATOM) ||
+ (_X_BE_32(&atom_preamble[4]) == MVHD_ATOM)) {
/* pos = current pos minus 2 atom preambles */
free_moov_offset = input->get_current_pos(input) - ATOM_PREAMBLE_SIZE * 2;
free_moov_size = atom_size;
@@ -560,9 +571,9 @@ static void find_moov_atom(input_plugin_t *input, off_t *moov_offset,
ATOM_PREAMBLE_SIZE)
break;
- atom_size = BE_32(&atom_preamble[0]);
+ atom_size = _X_BE_32(&atom_preamble[0]);
atom_size <<= 32;
- atom_size |= BE_32(&atom_preamble[4]);
+ atom_size |= _X_BE_32(&atom_preamble[4]);
atom_size -= ATOM_PREAMBLE_SIZE * 2;
} else
atom_size -= ATOM_PREAMBLE_SIZE;
@@ -687,20 +698,20 @@ static int is_qt_file(input_plugin_t *qt_file) {
if ((qt_file->get_capabilities(qt_file) & INPUT_CAP_SEEKABLE) == 0) {
memset (&preview, 0, MAX_PREVIEW_SIZE);
len = qt_file->get_optional_data(qt_file, preview, INPUT_OPTIONAL_DATA_PREVIEW);
- if (BE_32(&preview[4]) == MOOV_ATOM)
+ if (_X_BE_32(&preview[4]) == MOOV_ATOM)
return 1;
else {
- if (BE_32(&preview[4]) == FTYP_ATOM) {
+ if (_X_BE_32(&preview[4]) == FTYP_ATOM) {
/* show some lenience if the first atom is 'ftyp'; the second atom
* could be 'moov' */
- moov_atom_size = BE_32(&preview[0]);
+ moov_atom_size = _X_BE_32(&preview[0]);
/* compute the size of the current atom plus the preamble of the
* next atom; if the size is within the range on the preview buffer
* then the next atom's preamble is in the preview buffer */
i = moov_atom_size + ATOM_PREAMBLE_SIZE;
if (i >= MAX_PREVIEW_SIZE)
return 0;
- if (BE_32(&preview[i - 4]) == MOOV_ATOM)
+ if (_X_BE_32(&preview[i - 4]) == MOOV_ATOM)
return 1;
else
return 0;
@@ -728,52 +739,114 @@ static int is_qt_file(input_plugin_t *qt_file) {
}
}
+static char *parse_data_atom(unsigned char *data_atom) {
+ const uint32_t data_atom_size = _X_BE_32(&data_atom[0]);
+
+ static const int data_atom_max_version = 0;
+ const int data_atom_version = data_atom[8];
+
+ const size_t alloc_size = data_atom_size - 8 + 1;
+ char *alloc_str = NULL;
+
+ if ( data_atom_version > data_atom_max_version ) {
+ debug_meta_load("demux_qt: version %d for data atom is higher than the highest supported version (%d)\n",
+ data_atom_version, data_atom_max_version);
+ return NULL;
+ }
+
+ alloc_str = xine_xmalloc(alloc_size);
+ xine_fast_memcpy(alloc_str, &data_atom[16], alloc_size-1);
+ alloc_str[alloc_size-1] = '\0';
+
+ debug_meta_load("demux_qt: got a string of size %zd (%s)\n", alloc_size, alloc_str);
+
+ return alloc_str;
+}
+
/* parse out a meta data atom */
static void parse_meta_atom(qt_info *info, unsigned char *meta_atom) {
- int i;
- unsigned int meta_atom_size = BE_32(&meta_atom[0]);
- qt_atom current_atom;
- int string_size;
-
- for (i = 0; i < meta_atom_size - 4; i++) {
- current_atom = BE_32(&meta_atom[i]);
-
- if (current_atom == ART_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->artist = xine_xmalloc(string_size);
- strncpy(info->artist, &meta_atom[i + 20], string_size - 1);
- info->artist[string_size - 1] = 0;
- } else if (current_atom == NAM_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->name = xine_xmalloc(string_size);
- strncpy(info->name, &meta_atom[i + 20], string_size - 1);
- info->name[string_size - 1] = 0;
- } else if (current_atom == ALB_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->album = xine_xmalloc(string_size);
- strncpy(info->album, &meta_atom[i + 20], string_size - 1);
- info->album[string_size - 1] = 0;
- } else if (current_atom == GEN_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->genre = xine_xmalloc(string_size);
- strncpy(info->genre, &meta_atom[i + 20], string_size - 1);
- info->genre[string_size - 1] = 0;
- } else if (current_atom == TOO_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->comment = xine_xmalloc(string_size);
- strncpy(info->comment, &meta_atom[i + 20], string_size - 1);
- info->comment[string_size - 1] = 0;
- } else if (current_atom == WRT_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->composer = xine_xmalloc(string_size);
- strncpy(info->composer, &meta_atom[i + 20], string_size - 1);
- info->composer[string_size - 1] = 0;
- } else if (current_atom == DAY_ATOM) {
- string_size = BE_32(&meta_atom[i + 4]) - 16 + 1;
- info->year = xine_xmalloc(string_size);
- strncpy(info->year, &meta_atom[i + 20], string_size - 1);
- info->year[string_size - 1] = 0;
+ static const uint32_t meta_atom_preamble_size = 12;
+
+ const uint32_t meta_atom_size = _X_BE_32(&meta_atom[0]);
+
+ static const int meta_atom_max_version = 0;
+ const int meta_atom_version = meta_atom[8];
+ /* const uint32_t flags = _X_BE_24(&meta_atom[9]); */
+
+ uint32_t i = meta_atom_preamble_size;
+
+ if ( meta_atom_version > meta_atom_max_version ) {
+ debug_meta_load("demux_qt: version %d for meta atom is higher than the highest supported version (%d)\n",
+ meta_atom_version, meta_atom_max_version);
+ return;
+ }
+
+ while ( i < meta_atom_size ) {
+ const uint8_t *const current_atom = &meta_atom[i];
+ const qt_atom current_atom_code = _X_BE_32(&current_atom[4]);
+ const uint32_t current_atom_size = _X_BE_32(&current_atom[0]);
+ uint32_t handler_type = 0;
+
+ switch (current_atom_code) {
+ case HDLR_ATOM: {
+ static const int hdlr_atom_max_version = 0;
+ const int hdlr_atom_version = current_atom[8];
+
+ /* const uint32_t hdlr_atom_flags = _X_BE_24(&current_atom[9]); */
+
+ if ( hdlr_atom_version > hdlr_atom_max_version ) {
+ debug_meta_load("demux_qt: version %d for hdlr atom is higher than the highest supported version (%d)\n",
+ hdlr_atom_version, hdlr_atom_max_version);
+ return;
+ }
+
+ handler_type = _X_BE_32(&current_atom[12]);
}
+ break;
+
+ case ILST_ATOM: {
+ uint32_t j = i + 8;
+ while ( j < current_atom_size ) {
+ const uint8_t *const sub_atom = &meta_atom[j];
+ const qt_atom sub_atom_code = _X_BE_32(&sub_atom[4]);
+ const uint32_t sub_atom_size = _X_BE_32(&sub_atom[0]);
+
+ switch(sub_atom_code) {
+ case ART_ATOM:
+ info->artist = parse_data_atom(&sub_atom[8]);
+ break;
+ case NAM_ATOM:
+ info->name = parse_data_atom(&sub_atom[8]);
+ break;
+ case ALB_ATOM:
+ info->album = parse_data_atom(&sub_atom[8]);
+ break;
+ case GEN_ATOM:
+ info->genre = parse_data_atom(&sub_atom[8]);
+ break;
+ case CMT_ATOM:
+ info->comment = parse_data_atom(&sub_atom[8]);
+ break;
+ case WRT_ATOM:
+ info->composer = parse_data_atom(&sub_atom[8]);
+ break;
+ case DAY_ATOM:
+ info->year = parse_data_atom(&sub_atom[8]);
+ break;
+ default:
+ debug_meta_load("unknown atom %08x in ilst\n", sub_atom_code);
+ }
+
+ j += sub_atom_size;
+ }
+ }
+ break;
+
+ default:
+ debug_meta_load("unknown atom %08x in meta\n", current_atom_code);
+ }
+
+ i += current_atom_size;
}
}
@@ -781,10 +854,10 @@ static void parse_meta_atom(qt_info *info, unsigned char *meta_atom) {
/* fetch interesting information from the movie header atom */
static void parse_mvhd_atom(qt_info *info, unsigned char *mvhd_atom) {
- info->creation_time = BE_32(&mvhd_atom[0x0C]);
- info->modification_time = BE_32(&mvhd_atom[0x10]);
- info->timescale = BE_32(&mvhd_atom[0x14]);
- info->duration = BE_32(&mvhd_atom[0x18]);
+ info->creation_time = _X_BE_32(&mvhd_atom[0x0C]);
+ info->modification_time = _X_BE_32(&mvhd_atom[0x10]);
+ info->timescale = _X_BE_32(&mvhd_atom[0x14]);
+ info->duration = _X_BE_32(&mvhd_atom[0x18]);
debug_atom_load(" qt: timescale = %d, duration = %d (%d seconds)\n",
info->timescale, info->duration,
@@ -815,25 +888,11 @@ static qt_error parse_trak_atom (qt_trak *trak,
unsigned char *trak_atom) {
int i, j, k;
- unsigned int trak_atom_size = BE_32(&trak_atom[0]);
- qt_atom current_atom;
- unsigned int current_atom_size;
+ const unsigned int trak_atom_size = _X_BE_32(&trak_atom[0]);
unsigned int atom_pos;
unsigned int properties_offset;
- unsigned int current_stsd_atom_size;
qt_error last_error = QT_OK;
- /* for palette traversal */
- int color_depth;
- int color_flag;
- int color_start;
- int color_count;
- int color_end;
- int color_index;
- int color_dec;
- int color_greyscale;
- const unsigned char *color_table;
-
/* initialize trak structure */
trak->edit_list_count = 0;
trak->edit_list_table = NULL;
@@ -864,12 +923,13 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* search for media type atoms */
for (i = ATOM_PREAMBLE_SIZE; i < trak_atom_size - 4; i++) {
- current_atom = BE_32(&trak_atom[i]);
+ const qt_atom current_atom = _X_BE_32(&trak_atom[i]);
- if (current_atom == VMHD_ATOM) {
+ switch (current_atom) {
+ case VMHD_ATOM:
trak->type = MEDIA_VIDEO;
break;
- } else if (current_atom == SMHD_ATOM) {
+ case SMHD_ATOM:
trak->type = MEDIA_AUDIO;
break;
}
@@ -881,20 +941,22 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* search for the useful atoms */
for (i = ATOM_PREAMBLE_SIZE; i < trak_atom_size - 4; i++) {
- current_atom_size = BE_32(&trak_atom[i - 4]);
- current_atom = BE_32(&trak_atom[i]);
+ const current_atom_size = _X_BE_32(&trak_atom[i - 4]);
+ const current_atom = _X_BE_32(&trak_atom[i]);
- if (current_atom == TKHD_ATOM) {
- trak->flags = BE_16(&trak_atom[i + 6]);
- } else if (current_atom == ELST_ATOM) {
+ switch(current_atom) {
+ case TKHD_ATOM:
+ trak->flags = _X_BE_16(&trak_atom[i + 6]);
+ break;
+ case ELST_ATOM:
/* there should only be one edit list table */
if (trak->edit_list_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->edit_list_count = BE_32(&trak_atom[i + 8]);
+ trak->edit_list_count = _X_BE_32(&trak_atom[i + 8]);
debug_atom_load(" qt elst atom (edit list atom): %d entries\n",
trak->edit_list_count);
@@ -909,44 +971,56 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the edit list table */
for (j = 0; j < trak->edit_list_count; j++) {
trak->edit_list_table[j].track_duration =
- BE_32(&trak_atom[i + 12 + j * 12 + 0]);
+ _X_BE_32(&trak_atom[i + 12 + j * 12 + 0]);
trak->edit_list_table[j].media_time =
- BE_32(&trak_atom[i + 12 + j * 12 + 4]);
+ _X_BE_32(&trak_atom[i + 12 + j * 12 + 4]);
debug_atom_load(" %d: track duration = %d, media time = %d\n",
j,
trak->edit_list_table[j].track_duration,
trak->edit_list_table[j].media_time);
}
+ break;
- } else if (current_atom == MDHD_ATOM) {
- int version;
+ case MDHD_ATOM:
debug_atom_load ("demux_qt: mdhd atom\n");
-
- version = trak_atom[i+4];
- if ( version > 1 ) continue; /* unsupported, undocumented */
+ {
+ const int version = trak_atom[i+4];
+ if ( version > 1 ) continue; /* unsupported, undocumented */
- trak->timescale = BE_32(&trak_atom[i + (version == 0 ? 0x10 : 0x18) ]);
- } else if (current_atom == STSD_ATOM) {
+ trak->timescale = _X_BE_32(&trak_atom[i + (version == 0 ? 0x10 : 0x18) ]);
+ }
+ break;
+ case STSD_ATOM:
debug_atom_load ("demux_qt: stsd atom\n");
#if DEBUG_ATOM_LOAD
xine_hexdump (&trak_atom[i], current_atom_size);
#endif
/* allocate space for each of the properties unions */
- trak->stsd_atoms_count = BE_32(&trak_atom[i + 8]);
- trak->stsd_atoms = xine_xmalloc(trak->stsd_atoms_count * sizeof(properties_t));
+ trak->stsd_atoms_count = _X_BE_32(&trak_atom[i + 8]);
+ trak->stsd_atoms = xine_xcalloc(trak->stsd_atoms_count, sizeof(properties_t));
if (!trak->stsd_atoms) {
last_error = QT_NO_MEMORY;
goto free_trak;
}
- memset(trak->stsd_atoms, 0, trak->stsd_atoms_count * sizeof(properties_t));
atom_pos = i + 0x10;
properties_offset = 0x0C;
for (k = 0; k < trak->stsd_atoms_count; k++) {
- current_stsd_atom_size = BE_32(&trak_atom[atom_pos - 4]);
+ const uint32_t current_stsd_atom_size = _X_BE_32(&trak_atom[atom_pos - 4]);
+
+ /* for palette traversal */
+ int color_depth;
+ int color_flag;
+ int color_start;
+ int color_count;
+ int color_end;
+ int color_index;
+ int color_dec;
+ int color_greyscale;
+ const unsigned char *color_table;
if (trak->type == MEDIA_VIDEO) {
@@ -969,15 +1043,15 @@ static qt_error parse_trak_atom (qt_trak *trak,
trak->stsd_atoms[k].video.palette_count = 0;
/* fetch video parameters */
- if( BE_16(&trak_atom[atom_pos + 0x1C]) &&
- BE_16(&trak_atom[atom_pos + 0x1E]) ) {
+ if( _X_BE_16(&trak_atom[atom_pos + 0x1C]) &&
+ _X_BE_16(&trak_atom[atom_pos + 0x1E]) ) {
trak->stsd_atoms[k].video.width =
- BE_16(&trak_atom[atom_pos + 0x1C]);
+ _X_BE_16(&trak_atom[atom_pos + 0x1C]);
trak->stsd_atoms[k].video.height =
- BE_16(&trak_atom[atom_pos + 0x1E]);
+ _X_BE_16(&trak_atom[atom_pos + 0x1E]);
}
trak->stsd_atoms[k].video.codec_fourcc =
- ME_32(&trak_atom[atom_pos + 0x00]);
+ _X_ME_32(&trak_atom[atom_pos + 0x00]);
/* figure out the palette situation */
color_depth = trak_atom[atom_pos + 0x4F];
@@ -988,7 +1062,7 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* if the depth is 2, 4, or 8 bpp, file is palettized */
if ((color_depth == 2) || (color_depth == 4) || (color_depth == 8)) {
- color_flag = BE_16(&trak_atom[atom_pos + 0x50]);
+ color_flag = _X_BE_16(&trak_atom[atom_pos + 0x50]);
if (color_greyscale) {
@@ -1040,15 +1114,15 @@ static qt_error parse_trak_atom (qt_trak *trak,
} else {
/* load the palette from the file */
- color_start = BE_32(&trak_atom[atom_pos + 0x52]);
- color_count = BE_16(&trak_atom[atom_pos + 0x56]);
- color_end = BE_16(&trak_atom[atom_pos + 0x58]);
+ color_start = _X_BE_32(&trak_atom[atom_pos + 0x52]);
+ color_count = _X_BE_16(&trak_atom[atom_pos + 0x56]);
+ color_end = _X_BE_16(&trak_atom[atom_pos + 0x58]);
trak->stsd_atoms[k].video.palette_count =
color_end + 1;
for (j = color_start; j <= color_end; j++) {
- color_index = BE_16(&trak_atom[atom_pos + 0x5A + j * 8]);
+ color_index = _X_BE_16(&trak_atom[atom_pos + 0x5A + j * 8]);
if (color_count & 0x8000)
color_index = j;
if (color_index <
@@ -1101,9 +1175,9 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* fetch audio parameters */
trak->stsd_atoms[k].audio.codec_fourcc =
- ME_32(&trak_atom[atom_pos + 0x0]);
+ _X_ME_32(&trak_atom[atom_pos + 0x0]);
trak->stsd_atoms[k].audio.sample_rate =
- BE_16(&trak_atom[atom_pos + 0x1C]);
+ _X_BE_16(&trak_atom[atom_pos + 0x1C]);
trak->stsd_atoms[k].audio.channels = trak_atom[atom_pos + 0x15];
trak->stsd_atoms[k].audio.bits = trak_atom[atom_pos + 0x17];
@@ -1175,18 +1249,18 @@ static qt_error parse_trak_atom (qt_trak *trak,
(trak->stsd_atoms[k].audio.codec_fourcc != SOWT_FOURCC) &&
(trak->stsd_atoms[k].audio.codec_fourcc != RAW_FOURCC)) {
- if (BE_32(&trak_atom[atom_pos + 0x20]))
+ if (_X_BE_32(&trak_atom[atom_pos + 0x20]))
trak->stsd_atoms[k].audio.samples_per_packet =
- BE_32(&trak_atom[atom_pos + 0x20]);
- if (BE_32(&trak_atom[atom_pos + 0x24]))
+ _X_BE_32(&trak_atom[atom_pos + 0x20]);
+ if (_X_BE_32(&trak_atom[atom_pos + 0x24]))
trak->stsd_atoms[k].audio.bytes_per_packet =
- BE_32(&trak_atom[atom_pos + 0x24]);
- if (BE_32(&trak_atom[atom_pos + 0x28]))
+ _X_BE_32(&trak_atom[atom_pos + 0x24]);
+ if (_X_BE_32(&trak_atom[atom_pos + 0x28]))
trak->stsd_atoms[k].audio.bytes_per_frame =
- BE_32(&trak_atom[atom_pos + 0x28]);
- if (BE_32(&trak_atom[atom_pos + 0x2C]))
+ _X_BE_32(&trak_atom[atom_pos + 0x28]);
+ if (_X_BE_32(&trak_atom[atom_pos + 0x2C]))
trak->stsd_atoms[k].audio.bytes_per_sample =
- BE_32(&trak_atom[atom_pos + 0x2C]);
+ _X_BE_32(&trak_atom[atom_pos + 0x2C]);
trak->stsd_atoms[k].audio.samples_per_frame =
(trak->stsd_atoms[k].audio.bytes_per_frame /
trak->stsd_atoms[k].audio.bytes_per_packet) *
@@ -1194,7 +1268,7 @@ static qt_error parse_trak_atom (qt_trak *trak,
}
/* see if the trak deserves a promotion to VBR */
- if (BE_16(&trak_atom[atom_pos + 0x18]) == 0xFFFE)
+ if (_X_BE_16(&trak_atom[atom_pos + 0x18]) == 0xFFFE)
trak->stsd_atoms[k].audio.vbr = 1;
else
trak->stsd_atoms[k].audio.vbr = 0;
@@ -1224,10 +1298,10 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* check for a MS-style WAVE format header */
if ((current_atom_size >= 0x4C) &&
- (BE_32(&trak_atom[atom_pos + 0x34]) == WAVE_ATOM) &&
- (BE_32(&trak_atom[atom_pos + 0x3C]) == FRMA_ATOM) &&
- (ME_32(&trak_atom[atom_pos + 0x48]) == trak->stsd_atoms[k].audio.codec_fourcc)) {
- int wave_size = BE_32(&trak_atom[atom_pos + 0x44]) - 8;
+ (_X_BE_32(&trak_atom[atom_pos + 0x34]) == WAVE_ATOM) &&
+ (_X_BE_32(&trak_atom[atom_pos + 0x3C]) == FRMA_ATOM) &&
+ (_X_ME_32(&trak_atom[atom_pos + 0x48]) == trak->stsd_atoms[k].audio.codec_fourcc)) {
+ const int wave_size = _X_BE_32(&trak_atom[atom_pos + 0x44]) - 8;
if ((wave_size >= sizeof(xine_waveformatex)) &&
(current_atom_size >= (0x4C + wave_size))) {
@@ -1277,15 +1351,15 @@ static qt_error parse_trak_atom (qt_trak *trak,
atom_pos += current_stsd_atom_size;
properties_offset += current_stsd_atom_size;
}
-
- } else if (current_atom == ESDS_ATOM) {
-
- uint32_t len;
+ break;
+
+ case ESDS_ATOM:
debug_atom_load(" qt/mpeg-4 esds atom\n");
if ((trak->type == MEDIA_VIDEO) ||
(trak->type == MEDIA_AUDIO)) {
+ uint32_t len;
j = i + 8;
if( trak_atom[j++] == 0x03 ) {
@@ -1308,25 +1382,25 @@ static qt_error parse_trak_atom (qt_trak *trak,
}
}
}
+ break;
- } else if (current_atom == AVCC_ATOM) {
-
+ case AVCC_ATOM:
debug_atom_load(" avcC atom\n");
trak->decoder_config_len = current_atom_size - 8;
trak->decoder_config = realloc(trak->decoder_config, trak->decoder_config_len);
memcpy(trak->decoder_config, &trak_atom[i + 4], trak->decoder_config_len);
+ break;
- } else if (current_atom == STSZ_ATOM) {
-
+ case STSZ_ATOM:
/* there should only be one of these atoms */
if (trak->sample_size_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->sample_size = BE_32(&trak_atom[i + 8]);
- trak->sample_size_count = BE_32(&trak_atom[i + 12]);
+ trak->sample_size = _X_BE_32(&trak_atom[i + 8]);
+ trak->sample_size_count = _X_BE_32(&trak_atom[i + 12]);
debug_atom_load(" qt stsz atom (sample size atom): sample size = %d, %d entries\n",
trak->sample_size, trak->sample_size_count);
@@ -1342,7 +1416,7 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the sample size table */
for (j = 0; j < trak->sample_size_count; j++) {
trak->sample_size_table[j] =
- BE_32(&trak_atom[i + 16 + j * 4]);
+ _X_BE_32(&trak_atom[i + 16 + j * 4]);
debug_atom_load(" sample size %d: %d\n",
j, trak->sample_size_table[j]);
}
@@ -1350,16 +1424,16 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* set the pointer to non-NULL to indicate that the atom type has
* already been seen for this trak atom */
trak->sample_size_table = (void *)-1;
+ break;
- } else if (current_atom == STSS_ATOM) {
-
+ case STSS_ATOM:
/* there should only be one of these atoms */
if (trak->sync_sample_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->sync_sample_count = BE_32(&trak_atom[i + 8]);
+ trak->sync_sample_count = _X_BE_32(&trak_atom[i + 8]);
debug_atom_load(" qt stss atom (sample sync atom): %d sync samples\n",
trak->sync_sample_count);
@@ -1374,21 +1448,21 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the sync sample table */
for (j = 0; j < trak->sync_sample_count; j++) {
trak->sync_sample_table[j] =
- BE_32(&trak_atom[i + 12 + j * 4]);
+ _X_BE_32(&trak_atom[i + 12 + j * 4]);
debug_atom_load(" sync sample %d: sample %d (%d) is a keyframe\n",
j, trak->sync_sample_table[j],
trak->sync_sample_table[j] - 1);
}
+ break;
- } else if (current_atom == STCO_ATOM) {
-
+ case STCO_ATOM:
/* there should only be one of either stco or co64 */
if (trak->chunk_offset_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->chunk_offset_count = BE_32(&trak_atom[i + 8]);
+ trak->chunk_offset_count = _X_BE_32(&trak_atom[i + 8]);
debug_atom_load(" qt stco atom (32-bit chunk offset atom): %d chunk offsets\n",
trak->chunk_offset_count);
@@ -1403,20 +1477,20 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the chunk offset table */
for (j = 0; j < trak->chunk_offset_count; j++) {
trak->chunk_offset_table[j] =
- BE_32(&trak_atom[i + 12 + j * 4]);
+ _X_BE_32(&trak_atom[i + 12 + j * 4]);
debug_atom_load(" chunk %d @ 0x%"PRIX64"\n",
j, trak->chunk_offset_table[j]);
}
+ break;
- } else if (current_atom == CO64_ATOM) {
-
+ case CO64_ATOM:
/* there should only be one of either stco or co64 */
if (trak->chunk_offset_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->chunk_offset_count = BE_32(&trak_atom[i + 8]);
+ trak->chunk_offset_count = _X_BE_32(&trak_atom[i + 8]);
debug_atom_load(" qt co64 atom (64-bit chunk offset atom): %d chunk offsets\n",
trak->chunk_offset_count);
@@ -1431,23 +1505,23 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the 64-bit chunk offset table */
for (j = 0; j < trak->chunk_offset_count; j++) {
trak->chunk_offset_table[j] =
- BE_32(&trak_atom[i + 12 + j * 8 + 0]);
+ _X_BE_32(&trak_atom[i + 12 + j * 8 + 0]);
trak->chunk_offset_table[j] <<= 32;
trak->chunk_offset_table[j] |=
- BE_32(&trak_atom[i + 12 + j * 8 + 4]);
+ _X_BE_32(&trak_atom[i + 12 + j * 8 + 4]);
debug_atom_load(" chunk %d @ 0x%"PRIX64"\n",
j, trak->chunk_offset_table[j]);
}
+ break;
- } else if (current_atom == STSC_ATOM) {
-
+ case STSC_ATOM:
/* there should only be one of these atoms */
if (trak->sample_to_chunk_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->sample_to_chunk_count = BE_32(&trak_atom[i + 8]);
+ trak->sample_to_chunk_count = _X_BE_32(&trak_atom[i + 8]);
debug_atom_load(" qt stsc atom (sample-to-chunk atom): %d entries\n",
trak->sample_to_chunk_count);
@@ -1462,27 +1536,27 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the sample to chunk table */
for (j = 0; j < trak->sample_to_chunk_count; j++) {
trak->sample_to_chunk_table[j].first_chunk =
- BE_32(&trak_atom[i + 12 + j * 12 + 0]);
+ _X_BE_32(&trak_atom[i + 12 + j * 12 + 0]);
trak->sample_to_chunk_table[j].samples_per_chunk =
- BE_32(&trak_atom[i + 12 + j * 12 + 4]);
+ _X_BE_32(&trak_atom[i + 12 + j * 12 + 4]);
trak->sample_to_chunk_table[j].media_id =
- BE_32(&trak_atom[i + 12 + j * 12 + 8]);
+ _X_BE_32(&trak_atom[i + 12 + j * 12 + 8]);
debug_atom_load(" %d: %d samples/chunk starting at chunk %d (%d) for media id %d\n",
j, trak->sample_to_chunk_table[j].samples_per_chunk,
trak->sample_to_chunk_table[j].first_chunk,
trak->sample_to_chunk_table[j].first_chunk - 1,
trak->sample_to_chunk_table[j].media_id);
}
+ break;
- } else if (current_atom == STTS_ATOM) {
-
+ case STTS_ATOM:
/* there should only be one of these atoms */
if (trak->time_to_sample_table) {
last_error = QT_HEADER_TROUBLE;
goto free_trak;
}
- trak->time_to_sample_count = BE_32(&trak_atom[i + 8]);
+ trak->time_to_sample_count = _X_BE_32(&trak_atom[i + 8]);
debug_atom_load(" qt stts atom (time-to-sample atom): %d entries\n",
trak->time_to_sample_count);
@@ -1497,9 +1571,9 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* load the time to sample table */
for (j = 0; j < trak->time_to_sample_count; j++) {
trak->time_to_sample_table[j].count =
- BE_32(&trak_atom[i + 12 + j * 8 + 0]);
+ _X_BE_32(&trak_atom[i + 12 + j * 8 + 0]);
trak->time_to_sample_table[j].duration =
- BE_32(&trak_atom[i + 12 + j * 8 + 4]);
+ _X_BE_32(&trak_atom[i + 12 + j * 8 + 4]);
debug_atom_load(" %d: count = %d, duration = %d\n",
j, trak->time_to_sample_table[j].count,
trak->time_to_sample_table[j].duration);
@@ -1535,9 +1609,7 @@ static qt_error parse_reference_atom (reference_t *ref,
char *base_mrl) {
int i, j;
- unsigned int ref_atom_size = BE_32(&ref_atom[0]);
- qt_atom current_atom;
- unsigned int current_atom_size;
+ const unsigned int ref_atom_size = _X_BE_32(&ref_atom[0]);
/* initialize reference atom */
ref->url = NULL;
@@ -1546,59 +1618,59 @@ static qt_error parse_reference_atom (reference_t *ref,
/* traverse through the atom looking for the key atoms */
for (i = ATOM_PREAMBLE_SIZE; i < ref_atom_size - 4; i++) {
+ const uint32_t current_atom_size = _X_BE_32(&ref_atom[i - 4]);
+ const qt_atom current_atom = _X_BE_32(&ref_atom[i]);
- current_atom_size = BE_32(&ref_atom[i - 4]);
- current_atom = BE_32(&ref_atom[i]);
-
- if (current_atom == RDRF_ATOM) {
+ switch (current_atom) {
+ case RDRF_ATOM:
/* if the URL starts with "http://", copy it */
if (strncmp(&ref_atom[i + 16], "http://", 7) == 0
|| strncmp(&ref_atom[i + 16], "rtsp://", 7) == 0) {
/* URL is spec'd to terminate with a NULL; don't trust it */
- ref->url = xine_xmalloc(BE_32(&ref_atom[i + 12]) + 1);
- strncpy(ref->url, &ref_atom[i + 16], BE_32(&ref_atom[i + 12]));
- ref->url[BE_32(&ref_atom[i + 12]) - 1] = '\0';
+ ref->url = xine_xmalloc(_X_BE_32(&ref_atom[i + 12]) + 1);
+ strncpy(ref->url, &ref_atom[i + 16], _X_BE_32(&ref_atom[i + 12]));
+ ref->url[_X_BE_32(&ref_atom[i + 12]) - 1] = '\0';
} else {
int string_size;
if (base_mrl)
- string_size = strlen(base_mrl) + BE_32(&ref_atom[i + 12]) + 1;
+ string_size = strlen(base_mrl) + _X_BE_32(&ref_atom[i + 12]) + 1;
else
- string_size = BE_32(&ref_atom[i + 12]) + 1;
+ string_size = _X_BE_32(&ref_atom[i + 12]) + 1;
/* otherwise, append relative URL to base MRL */
ref->url = xine_xmalloc(string_size);
if (base_mrl)
strcpy(ref->url, base_mrl);
- strncat(ref->url, &ref_atom[i + 16], BE_32(&ref_atom[i + 12]));
+ strncat(ref->url, &ref_atom[i + 16], _X_BE_32(&ref_atom[i + 12]));
ref->url[string_size - 1] = '\0';
}
debug_atom_load(" qt rdrf URL reference:\n %s\n", ref->url);
+ break;
- } else if (current_atom == RMDR_ATOM) {
-
+ case RMDR_ATOM:
/* load the data rate */
- ref->data_rate = BE_32(&ref_atom[i + 8]);
+ ref->data_rate = _X_BE_32(&ref_atom[i + 8]);
ref->data_rate *= 10;
debug_atom_load(" qt rmdr data rate = %"PRId64"\n", ref->data_rate);
+ break;
- } else if (current_atom == RMVC_ATOM) {
-
+ case RMVC_ATOM:
debug_atom_load(" qt rmvc atom\n");
/* search the rmvc atom for 'qtim'; 2 bytes will follow the qtim
* chars so only search to 6 bytes to the end */
for (j = 4; j < current_atom_size - 6; j++) {
- if (BE_32(&ref_atom[i + j]) == QTIM_ATOM) {
+ if (_X_BE_32(&ref_atom[i + j]) == QTIM_ATOM) {
- ref->qtim_version = BE_16(&ref_atom[i + j + 4]);
+ ref->qtim_version = _X_BE_16(&ref_atom[i + j + 4]);
debug_atom_load(" qtim version = %04X\n", ref->qtim_version);
}
}
@@ -1916,31 +1988,32 @@ static qt_error build_frame_table(qt_trak *trak,
static void parse_moov_atom(qt_info *info, unsigned char *moov_atom,
int64_t bandwidth) {
int i, j;
- unsigned int moov_atom_size = BE_32(&moov_atom[0]);
- qt_atom current_atom;
+ unsigned int moov_atom_size = _X_BE_32(&moov_atom[0]);
int string_size, error;
unsigned int max_video_frames = 0;
unsigned int max_audio_frames = 0;
/* make sure this is actually a moov atom (will also accept 'free' as
* a special case) */
- if ((BE_32(&moov_atom[4]) != MOOV_ATOM) &&
- (BE_32(&moov_atom[4]) != FREE_ATOM)) {
+ if ((_X_BE_32(&moov_atom[4]) != MOOV_ATOM) &&
+ (_X_BE_32(&moov_atom[4]) != FREE_ATOM)) {
info->last_error = QT_NO_MOOV_ATOM;
return;
}
/* prowl through the moov atom looking for very specific targets */
- for (i = ATOM_PREAMBLE_SIZE + 4; i < moov_atom_size - 4; i += BE_32(&moov_atom[i - 4])) {
- current_atom = BE_32(&moov_atom[i]);
+ for (i = ATOM_PREAMBLE_SIZE + 4; i < moov_atom_size - 4; i += _X_BE_32(&moov_atom[i - 4])) {
+ const qt_atom current_atom = _X_BE_32(&moov_atom[i]);
- if (current_atom == MVHD_ATOM) {
+ switch (current_atom) {
+ case MVHD_ATOM:
parse_mvhd_atom(info, &moov_atom[i - 4]);
if (info->last_error != QT_OK)
return;
- } else if (current_atom == TRAK_ATOM) {
+ break;
+ case TRAK_ATOM:
/* create a new trak structure */
info->trak_count++;
info->traks = (qt_trak *)realloc(info->traks,
@@ -1952,43 +2025,50 @@ static void parse_moov_atom(qt_info *info, unsigned char *moov_atom,
info->trak_count--;
return;
}
+ break;
+
+ case UDTA_ATOM:
+ parse_meta_atom(info, &moov_atom[i + 4]);
+ if (info->last_error != QT_OK)
+ return;
+ break;
- } else if (current_atom == META_ATOM) {
-
+ case META_ATOM:
parse_meta_atom(info, &moov_atom[i - 4]);
if (info->last_error != QT_OK)
return;
+ break;
- } else if (current_atom == NAM_ATOM) {
-
- string_size = BE_16(&moov_atom[i + 4]) + 1;
+ case NAM_ATOM:
+ string_size = _X_BE_16(&moov_atom[i + 4]) + 1;
info->name = realloc (info->name, string_size);
strncpy(info->name, &moov_atom[i + 8], string_size - 1);
info->name[string_size - 1] = 0;
+ break;
- } else if (current_atom == CPY_ATOM) {
-
- string_size = BE_16(&moov_atom[i + 4]) + 1;
+ case CPY_ATOM:
+ string_size = _X_BE_16(&moov_atom[i + 4]) + 1;
info->copyright = realloc (info->copyright, string_size);
strncpy(info->copyright, &moov_atom[i + 8], string_size - 1);
info->copyright[string_size - 1] = 0;
+ break;
- } else if (current_atom == DES_ATOM) {
-
- string_size = BE_16(&moov_atom[i + 4]) + 1;
+ case DES_ATOM:
+ string_size = _X_BE_16(&moov_atom[i + 4]) + 1;
info->description = realloc (info->description, string_size);
strncpy(info->description, &moov_atom[i + 8], string_size - 1);
info->description[string_size - 1] = 0;
+ break;
- } else if (current_atom == CMT_ATOM) {
-
- string_size = BE_16(&moov_atom[i + 4]) + 1;
+ case CMT_ATOM:
+ string_size = _X_BE_16(&moov_atom[i + 4]) + 1;
info->comment = realloc (info->comment, string_size);
strncpy(info->comment, &moov_atom[i + 8], string_size - 1);
info->comment[string_size - 1] = 0;
+ break;
- } else if (current_atom == RMDA_ATOM) {
-
+ case RMDA_ATOM:
+ case RMRA_ATOM:
/* create a new reference structure */
info->reference_count++;
info->references = (reference_t *)realloc(info->references,
@@ -1996,8 +2076,9 @@ static void parse_moov_atom(qt_info *info, unsigned char *moov_atom,
parse_reference_atom(&info->references[info->reference_count - 1],
&moov_atom[i - 4], info->base_mrl);
+ break;
- } else {
+ default:
debug_atom_load(" qt: unknown atom into the moov atom (0x%08X)\n", current_atom);
}
}
@@ -2098,24 +2179,24 @@ static qt_error open_qt_file(qt_info *info, input_plugin_t *input,
else {
memset (&preview, 0, MAX_PREVIEW_SIZE);
input->get_optional_data(input, preview, INPUT_OPTIONAL_DATA_PREVIEW);
- if (BE_32(&preview[4]) != MOOV_ATOM) {
+ if (_X_BE_32(&preview[4]) != MOOV_ATOM) {
/* special case if there is an ftyp atom first */
- if (BE_32(&preview[4]) == FTYP_ATOM) {
- moov_atom_size = BE_32(&preview[0]);
+ if (_X_BE_32(&preview[4]) == FTYP_ATOM) {
+ moov_atom_size = _X_BE_32(&preview[0]);
if ((moov_atom_size + ATOM_PREAMBLE_SIZE >= MAX_PREVIEW_SIZE) ||
- (BE_32(&preview[moov_atom_size + 4]) != MOOV_ATOM)) {
+ (_X_BE_32(&preview[moov_atom_size + 4]) != MOOV_ATOM)) {
info->last_error = QT_NO_MOOV_ATOM;
return info->last_error;
}
moov_atom_offset = moov_atom_size;
- moov_atom_size = BE_32(&preview[moov_atom_offset]);
+ moov_atom_size = _X_BE_32(&preview[moov_atom_offset]);
} else {
info->last_error = QT_NO_MOOV_ATOM;
return info->last_error;
}
} else {
moov_atom_offset = 0;
- moov_atom_size = BE_32(&preview[0]);
+ moov_atom_size = _X_BE_32(&preview[0]);
}
}
@@ -2146,14 +2227,14 @@ static qt_error open_qt_file(qt_info *info, input_plugin_t *input,
}
/* check if moov is compressed */
- if (BE_32(&moov_atom[12]) == CMOV_ATOM) {
+ if (_X_BE_32(&moov_atom[12]) == CMOV_ATOM) {
info->compressed_header = 1;
z_state.next_in = &moov_atom[0x28];
z_state.avail_in = moov_atom_size - 0x28;
- z_state.avail_out = BE_32(&moov_atom[0x24]);
- unzip_buffer = (unsigned char *)malloc(BE_32(&moov_atom[0x24]));
+ z_state.avail_out = _X_BE_32(&moov_atom[0x24]);
+ unzip_buffer = (unsigned char *)malloc(_X_BE_32(&moov_atom[0x24]));
if (!unzip_buffer) {
free(moov_atom);
info->last_error = QT_NO_MEMORY;
@@ -2192,7 +2273,7 @@ static qt_error open_qt_file(qt_info *info, input_plugin_t *input,
/* replace the compressed moov atom with the decompressed atom */
free (moov_atom);
moov_atom = unzip_buffer;
- moov_atom_size = BE_32(&moov_atom[0]);
+ moov_atom_size = _X_BE_32(&moov_atom[0]);
}
if (!moov_atom) {
diff --git a/src/demuxers/demux_real.c b/src/demuxers/demux_real.c
index 11b0dbf38..b27b01a10 100644
--- a/src/demuxers/demux_real.c
+++ b/src/demuxers/demux_real.c
@@ -194,11 +194,11 @@ static void real_parse_index(demux_real_t *this) {
}
/* Check chunk is actually an index chunk */
- if(BE_32(&index_chunk_header[0]) == INDX_TAG) {
+ if(_X_BE_32(&index_chunk_header[0]) == INDX_TAG) {
unsigned short version;
/* Check version */
- version = BE_16(&index_chunk_header[8]);
+ version = _X_BE_16(&index_chunk_header[8]);
if(version != 0) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_real: unknown object version in INDX: 0x%04x\n", version);
@@ -206,9 +206,9 @@ static void real_parse_index(demux_real_t *this) {
}
/* Read data from header */
- entries = BE_32(&index_chunk_header[10]);
- stream_num = BE_16(&index_chunk_header[14]);
- next_index_chunk = BE_32(&index_chunk_header[16]);
+ entries = _X_BE_32(&index_chunk_header[10]);
+ stream_num = _X_BE_16(&index_chunk_header[14]);
+ next_index_chunk = _X_BE_32(&index_chunk_header[16]);
/* Find which stream this index is for */
index = NULL;
@@ -246,9 +246,9 @@ static void real_parse_index(demux_real_t *this) {
break;
}
- (*index)[i].timestamp = BE_32(&index_record[2]);
- (*index)[i].offset = BE_32(&index_record[6]);
- (*index)[i].packetno = BE_32(&index_record[10]);
+ (*index)[i].timestamp = _X_BE_32(&index_record[2]);
+ (*index)[i].offset = _X_BE_32(&index_record[6]);
+ (*index)[i].packetno = _X_BE_32(&index_record[10]);
}
} else {
lprintf("unused index chunk with %d entries for stream num %d\n",
@@ -267,14 +267,14 @@ static void real_parse_index(demux_real_t *this) {
static mdpr_t *real_parse_mdpr(const char *data) {
mdpr_t *mdpr=malloc(sizeof(mdpr_t));
- mdpr->stream_number=BE_16(&data[2]);
- mdpr->max_bit_rate=BE_32(&data[4]);
- mdpr->avg_bit_rate=BE_32(&data[8]);
- mdpr->max_packet_size=BE_32(&data[12]);
- mdpr->avg_packet_size=BE_32(&data[16]);
- mdpr->start_time=BE_32(&data[20]);
- mdpr->preroll=BE_32(&data[24]);
- mdpr->duration=BE_32(&data[28]);
+ mdpr->stream_number=_X_BE_16(&data[2]);
+ mdpr->max_bit_rate=_X_BE_32(&data[4]);
+ mdpr->avg_bit_rate=_X_BE_32(&data[8]);
+ mdpr->max_packet_size=_X_BE_32(&data[12]);
+ mdpr->avg_packet_size=_X_BE_32(&data[16]);
+ mdpr->start_time=_X_BE_32(&data[20]);
+ mdpr->preroll=_X_BE_32(&data[24]);
+ mdpr->duration=_X_BE_32(&data[28]);
mdpr->stream_name_size=data[32];
mdpr->stream_name=malloc(sizeof(char)*(mdpr->stream_name_size+1));
@@ -286,7 +286,7 @@ static mdpr_t *real_parse_mdpr(const char *data) {
memcpy(mdpr->mime_type, &data[34+mdpr->stream_name_size], mdpr->mime_type_size);
mdpr->mime_type[(int)mdpr->mime_type_size]=0;
- mdpr->type_specific_len=BE_32(&data[34+mdpr->stream_name_size+mdpr->mime_type_size]);
+ mdpr->type_specific_len=_X_BE_32(&data[34+mdpr->stream_name_size+mdpr->mime_type_size]);
mdpr->type_specific_data=malloc(sizeof(char)*(mdpr->type_specific_len));
memcpy(mdpr->type_specific_data,
&data[38+mdpr->stream_name_size+mdpr->mime_type_size], mdpr->type_specific_len);
@@ -345,14 +345,14 @@ static void real_parse_headers (demux_real_t *this) {
return;
}
- if (BE_32(signature) != RMF_TAG) {
+ if (_X_BE_32(signature) != RMF_TAG) {
this->status = DEMUX_FINISHED;
lprintf ("signature not found '%.4s'\n", signature);
return;
}
/* skip to the start of the first chunk and start traversing */
- chunk_size = BE_32(&signature[4]);
+ chunk_size = _X_BE_32(&signature[4]);
this->input->seek(this->input, chunk_size-8, SEEK_CUR);
/* iterate through chunks and gather information until the first DATA
@@ -364,8 +364,8 @@ static void real_parse_headers (demux_real_t *this) {
this->status = DEMUX_FINISHED;
return;
}
- chunk_type = BE_32(&preamble[0]);
- chunk_size = BE_32(&preamble[4]);
+ chunk_type = _X_BE_32(&preamble[0]);
+ chunk_size = _X_BE_32(&preamble[4]);
lprintf ("chunktype %.4s len %d\n", (char *) &chunk_type, chunk_size);
switch (chunk_type) {
@@ -383,7 +383,7 @@ static void real_parse_headers (demux_real_t *this) {
return;
}
- version = BE_16(&chunk_buffer[0]);
+ version = _X_BE_16(&chunk_buffer[0]);
if (chunk_type == PROP_TAG) {
@@ -395,10 +395,10 @@ static void real_parse_headers (demux_real_t *this) {
return;
}
- this->duration = BE_32(&chunk_buffer[22]);
- this->index_start = BE_32(&chunk_buffer[30]);
- this->data_start = BE_32(&chunk_buffer[34]);
- this->avg_bitrate = BE_32(&chunk_buffer[6]);
+ this->duration = _X_BE_32(&chunk_buffer[22]);
+ this->index_start = _X_BE_32(&chunk_buffer[30]);
+ this->data_start = _X_BE_32(&chunk_buffer[34]);
+ this->avg_bitrate = _X_BE_32(&chunk_buffer[6]);
lprintf("PROP: duration: %d ms\n", this->duration);
lprintf("PROP: index start: %"PRIX64"\n", this->index_start);
@@ -427,7 +427,7 @@ static void real_parse_headers (demux_real_t *this) {
lprintf ("parsing type specific data...\n");
- if(BE_32(mdpr->type_specific_data) == RA_TAG) {
+ if(_X_BE_32(mdpr->type_specific_data) == RA_TAG) {
int version, len;
if(this->num_audio_streams == MAX_AUDIO_STREAMS) {
@@ -436,7 +436,7 @@ static void real_parse_headers (demux_real_t *this) {
goto unknown;
}
- version = BE_16(mdpr->type_specific_data + 4);
+ version = _X_BE_16(mdpr->type_specific_data + 4);
lprintf("audio version %d detected\n", version);
@@ -444,14 +444,14 @@ static void real_parse_headers (demux_real_t *this) {
case 3:
/* Version 3 header stores fourcc after meta info - cheat by reading backwards from the
* end of the header instead of having to parse it all */
- fourcc = ME_32(mdpr->type_specific_data + mdpr->type_specific_len - 5);
+ fourcc = _X_ME_32(mdpr->type_specific_data + mdpr->type_specific_len - 5);
break;
case 4:
len = *(mdpr->type_specific_data + 56);
- fourcc = ME_32(mdpr->type_specific_data + 58 + len);
+ fourcc = _X_ME_32(mdpr->type_specific_data + 58 + len);
break;
case 5:
- fourcc = ME_32(mdpr->type_specific_data + 66);
+ fourcc = _X_ME_32(mdpr->type_specific_data + 66);
break;
default:
lprintf("unsupported audio header version %d\n", version);
@@ -467,7 +467,7 @@ static void real_parse_headers (demux_real_t *this) {
this->num_audio_streams++;
- } else if(BE_32(mdpr->type_specific_data + 4) == VIDO_TAG) {
+ } else if(_X_BE_32(mdpr->type_specific_data + 4) == VIDO_TAG) {
if(this->num_video_streams == MAX_VIDEO_STREAMS) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
@@ -476,12 +476,12 @@ static void real_parse_headers (demux_real_t *this) {
}
lprintf ("video detected\n");
- fourcc = ME_32(mdpr->type_specific_data + 8);
+ fourcc = _X_ME_32(mdpr->type_specific_data + 8);
lprintf("fourcc = %.4s\n", (char *) &fourcc);
this->video_streams[this->num_video_streams].fourcc = fourcc;
this->video_streams[this->num_video_streams].buf_type = _x_fourcc_to_buf_video(fourcc);
- this->video_streams[this->num_video_streams].format = BE_32(mdpr->type_specific_data + 30);
+ this->video_streams[this->num_video_streams].format = _X_BE_32(mdpr->type_specific_data + 30);
this->video_streams[this->num_video_streams].index = NULL;
this->video_streams[this->num_video_streams].mdpr = mdpr;
@@ -506,28 +506,28 @@ unknown:
stream_ptr = 2;
/* load the title string */
- field_size = BE_16(&chunk_buffer[stream_ptr]);
+ field_size = _X_BE_16(&chunk_buffer[stream_ptr]);
stream_ptr += 2;
_x_meta_info_n_set(this->stream, XINE_META_INFO_TITLE,
&chunk_buffer[stream_ptr], field_size);
stream_ptr += field_size;
/* load the author string */
- field_size = BE_16(&chunk_buffer[stream_ptr]);
+ field_size = _X_BE_16(&chunk_buffer[stream_ptr]);
stream_ptr += 2;
_x_meta_info_n_set(this->stream, XINE_META_INFO_ARTIST,
&chunk_buffer[stream_ptr], field_size);
stream_ptr += field_size;
/* load the copyright string as the year */
- field_size = BE_16(&chunk_buffer[stream_ptr]);
+ field_size = _X_BE_16(&chunk_buffer[stream_ptr]);
stream_ptr += 2;
_x_meta_info_n_set(this->stream, XINE_META_INFO_YEAR,
&chunk_buffer[stream_ptr], field_size);
stream_ptr += field_size;
/* load the comment string */
- field_size = BE_16(&chunk_buffer[stream_ptr]);
+ field_size = _X_BE_16(&chunk_buffer[stream_ptr]);
stream_ptr += 2;
_x_meta_info_n_set(this->stream, XINE_META_INFO_COMMENT,
&chunk_buffer[stream_ptr], field_size);
@@ -545,7 +545,7 @@ unknown:
}
/* check version */
- version = BE_16(&data_chunk_header[0]);
+ version = _X_BE_16(&data_chunk_header[0]);
if(version != 0) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_real: unknown object version in DATA: 0x%04x\n", version);
@@ -553,8 +553,8 @@ unknown:
return;
}
- this->current_data_chunk_packet_count = BE_32(&data_chunk_header[2]);
- this->next_data_chunk_offset = BE_32(&data_chunk_header[6]);
+ this->current_data_chunk_packet_count = _X_BE_32(&data_chunk_header[2]);
+ this->next_data_chunk_offset = _X_BE_32(&data_chunk_header[6]);
this->data_chunk_size = chunk_size;
break;
@@ -625,11 +625,11 @@ unknown:
int i, stream;
/* Check for end of the data chunk */
- if(((id = BE_32(&search_buffer[offset])) == DATA_TAG) ||
+ if(((id = _X_BE_32(&search_buffer[offset])) == DATA_TAG) ||
(id == INDX_TAG))
break;
- stream = BE_16(&search_buffer[offset + 4]);
+ stream = _X_BE_16(&search_buffer[offset + 4]);
for(i = 0; !this->video_stream && (i < this->num_video_streams); i++) {
if(stream == this->video_streams[i].mdpr->stream_number) {
@@ -645,7 +645,7 @@ unknown:
}
}
- offset += BE_16(&search_buffer[offset + 2]);
+ offset += _X_BE_16(&search_buffer[offset + 2]);
}
if(INPUT_IS_SEEKABLE(this->input))
@@ -692,7 +692,7 @@ unknown:
this->video_stream->mdpr->avg_bit_rate);
/* Allocate fragment offset table */
- this->fragment_tab = xine_xmalloc(FRAGMENT_TAB_SIZE*sizeof(uint32_t));
+ this->fragment_tab = xine_xcalloc(FRAGMENT_TAB_SIZE, sizeof(uint32_t));
this->fragment_tab_max = FRAGMENT_TAB_SIZE;
}
@@ -716,7 +716,7 @@ unknown:
* The second is the codec initialisation data found at the end of
* the type specific data for the audio stream */
if(buf->type == BUF_AUDIO_AAC) {
- int version = BE_16(mdpr->type_specific_data + 4);
+ int version = _X_BE_16(mdpr->type_specific_data + 4);
if(version != 5) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
@@ -725,9 +725,9 @@ unknown:
goto unsupported;
}
- buf->decoder_info[1] = BE_16(mdpr->type_specific_data + 54);
- buf->decoder_info[2] = BE_16(mdpr->type_specific_data + 58);
- buf->decoder_info[3] = BE_16(mdpr->type_specific_data + 60);
+ buf->decoder_info[1] = _X_BE_16(mdpr->type_specific_data + 54);
+ buf->decoder_info[2] = _X_BE_16(mdpr->type_specific_data + 58);
+ buf->decoder_info[3] = _X_BE_16(mdpr->type_specific_data + 60);
buf->decoder_flags |= BUF_FLAG_STDHEADER;
buf->content = NULL;
@@ -740,7 +740,7 @@ unknown:
buf->type = this->audio_stream->buf_type;
buf->decoder_flags = BUF_FLAG_HEADER|BUF_FLAG_FRAME_END|BUF_FLAG_SPECIAL;
buf->decoder_info[1] = BUF_SPECIAL_DECODER_CONFIG;
- buf->decoder_info[2] = BE_32(mdpr->type_specific_data + 74) - 1;
+ buf->decoder_info[2] = _X_BE_32(mdpr->type_specific_data + 74) - 1;
buf->decoder_info_ptr[2] = buf->content;
buf->size = 0;
@@ -952,7 +952,7 @@ static int stream_read_char (demux_real_t *this) {
static int stream_read_word (demux_real_t *this) {
uint16_t ret;
this->input->read (this->input, (char *) &ret, 2);
- return BE_16(&ret);
+ return _X_BE_16(&ret);
}
static int demux_real_send_chunk(demux_plugin_t *this_gen) {
@@ -981,7 +981,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
}
/* Check to see if we've gone past the end of the data chunk */
- if(((id = BE_32(&header[0])) == DATA_TAG) ||
+ if(((id = _X_BE_32(&header[0])) == DATA_TAG) ||
(id == INDX_TAG)) {
lprintf("finished reading data chunk\n");
this->status = DEMUX_FINISHED;
@@ -989,7 +989,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
}
/* check version */
- version = BE_16(&header[0]);
+ version = _X_BE_16(&header[0]);
if(version > 1) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_real: unknown object version in data packet: 0x%04x\n", version);
@@ -998,10 +998,10 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
}
/* read the packet information */
- stream = BE_16(&header[4]);
+ stream = _X_BE_16(&header[4]);
offset = this->input->get_current_pos(this->input);
- size = BE_16(&header[2]) - DATA_PACKET_HEADER_SIZE;
- timestamp= BE_32(&header[6]);
+ size = _X_BE_16(&header[2]) - DATA_PACKET_HEADER_SIZE;
+ timestamp= _X_BE_32(&header[6]);
pts = (int64_t) timestamp * 90;
/* Data packet header with version 1 contains 1 extra byte */
@@ -1282,7 +1282,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
frames = (stream_read_word(this) & 0xf0) >> 4;
/* 2 bytes per frame size */
- sizes = xine_xmalloc(frames*sizeof(int));
+ sizes = xine_xcalloc(frames, sizeof(int));
for(i = 0; i < frames; i++)
sizes[i] = stream_read_word(this);
@@ -1355,8 +1355,8 @@ discard:
return this->status;
}
lprintf ("**** found next DATA tag\n");
- this->current_data_chunk_packet_count = BE_32(&data_chunk_header[2]);
- this->next_data_chunk_offset = BE_32(&data_chunk_header[6]);
+ this->current_data_chunk_packet_count = _X_BE_32(&data_chunk_header[2]);
+ this->next_data_chunk_offset = _X_BE_32(&data_chunk_header[6]);
}
if (!this->current_data_chunk_packet_count) {
diff --git a/src/demuxers/demux_realaudio.c b/src/demuxers/demux_realaudio.c
index bf8de0dad..2c315519e 100644
--- a/src/demuxers/demux_realaudio.c
+++ b/src/demuxers/demux_realaudio.c
@@ -90,13 +90,13 @@ static int open_ra_file(demux_ra_t *this) {
return 0;
/* read version */
- version = BE_16(&file_header[0x04]);
+ version = _X_BE_16(&file_header[0x04]);
/* read header size according to version */
if (version == 3)
- this->header_size = BE_16(&file_header[0x06]) + 8;
+ this->header_size = _X_BE_16(&file_header[0x06]) + 8;
else if (version == 4)
- this->header_size = BE_32(&file_header[0x12]) + 16;
+ this->header_size = _X_BE_32(&file_header[0x12]) + 16;
else {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_realaudio: unknown version number %d\n", version);
return 0;
@@ -113,18 +113,18 @@ static int open_ra_file(demux_ra_t *this) {
/* read header data according to version */
if((version == 3) && (this->header_size >= 32)) {
- this->data_size = BE_32(&this->header[0x12]);
+ this->data_size = _X_BE_32(&this->header[0x12]);
this->block_align = 240;
offset = 0x16;
} else if(this->header_size >= 72) {
- this->data_size = BE_32(&this->header[0x1C]);
+ this->data_size = _X_BE_32(&this->header[0x1C]);
- this->block_align = BE_16(&this->header[0x2A]);
+ this->block_align = _X_BE_16(&this->header[0x2A]);
if(this->header[0x3D] == 4)
- this->fourcc = ME_32(&this->header[0x3E]);
+ this->fourcc = _X_ME_32(&this->header[0x3E]);
else {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_realaudio: invalid fourcc size %d\n", this->header[0x3D]);
@@ -169,7 +169,7 @@ static int open_ra_file(demux_ra_t *this) {
/* Fourcc for version 3 comes after meta info */
if((version == 3) && ((offset+7) <= this->header_size)) {
if(this->header[offset+2] == 4)
- this->fourcc = ME_32(&this->header[offset+3]);
+ this->fourcc = _X_ME_32(&this->header[offset+3]);
else {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_realaudio: invalid fourcc size %d\n", this->header[offset+2]);
@@ -313,8 +313,6 @@ static int demux_ra_get_status (demux_plugin_t *this_gen) {
/* return the approximate length in miliseconds */
static int demux_ra_get_stream_length (demux_plugin_t *this_gen) {
- demux_ra_t *this = (demux_ra_t *) this_gen;
-
return 0;
}
diff --git a/src/demuxers/demux_roq.c b/src/demuxers/demux_roq.c
index 0e7c93b97..10137be7f 100644
--- a/src/demuxers/demux_roq.c
+++ b/src/demuxers/demux_roq.c
@@ -95,8 +95,8 @@ static int open_roq_file(demux_roq_t *this) {
return 0;
/* check for the RoQ magic numbers */
- if ((LE_16(&preamble[0]) != RoQ_MAGIC_NUMBER) ||
- (LE_32(&preamble[2]) != 0xFFFFFFFF))
+ if ((_X_LE_16(&preamble[0]) != RoQ_MAGIC_NUMBER) ||
+ (_X_LE_32(&preamble[2]) != 0xFFFFFFFF))
return 0;
this->bih.biSize = sizeof(xine_bmiheader);
@@ -112,7 +112,7 @@ static int open_roq_file(demux_roq_t *this) {
*
* therefore, the frame pts increment is 90000 / fps
*/
- fps = LE_16(&preamble[6]);
+ fps = _X_LE_16(&preamble[6]);
this->frame_pts_inc = 90000 / fps;
/* iterate through the first 2 seconds worth of chunks searching for
@@ -124,16 +124,16 @@ static int open_roq_file(demux_roq_t *this) {
if (this->input->read(this->input, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
RoQ_CHUNK_PREAMBLE_SIZE)
break;
- chunk_type = LE_16(&preamble[0]);
- chunk_size = LE_32(&preamble[2]);
+ chunk_type = _X_LE_16(&preamble[0]);
+ chunk_size = _X_LE_32(&preamble[2]);
if (chunk_type == RoQ_INFO) {
/* fetch the width and height; reuse the preamble bytes */
if (this->input->read(this->input, preamble, 8) != 8)
break;
- this->bih.biWidth = LE_16(&preamble[0]);
- this->bih.biHeight = LE_16(&preamble[2]);
+ this->bih.biWidth = _X_LE_16(&preamble[0]);
+ this->bih.biHeight = _X_LE_16(&preamble[2]);
/* if an audio chunk was already found, search is done */
if (this->wave.nChannels)
@@ -188,8 +188,8 @@ static int demux_roq_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- chunk_type = LE_16(&preamble[0]);
- chunk_size = LE_32(&preamble[2]);
+ chunk_type = _X_LE_16(&preamble[0]);
+ chunk_size = _X_LE_32(&preamble[2]);
/* if the chunk is an audio chunk, route it to the audio fifo */
if ((chunk_type == RoQ_SOUND_MONO) || (chunk_type == RoQ_SOUND_STEREO)) {
diff --git a/src/demuxers/demux_smjpeg.c b/src/demuxers/demux_smjpeg.c
index 9c86314c5..8601d3cbc 100644
--- a/src/demuxers/demux_smjpeg.c
+++ b/src/demuxers/demux_smjpeg.c
@@ -119,7 +119,7 @@ static int open_smjpeg_file(demux_smjpeg_t *this) {
this->input->seek(this->input, SMJPEG_SIGNATURE_SIZE + 4, SEEK_SET);
if (this->input->read(this->input, header_chunk, 4) != 4)
return 0;
- this->duration = BE_32(&header_chunk[0]);
+ this->duration = _X_BE_32(&header_chunk[0]);
/* initial state: no video and no audio (until headers found) */
this->video_type = this->audio_type = 0;
@@ -131,7 +131,7 @@ static int open_smjpeg_file(demux_smjpeg_t *this) {
if (this->input->read(this->input, header_chunk, 4) != 4)
return 0;
- chunk_tag = BE_32(&header_chunk[0]);
+ chunk_tag = _X_BE_32(&header_chunk[0]);
switch(chunk_tag) {
@@ -145,8 +145,8 @@ static int open_smjpeg_file(demux_smjpeg_t *this) {
SMJPEG_VIDEO_HEADER_SIZE) != SMJPEG_VIDEO_HEADER_SIZE)
return 0;
- this->bih.biWidth = BE_16(&header_chunk[8]);
- this->bih.biHeight = BE_16(&header_chunk[10]);
+ this->bih.biWidth = _X_BE_16(&header_chunk[8]);
+ this->bih.biHeight = _X_BE_16(&header_chunk[10]);
this->bih.biCompression = *(uint32_t *)&header_chunk[12];
this->video_type = _x_fourcc_to_buf_video(this->bih.biCompression);
break;
@@ -156,13 +156,13 @@ static int open_smjpeg_file(demux_smjpeg_t *this) {
SMJPEG_AUDIO_HEADER_SIZE) != SMJPEG_AUDIO_HEADER_SIZE)
return 0;
- this->audio_sample_rate = BE_16(&header_chunk[4]);
+ this->audio_sample_rate = _X_BE_16(&header_chunk[4]);
this->audio_bits = header_chunk[6];
this->audio_channels = header_chunk[7];
/* ADPCM in these files is ID'd by 'APCM' which is used in other
* files to denote a slightly different format; thus, use the
* following special case */
- if (BE_32(&header_chunk[8]) == APCM_TAG) {
+ if (_X_BE_32(&header_chunk[8]) == APCM_TAG) {
audio_codec = be2me_32(APCM_TAG);
this->audio_type = BUF_AUDIO_SMJPEG_IMA;
} else {
@@ -176,7 +176,7 @@ static int open_smjpeg_file(demux_smjpeg_t *this) {
* of the chunk */
if (this->input->read(this->input, header_chunk, 4) != 4)
return 0;
- this->input->seek(this->input, BE_32(&header_chunk[0]), SEEK_CUR);
+ this->input->seek(this->input, _X_BE_32(&header_chunk[0]), SEEK_CUR);
break;
}
}
@@ -210,8 +210,8 @@ static int demux_smjpeg_send_chunk(demux_plugin_t *this_gen) {
return this->status; /* skip to next while() iteration to bail out */
}
- chunk_tag = BE_32(&preamble[0]);
- remaining_sample_bytes = BE_32(&preamble[8]);
+ chunk_tag = _X_BE_32(&preamble[0]);
+ remaining_sample_bytes = _X_BE_32(&preamble[8]);
/*
* Each sample has an absolute timestamp in millisecond units:
@@ -238,7 +238,7 @@ static int demux_smjpeg_send_chunk(demux_plugin_t *this_gen) {
pts /= (this->audio_sample_rate * this->audio_channels);
audio_frame_count += ((remaining_sample_bytes - 4) * 2);
} else {
- pts = BE_32(&preamble[4]);
+ pts = _X_BE_32(&preamble[4]);
pts *= 90;
}
diff --git a/src/demuxers/demux_snd.c b/src/demuxers/demux_snd.c
index 99415890a..0f28d81cf 100644
--- a/src/demuxers/demux_snd.c
+++ b/src/demuxers/demux_snd.c
@@ -85,17 +85,17 @@ static int open_snd_file(demux_snd_t *this) {
return 0;
/* check the signature */
- if (BE_32(&header[0]) != snd_TAG)
+ if (_X_BE_32(&header[0]) != snd_TAG)
return 0;
/* file is qualified; skip over the header bytes in the stream */
this->input->seek(this->input, SND_HEADER_SIZE, SEEK_SET);
- this->data_start = BE_32(&header[0x04]);
- this->data_size = BE_32(&header[0x08]);
- encoding = BE_32(&header[0x0C]);
- this->audio_sample_rate = BE_32(&header[0x10]);
- this->audio_channels = BE_32(&header[0x14]);
+ this->data_start = _X_BE_32(&header[0x04]);
+ this->data_size = _X_BE_32(&header[0x08]);
+ encoding = _X_BE_32(&header[0x0C]);
+ this->audio_sample_rate = _X_BE_32(&header[0x10]);
+ this->audio_channels = _X_BE_32(&header[0x14]);
/* basic sanity checks on the loaded audio parameters */
if ((!this->audio_sample_rate) ||
diff --git a/src/demuxers/demux_str.c b/src/demuxers/demux_str.c
index 90dbf2117..6f3556dd4 100644
--- a/src/demuxers/demux_str.c
+++ b/src/demuxers/demux_str.c
@@ -202,8 +202,8 @@ static int open_str_file(demux_str_t *this) {
}
/* check for STR with a RIFF header */
- if ((BE_32(&check_bytes[0]) == RIFF_TAG) &&
- (BE_32(&check_bytes[8]) == CDXA_TAG))
+ if ((_X_BE_32(&check_bytes[0]) == RIFF_TAG) &&
+ (_X_BE_32(&check_bytes[8]) == CDXA_TAG))
local_offset = 0x2C;
else
local_offset = 0;
@@ -220,16 +220,16 @@ static int open_str_file(demux_str_t *this) {
check_bytes[local_offset + 0x13]);
/* check for 12-byte sync marker */
- if ((BE_32(&check_bytes[local_offset + 0]) != 0x00FFFFFF) ||
- (BE_32(&check_bytes[local_offset + 4]) != 0xFFFFFFFF) ||
- (BE_32(&check_bytes[local_offset + 8]) != 0xFFFFFF00)) {
+ if ((_X_BE_32(&check_bytes[local_offset + 0]) != 0x00FFFFFF) ||
+ (_X_BE_32(&check_bytes[local_offset + 4]) != 0xFFFFFFFF) ||
+ (_X_BE_32(&check_bytes[local_offset + 8]) != 0xFFFFFF00)) {
lprintf("sector %d sync error\n", sector);
return 0;
}
/* the 32 bits starting at 0x10 and at 0x14 should be the same */
- if (BE_32(&check_bytes[local_offset + 0x10]) !=
- BE_32(&check_bytes[local_offset + 0x14])) {
+ if (_X_BE_32(&check_bytes[local_offset + 0x10]) !=
+ _X_BE_32(&check_bytes[local_offset + 0x14])) {
lprintf("sector %d control bits copy error\n", sector);
return 0;
}
@@ -248,15 +248,15 @@ static int open_str_file(demux_str_t *this) {
case CDXA_TYPE_VIDEO:
/* first time we have seen video/data in this channel? */
if ((!(this->channel_type[channel] & CDXA_TYPE_DATA)) &&
- (LE_32(&check_bytes[local_offset + 0x18]) == STR_MAGIC)) {
+ (_X_LE_32(&check_bytes[local_offset + 0x18]) == STR_MAGIC)) {
/* mark this channel as having video data */
this->channel_type[channel] |= CDXA_TYPE_VIDEO;
this->bih[channel].biWidth =
- LE_16(&check_bytes[local_offset + 0x18 + 0x10]);
+ _X_LE_16(&check_bytes[local_offset + 0x18 + 0x10]);
this->bih[channel].biHeight =
- LE_16(&check_bytes[local_offset + 0x18 + 0x12]);
+ _X_LE_16(&check_bytes[local_offset + 0x18 + 0x12]);
}
break;
@@ -349,12 +349,12 @@ static int demux_str_send_chunk(demux_plugin_t *this_gen) {
case CDXA_TYPE_DATA:
/* video chunk */
- if (LE_32(&sector[0x18]) != STR_MAGIC ||
+ if (_X_LE_32(&sector[0x18]) != STR_MAGIC ||
channel != this->default_video_channel) {
return 0;
}
- frame_number = LE_32(&sector[0x18 + 0x08]);
+ frame_number = _X_LE_32(&sector[0x18 + 0x08]);
buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
buf->pts = frame_number * FRAME_DURATION;
@@ -365,7 +365,7 @@ static int demux_str_send_chunk(demux_plugin_t *this_gen) {
/* first chunk of frame? sync forthcoming audio packets */
/* FIXME */
- /*if (LE_16(&sector[0x18+0x04]) == 0) {
+ /*if (_X_LE_16(&sector[0x18+0x04]) == 0) {
* int i;
* for (i = 0; i < STR_MAX_CHANNELS; i++) this->audio_pts[i] = buf->pts;
*}
@@ -385,7 +385,7 @@ static int demux_str_send_chunk(demux_plugin_t *this_gen) {
/* if the current chunk is 1 less than the chunk count, this is the
* last chunk of the frame */
- if ((LE_16(&sector[0x18+0x04]) + 1) == LE_16(&sector[0x18+0x06]))
+ if ((_X_LE_16(&sector[0x18+0x04]) + 1) == _X_LE_16(&sector[0x18+0x06]))
buf->decoder_flags |= BUF_FLAG_FRAME_END;
buf->type = BUF_VIDEO_PSX_MDEC | channel;
diff --git a/src/demuxers/demux_ts.c b/src/demuxers/demux_ts.c
index aea0c8ca1..07f466adb 100644
--- a/src/demuxers/demux_ts.c
+++ b/src/demuxers/demux_ts.c
@@ -180,6 +180,8 @@
#define MAX_PES_BUF_SIZE 2048
+#define CORRUPT_PES_THRESHOLD 10
+
#define NULL_PID 0x1fff
#define INVALID_PID ((unsigned int)(-1))
#define INVALID_PROGRAM ((unsigned int)(-1))
@@ -337,9 +339,10 @@ typedef struct {
int32_t packet_number;
/* NEW: var to keep track of number of last read packets */
int32_t npkt_read;
- int32_t read_zero;
uint8_t buf[BUF_SIZE]; /* == PKT_SIZE * NPKT_PER_READ */
+
+ int numPreview;
} demux_ts_t;
@@ -683,7 +686,11 @@ static int demux_ts_parse_pes_header (xine_t *xine, demux_ts_media *m,
stream_id = p[3];
if (packet_len==0)
+ {
+ xprintf (xine, XINE_VERBOSITY_DEBUG,
+ "demux_ts: error pes length 0\n");
return 0;
+ }
#ifdef TS_LOG
printf ("demux_ts: packet stream id: %.2x len: %d (%x)\n",
@@ -890,6 +897,16 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts,
m->buf->decoder_info[1] = BUF_SPECIAL_SPU_DVD_SUBTYPE;
m->buf->decoder_info[2] = SPU_DVD_SUBTYPE_PACKAGE;
}
+ else {
+ if (this->numPreview<5)
+ ++this->numPreview;
+ if ( this->numPreview==1 )
+ m->buf->decoder_flags=BUF_FLAG_HEADER | BUF_FLAG_FRAME_END;
+ else if ( this->numPreview<5 )
+ m->buf->decoder_flags=BUF_FLAG_PREVIEW;
+ else
+ m->buf->decoder_flags=BUF_FLAG_FRAME_END;
+ }
m->buf->pts = m->pts;
m->buf->decoder_info[0] = 1;
@@ -910,12 +927,17 @@ static void demux_ts_buffer_pes(demux_ts_t*this, unsigned char *ts,
m->buf = m->fifo->buffer_pool_alloc(m->fifo);
if (!demux_ts_parse_pes_header(this->stream->xine, m, ts, len, this->stream)) {
- m->corrupted_pes = 1;
m->buf->free_buffer(m->buf);
m->buf = NULL;
- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+
+ if (m->corrupted_pes > CORRUPT_PES_THRESHOLD) {
+ if (this->videoPid == m->pid)
+ this->videoPid = INVALID_PID;
+ } else {
+ m->corrupted_pes++;
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
"demux_ts: PID 0x%.4x: corrupted pes encountered\n", m->pid);
-
+ }
} else {
m->corrupted_pes = 0;
@@ -1244,7 +1266,7 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
case ISO_14496_PART10_VIDEO:
if (this->videoPid == INVALID_PID) {
#ifdef TS_PMT_LOG
- printf ("demux_ts: PMT video pid 0x%.4x\n", pid);
+ printf ("demux_ts: PMT video pid 0x%.4x type %2.2x\n", pid, stream[0]);
#endif
demux_ts_pes_new(this, this->media_num, pid, this->video_fifo,stream[0]);
this->videoMedia = this->media_num;
@@ -1266,7 +1288,7 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
}
if(!found) {
#ifdef TS_PMT_LOG
- printf ("demux_ts: PMT audio pid 0x%.4x\n", pid);
+ printf ("demux_ts: PMT audio pid 0x%.4x type %2.2x\n", pid, stream[0]);
#endif
demux_ts_pes_new(this, this->media_num, pid, this->audio_fifo,stream[0]);
this->audio_tracks[this->audio_tracks_count].pid = pid;
@@ -1280,7 +1302,7 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
break;
case ISO_13818_PRIVATE:
#ifdef TS_PMT_LOG
- printf ("demux_ts: PMT streamtype 13818_PRIVATE, pid: 0x%.4x\n", pid);
+ printf ("demux_ts: PMT streamtype 13818_PRIVATE, pid: 0x%.4x type %2.2x\n", pid, stream[0]);
for (i = 5; i < coded_length; i++)
printf ("%.2x ", stream[i]);
@@ -1289,13 +1311,12 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
break;
case ISO_13818_TYPE_C: /* data carousel */
#ifdef TS_PMT_LOG
- printf ("demux_ts: PMT streamtype 13818_TYPE_C, pid: 0x%.4x\n", pid);
+ printf ("demux_ts: PMT streamtype 13818_TYPE_C, pid: 0x%.4x type %2.2x\n", pid, stream[0]);
#endif
break;
case ISO_13818_PES_PRIVATE:
for (i = 5; i < coded_length; i += stream[i+1] + 2) {
if ((stream[i] == 0x6a) && (this->audio_tracks_count < MAX_AUDIO_TRACKS)) {
- uint32_t format_identifier=0;
int i, found = 0;
for(i = 0; i < this->audio_tracks_count; i++) {
if(this->audio_tracks[i].pid == pid) {
@@ -1305,7 +1326,7 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
}
if(!found) {
#ifdef TS_PMT_LOG
- printf ("demux_ts: PMT AC3 audio pid 0x%.4x\n", pid);
+ printf ("demux_ts: PMT AC3 audio pid 0x%.4x type %2.2x\n", pid, stream[0]);
#endif
demux_ts_pes_new(this, this->media_num, pid,
this->audio_fifo, 0x81);
@@ -1323,7 +1344,7 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
else if (stream[i] == 0x56)
{
#ifdef TS_PMT_LOG
- printf ("demux_ts: PMT Teletext, pid: 0x%.4x\n", pid);
+ printf ("demux_ts: PMT Teletext, pid: 0x%.4x type %2.2x\n", pid, stream[0]);
for (i = 5; i < coded_length; i++)
printf ("%.2x ", stream[i]);
@@ -1358,10 +1379,11 @@ printf("Program Number is %i, looking for %i\n",program_number,this->program_num
pid, this->video_fifo,
stream[0]);
#ifdef TS_LOG
- printf("demux_ts: DVBSUB: pid 0x%.4x: %s page %ld %ld\n",
+ printf("demux_ts: DVBSUB: pid 0x%.4x: %s page %ld %ld type %2.2x\n",
pid, lang->desc.lang,
lang->desc.comp_page_id,
- lang->desc.aux_page_id);
+ lang->desc.aux_page_id,
+ stream[0]);
#endif
}
}
@@ -1531,12 +1553,7 @@ static unsigned char * demux_synchronise(demux_ts_t* this) {
*/
if (this->npkt_read == 0) {
- /* printf ("demux_ts: read 0 packets! (%d)\n", this->read_zero); */
- this->read_zero++;
- } else this->read_zero = 0;
-
- if (this->read_zero > 200) {
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_ts: read 0 packets too many times!\n");
+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_ts: read 0 packets\n");
this->status = DEMUX_FINISHED;
return NULL;
}
@@ -1785,13 +1802,27 @@ static void demux_ts_parse_packet (demux_ts_t*this) {
if ( (pes_stream_id >= VIDEO_STREAM_S) && (pes_stream_id <= VIDEO_STREAM_E) ) {
if ( this->videoPid == INVALID_PID) {
-
- xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
- "demux_ts: auto-detected video pid 0x%.4x\n", pid);
-
- this->videoPid = pid;
- this->videoMedia = this->media_num;
- demux_ts_pes_new(this, this->media_num++, pid, this->video_fifo, pes_stream_id);
+ int i, found = 0;
+ for(i = 0; i < this->media_num; i++) {
+ if (this->media[i].pid == pid) {
+ found = 1;
+ break;
+ }
+ }
+
+ if (found && (this->media[i].corrupted_pes == 0)) {
+ this->videoPid = pid;
+ this->videoMedia = i;
+ } else if (!found) {
+ this->videoPid = pid;
+ this->videoMedia = this->media_num;
+ demux_ts_pes_new(this, this->media_num++, pid, this->video_fifo, pes_stream_id);
+ }
+
+ if (this->videoPid != INVALID_PID) {
+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_ts: auto-detected video pid 0x%.4x\n", pid);
+ }
}
} else if ( (pes_stream_id >= AUDIO_STREAM_S) && (pes_stream_id <= AUDIO_STREAM_E) ) {
if (this->audio_tracks_count < MAX_AUDIO_TRACKS) {
@@ -2061,7 +2092,6 @@ static int demux_ts_get_optional_data(demux_plugin_t *this_gen,
demux_ts_t *this = (demux_ts_t *) this_gen;
char *str = data;
int channel = *((int *)data);
- int track_num;
/* be a bit paranoid */
if (this == NULL || this->stream == NULL)
@@ -2227,9 +2257,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen,
this->status = DEMUX_FINISHED;
#ifdef TS_READ_STATS
- for (i=0; i<=NPKT_PER_READ; i++) {
- this->rstat[i] = 0;
- }
+ memset(this-rstat, 0, sizeof(*this->rstat)*NPKT_PER_READ);
#endif
/* DVBSUB */
@@ -2240,6 +2268,8 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen,
/* dvb */
this->event_queue = xine_event_new_queue (this->stream);
+ this->numPreview=0;
+
return &this->demux_plugin;
}
diff --git a/src/demuxers/demux_tta.c b/src/demuxers/demux_tta.c
index 2e4808b9c..4d53c5d3f 100644
--- a/src/demuxers/demux_tta.c
+++ b/src/demuxers/demux_tta.c
@@ -32,6 +32,7 @@
#include "buffer.h"
#include "bswap.h"
#include "group_audio.h"
+#include "attributes.h"
typedef struct {
demux_plugin_t demux_plugin;
@@ -56,7 +57,7 @@ typedef struct {
uint32_t samplerate;
uint32_t data_length;
uint32_t crc32;
- } __attribute__((__packed__)) tta;
+ } XINE_PACKED tta;
uint8_t buffer[22]; /* This is the size of the header */
} header;
} demux_tta_t;
@@ -65,16 +66,14 @@ typedef struct {
demux_class_t demux_class;
} demux_tta_class_t;
-#define FOURCC_32(a, b, c, d) (d + (c<<8) + (b<<16) + (a<<24))
-
static int open_tta_file(demux_tta_t *this) {
- uint8_t peek[4];
+ uint32_t peek;
uint32_t framelen;
- if (_x_demux_read_header(this->input, peek, 4) != 4)
+ if (_x_demux_read_header(this->input, &peek, 4) != 4)
return 0;
- if ( BE_32(peek) != FOURCC_32('T', 'T', 'A', '1') )
+ if ( peek != ME_FOURCC('T', 'T', 'A', '1') )
return 0;
if ( this->input->read(this->input, this->header.buffer, sizeof(this->header)) != sizeof(this->header) )
@@ -89,7 +88,7 @@ static int open_tta_file(demux_tta_t *this) {
return 0;
}
- this->seektable = xine_xmalloc(sizeof(uint32_t)*this->totalframes);
+ this->seektable = xine_xcalloc(this->totalframes, sizeof(uint32_t));
this->input->read(this->input, this->seektable, sizeof(uint32_t)*this->totalframes);
/* Skip the CRC32 */
diff --git a/src/demuxers/demux_vmd.c b/src/demuxers/demux_vmd.c
index e2b68fbb1..fd6900ec0 100644
--- a/src/demuxers/demux_vmd.c
+++ b/src/demuxers/demux_vmd.c
@@ -115,7 +115,7 @@ static int open_vmd_file(demux_vmd_t *this) {
VMD_HEADER_SIZE)
return 0;
- if (LE_16(&vmd_header[0]) != VMD_HEADER_SIZE - 2)
+ if (_X_LE_16(&vmd_header[0]) != VMD_HEADER_SIZE - 2)
return 0;
/* file is minimally qualified at this point, proceed to load */
@@ -125,11 +125,11 @@ static int open_vmd_file(demux_vmd_t *this) {
this->data_size = 1;
bih->biSize = sizeof(xine_bmiheader) + VMD_HEADER_SIZE;
- bih->biWidth = LE_16(&vmd_header[12]);
- bih->biHeight = LE_16(&vmd_header[14]);
- this->wave.nSamplesPerSec = LE_16(&vmd_header[804]);
+ bih->biWidth = _X_LE_16(&vmd_header[12]);
+ bih->biHeight = _X_LE_16(&vmd_header[14]);
+ this->wave.nSamplesPerSec = _X_LE_16(&vmd_header[804]);
this->wave.nChannels = (vmd_header[811] & 0x80) ? 2 : 1;
- this->wave.nBlockAlign = LE_16(&vmd_header[806]);
+ this->wave.nBlockAlign = _X_LE_16(&vmd_header[806]);
if (this->wave.nBlockAlign & 0x8000) {
this->wave.nBlockAlign -= 0x8000;
this->wave.wBitsPerSample = 16;
@@ -149,8 +149,8 @@ static int open_vmd_file(demux_vmd_t *this) {
/* skip over the offset table and load the table of contents; don't
* care about the offset table since demuxer will calculate those
* independently */
- toc_offset = LE_32(&vmd_header[812]);
- this->frame_count = LE_16(&vmd_header[6]);
+ toc_offset = _X_LE_32(&vmd_header[812]);
+ this->frame_count = _X_LE_16(&vmd_header[6]);
this->input->seek(this->input, toc_offset + this->frame_count * 6, SEEK_SET);
/* while we have the toal number of blocks, calculate the total running
@@ -172,7 +172,7 @@ static int open_vmd_file(demux_vmd_t *this) {
this->frame_table = xine_xmalloc(this->frame_count * sizeof(vmd_frame_t));
- current_offset = this->data_start = LE_32(&vmd_header[20]);
+ current_offset = this->data_start = _X_LE_32(&vmd_header[20]);
this->data_size = toc_offset - this->data_start;
current_frame_record = raw_frame_table;
total_frames = this->frame_count;
@@ -180,7 +180,7 @@ static int open_vmd_file(demux_vmd_t *this) {
while (total_frames--) {
/* if the frame size is 0, do not count the frame and bring the
* total frame count down */
- this->frame_table[i].frame_size = LE_32(&current_frame_record[2]);
+ this->frame_table[i].frame_size = _X_LE_32(&current_frame_record[2]);
/* this logic is present so that 0-length audio chunks are not
* accounted */
diff --git a/src/demuxers/demux_voc.c b/src/demuxers/demux_voc.c
index 1c1675b92..bb0cfc16d 100644
--- a/src/demuxers/demux_voc.c
+++ b/src/demuxers/demux_voc.c
@@ -91,7 +91,7 @@ static int open_voc_file(demux_voc_t *this) {
return 0;
/* file is qualified */
- first_block_offset = LE_16(&header[0x14]);
+ first_block_offset = _X_LE_16(&header[0x14]);
this->input->seek(this->input, first_block_offset, SEEK_SET);
/* load the block preamble */
diff --git a/src/demuxers/demux_vqa.c b/src/demuxers/demux_vqa.c
index 56fbde7d1..987114793 100644
--- a/src/demuxers/demux_vqa.c
+++ b/src/demuxers/demux_vqa.c
@@ -98,8 +98,8 @@ static int open_vqa_file(demux_vqa_t *this) {
return 0;
/* check for the VQA signatures */
- if ((BE_32(&scratch[0]) != FORM_TAG) ||
- (BE_32(&scratch[8]) != WVQA_TAG))
+ if ((_X_BE_32(&scratch[0]) != FORM_TAG) ||
+ (_X_BE_32(&scratch[8]) != WVQA_TAG))
return 0;
/* file is qualified; skip to the start of the VQA header */
@@ -115,9 +115,9 @@ static int open_vqa_file(demux_vqa_t *this) {
return 0;
bih->biSize = sizeof(xine_bmiheader) + VQA_HEADER_SIZE;
- bih->biWidth = LE_16(&vqa_header[6]);
- bih->biHeight = LE_16(&vqa_header[8]);
- this->wave.nSamplesPerSec = LE_16(&vqa_header[24]);
+ bih->biWidth = _X_LE_16(&vqa_header[6]);
+ bih->biHeight = _X_LE_16(&vqa_header[8]);
+ this->wave.nSamplesPerSec = _X_LE_16(&vqa_header[24]);
this->wave.nChannels = vqa_header[26];
this->wave.wBitsPerSample = 16;
@@ -125,7 +125,7 @@ static int open_vqa_file(demux_vqa_t *this) {
if (this->input->read(this->input, scratch, VQA_PREAMBLE_SIZE) !=
VQA_PREAMBLE_SIZE)
return 0;
- chunk_size = BE_32(&scratch[4]);
+ chunk_size = _X_BE_32(&scratch[4]);
this->input->seek(this->input, chunk_size, SEEK_CUR);
this->video_pts = this->audio_frames = 0;
@@ -152,7 +152,7 @@ static int demux_vqa_send_chunk(demux_plugin_t *this_gen) {
}
current_file_pos = this->input->get_current_pos(this->input);
- chunk_size = BE_32(&preamble[4]);
+ chunk_size = _X_BE_32(&preamble[4]);
skip_byte = chunk_size & 0x1;
audio_pts = this->audio_frames;
audio_pts *= 90000;
@@ -204,7 +204,7 @@ static int demux_vqa_send_chunk(demux_plugin_t *this_gen) {
}
current_file_pos = this->input->get_current_pos(this->input);
- chunk_size = BE_32(&preamble[4]);
+ chunk_size = _X_BE_32(&preamble[4]);
while (chunk_size) {
buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
buf->type = BUF_VIDEO_VQA;
diff --git a/src/demuxers/demux_wav.c b/src/demuxers/demux_wav.c
index 1e46d8526..d7f8f9f9c 100644
--- a/src/demuxers/demux_wav.c
+++ b/src/demuxers/demux_wav.c
@@ -123,8 +123,8 @@ static int open_wav_file(demux_wav_t *this) {
free (this->wave);
return 0;
}
- chunk_tag = LE_32(&chunk_preamble[0]);
- chunk_size = LE_32(&chunk_preamble[4]);
+ chunk_tag = _X_LE_32(&chunk_preamble[0]);
+ chunk_size = _X_LE_32(&chunk_preamble[4]);
if (chunk_tag == data_TAG) {
this->data_start = this->input->get_current_pos(this->input);
diff --git a/src/demuxers/demux_wc3movie.c b/src/demuxers/demux_wc3movie.c
index fa1cfb17d..b02c3fa93 100644
--- a/src/demuxers/demux_wc3movie.c
+++ b/src/demuxers/demux_wc3movie.c
@@ -159,9 +159,9 @@ static int demux_mve_send_chunk(demux_plugin_t *this_gen) {
PREAMBLE_SIZE)
this->status = DEMUX_FINISHED;
else {
- chunk_tag = BE_32(&preamble[0]);
+ chunk_tag = _X_BE_32(&preamble[0]);
/* round up to the nearest even size */
- chunk_size = (BE_32(&preamble[4]) + 1) & (~1);
+ chunk_size = (_X_BE_32(&preamble[4]) + 1) & (~1);
if (chunk_tag == BRCH_TAG) {
/* empty chunk; do nothing */
@@ -185,7 +185,7 @@ static int demux_mve_send_chunk(demux_plugin_t *this_gen) {
this->status = DEMUX_FINISHED;
return this->status;
}
- palette_number = LE_32(&preamble[0]);
+ palette_number = _X_LE_32(&preamble[0]);
if (palette_number >= this->number_of_shots) {
xine_log(this->stream->xine, XINE_LOG_MSG,
@@ -359,9 +359,9 @@ static int open_mve_file(demux_mve_t *this) {
if (_x_demux_read_header(this->input, header, WC3_HEADER_SIZE) != WC3_HEADER_SIZE)
return 0;
- if ((BE_32(&header[0]) != FORM_TAG) ||
- (BE_32(&header[8]) != MOVE_TAG) ||
- (BE_32(&header[12]) != PC_TAG))
+ if ((_X_BE_32(&header[0]) != FORM_TAG) ||
+ (_X_BE_32(&header[8]) != MOVE_TAG) ||
+ (_X_BE_32(&header[12]) != PC_TAG))
return 0;
/* file is qualified */
@@ -377,20 +377,18 @@ static int open_mve_file(demux_mve_t *this) {
this->input->seek(this->input, 0x1C, SEEK_SET);
if (this->input->read(this->input, preamble, 4) != 4)
return 0;
- this->number_of_shots = LE_32(&preamble[0]);
+ this->number_of_shots = _X_LE_32(&preamble[0]);
/* allocate space for the shot offset index and set offsets to 0 */
- this->shot_offsets = xine_xmalloc(this->number_of_shots * sizeof(off_t));
+ this->shot_offsets = xine_xcalloc(this->number_of_shots, sizeof(off_t));
this->current_shot = 0;
- for (i = 0; i < this->number_of_shots; i++)
- this->shot_offsets[i] = 0;
/* skip the SOND chunk */
this->input->seek(this->input, 12, SEEK_CUR);
/* load the palette chunks */
- this->palettes = xine_xmalloc(this->number_of_shots * PALETTE_SIZE *
- sizeof(palette_entry_t));
+ this->palettes = xine_xcalloc(this->number_of_shots, PALETTE_SIZE *
+ sizeof(palette_entry_t));
for (i = 0; i < this->number_of_shots; i++) {
/* make sure there was a valid palette chunk preamble */
if (this->input->read(this->input, preamble, PREAMBLE_SIZE) !=
@@ -400,8 +398,8 @@ static int open_mve_file(demux_mve_t *this) {
return 0;
}
- if ((BE_32(&preamble[0]) != PALT_TAG) ||
- (BE_32(&preamble[4]) != PALETTE_CHUNK_SIZE)) {
+ if ((_X_BE_32(&preamble[0]) != PALT_TAG) ||
+ (_X_BE_32(&preamble[4]) != PALETTE_CHUNK_SIZE)) {
xine_log(this->stream->xine, XINE_LOG_MSG,
_("demux_wc3movie: There was a problem while loading palette chunks\n"));
free (this->palettes);
@@ -450,9 +448,9 @@ static int open_mve_file(demux_mve_t *this) {
return 0;
}
- chunk_tag = BE_32(&preamble[0]);
+ chunk_tag = _X_BE_32(&preamble[0]);
/* round up to the nearest even size */
- chunk_size = (BE_32(&preamble[4]) + 1) & (~1);
+ chunk_size = (_X_BE_32(&preamble[4]) + 1) & (~1);
switch (chunk_tag) {
@@ -481,8 +479,8 @@ static int open_mve_file(demux_mve_t *this) {
free (this->shot_offsets);
return 0;
}
- this->bih.biWidth = BE_32(&preamble[0]);
- this->bih.biHeight = BE_32(&preamble[4]);
+ this->bih.biWidth = _X_BE_32(&preamble[0]);
+ this->bih.biHeight = _X_BE_32(&preamble[4]);
break;
case INDX_TAG:
@@ -558,9 +556,9 @@ static int demux_mve_seek (demux_plugin_t *this_gen,
return this->status;
}
- chunk_tag = BE_32(&preamble[0]);
+ chunk_tag = _X_BE_32(&preamble[0]);
/* round up to the nearest even size */
- chunk_size = (BE_32(&preamble[4]) + 1) & (~1);
+ chunk_size = (_X_BE_32(&preamble[4]) + 1) & (~1);
if (chunk_tag == SHOT_TAG) {
this->shot_offsets[0] =
@@ -599,9 +597,9 @@ static int demux_mve_seek (demux_plugin_t *this_gen,
return this->status;
}
- chunk_tag = BE_32(&preamble[0]);
+ chunk_tag = _X_BE_32(&preamble[0]);
/* round up to the nearest even size */
- chunk_size = (BE_32(&preamble[4]) + 1) & (~1);
+ chunk_size = (_X_BE_32(&preamble[4]) + 1) & (~1);
if (chunk_tag == SHOT_TAG) {
this->shot_offsets[i + 1] =
diff --git a/src/demuxers/ebml.c b/src/demuxers/ebml.c
index 88492dde6..487344316 100644
--- a/src/demuxers/ebml.c
+++ b/src/demuxers/ebml.c
@@ -297,12 +297,12 @@ int ebml_read_float (ebml_parser_t *ebml, ebml_elem_t *elem, double *num) {
if (size == 4) {
float f;
- *((uint32_t *) &f) = BE_32(data);
+ *((uint32_t *) &f) = _X_BE_32(data);
*num = f;
} else {
double d;
- *((uint64_t *) &d) = BE_64(data);
+ *((uint64_t *) &d) = _X_BE_64(data);
*num = d;
}
return 1;
diff --git a/src/demuxers/flacutils.h b/src/demuxers/flacutils.h
index 67f5d66c9..c95f87519 100644
--- a/src/demuxers/flacutils.h
+++ b/src/demuxers/flacutils.h
@@ -73,19 +73,19 @@ static inline void _x_parse_flac_metadata_header(uint8_t *buffer, xine_flac_meta
parsed->last = buffer[0] & 0x80 ? 1 : 0;
parsed->blocktype = buffer[0] & 0x7f;
- parsed->length = BE_24(&buffer[1]);
+ parsed->length = _X_BE_24(&buffer[1]);
}
static inline void _x_parse_flac_streaminfo_block(uint8_t *buffer, xine_flac_streaminfo_block *parsed) {
- parsed->blocksize_min = BE_16(&buffer[0]);
- parsed->blocksize_max = BE_16(&buffer[2]);
- parsed->framesize_min = BE_24(&buffer[4]);
- parsed->framesize_max = BE_24(&buffer[7]);
- parsed->samplerate = BE_32(&buffer[10]);
+ parsed->blocksize_min = _X_BE_16(&buffer[0]);
+ parsed->blocksize_max = _X_BE_16(&buffer[2]);
+ parsed->framesize_min = _X_BE_24(&buffer[4]);
+ parsed->framesize_max = _X_BE_24(&buffer[7]);
+ parsed->samplerate = _X_BE_32(&buffer[10]);
parsed->channels = ((parsed->samplerate >> 9) & 0x07) + 1;
parsed->bits_per_sample = ((parsed->samplerate >> 4) & 0x1F) + 1;
parsed->samplerate >>= 12;
- parsed->total_samples = BE_64(&buffer[10]) & UINT64_C(0x0FFFFFFFFF); /* 36 bits */
+ parsed->total_samples = _X_BE_64(&buffer[10]) & UINT64_C(0x0FFFFFFFFF); /* 36 bits */
}
#endif
diff --git a/src/demuxers/group_audio.c b/src/demuxers/group_audio.c
index b8f0e1ed4..449c2ad12 100644
--- a/src/demuxers/group_audio.c
+++ b/src/demuxers/group_audio.c
@@ -68,11 +68,7 @@ static const demuxer_info_t demux_info_mpgaudio = {
};
static const demuxer_info_t demux_info_mpc = {
- 0 /* priority */
-};
-
-static const demuxer_info_t demux_info_nsf = {
- 10 /* priority */
+ 1 /* priority */
};
static const demuxer_info_t demux_info_realaudio = {
@@ -103,12 +99,6 @@ static const demuxer_info_t demux_info_wav = {
6 /* priority */
};
-#ifdef HAVE_MODPLUG
-static const demuxer_info_t demux_info_mod = {
- 10 /* priority */
-};
-#endif
-
const plugin_info_t xine_plugin_info[] EXPORTED = {
/* type, API, "name", version, special_info, init_function */
{ PLUGIN_DEMUX, 26, "aac", XINE_VERSION_CODE, &demux_info_aac, demux_aac_init_plugin },
@@ -120,7 +110,6 @@ const plugin_info_t xine_plugin_info[] EXPORTED = {
{ PLUGIN_DEMUX, 26, "flac", XINE_VERSION_CODE, &demux_info_flac, demux_flac_init_plugin },
{ PLUGIN_DEMUX, 26, "mp3", XINE_VERSION_CODE, &demux_info_mpgaudio, demux_mpgaudio_init_class },
{ PLUGIN_DEMUX, 26, "mpc", XINE_VERSION_CODE, &demux_info_mpc, demux_mpc_init_plugin },
- { PLUGIN_DEMUX, 26, "nsf", XINE_VERSION_CODE, &demux_info_nsf, demux_nsf_init_plugin },
{ PLUGIN_DEMUX, 26, "realaudio", XINE_VERSION_CODE, &demux_info_realaudio, demux_realaudio_init_plugin },
{ PLUGIN_DEMUX, 26, "shn", XINE_VERSION_CODE, &demux_info_shn, demux_shn_init_plugin },
{ PLUGIN_DEMUX, 26, "snd", XINE_VERSION_CODE, &demux_info_snd, demux_snd_init_plugin },
@@ -128,8 +117,5 @@ const plugin_info_t xine_plugin_info[] EXPORTED = {
{ PLUGIN_DEMUX, 26, "voc", XINE_VERSION_CODE, &demux_info_voc, demux_voc_init_plugin },
{ PLUGIN_DEMUX, 26, "vox", XINE_VERSION_CODE, &demux_info_vox, demux_vox_init_plugin },
{ PLUGIN_DEMUX, 26, "wav", XINE_VERSION_CODE, &demux_info_wav, demux_wav_init_plugin },
-#ifdef HAVE_MODPLUG
- { PLUGIN_DEMUX, 26, "mod", XINE_VERSION_CODE, &demux_info_mod, demux_mod_init_plugin },
-#endif
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
};
diff --git a/src/demuxers/group_audio.h b/src/demuxers/group_audio.h
index 7f1fccc5e..984b7c88e 100644
--- a/src/demuxers/group_audio.h
+++ b/src/demuxers/group_audio.h
@@ -34,7 +34,6 @@ void *demux_dts_init_plugin (xine_t *xine, void *data);
void *demux_flac_init_plugin (xine_t *xine, void *data);
void *demux_mpgaudio_init_class (xine_t *xine, void *data);
void *demux_mpc_init_plugin (xine_t *xine, void *data);
-void *demux_nsf_init_plugin (xine_t *xine, void *data);
void *demux_realaudio_init_plugin (xine_t *xine, void *data);
void *demux_shn_init_plugin (xine_t *xine, void *data);
void *demux_snd_init_plugin (xine_t *xine, void *data);
@@ -43,8 +42,4 @@ void *demux_voc_init_plugin (xine_t *xine, void *data);
void *demux_vox_init_plugin (xine_t *xine, void *data);
void *demux_wav_init_plugin (xine_t *xine, void *data);
-#ifdef HAVE_MODPLUG
-void *demux_mod_init_plugin (xine_t *xine, void *data);
-#endif
-
#endif
diff --git a/src/demuxers/id3.c b/src/demuxers/id3.c
index b707166b6..843b4e9e3 100644
--- a/src/demuxers/id3.c
+++ b/src/demuxers/id3.c
@@ -227,47 +227,15 @@ static int id3v2_parse_genre(char* dest, char *src, int len) {
return 1;
}
-#if 0
-/* parse an unsynchronized 16bits integer */
-static uint16_t BE_16_synchsafe(uint8_t buf[2]) {
- return ((uint16_t)(buf[0] & 0x7F) << 7) |
- (uint16_t)(buf[1] & 0x7F);
-}
-#endif
-
-/* parse an unsynchronized 24bits integer */
-static uint32_t BE_24_synchsafe(uint8_t buf[3]) {
- return ((uint32_t)(buf[0] & 0x7F) << 14) |
- ((uint32_t)(buf[1] & 0x7F) << 7) |
- (uint32_t)(buf[2] & 0x7F);
-}
-
-/* parse an unsynchronized 32bits integer */
-static uint32_t BE_32_synchsafe(uint8_t buf[4]) {
- return ((uint32_t)(buf[0] & 0x7F) << 21) |
- ((uint32_t)(buf[1] & 0x7F) << 14) |
- ((uint32_t)(buf[2] & 0x7F) << 7) |
- (uint32_t)(buf[3] & 0x7F);
-}
-
-/* parse an unsynchronized 35bits integer */
-static uint32_t BE_35_synchsafe(uint8_t buf[5]) {
- return ((uint32_t)(buf[0] & 0x07) << 28) |
- ((uint32_t)(buf[1] & 0x7F) << 21) |
- ((uint32_t)(buf[2] & 0x7F) << 14) |
- ((uint32_t)(buf[3] & 0x7F) << 7) |
- (uint32_t)(buf[4] & 0x7F);
-}
-
static int id3v2_parse_header(input_plugin_t *input, uint8_t *mp3_frame_header,
id3v2_header_t *tag_header) {
uint8_t buf[6];
- tag_header->id = BE_32(mp3_frame_header);
+ tag_header->id = _X_BE_32(mp3_frame_header);
if (input->read (input, buf, 6) == 6) {
tag_header->revision = buf[0];
tag_header->flags = buf[1];
- tag_header->size = BE_32_synchsafe(&buf[2]);
+ tag_header->size = _X_BE_32_synchsafe(&buf[2]);
lprintf("tag: ID3 v2.%d.%d\n", mp3_frame_header[3], tag_header->revision);
lprintf("flags: %d\n", tag_header->flags);
@@ -289,7 +257,7 @@ static int id3v22_parse_frame_header(input_plugin_t *input,
if (len == ID3V22_FRAME_HEADER_SIZE) {
frame_header->id = (buf[0] << 16) + (buf[1] << 8) + buf[2];
- frame_header->size = BE_24_synchsafe(&buf[3]);
+ frame_header->size = _X_BE_24_synchsafe(&buf[3]);
lprintf("frame: %c%c%c: size: %d\n", buf[0], buf[1], buf[2],
frame_header->size);
@@ -369,7 +337,7 @@ static int id3v22_interp_frame(input_plugin_t *input,
int id3v22_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header) {
+ uint8_t *mp3_frame_header) {
id3v2_header_t tag_header;
id3v22_frame_header_t tag_frame_header;
int pos = 0;
@@ -379,7 +347,7 @@ int id3v22_parse_tag(input_plugin_t *input,
if (tag_header.flags & ID3V22_ZERO_FLAG) {
/* invalid flags */
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
- "id3: invalid header flags\n");
+ "id3: invalid header flags (%02x)\n", tag_header.flags);
input->seek (input, tag_header.size - pos, SEEK_CUR);
return 0;
}
@@ -441,9 +409,9 @@ static int id3v23_parse_frame_header(input_plugin_t *input,
len = input->read (input, buf, ID3V23_FRAME_HEADER_SIZE);
if (len == ID3V23_FRAME_HEADER_SIZE) {
- frame_header->id = BE_32(buf);
- frame_header->size = BE_32(&buf[4]);
- frame_header->flags = BE_16(buf + 8);
+ frame_header->id = _X_BE_32(buf);
+ frame_header->size = _X_BE_32(&buf[4]);
+ frame_header->flags = _X_BE_16(buf + 8);
lprintf("frame: %c%c%c%c, size: %d, flags: %X\n", buf[0], buf[1], buf[2], buf[3],
frame_header->size, frame_header->flags);
@@ -460,12 +428,12 @@ static int id3v23_parse_frame_ext_header(input_plugin_t *input,
if (input->read (input, buf, 4) == 4) {
- frame_ext_header->size = BE_32_synchsafe(&buf[0]);
+ frame_ext_header->size = _X_BE_32_synchsafe(&buf[0]);
if (frame_ext_header->size == 6) {
if (input->read (input, buf + 4, 6) == 6) {
- frame_ext_header->flags = BE_16(buf + 4);
- frame_ext_header->padding_size = BE_32(buf + 6);
+ frame_ext_header->flags = _X_BE_16(buf + 4);
+ frame_ext_header->padding_size = _X_BE_32(buf + 6);
frame_ext_header->crc = 0;
} else {
return 0;
@@ -473,9 +441,9 @@ static int id3v23_parse_frame_ext_header(input_plugin_t *input,
} else if (frame_ext_header->size == 10) {
if (input->read (input, buf + 4, 10) == 10) {
- frame_ext_header->flags = BE_16(buf + 4);
- frame_ext_header->padding_size = BE_32(buf + 6);
- frame_ext_header->crc = BE_32(buf + 10);
+ frame_ext_header->flags = _X_BE_16(buf + 4);
+ frame_ext_header->padding_size = _X_BE_32(buf + 6);
+ frame_ext_header->crc = _X_BE_32(buf + 10);
} else {
return 0;
}
@@ -562,7 +530,7 @@ static int id3v23_interp_frame(input_plugin_t *input,
int id3v23_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header) {
+ uint8_t *mp3_frame_header) {
id3v2_header_t tag_header;
id3v23_frame_header_t tag_frame_header;
id3v23_frame_ext_header_t tag_frame_ext_header;
@@ -573,7 +541,7 @@ int id3v23_parse_tag(input_plugin_t *input,
if (tag_header.flags & ID3V23_ZERO_FLAG) {
/* invalid flags */
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
- "id3: invalid header flags\n");
+ "id3: invalid header flags (%02x)\n", tag_header.flags);
input->seek (input, tag_header.size - pos, SEEK_CUR);
return 0;
}
@@ -650,9 +618,9 @@ static int id3v24_parse_frame_header(input_plugin_t *input,
len = input->read (input, buf, ID3V24_FRAME_HEADER_SIZE);
if (len == ID3V24_FRAME_HEADER_SIZE) {
- frame_header->id = BE_32(buf);
- frame_header->size = BE_32_synchsafe(&buf[4]);
- frame_header->flags = BE_16(&buf[8]);
+ frame_header->id = _X_BE_32(buf);
+ frame_header->size = _X_BE_32_synchsafe(&buf[4]);
+ frame_header->flags = _X_BE_16(&buf[8]);
lprintf("frame: %c%c%c%c, size: %d, flags: %X\n", buf[0], buf[1], buf[2], buf[3],
frame_header->size, frame_header->flags);
@@ -669,7 +637,7 @@ static int id3v24_parse_ext_header(input_plugin_t *input,
if (input->read (input, buf, 4) == 4) {
- frame_ext_header->size = BE_32_synchsafe(&buf[0]);
+ frame_ext_header->size = _X_BE_32_synchsafe(&buf[0]);
if (input->read (input, buf, 2) == 2) {
uint8_t flags_size = buf[0];
@@ -813,7 +781,7 @@ static int id3v24_interp_frame(input_plugin_t *input,
int id3v24_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header) {
+ uint8_t *mp3_frame_header) {
id3v2_header_t tag_header;
id3v24_frame_header_t tag_frame_header;
id3v24_frame_ext_header_t tag_frame_ext_header;
@@ -824,7 +792,7 @@ int id3v24_parse_tag(input_plugin_t *input,
if (tag_header.flags & ID3V24_ZERO_FLAG) {
/* invalid flags */
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
- "id3: invalid header flags\n");
+ "id3: invalid header flags (%02x)\n", tag_header.flags);
input->seek (input, tag_header.size - pos, SEEK_CUR);
return 0;
}
@@ -881,7 +849,7 @@ int id3v24_parse_tag(input_plugin_t *input,
int id3v2_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header) {
+ uint8_t *mp3_frame_header) {
_x_assert(mp3_frame_header[0] == 'I' && mp3_frame_header[1] == 'D' && mp3_frame_header[2] == '3');
int result = 0;
@@ -898,7 +866,7 @@ int id3v2_parse_tag(input_plugin_t *input,
break;
case 4:
- xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.3 tag\n");
+ xprintf(stream->xine, XINE_VERBOSITY_LOG, "ID3V2.4 tag\n");
result = id3v24_parse_tag(input, stream, mp3_frame_header);
break;
diff --git a/src/demuxers/id3.h b/src/demuxers/id3.h
index 9d08f6817..eea5930f1 100644
--- a/src/demuxers/id3.h
+++ b/src/demuxers/id3.h
@@ -155,21 +155,25 @@ int id3v1_parse_tag (input_plugin_t *input, xine_stream_t *stream);
int id3v22_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header);
+ uint8_t *mp3_frame_header);
int id3v23_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header);
+ uint8_t *mp3_frame_header);
int id3v24_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header);
+ uint8_t *mp3_frame_header);
/* Generic function that switch between the three above */
int id3v2_parse_tag(input_plugin_t *input,
xine_stream_t *stream,
- int8_t *mp3_frame_header);
+ uint8_t *mp3_frame_header);
+/**
+ * @brief Checks if the given buffer is an ID3 tag preamble
+ * @param ptr Pointer to the first 10 bytes of the ID3 tag
+ */
static inline int id3v2_istag(uint8_t *ptr) {
return
(ptr[0] == 'I') &&
@@ -177,12 +181,36 @@ static inline int id3v2_istag(uint8_t *ptr) {
(ptr[2] == '3');
}
-static inline uint32_t id3v2_tagsize(uint8_t *ptr) {
- return
- ((uint32_t)ptr[0] << 21) +
- ((uint32_t)ptr[1] << 14) +
- ((uint32_t)ptr[2] << 7) +
- (uint32_t)ptr[3];
+#if 0
+/* parse an unsynchronized 16bits integer */
+static inline uint16_t _X_BE_16_synchsafe(uint8_t buf[2]) {
+ return ((uint16_t)(buf[0] & 0x7F) << 7) |
+ (uint16_t)(buf[1] & 0x7F);
+}
+#endif
+
+/* parse an unsynchronized 24bits integer */
+static inline uint32_t _X_BE_24_synchsafe(uint8_t buf[3]) {
+ return ((uint32_t)(buf[0] & 0x7F) << 14) |
+ ((uint32_t)(buf[1] & 0x7F) << 7) |
+ (uint32_t)(buf[2] & 0x7F);
+}
+
+/* parse an unsynchronized 32bits integer */
+static inline uint32_t _X_BE_32_synchsafe(uint8_t buf[4]) {
+ return ((uint32_t)(buf[0] & 0x7F) << 21) |
+ ((uint32_t)(buf[1] & 0x7F) << 14) |
+ ((uint32_t)(buf[2] & 0x7F) << 7) |
+ (uint32_t)(buf[3] & 0x7F);
+}
+
+/* parse an unsynchronized 35bits integer */
+static inline uint32_t BE_35_synchsafe(uint8_t buf[5]) {
+ return ((uint32_t)(buf[0] & 0x07) << 28) |
+ ((uint32_t)(buf[1] & 0x7F) << 21) |
+ ((uint32_t)(buf[2] & 0x7F) << 14) |
+ ((uint32_t)(buf[3] & 0x7F) << 7) |
+ (uint32_t)(buf[4] & 0x7F);
}
#endif /* ID3_H */
diff --git a/src/demuxers/matroska.h b/src/demuxers/matroska.h
index 3bfdbdc0c..6950a0079 100644
--- a/src/demuxers/matroska.h
+++ b/src/demuxers/matroska.h
@@ -264,6 +264,7 @@ struct matroska_track_s {
#define MATROSKA_CODEC_ID_V_REAL_RV30 "V_REAL/RV30"
#define MATROSKA_CODEC_ID_V_REAL_RV40 "V_REAL/RV40"
#define MATROSKA_CODEC_ID_V_MJPEG "V_MJPEG"
+#define MATROSKA_CODEC_ID_V_THEORA "V_THEORA"
#define MATROSKA_CODEC_ID_A_MPEG1_L1 "A_MPEG/L1"
#define MATROSKA_CODEC_ID_A_MPEG1_L2 "A_MPEG/L2"