summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-12-23 21:22:38 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-12-23 21:22:38 +0000
commit9e88be122fc92b6c7a1f6aae640919081d93f075 (patch)
tree79b1d09aa8b250fb476bf0668c7999832e16cc89
parent62251c2d47525d324cac3392bd8dfc645e927349 (diff)
downloadxine-lib-9e88be122fc92b6c7a1f6aae640919081d93f075.tar.gz
xine-lib-9e88be122fc92b6c7a1f6aae640919081d93f075.tar.bz2
- some more endianness fixes to ogg demuxer
- new helper function for demuxers (send data to fifo easily, provided it was already loaded to memory) CVS patchset: 5936 CVS date: 2003/12/23 21:22:38
-rw-r--r--src/demuxers/demux_ogg.c94
-rw-r--r--src/xine-engine/demux.c53
-rw-r--r--src/xine-engine/xine_internal.h9
3 files changed, 91 insertions, 65 deletions
diff --git a/src/demuxers/demux_ogg.c b/src/demuxers/demux_ogg.c
index c55f30cdf..dc1d85ab2 100644
--- a/src/demuxers/demux_ogg.c
+++ b/src/demuxers/demux_ogg.c
@@ -19,7 +19,7 @@
*/
/*
- * $Id: demux_ogg.c,v 1.127 2003/12/21 00:22:10 manfredtremmel Exp $
+ * $Id: demux_ogg.c,v 1.128 2003/12/23 21:22:38 miguelfreitas Exp $
*
* demultiplexer for ogg streams
*
@@ -252,44 +252,6 @@ static void get_stream_length (demux_ogg_t *this) {
}
-/* helper function to send data to fifo, breaking into smaller
- * pieces (bufs) as needed.
- */
-static void send_fifo_data(fifo_buffer_t *fifo, uint8_t *data, int size,
- off_t input_pos, int64_t pts,
- uint32_t type, uint32_t decoder_flags) {
- buf_element_t *buf;
-
- decoder_flags |= BUF_FLAG_FRAME_START;
-
- while (fifo && size) {
-
- buf = fifo->buffer_pool_alloc (fifo);
-
- if ( size > buf->max_size ) {
- buf->size = buf->max_size;
- buf->decoder_flags = decoder_flags;
- } else {
- buf->size = size;
- buf->decoder_flags = BUF_FLAG_FRAME_END | decoder_flags;
- }
- decoder_flags &= ~BUF_FLAG_FRAME_START;
-
- memcpy (buf->content, data, buf->size);
- data += buf->size;
- size -= buf->size;
-
- buf->pts = pts;
- pts = 0;
-
- buf->extra_info->input_pos = input_pos;
- buf->extra_info->input_time = buf->pts / 90 ;
- buf->type = type;
-
- fifo->put (fifo, buf);
- }
-}
-
#ifdef HAVE_THEORA
/* TODO: clean up this mess! */
static void send_ogg_packet (demux_ogg_t *this,
@@ -476,9 +438,12 @@ static void send_ogg_buf (demux_ogg_t *this,
this->header_granulepos[stream_num],
pts);
- send_fifo_data(this->audio_fifo, data, size,
- this->input->get_current_pos(this->input),
- pts, this->buf_types[stream_num], decoder_flags);
+ _x_demux_send_data(this->audio_fifo, data, size,
+ pts, this->buf_types[stream_num], decoder_flags,
+ this->input->get_current_pos(this->input),
+ this->input->get_length(this->input),
+ pts / 90, this->time_length, 0);
+
#ifdef HAVE_THEORA
} else if ((this->buf_types[stream_num] & 0xFFFF0000) == BUF_VIDEO_THEORA) {
@@ -606,9 +571,11 @@ static void send_ogg_buf (demux_ogg_t *this,
this->header_granulepos[stream_num],
pts);
- send_fifo_data(this->video_fifo, data, size,
- this->input->get_current_pos(this->input),
- pts, this->buf_types[stream_num], decoder_flags);
+ _x_demux_send_data(this->video_fifo, data, size,
+ pts, this->buf_types[stream_num], decoder_flags,
+ this->input->get_current_pos(this->input),
+ this->input->get_length(this->input),
+ pts / 90, this->time_length, 0);
if (this->chapter_info && op->granulepos != -1) {
int chapter = 0;
@@ -839,7 +806,10 @@ static void demux_ogg_send_header (demux_ogg_t *this) {
int32_t locsize, locdefault_len, locbuffersize, locwidth, locheight;
int64_t loctime_unit, locsamples_per_unit;
- memcpy(&locsubtype, &op.packet[9], 4);
+ /* 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]);
@@ -920,27 +890,25 @@ static void demux_ogg_send_header (demux_ogg_t *this) {
int channel;
int16_t locbits_per_sample, locchannels, locblockalign;
- uint32_t locsubtype;
int32_t locsize, locdefault_len, locbuffersize, locavgbytespersec;
int64_t loctime_unit, locsamples_per_unit;
- memcpy(&locsubtype, &op.packet[9], 4);
- memcpy(&locsize, &op.packet[13], 4);
- memcpy(&loctime_unit, &op.packet[17], 8);
- memcpy(&locsamples_per_unit, &op.packet[25], 8);
- memcpy(&locdefault_len, &op.packet[33], 4);
- memcpy(&locbuffersize, &op.packet[37], 4);
- memcpy(&locbits_per_sample, &op.packet[41], 2);
- memcpy(&locchannels, &op.packet[45], 2);
- memcpy(&locblockalign, &op.packet[47], 2);
- memcpy(&locavgbytespersec, &op.packet[49], 4);
+ 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, &locsubtype, 4);
+ memcpy(str, &op.packet[9], 4);
str[4] = 0;
codec = strtoul(str, NULL, 16);
@@ -1011,7 +979,7 @@ static void demux_ogg_send_header (demux_ogg_t *this) {
#endif
this->preview_buffers[stream_num] = 5; /* FIXME: don't know */
- if ( (*(int32_t*)(op.packet+96)==0x05589f80) && (op.bytes>=184)) {
+ if ( (LE_32(&op.packet[96])==0x05589f80) && (op.bytes>=184)) {
buf_element_t *buf;
xine_bmiheader bih;
@@ -1030,11 +998,11 @@ static void demux_ogg_send_header (demux_ogg_t *this) {
this->buf_types[stream_num] |= channel;
bih.biSize = sizeof(xine_bmiheader);
- bih.biWidth = *(int32_t*)(op.packet+176);
- bih.biHeight = *(int32_t*)(op.packet+180);
+ 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 = *(int16_t*)(op.packet+182);
+ bih.biBitCount = LE_16(&op.packet[182]);
if (!bih.biBitCount)
bih.biBitCount = 24; /* FIXME ? */
bih.biSizeImage = (bih.biBitCount>>3)*bih.biWidth*bih.biHeight;
@@ -1075,7 +1043,7 @@ static void demux_ogg_send_header (demux_ogg_t *this) {
this->ignore_keyframes = 1;
- } else if (*(int32_t*)op.packet+96 == 0x05589F81) {
+ } else if (LE_32(&op.packet[96]) == 0x05589F81) {
#if 0
/* FIXME: no test streams */
diff --git a/src/xine-engine/demux.c b/src/xine-engine/demux.c
index 2ce91fe4d..d3835a64a 100644
--- a/src/xine-engine/demux.c
+++ b/src/xine-engine/demux.c
@@ -20,7 +20,7 @@
* Demuxer helper functions
* hide some xine engine details from demuxers and reduce code duplication
*
- * $Id: demux.c,v 1.43 2003/12/05 15:55:04 f1rmb Exp $
+ * $Id: demux.c,v 1.44 2003/12/23 21:22:40 miguelfreitas Exp $
*/
@@ -456,3 +456,54 @@ off_t _x_read_abort (xine_stream_t *stream, int fd, char *buf, off_t todo) {
int _x_action_pending (xine_stream_t *stream) {
return stream->demux_action_pending;
}
+
+/*
+ * demuxer helper function to send data to fifo, breaking into smaller
+ * pieces (bufs) as needed.
+ *
+ * it has quite some parameters, but only the first 6 are needed.
+ *
+ * the other ones help enforcing that demuxers provide the information
+ * they have about the stream, so things like the GUI slider bar can
+ * work as expected.
+ */
+void _x_demux_send_data(fifo_buffer_t *fifo, uint8_t *data, int size,
+ int64_t pts, uint32_t type, uint32_t decoder_flags,
+ off_t input_pos, off_t input_length,
+ int input_time, int total_time,
+ uint32_t frame_number) {
+ buf_element_t *buf;
+
+ decoder_flags |= BUF_FLAG_FRAME_START;
+
+ while (fifo && size) {
+
+ buf = fifo->buffer_pool_alloc (fifo);
+
+ if ( size > buf->max_size ) {
+ buf->size = buf->max_size;
+ buf->decoder_flags = decoder_flags;
+ } else {
+ buf->size = size;
+ buf->decoder_flags = BUF_FLAG_FRAME_END | decoder_flags;
+ }
+ decoder_flags &= ~BUF_FLAG_FRAME_START;
+
+ xine_fast_memcpy (buf->content, data, buf->size);
+ data += buf->size;
+ size -= buf->size;
+
+ buf->pts = pts;
+ pts = 0;
+
+ buf->extra_info->input_pos = input_pos;
+ buf->extra_info->input_length = input_length;
+ buf->extra_info->input_time = input_time;
+ buf->extra_info->total_time = total_time;
+ buf->extra_info->frame_number = frame_number;
+
+ buf->type = type;
+
+ fifo->put (fifo, buf);
+ }
+}
diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h
index 979ec8227..00b475db2 100644
--- a/src/xine-engine/xine_internal.h
+++ b/src/xine-engine/xine_internal.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_internal.h,v 1.151 2003/12/09 00:02:38 f1rmb Exp $
+ * $Id: xine_internal.h,v 1.152 2003/12/23 21:22:41 miguelfreitas Exp $
*
*/
@@ -339,6 +339,13 @@ off_t _x_read_abort (xine_stream_t *stream, int fd, char *buf, off_t todo);
int _x_action_pending (xine_stream_t *stream);
+void _x_demux_send_data(fifo_buffer_t *fifo, uint8_t *data, int size,
+ int64_t pts, uint32_t type, uint32_t decoder_flags,
+ off_t input_pos, off_t input_length,
+ int input_time, int total_time,
+ uint32_t frame_number);
+
+
/*
* plugin_loader functions
*