aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Converse <alex.converse@gmail.com>2011-08-24 16:59:30 -0700
committerAlex Converse <alex.converse@gmail.com>2011-08-25 11:53:21 -0700
commitad6c7c1b525c7ae365491b4fef7869d31ee88329 (patch)
treeec0e580b4d5657d1ca4d98e3537eb27941c4a6fc
parentd4b9974465baf893e90527a366e7a7411ded1ef8 (diff)
downloadffmpeg-ad6c7c1b525c7ae365491b4fef7869d31ee88329.tar.gz
mp4: Handle non-trivial ES Descriptors.
-rw-r--r--libavformat/isom.c16
-rw-r--r--libavformat/isom.h1
-rw-r--r--libavformat/mov.c3
-rw-r--r--libavformat/mpegts.c3
4 files changed, 19 insertions, 4 deletions
diff --git a/libavformat/isom.c b/libavformat/isom.c
index eb17e25474..7d42e80070 100644
--- a/libavformat/isom.c
+++ b/libavformat/isom.c
@@ -372,6 +372,22 @@ int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
return len;
}
+void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
+{
+ int flags;
+ if (es_id) *es_id = avio_rb16(pb);
+ else avio_rb16(pb);
+ flags = avio_r8(pb);
+ if (flags & 0x80) //streamDependenceFlag
+ avio_rb16(pb);
+ if (flags & 0x40) { //URL_Flag
+ int len = avio_r8(pb);
+ avio_skip(pb, len);
+ }
+ if (flags & 0x20) //OCRstreamFlag
+ avio_rb16(pb);
+}
+
static const AVCodecTag mp4_audio_types[] = {
{ CODEC_ID_MP3ON4, AOT_PS }, /* old mp3on4 draft */
{ CODEC_ID_MP3ON4, AOT_L1 }, /* layer 1 */
diff --git a/libavformat/isom.h b/libavformat/isom.h
index ef3fe1484f..838eb42f97 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -146,6 +146,7 @@ typedef struct MOVContext {
int ff_mp4_read_descr_len(AVIOContext *pb);
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag);
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb);
+void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id);
#define MP4IODescrTag 0x02
#define MP4ESDescrTag 0x03
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 92b1b14f15..35cd9a880b 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -473,8 +473,7 @@ int ff_mov_read_esds(AVFormatContext *fc, AVIOContext *pb, MOVAtom atom)
avio_rb32(pb); /* version + flags */
ff_mp4_read_descr(fc, pb, &tag);
if (tag == MP4ESDescrTag) {
- avio_rb16(pb); /* ID */
- avio_r8(pb); /* priority */
+ ff_mp4_parse_es_descr(pb, NULL);
} else
avio_rb16(pb); /* ID */
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index fa5bd4c5a1..a72341865f 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -886,9 +886,8 @@ static int mp4_read_iods(AVFormatContext *s, const uint8_t *buf, unsigned size,
avio_r8(&pb);
len = ff_mp4_read_descr(s, &pb, &tag);
if (tag == MP4ESDescrTag) {
- *es_id = avio_rb16(&pb); /* ES_ID */
+ ff_mp4_parse_es_descr(&pb, es_id);
av_dlog(s, "ES_ID %#x\n", *es_id);
- avio_r8(&pb); /* priority */
len = ff_mp4_read_descr(s, &pb, &tag);
if (tag == MP4DecConfigDescrTag) {
*dec_config_descr = av_malloc(len);