summaryrefslogtreecommitdiff
path: root/src/demuxers
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers')
-rw-r--r--src/demuxers/demux_asf.c3
-rw-r--r--src/demuxers/demux_avi.c4
-rw-r--r--src/demuxers/demux_elem.c3
-rw-r--r--src/demuxers/demux_mpeg.c200
-rw-r--r--src/demuxers/demux_mpeg_block.c66
-rw-r--r--src/demuxers/demux_mpgaudio.c3
-rw-r--r--src/demuxers/demux_ogg.c3
-rw-r--r--src/demuxers/demux_pes.c5
-rw-r--r--src/demuxers/demux_qt.c4
9 files changed, 194 insertions, 97 deletions
diff --git a/src/demuxers/demux_asf.c b/src/demuxers/demux_asf.c
index b2da7551b..4555a03a0 100644
--- a/src/demuxers/demux_asf.c
+++ b/src/demuxers/demux_asf.c
@@ -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: demux_asf.c,v 1.8 2001/11/07 19:06:15 miguelfreitas Exp $
+ * $Id: demux_asf.c,v 1.9 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for asf streams
*
@@ -621,6 +621,7 @@ static void asf_send_buffer (demux_asf_t *this, asf_stream_t *stream,
buf->input_time = 0 ;
}
buf->PTS = timestamp * 90;
+ buf->SCR = timestamp * 90;
buf->type = stream->buf_type;
buf->size = frag_len;
diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c
index 81afaf1f9..2e831110c 100644
--- a/src/demuxers/demux_avi.c
+++ b/src/demuxers/demux_avi.c
@@ -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: demux_avi.c,v 1.50 2001/11/07 19:06:15 miguelfreitas Exp $
+ * $Id: demux_avi.c,v 1.51 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for avi streams
*
@@ -724,6 +724,7 @@ static int demux_avi_next (demux_avi_t *this) {
xprintf (VERBOSE|DEMUX|VAVI, "demux_avi: audio \n");
buf->PTS = audio_pts;
+ buf->SCR = audio_pts;
buf->size = AVI_read_audio (this, this->avi, buf->mem, 2048, &buf->decoder_info[0]);
if (buf->size<0) {
@@ -750,6 +751,7 @@ static int demux_avi_next (demux_avi_t *this) {
xprintf (VERBOSE|DEMUX|VAVI, "demux_avi: video \n");
buf->PTS = video_pts;
+ buf->SCR = video_pts;
buf->size = AVI_read_video (this, this->avi, buf->mem, 2048, &buf->decoder_info[0]);
buf->type = this->avi->video_type;
diff --git a/src/demuxers/demux_elem.c b/src/demuxers/demux_elem.c
index aae62c38b..2e019327c 100644
--- a/src/demuxers/demux_elem.c
+++ b/src/demuxers/demux_elem.c
@@ -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: demux_elem.c,v 1.26 2001/11/04 22:49:28 miguelfreitas Exp $
+ * $Id: demux_elem.c,v 1.27 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for elementary mpeg streams
*
@@ -87,6 +87,7 @@ static int demux_mpeg_elem_next (demux_mpeg_elem_t *this, int preview_mode) {
buf->decoder_info[0] = 1;
buf->PTS = 0;
+ buf->SCR = 0;
buf->input_pos = this->input->get_current_pos(this->input);
buf->type = BUF_VIDEO_MPEG;
diff --git a/src/demuxers/demux_mpeg.c b/src/demuxers/demux_mpeg.c
index de52c6b48..67de987c3 100644
--- a/src/demuxers/demux_mpeg.c
+++ b/src/demuxers/demux_mpeg.c
@@ -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: demux_mpeg.c,v 1.41 2001/10/27 13:59:31 guenter Exp $
+ * $Id: demux_mpeg.c,v 1.42 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for mpeg 1/2 program streams
* reads streams of variable blocksizes
@@ -67,6 +67,8 @@ typedef struct demux_mpeg_s {
int send_end_buffers;
+ uint32_t last_scr;
+
} demux_mpeg_t ;
static uint32_t read_bytes (demux_mpeg_t *this, int n) {
@@ -111,17 +113,17 @@ static uint32_t read_bytes (demux_mpeg_t *this, int n) {
return res;
}
-static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
+static void parse_mpeg2_packet (demux_mpeg_t *this, int stream_id, uint32_t scr) {
- int nLen, i;
+ int len, i;
uint32_t w, flags, header_len, pts;
buf_element_t *buf = NULL;
- nLen = read_bytes(this, 2);
+ len = read_bytes(this, 2);
- xprintf (VERBOSE|DEMUX|MPEG, " mpeg2 packet (len=%d",nLen);
+ xprintf (VERBOSE|DEMUX|MPEG, " mpeg2 packet (len=%d",len);
- if (nID==0xbd) {
+ if (stream_id==0xbd) {
int track;
@@ -131,7 +133,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
flags = read_bytes(this, 1);
header_len = read_bytes(this, 1);
- nLen -= header_len + 3;
+ len -= header_len + 3;
pts=0;
@@ -159,9 +161,9 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
/* contents */
if(this->audio_fifo)
- buf = this->input->read_block (this->input, this->audio_fifo, nLen-4);
+ buf = this->input->read_block (this->input, this->audio_fifo, len-4);
else {
- this->input->read (this->input, this->dummy_space, nLen-4);
+ this->input->read (this->input, this->dummy_space, len-4);
return;
}
@@ -171,6 +173,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
}
buf->type = BUF_AUDIO_A52 + track;
buf->PTS = pts;
+ buf->SCR = scr;
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -181,8 +184,8 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
if(this->audio_fifo)
this->audio_fifo->put (this->audio_fifo, buf);
- } else if ((nID & 0xe0) == 0xc0) {
- int track = nID & 0x1f;
+ } else if ((stream_id & 0xe0) == 0xc0) {
+ int track = stream_id & 0x1f;
xprintf (VERBOSE|DEMUX|AUDIO, ", audio #%d", track);
@@ -190,7 +193,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
flags = read_bytes(this, 1);
header_len = read_bytes(this, 1);
- nLen -= header_len + 3;
+ len -= header_len + 3;
pts = 0;
@@ -212,9 +215,9 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
i = this->input->read (this->input, this->dummy_space, header_len);
if(this->audio_fifo)
- buf = this->input->read_block (this->input, this->audio_fifo, nLen);
+ buf = this->input->read_block (this->input, this->audio_fifo, len);
else {
- this->input->read (this->input, this->dummy_space, nLen);
+ this->input->read (this->input, this->dummy_space, len);
return;
}
@@ -224,6 +227,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
}
buf->type = BUF_AUDIO_MPEG + track;
buf->PTS = pts;
+ buf->SCR = scr;
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -233,7 +237,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
if(this->audio_fifo)
this->audio_fifo->put (this->audio_fifo, buf);
- } else if ((nID >= 0xbc) && ((nID & 0xf0) == 0xe0)) {
+ } else if ((stream_id >= 0xbc) && ((stream_id & 0xf0) == 0xe0)) {
xprintf (VERBOSE|DEMUX|VIDEO, ",video");
@@ -241,7 +245,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
flags = read_bytes(this, 1);
header_len = read_bytes(this, 1);
- nLen -= header_len + 3;
+ len -= header_len + 3;
pts = 0;
@@ -264,7 +268,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
/* contents */
- buf = this->input->read_block (this->input, this->video_fifo, nLen);
+ buf = this->input->read_block (this->input, this->video_fifo, len);
if (buf == NULL) {
this->status = DEMUX_FINISHED;
@@ -272,6 +276,7 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
}
buf->type = BUF_VIDEO_MPEG;
buf->PTS = pts;
+ buf->SCR = scr;
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -283,17 +288,17 @@ static void parse_mpeg2_packet (demux_mpeg_t *this, int nID) {
} else {
xprintf (VERBOSE|DEMUX, ",unknown stream - skipped");
- i = this->input->read (this->input, this->dummy_space, nLen);
- /* (*this->input->seek) (nLen,SEEK_CUR); */
+ i = this->input->read (this->input, this->dummy_space, len);
+ /* (*this->input->seek) (len,SEEK_CUR); */
}
xprintf (VERBOSE|DEMUX, ")\n");
}
-static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
-{
- int nLen;
+static void parse_mpeg1_packet (demux_mpeg_t *this, int stream_id, uint32_t scr) {
+
+ int len;
uint32_t w;
int i;
int pts;
@@ -301,15 +306,15 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
xprintf (VERBOSE|DEMUX, " packet (");
- nLen = read_bytes(this, 2);
+ len = read_bytes(this, 2);
- xprintf (VERBOSE|DEMUX, "len=%d",nLen);
+ xprintf (VERBOSE|DEMUX, "len=%d",len);
pts=0;
- if (nID != 0xbf) {
+ if (stream_id != 0xbf) {
- w = read_bytes(this, 1); nLen--;
+ w = read_bytes(this, 1); len--;
while ((w & 0x80) == 0x80) {
@@ -317,7 +322,7 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
return;
/* stuffing bytes */
- w = read_bytes(this, 1); nLen--;
+ w = read_bytes(this, 1); len--;
}
if ((w & 0xC0) == 0x40) {
@@ -326,8 +331,8 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
return;
/* buffer_scale, buffer size */
- w = read_bytes(this, 1); nLen--;
- w = read_bytes(this, 1); nLen--;
+ w = read_bytes(this, 1); len--;
+ w = read_bytes(this, 1); len--;
}
if ((w & 0xF0) == 0x20) {
@@ -336,11 +341,11 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
return;
pts = (w & 0xe) << 29 ;
- w = read_bytes(this, 2); nLen -= 2;
+ w = read_bytes(this, 2); len -= 2;
pts |= (w & 0xFFFE) << 14;
- w = read_bytes(this, 2); nLen -= 2;
+ w = read_bytes(this, 2); len -= 2;
pts |= (w & 0xFFFE) >> 1;
xprintf (VERBOSE|DEMUX|VPTS, ", pts=%d",pts);
@@ -353,11 +358,11 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
return;
pts = (w & 0x0e) << 29 ;
- w = read_bytes(this, 2); nLen -= 2;
+ w = read_bytes(this, 2); len -= 2;
pts |= (w & 0xFFFE) << 14;
- w = read_bytes(this, 2); nLen -= 2;
+ w = read_bytes(this, 2); len -= 2;
pts |= (w & 0xFFFE) >> 1;
@@ -365,8 +370,8 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
xprintf (VERBOSE|DEMUX|VPTS, ", pts2=%d",pts);
/* Decoding Time Stamp */
- w = read_bytes(this, 3); nLen -= 3;
- w = read_bytes(this, 2); nLen -= 2;
+ w = read_bytes(this, 3); len -= 3;
+ w = read_bytes(this, 2); len -= 2;
} else {
xprintf (VERBOSE|DEMUX, ", w = %02x",w);
if (w != 0x0f)
@@ -375,15 +380,15 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
}
- if ((nID & 0xe0) == 0xc0) {
- int track = nID & 0x1f;
+ if ((stream_id & 0xe0) == 0xc0) {
+ int track = stream_id & 0x1f;
xprintf (VERBOSE|DEMUX|AUDIO, ", audio #%d", track);
if(this->audio_fifo) {
- buf = this->input->read_block (this->input, this->audio_fifo, nLen);
+ buf = this->input->read_block (this->input, this->audio_fifo, len);
} else {
- this->input->read (this->input, this->dummy_space, nLen);
+ this->input->read (this->input, this->dummy_space, len);
return;
}
@@ -393,6 +398,7 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
}
buf->type = BUF_AUDIO_MPEG + track ;
buf->PTS = pts;
+ buf->SCR = scr;
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -404,11 +410,11 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
if(this->audio_fifo)
this->audio_fifo->put (this->audio_fifo, buf);
- } else if ((nID & 0xf0) == 0xe0) {
+ } else if ((stream_id & 0xf0) == 0xe0) {
- xprintf (VERBOSE|DEMUX|VIDEO, ", video #%d", nID & 0x0f);
+ xprintf (VERBOSE|DEMUX|VIDEO, ", video #%d", stream_id & 0x0f);
- buf = this->input->read_block (this->input, this->video_fifo, nLen);
+ buf = this->input->read_block (this->input, this->video_fifo, len);
if (buf == NULL) {
this->status = DEMUX_FINISHED;
@@ -416,6 +422,7 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
}
buf->type = BUF_VIDEO_MPEG;
buf->PTS = pts;
+ buf->SCR = scr;
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -426,55 +433,91 @@ static void parse_mpeg1_packet (demux_mpeg_t *this, int nID)
this->video_fifo->put (this->video_fifo, buf);
- } else if (nID == 0xbd) {
+ } else if (stream_id == 0xbd) {
xprintf (VERBOSE|DEMUX|AC3, ", ac3");
- i = this->input->read (this->input, this->dummy_space, nLen);
+ i = this->input->read (this->input, this->dummy_space, len);
} else {
- xprintf (VERBOSE|DEMUX, ", unknown (nID = %d)",nID);
- this->input->read (this->input, this->dummy_space, nLen);
+ xprintf (VERBOSE|DEMUX, ", unknown (stream_id = %d)",stream_id);
+ this->input->read (this->input, this->dummy_space, len);
}
xprintf (VERBOSE|DEMUX, ")\n");
}
-static uint32_t parse_pack(demux_mpeg_t *this)
-{
- uint32_t buf ;
- int mpeg_version;
+static uint32_t parse_pack(demux_mpeg_t *this) {
+
+ uint32_t buf ;
+ int mpeg_version;
+ uint32_t scr;
xprintf (VERBOSE|DEMUX, "pack {\n");
- /* system_clock_reference */
buf = read_bytes (this, 1);
xprintf (VERBOSE|DEMUX|VIDEO, " mpeg version : %02x",buf>>4);
if ((buf>>4) == 4) {
- xprintf (VERBOSE|DEMUX|VIDEO, " => mpeg II \n");
- buf = read_bytes(this, 2);
- mpeg_version = 2;
- } else {
- xprintf (VERBOSE|DEMUX|VIDEO, " => mpeg I \n");
- mpeg_version = 1;
- }
- buf = read_bytes (this, 2);
- buf = read_bytes (this, 2);
-
- /* mux_rate */
-
- if (!this->rate) {
- buf = read_bytes (this,1);
- this->rate = (buf & 0x7F) << 15;
- buf = read_bytes (this,1);
- this->rate |= (buf << 7);
- buf = read_bytes (this,1);
- this->rate |= (buf >> 1);
+ int stuffing, i;
- /* printf ("demux_mpeg: mux_rate = %d\n",this->rate); */
+ xprintf (VERBOSE|DEMUX|VIDEO, " => mpeg II \n");
+
+ mpeg_version = 2;
+
+ /* system_clock_reference */
+
+ scr = (buf & 0x08) << 27;
+ scr = (buf & 0x03) << 28;
+ buf = read_bytes (this, 1);
+ scr |= buf << 20;
+ buf = read_bytes (this, 1);
+ scr |= (buf & 0xF8) << 12 ;
+ scr |= (buf & 0x03) << 13 ;
+ buf = read_bytes (this, 1);
+ scr |= buf << 5;
+ buf = read_bytes (this, 1);
+ scr |= (buf & 0xF8) >> 3;
+ buf = read_bytes (this, 1); /* extension */
+
+ /* mux_rate */
+
+ buf = read_bytes(this,3);
+ if (!this->rate) {
+ this->rate = (buf & 0xFFFFFC) >> 2;
+ }
+
+ /* stuffing bytes */
+ buf = read_bytes(this,1);
+ stuffing = buf &0x03;
+ for (i=0; i<stuffing; i++)
+ read_bytes (this, 1);
- } else
- buf = read_bytes (this, 3) ;
+ } else {
+ xprintf (VERBOSE|DEMUX|VIDEO, " => mpeg I \n");
+ mpeg_version = 1;
+ /* system_clock_reference */
+
+ scr = (buf & 0x2) << 30;
+ buf = read_bytes (this, 2);
+ scr |= (buf & 0xFFFE) << 14;
+ buf = read_bytes (this, 2);
+ scr |= (buf & 0xFFFE) >>1;
+
+ /* mux_rate */
+
+ if (!this->rate) {
+ buf = read_bytes (this,1);
+ this->rate = (buf & 0x7F) << 15;
+ buf = read_bytes (this,1);
+ this->rate |= (buf << 7);
+ buf = read_bytes (this,1);
+ this->rate |= (buf >> 1);
+
+ /* printf ("demux_mpeg: mux_rate = %d\n",this->rate); */
+
+ } else
+ buf = read_bytes (this, 3) ;
+ }
/* system header */
@@ -500,9 +543,9 @@ static uint32_t parse_pack(demux_mpeg_t *this)
return buf;
if (mpeg_version == 1)
- parse_mpeg1_packet (this, buf & 0xFF);
+ parse_mpeg1_packet (this, buf & 0xFF, scr);
else
- parse_mpeg2_packet (this, buf & 0xFF);
+ parse_mpeg2_packet (this, buf & 0xFF, scr);
buf = read_bytes (this, 4);
xprintf (VERBOSE|DEMUX, " code = %08x\n",buf);
@@ -565,9 +608,9 @@ static uint32_t parse_pack_preview (demux_mpeg_t *this, int *num_buffers)
return buf;
if (mpeg_version == 1)
- parse_mpeg1_packet (this, buf & 0xFF);
+ parse_mpeg1_packet (this, buf & 0xFF, 0);
else
- parse_mpeg2_packet (this, buf & 0xFF);
+ parse_mpeg2_packet (this, buf & 0xFF, 0);
buf = read_bytes (this, 4);
*num_buffers = *num_buffers - 1;
@@ -683,7 +726,8 @@ static void demux_mpeg_start (demux_plugin_t *this_gen,
this->video_fifo = video_fifo;
this->audio_fifo = audio_fifo;
- this->rate = 0; /* fixme */
+ this->rate = 0; /* fixme */
+ this->last_scr = 0;
buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
buf->type = BUF_CONTROL_START;
diff --git a/src/demuxers/demux_mpeg_block.c b/src/demuxers/demux_mpeg_block.c
index 5aeffe3be..fc54626e1 100644
--- a/src/demuxers/demux_mpeg_block.c
+++ b/src/demuxers/demux_mpeg_block.c
@@ -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: demux_mpeg_block.c,v 1.59 2001/10/25 00:46:59 miguelfreitas Exp $
+ * $Id: demux_mpeg_block.c,v 1.60 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for mpeg 1/2 program streams
*
@@ -67,6 +67,7 @@ typedef struct demux_mpeg_block_s {
uint8_t *scratch;
+ uint32_t last_scr;
} demux_mpeg_block_t ;
@@ -79,6 +80,7 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
uint32_t PTS;
uint32_t packet_len;
uint32_t stream_id;
+ uint32_t scr = this->last_scr;
buf = this->input->read_block (this->input, this->video_fifo, this->blocksize);
@@ -167,6 +169,18 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
if (bMpeg1) {
+ /* system_clock_reference */
+
+ scr = (p[4] & 0x02) << 30;
+ scr |= (p[5] & 0xFF) << 22;
+ scr |= (p[5] & 0xFE) << 14;
+ scr |= (p[6] & 0xFF) << 7;
+ scr |= (p[7] & 0xFE) >> 1;
+
+ buf->SCR = scr;
+
+ /* mux_rate */
+
if (!this->rate) {
this->rate = (p[9] & 0x7F) << 15;
this->rate |= (p[10] << 7);
@@ -178,26 +192,27 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
p += 12;
} else { /* mpeg2 */
+
+ int num_stuffing_bytes;
- int num_stuffing_bytes;
-
- /* SCR decoding code works but is not used by xine
- int scr;
+ /* system_clock_reference */
- scr = (p[4] & 0x38) << 27 ;
+ scr = (p[4] & 0x08) << 27 ;
scr |= (p[4] & 0x03) << 28 ;
scr |= p[5] << 20;
scr |= (p[6] & 0xF8) << 12 ;
scr |= (p[6] & 0x03) << 13 ;
scr |= p[7] << 5;
scr |= (p[8] & 0xF8) >> 3;
-
- optional - decode extension:
-
+ /* optional - decode extension:
scr *=300;
scr += ( (p[8] & 0x03 << 7) | (p[9] & 0xFE >> 1) );
*/
+ buf->SCR = scr;
+
+ /* mux_rate */
+
if (!this->rate) {
this->rate = (p[0xA] << 14);
this->rate |= (p[0xB] << 6);
@@ -235,7 +250,29 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
this->status = DEMUX_FINISHED;
}
- return ;
+ return;
+ }
+
+ /* discontinuity ? */
+ {
+ int32_t scr_diff = scr - this->last_scr;
+ if (abs(scr_diff) > 60000) {
+
+ buf_element_t *buf;
+
+ buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
+ buf->type = BUF_CONTROL_AVSYNC_RESET;
+ buf->SCR = scr;
+ this->video_fifo->put (this->video_fifo, buf);
+
+ if (this->audio_fifo) {
+ buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
+ buf->type = BUF_CONTROL_AVSYNC_RESET;
+ buf->SCR = scr;
+ this->audio_fifo->put (this->audio_fifo, buf);
+ }
+ }
+ this->last_scr = scr;
}
packet_len = p[4] << 8 | p[5];
@@ -308,7 +345,7 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
PTS |= (p[11] & 0xFE) << 14 ;
PTS |= p[12] << 7 ;
PTS |= (p[13] & 0xFE) >> 1 ;
-
+
} else
PTS = 0;
@@ -332,6 +369,8 @@ static void demux_mpeg_block_parse_pack (demux_mpeg_block_t *this, int preview_m
packet_len -= header_len + 3;
}
+ PTS &= 0x7FFFFFFF ; /* 31 bit only (for signed calculations) */
+
if (stream_id == 0xbd) {
int track, spu_id;
@@ -744,6 +783,8 @@ static void demux_mpeg_block_start (demux_plugin_t *this_gen,
this->rate = demux_mpeg_block_estimate_rate (this);
+ this->last_scr = 0;
+
if((this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) != 0) {
int num_buffers = NUM_PREVIEW_BUFFERS;
@@ -792,7 +833,8 @@ static void demux_mpeg_block_start (demux_plugin_t *this_gen,
* now start demuxing
*/
- this->status = DEMUX_OK ;
+ this->status = DEMUX_OK ;
+ this->last_scr = 0;
if ((err = pthread_create (&this->thread,
NULL, demux_mpeg_block_loop, this)) != 0) {
diff --git a/src/demuxers/demux_mpgaudio.c b/src/demuxers/demux_mpgaudio.c
index 097b8344a..6ec5113be 100644
--- a/src/demuxers/demux_mpgaudio.c
+++ b/src/demuxers/demux_mpgaudio.c
@@ -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: demux_mpgaudio.c,v 1.26 2001/10/25 00:46:59 miguelfreitas Exp $
+ * $Id: demux_mpgaudio.c,v 1.27 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for mpeg audio (i.e. mp3) streams
*
@@ -186,6 +186,7 @@ static int demux_mpgaudio_next (demux_mpgaudio_t *this) {
}
buf->PTS = 0;
+ buf->SCR = 0;
buf->input_pos = this->input->get_current_pos(this->input);
buf->input_time = buf->input_pos * this->stream_length /
this->input->get_length(this->input);
diff --git a/src/demuxers/demux_ogg.c b/src/demuxers/demux_ogg.c
index 8c542c00e..4842becb7 100644
--- a/src/demuxers/demux_ogg.c
+++ b/src/demuxers/demux_ogg.c
@@ -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: demux_ogg.c,v 1.7 2001/11/06 21:47:30 miguelfreitas Exp $
+ * $Id: demux_ogg.c,v 1.8 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for ogg streams
*
@@ -163,6 +163,7 @@ static void demux_ogg_send_package (demux_ogg_t *this, int is_content) {
}
buf->PTS = 0; /* FIXME */
+ buf->SCR = 0; /* FIXME */
buf->size = op.bytes;
buf->decoder_info[0] = is_content;
diff --git a/src/demuxers/demux_pes.c b/src/demuxers/demux_pes.c
index 868cec381..77defa9a7 100644
--- a/src/demuxers/demux_pes.c
+++ b/src/demuxers/demux_pes.c
@@ -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: demux_pes.c,v 1.11 2001/10/25 00:46:59 miguelfreitas Exp $
+ * $Id: demux_pes.c,v 1.12 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for mpeg 2 PES (Packetized Elementary Streams)
* reads streams of variable blocksizes
@@ -168,6 +168,7 @@ static void parse_mpeg2_packet (demux_pes_t *this, int nID) {
}
buf->type = BUF_AUDIO_A52 + track;
buf->PTS = pts;
+ buf->SCR = pts; /* FIMXE! */
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -217,6 +218,7 @@ static void parse_mpeg2_packet (demux_pes_t *this, int nID) {
}
buf->type = BUF_AUDIO_MPEG + track;
buf->PTS = pts;
+ buf->SCR = pts; /* FIXME ! */
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
@@ -266,6 +268,7 @@ static void parse_mpeg2_packet (demux_pes_t *this, int nID) {
}
buf->type = BUF_VIDEO_MPEG;
buf->PTS = pts;
+ buf->SCR = pts; /* FIXME! */
if (this->preview_mode)
buf->decoder_info[0] = 0;
else
diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c
index a28edafef..a214f0326 100644
--- a/src/demuxers/demux_qt.c
+++ b/src/demuxers/demux_qt.c
@@ -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: demux_qt.c,v 1.10 2001/11/07 18:26:36 miguelfreitas Exp $
+ * $Id: demux_qt.c,v 1.11 2001/11/10 13:48:02 guenter Exp $
*
* demultiplexer for quicktime streams, based on:
*
@@ -3992,6 +3992,7 @@ static void *demux_qt_loop (void *this_gen) {
/* int count; */
buf->PTS = audio_pts;
+ buf->SCR = audio_pts;
buf->type = this->audio_type;
buf->decoder_info[0] = 1;
buf->input_time = 0;
@@ -4038,6 +4039,7 @@ static void *demux_qt_loop (void *this_gen) {
buf->content = buf->mem;
buf->size = copy_bytes;
buf->PTS = video_pts;
+ buf->SCR = video_pts;
buf->type = this->video_type;
buf->input_time = video_pts / 90000;
buf->input_pos = this->input->get_current_pos(this->input);