summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/demuxers/demux_mpeg_block.c198
1 files changed, 109 insertions, 89 deletions
diff --git a/src/demuxers/demux_mpeg_block.c b/src/demuxers/demux_mpeg_block.c
index 150414857..9e5ab3399 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.96 2002/04/29 23:31:59 jcdutton Exp $
+ * $Id: demux_mpeg_block.c,v 1.97 2002/05/01 13:30:39 miguelfreitas Exp $
*
* demultiplexer for mpeg 1/2 program streams
*
@@ -869,6 +869,29 @@ static int demux_mpeg_block_get_status (demux_plugin_t *this_gen) {
return this->status;
}
+static int demux_mpeg_detect_blocksize(demux_mpeg_block_t *this,
+ input_plugin_t *input)
+{
+ input->seek(input, 2048, SEEK_SET);
+ if (!input->read(input, this->scratch, 4))
+ return 0;
+
+ if (this->scratch[0] || this->scratch[1]
+ || (this->scratch[2] != 0x01) || (this->scratch[3] != 0xba)) {
+
+ input->seek(input, 2324, SEEK_SET);
+ if (!input->read(input, this->scratch, 4))
+ return 0;
+ if (this->scratch[0] || this->scratch[1]
+ || (this->scratch[2] != 0x01) || (this->scratch[3] != 0xba))
+ return 0;
+
+ return 2324;
+ } else
+ return 2048;
+}
+
+
static void demux_mpeg_block_start (demux_plugin_t *this_gen,
fifo_buffer_t *video_fifo,
fifo_buffer_t *audio_fifo,
@@ -883,97 +906,110 @@ static void demux_mpeg_block_start (demux_plugin_t *this_gen,
this->video_fifo = video_fifo;
this->audio_fifo = audio_fifo;
- if( this->status != DEMUX_OK ) {
- /*
- * send start buffer
- */
-
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
- buf->type = BUF_CONTROL_START;
- this->video_fifo->put (this->video_fifo, buf);
+ if((this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) != 0) {
+ if (!this->blocksize)
+ this->blocksize = demux_mpeg_detect_blocksize( this, this->input );
+ }
+
+ if( this->blocksize ) {
+
+ if( this->status != DEMUX_OK ) {
+ /*
+ * send start buffer
+ */
- if(this->audio_fifo) {
- buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
+ buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
buf->type = BUF_CONTROL_START;
- this->audio_fifo->put (this->audio_fifo, buf);
- }
+ this->video_fifo->put (this->video_fifo, buf);
- if (!this->rate)
- this->rate = demux_mpeg_block_estimate_rate (this);
+ if(this->audio_fifo) {
+ buf = this->audio_fifo->buffer_pool_alloc (this->audio_fifo);
+ buf->type = BUF_CONTROL_START;
+ this->audio_fifo->put (this->audio_fifo, buf);
+ }
- this->last_scr = 0;
- this->nav_last_end_pts = 0;
- this->ignore_scr_discont = 0;
+ if (!this->rate)
+ this->rate = demux_mpeg_block_estimate_rate (this);
- if((this->input->get_capabilities(this->input) & INPUT_CAP_PREVIEW) != 0) {
+ this->last_scr = 0;
+ this->nav_last_end_pts = 0;
+ this->ignore_scr_discont = 0;
- int num_buffers = NUM_PREVIEW_BUFFERS;
+ if((this->input->get_capabilities(this->input) & INPUT_CAP_PREVIEW) != 0) {
- this->input->seek (this->input, 0, SEEK_SET);
+ int num_buffers = NUM_PREVIEW_BUFFERS;
- this->status = DEMUX_OK ;
- while ( (num_buffers>0) && (this->status == DEMUX_OK) ) {
+ this->input->seek (this->input, 0, SEEK_SET);
- demux_mpeg_block_parse_pack(this, 1);
- num_buffers --;
+ this->status = DEMUX_OK ;
+ while ( (num_buffers>0) && (this->status == DEMUX_OK) ) {
+
+ demux_mpeg_block_parse_pack(this, 1);
+ num_buffers --;
+ }
}
+ this->status = DEMUX_FINISHED;
}
- this->status = DEMUX_FINISHED;
- }
- if((this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) != 0) {
- if (start_pos) {
- start_pos /= (off_t) this->blocksize;
- start_pos *= (off_t) this->blocksize;
+ if((this->input->get_capabilities(this->input) & INPUT_CAP_SEEKABLE) != 0) {
+
+ if (start_pos) {
+ start_pos /= (off_t) this->blocksize;
+ start_pos *= (off_t) this->blocksize;
+
+ this->input->seek (this->input, start_pos, SEEK_SET);
+ } else if (start_time) {
+ start_pos = start_time * this->rate * 50;
+ start_pos /= (off_t) this->blocksize;
+ start_pos *= (off_t) this->blocksize;
- this->input->seek (this->input, start_pos, SEEK_SET);
- } else if (start_time) {
- start_pos = start_time * this->rate * 50;
- start_pos /= (off_t) this->blocksize;
- start_pos *= (off_t) this->blocksize;
+ this->input->seek (this->input, start_pos, SEEK_SET);
+ } else
+ this->input->seek (this->input, 0, SEEK_SET);
+ }
- this->input->seek (this->input, start_pos, SEEK_SET);
- } else
- this->input->seek (this->input, 0, SEEK_SET);
- }
+ /*
+ * query CLUT from the input plugin
+ */
- /*
- * query CLUT from the input plugin
- */
+ buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
- buf = this->video_fifo->buffer_pool_alloc (this->video_fifo);
+ if ((this->input->get_capabilities(this->input) & INPUT_CAP_CLUT) &&
+ ((this->input->get_optional_data(this->input, buf->mem, INPUT_OPTIONAL_DATA_CLUT)
+ == INPUT_OPTIONAL_SUCCESS))) {
+ buf->type = BUF_SPU_CLUT;
+ buf->content = buf->mem;
+
+ this->video_fifo->put(this->video_fifo, buf);
+ } else {
+ buf->free_buffer(buf);
+ }
- if ((this->input->get_capabilities(this->input) & INPUT_CAP_CLUT) &&
- ((this->input->get_optional_data(this->input, buf->mem, INPUT_OPTIONAL_DATA_CLUT)
- == INPUT_OPTIONAL_SUCCESS))) {
- buf->type = BUF_SPU_CLUT;
- buf->content = buf->mem;
+ /*
+ * now start demuxing
+ */
- this->video_fifo->put(this->video_fifo, buf);
- } else {
- buf->free_buffer(buf);
- }
-
- /*
- * now start demuxing
- */
-
- if( this->status != DEMUX_OK )
- {
- this->status = DEMUX_OK ;
- this->last_scr = 0;
- this->nav_last_end_pts = 0;
- this->ignore_scr_discont = 0;
+ if( this->status != DEMUX_OK ) {
+
+ this->status = DEMUX_OK ;
+ this->last_scr = 0;
+ this->nav_last_end_pts = 0;
+ this->ignore_scr_discont = 0;
- if ((err = pthread_create (&this->thread,
+ if ((err = pthread_create (&this->thread,
NULL, demux_mpeg_block_loop, this)) != 0) {
- printf ("demux_mpeg_block: can't create new thread (%s)\n",
+ printf ("demux_mpeg_block: can't create new thread (%s)\n",
strerror(err));
- abort();
+ abort();
+ }
+ }
+ else {
+ xine_flush_engine(this->xine);
}
}
else {
- xine_flush_engine(this->xine);
+ printf("demux_mpeg_block: unknown block size. try using demux_mpeg.\n");
+ this->status = DEMUX_FINISHED ;
}
pthread_mutex_unlock( &this->mutex );
}
@@ -1020,27 +1056,11 @@ static int demux_mpeg_block_open(demux_plugin_t *this_gen,
this->blocksize = input->get_blocksize(input);
- if (!this->blocksize) {
-
- /* detect blocksize */
- input->seek(input, 2048, SEEK_SET);
- if (!input->read(input, this->scratch, 4))
- return DEMUX_CANNOT_HANDLE;
-
- if (this->scratch[0] || this->scratch[1]
- || (this->scratch[2] != 0x01) || (this->scratch[3] != 0xba)) {
+ if (!this->blocksize)
+ this->blocksize = demux_mpeg_detect_blocksize( this, input );
- input->seek(input, 2324, SEEK_SET);
- if (!input->read(input, this->scratch, 4))
- return DEMUX_CANNOT_HANDLE;
- if (this->scratch[0] || this->scratch[1]
- || (this->scratch[2] != 0x01) || (this->scratch[3] != 0xba))
- return DEMUX_CANNOT_HANDLE;
- this->blocksize = 2324;
-
- } else
- this->blocksize = 2048;
- }
+ if (!this->blocksize)
+ return DEMUX_CANNOT_HANDLE;
input->seek(input, 0, SEEK_SET);
if (input->read(input, this->scratch, this->blocksize)) {
@@ -1118,7 +1138,7 @@ static int demux_mpeg_block_open(demux_plugin_t *this_gen,
while(*m == ' ' || *m == '\t') m++;
if(!strcasecmp((ending + 1), m)) {
- this->blocksize = 2048;
+ this->blocksize = 0;
demux_mpeg_block_accept_input (this, input);
return DEMUX_CAN_HANDLE;
}