diff libmpdemux/parse_mp4.c @ 5305:77ac28af44ec

- Add parsing of Sync Layer Descriptor - Add a function to cleanup malloced mem from mp4_parse_esds - Fix some weird code from me :)
author atmos4
date Sun, 24 Mar 2002 06:10:13 +0000
parents 534f16f50c17
children a3874da21700
line wrap: on
line diff
--- a/libmpdemux/parse_mp4.c	Sun Mar 24 03:08:20 2002 +0000
+++ b/libmpdemux/parse_mp4.c	Sun Mar 24 06:10:13 2002 +0000
@@ -29,10 +29,10 @@
   return length;
 }
 
+/* parse the data part of MP4 esds atoms */
 int mp4_parse_esds(unsigned char *data, int datalen, esds_t *esds) {
   /* create memory stream from data */
   stream_t *s = new_memory_stream(data, datalen);
-  uint8_t tag;
   uint8_t len;
 
   esds->version = stream_read_char(s);
@@ -42,8 +42,7 @@
       esds->version, esds->flags);
 
   /* get and verify ES_DescrTag */
-  tag = stream_read_char(s);
-  if (tag == MP4ESDescrTag) {
+  if (stream_read_char(s) == MP4ESDescrTag) {
     /* read length */
     if ((len = mp4_read_descr_len(s)) < 5 + 15) {
       freereturn(s,1);
@@ -107,11 +106,40 @@
   mp_msg(MSGT_DEMUX, MP4_DL,
       "ESDS MPEG4 Decoder Specific Descriptor (%dBytes)\n", len);
 
+  /* get and verify SLConfigDescrTag */
+  if(stream_read_char(s) != MP4SLConfigDescrTag) {
+    freereturn(s,1);
+  }
+
+  if((len = mp4_read_descr_len(s)) < 1) {
+    freereturn(s,1);
+  }
+
+  /* Note: SLConfig is usually constant value 2 size 1Byte */
+  esds->SLConfigLen = len;
+  esds->SLConfig = malloc(esds->SLConfigLen);
+  if (esds->SLConfig) {
+    stream_read(s, esds->SLConfig, esds->SLConfigLen);
+  } else {
+    esds->SLConfigLen = 0;
+  }
+  mp_msg(MSGT_DEMUX, MP4_DL,
+      "ESDS MPEG4 Sync Layer Config Descriptor (%dBytes)\n"
+      " -> predefined: %d\n", len, esds->SLConfig[0]);
+
   /* will skip the remainder of the atom */
   freereturn(s,0);
 
 }
 
+/* cleanup all mem occupied by mp4_parse_esds */
+void mp4_free_esds(esds_t *esds) {
+  if(esds->decoderConfig)
+    free(esds->decoderConfig);
+  if(esds->SLConfig)
+    free(esds->SLConfig);
+}
+
 #undef freereturn
 #undef MP4_DL