summaryrefslogtreecommitdiff
path: root/src/demuxers/demux_mpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/demuxers/demux_mpeg.c')
-rw-r--r--src/demuxers/demux_mpeg.c106
1 files changed, 56 insertions, 50 deletions
diff --git a/src/demuxers/demux_mpeg.c b/src/demuxers/demux_mpeg.c
index 1e4649701..5242af47b 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.75 2002/09/05 22:18:52 mroi Exp $
+ * $Id: demux_mpeg.c,v 1.76 2002/09/18 00:51:33 guenter Exp $
*
* demultiplexer for mpeg 1/2 program streams
* reads streams of variable blocksizes
@@ -834,53 +834,58 @@ static int demux_mpeg_get_status (demux_plugin_t *this_gen) {
return (this->thread_running?DEMUX_OK:DEMUX_FINISHED);
}
-static int demux_mpeg_start (demux_plugin_t *this_gen,
- fifo_buffer_t *video_fifo,
- fifo_buffer_t *audio_fifo,
- off_t start_pos, int start_time) {
-
- demux_mpeg_t *this = (demux_mpeg_t *) this_gen;
- int err;
- int status;
-
+static int demux_mpeg_send_headers (demux_mpeg_t *this) {
pthread_mutex_lock( &this->mutex );
- if( !this->thread_running ) {
-
- this->video_fifo = video_fifo;
- this->audio_fifo = audio_fifo;
-
- this->rate = 0; /* fixme */
- this->last_pts[0] = 0;
- this->last_pts[1] = 0;
+ this->video_fifo = this->xine->video_fifo;
+ this->audio_fifo = this->xine->audio_fifo;
- xine_demux_control_start(this->xine);
-
- if ((this->input->get_capabilities (this->input) & INPUT_CAP_PREVIEW) != 0 ) {
-
- uint32_t w;
- int num_buffers = NUM_PREVIEW_BUFFERS;
-
- this->preview_mode = 1;
-
- this->input->seek (this->input, 4, SEEK_SET);
-
- this->status = DEMUX_OK ;
+ this->rate = 0; /* fixme */
+ this->last_pts[0] = 0;
+ this->last_pts[1] = 0;
+
+ xine_demux_control_start(this->xine);
+
+ if ((this->input->get_capabilities (this->input) & INPUT_CAP_PREVIEW) != 0 ) {
+
+ uint32_t w;
+ int num_buffers = NUM_PREVIEW_BUFFERS;
+
+ this->preview_mode = 1;
+
+ this->input->seek (this->input, 4, SEEK_SET);
+
+ this->status = DEMUX_OK ;
+
+ do {
+
+ w = parse_pack_preview (this, &num_buffers);
+
+ if (w != 0x000001ba)
+ demux_mpeg_resync (this, w);
+
+ num_buffers --;
+
+ } while ( (this->status == DEMUX_OK) && (num_buffers>0)) ;
+
+ /* printf ("demux_mpeg: rate %d\n", this->rate); */
+ }
- do {
+ xine_demux_control_headers_done (this->xine);
- w = parse_pack_preview (this, &num_buffers);
+ pthread_mutex_unlock (&this->mutex);
- if (w != 0x000001ba)
- demux_mpeg_resync (this, w);
+ return DEMUX_CAN_HANDLE;
+}
- num_buffers --;
+static int demux_mpeg_start (demux_plugin_t *this_gen,
+ off_t start_pos, int start_time) {
- } while ( (this->status == DEMUX_OK) && (num_buffers>0)) ;
+ demux_mpeg_t *this = (demux_mpeg_t *) this_gen;
+ int err;
+ int status;
- /* printf ("demux_mpeg: rate %d\n", this->rate); */
- }
- }
+ pthread_mutex_lock( &this->mutex );
if ((this->input->get_capabilities (this->input) & INPUT_CAP_SEEKABLE) != 0 ) {
@@ -926,10 +931,9 @@ static int demux_mpeg_start (demux_plugin_t *this_gen,
static int demux_mpeg_seek (demux_plugin_t *this_gen,
off_t start_pos, int start_time) {
- demux_mpeg_t *this = (demux_mpeg_t *) this_gen;
+ /* demux_mpeg_t *this = (demux_mpeg_t *) this_gen; */
- return demux_mpeg_start (this_gen, this->video_fifo, this->audio_fifo,
- start_pos, start_time);
+ return demux_mpeg_start (this_gen, start_pos, start_time);
}
static int demux_mpeg_open(demux_plugin_t *this_gen,
@@ -966,7 +970,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
pckbuf = read_bytes (this, 1);
if ((pckbuf>>4) != 4) {
this->input = input;
- return DEMUX_CAN_HANDLE;
+ return demux_mpeg_send_headers (this);
}
}
break;
@@ -978,7 +982,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
pckbuf = read_bytes (this, 1);
if ((pckbuf>>4) != 4) {
this->input = input;
- return DEMUX_CAN_HANDLE;
+ return demux_mpeg_send_headers (this);
}
}
break;
@@ -1010,7 +1014,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
pckbuf = read_bytes (this, 1);
if ((pckbuf>>4) != 4) {
this->input = input;
- return DEMUX_CAN_HANDLE;
+ return demux_mpeg_send_headers (this);
}
}
break;
@@ -1041,7 +1045,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
for (j = 0; j < 1024 - 4; j++) {
if (BE_32(&buf[j]) == MPEG_MARKER) {
this->input = input;
- return DEMUX_CAN_HANDLE;
+ return demux_mpeg_send_headers (this);
}
}
}
@@ -1074,7 +1078,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
if(!strncmp((media + 3), "mpeg1", 5)) {
this->input = input;
- return DEMUX_CAN_HANDLE;
+ return demux_mpeg_send_headers (this);
}
else if(!strncasecmp((media + 3), "mpeg2", 5)) {
return DEMUX_CANNOT_HANDLE;
@@ -1102,7 +1106,7 @@ static int demux_mpeg_open(demux_plugin_t *this_gen,
if(!strcasecmp((ending + 1), m)) {
this->input = input;
- return DEMUX_CAN_HANDLE;
+ return demux_mpeg_send_headers (this);
}
}
}
@@ -1125,7 +1129,7 @@ static char *demux_mpeg_get_mimetypes(void) {
"video/x-mpeg: mpeg, mpg, mpe: MPEG animation;";
}
-static void demux_mpeg_close (demux_plugin_t *this) {
+static void demux_mpeg_dispose (demux_plugin_t *this) {
free (this);
}
@@ -1161,13 +1165,15 @@ static void *init_demuxer_plugin (xine_t *xine, void *data) {
this->demux_plugin.start = demux_mpeg_start;
this->demux_plugin.seek = demux_mpeg_seek;
this->demux_plugin.stop = demux_mpeg_stop;
- this->demux_plugin.close = demux_mpeg_close;
+ this->demux_plugin.dispose = demux_mpeg_dispose;
this->demux_plugin.get_status = demux_mpeg_get_status;
this->demux_plugin.get_identifier = demux_mpeg_get_id;
this->demux_plugin.get_stream_length = demux_mpeg_get_stream_length;
this->demux_plugin.get_mimetypes = demux_mpeg_get_mimetypes;
this->status = DEMUX_FINISHED;
+ this->xine = xine;
+
pthread_mutex_init( &this->mutex, NULL );
return this;