diff libmpdemux/demux_mpg.c @ 16310:fb95057e370e

support MPEG in GXF container with extension-based detection.
author reimar
date Fri, 26 Aug 2005 17:40:02 +0000
parents 6b86089c2edd
children 6720cdd99559
line wrap: on
line diff
--- a/libmpdemux/demux_mpg.c	Thu Aug 25 21:46:32 2005 +0000
+++ b/libmpdemux/demux_mpg.c	Fri Aug 26 17:40:02 2005 +0000
@@ -506,6 +506,36 @@
   return 1;
 }
 
+static int demux_mpg_gxf_fill_buffer(demuxer_t *demux, demux_stream_t *ds) {
+  demux_packet_t *pack;
+  uint32_t state = (uint32_t)demux->priv;
+  int pos = 0;
+  int discard = 0;
+  unsigned char *buf;
+  if (demux->stream->eof)
+    return 0;
+  demux->filepos = stream_tell(demux->stream);
+  pack = new_demux_packet(STREAM_BUFFER_SIZE);
+  buf = pack->buffer;
+  while (pos < STREAM_BUFFER_SIZE) {
+    register int c = stream_read_char(demux->stream);
+    if (c < 0) { // EOF
+      resize_demux_packet(pack, pos);
+      break;
+    }
+    state = state << 8 | c;
+    if (state == 0x1bc || state == 0x1bf)
+      discard = 1;
+    else if (state == 0x100)
+      discard = 0;
+    if (!discard)
+      buf[pos++] = c;
+  }
+  ds_add_packet(ds, pack);
+  demux->priv = (void *)state;
+  return 1;
+}
+
 int demux_mpg_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
 unsigned int head=0;
 int skipped=0;
@@ -789,6 +819,13 @@
     return demuxer;
 }
 
+static demuxer_t *demux_mpg_gxf_open(demuxer_t *demuxer) {
+  demuxer->audio->sh = NULL;
+  demuxer->video->sh = new_sh_video(demuxer,0);
+  ((sh_video_t *)demuxer->video->sh)->ds = demuxer->video;
+  demuxer->priv = (void *) 0xffffffff;
+  return demuxer;
+}
 
 static demuxer_t* demux_mpg_ps_open(demuxer_t* demuxer)
 {
@@ -844,6 +881,22 @@
 };
 
 
+demuxer_desc_t demuxer_desc_mpeg_gxf = {
+  "MPEG ES in GXF demuxer",
+  "mpeggxf",
+  "MPEG-ES in GXF",
+  "Reimar Döffinger",
+  "Mpeg",
+  DEMUXER_TYPE_MPEG_GXF,
+  0, // hack autodetection
+  NULL,
+  demux_mpg_gxf_fill_buffer,
+  demux_mpg_gxf_open,
+  NULL,
+  NULL,
+  NULL
+};
+
 demuxer_desc_t demuxer_desc_mpeg_es = {
   "MPEG ES demuxer",
   "mpeges",