diff options
author | atmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-03-24 06:10:13 +0000 |
---|---|---|
committer | atmos4 <atmos4@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-03-24 06:10:13 +0000 |
commit | a0399163e6070c43bab32ada1cd250c586173548 (patch) | |
tree | 602992d3f39aaf970dc2d77a5fa4ab8614d8f29e /libmpdemux/parse_mp4.c | |
parent | a699ffad787db0eb9853e8a629c4353ac9b1e183 (diff) | |
download | mpv-a0399163e6070c43bab32ada1cd250c586173548.tar.bz2 mpv-a0399163e6070c43bab32ada1cd250c586173548.tar.xz |
- Add parsing of Sync Layer Descriptor
- Add a function to cleanup malloced mem from mp4_parse_esds
- Fix some weird code from me :)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@5306 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/parse_mp4.c')
-rw-r--r-- | libmpdemux/parse_mp4.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/libmpdemux/parse_mp4.c b/libmpdemux/parse_mp4.c index 512496984c..8ffc70d53f 100644 --- a/libmpdemux/parse_mp4.c +++ b/libmpdemux/parse_mp4.c @@ -29,10 +29,10 @@ int mp4_read_descr_len(stream_t *s) { 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 @@ int mp4_parse_esds(unsigned char *data, int datalen, esds_t *esds) { 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 @@ int mp4_parse_esds(unsigned char *data, int datalen, esds_t *esds) { 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 |