aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-01-20 23:48:16 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-01-20 23:48:16 +0000
commit88141c9192549eb8adc492528568db4c45cb1f55 (patch)
tree8f313d964c960fe0ce4a08dd9bf358519b3f617a
parent82863d1e02bf27af6607a497104ecff4cc011963 (diff)
downloadffmpeg-88141c9192549eb8adc492528568db4c45cb1f55.tar.gz
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
Originally committed as revision 4874 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/asf.c65
-rw-r--r--libavformat/asf.h12
2 files changed, 75 insertions, 2 deletions
diff --git a/libavformat/asf.c b/libavformat/asf.c
index b3e84e184e..a3edf77c63 100644
--- a/libavformat/asf.c
+++ b/libavformat/asf.c
@@ -60,6 +60,10 @@ static void print_guid(const GUID *g)
else PRINT_IF_GUID(g, head1_guid);
else PRINT_IF_GUID(g, head2_guid);
else PRINT_IF_GUID(g, my_guid);
+ else PRINT_IF_GUID(g, ext_stream_header);
+ else PRINT_IF_GUID(g, extended_content_header);
+ else PRINT_IF_GUID(g, ext_stream_embed_stream_header);
+ else PRINT_IF_GUID(g, ext_stream_audio_stream);
else
printf("(GUID: unknown) ");
printf("0x%08x, 0x%04x, 0x%04x, {", g->v1, g->v2, g->v3);
@@ -186,6 +190,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
int type, total_size, type_specific_size, sizeX;
unsigned int tag1;
int64_t pos1, pos2;
+ int test_for_ext_stream_audio;
pos1 = url_ftell(pb);
@@ -201,12 +206,17 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->duration = asf->hdr.send_time /
(10000000 / 1000) - st->start_time;
get_guid(pb, &g);
+
+ test_for_ext_stream_audio = 0;
if (!memcmp(&g, &audio_stream, sizeof(GUID))) {
type = CODEC_TYPE_AUDIO;
} else if (!memcmp(&g, &video_stream, sizeof(GUID))) {
type = CODEC_TYPE_VIDEO;
} else if (!memcmp(&g, &command_stream, sizeof(GUID))) {
type = CODEC_TYPE_UNKNOWN;
+ } else if (!memcmp(&g, &ext_stream_embed_stream_header, sizeof(GUID))) {
+ test_for_ext_stream_audio = 1;
+ type = CODEC_TYPE_UNKNOWN;
} else {
goto fail;
}
@@ -219,6 +229,20 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
asf->asfid2avid[st->id] = s->nb_streams - 1;
get_le32(pb);
+
+ if (test_for_ext_stream_audio) {
+ get_guid(pb, &g);
+ if (!memcmp(&g, &ext_stream_audio_stream, sizeof(GUID))) {
+ type = CODEC_TYPE_AUDIO;
+ get_guid(pb, &g);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_guid(pb, &g);
+ get_le32(pb);
+ }
+ }
+
st->codec->codec_type = type;
if (type == CODEC_TYPE_AUDIO) {
get_wav_header(pb, st->codec, type_specific_size);
@@ -259,7 +283,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->codec->frame_size = 1;
break;
}
- } else {
+ } else if (type == CODEC_TYPE_VIDEO) {
get_le32(pb);
get_le32(pb);
get_byte(pb);
@@ -349,12 +373,49 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
}
av_free(name);
}
-#if 0
+ } else if (!memcmp(&g, &ext_stream_header, sizeof(GUID))) {
+ int ext_len, payload_ext_ct, stream_ct;
+ uint32_t ext_d;
+ int64_t pos_ex_st, pos_curr;
+ pos_ex_st = url_ftell(pb);
+
+ get_le64(pb);
+ get_le64(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le32(pb);
+ get_le16(pb);
+ get_le16(pb);
+ get_le64(pb);
+ stream_ct = get_le16(pb);
+ payload_ext_ct = get_le16(pb);
+
+ for (i=0; i<stream_ct; i++){
+ get_le16(pb);
+ ext_len = get_le16(pb);
+ url_fseek(pb, ext_len, SEEK_CUR);
+ }
+
+ for (i=0; i<payload_ext_ct; i++){
+ get_guid(pb, &g);
+ ext_d=get_le16(pb);
+ ext_len=get_le32(pb);
+ url_fseek(pb, ext_len, SEEK_CUR);
+ }
+
+ // there could be a optional stream properties object to follow
+ // if so the next iteration will pick it up
} else if (!memcmp(&g, &head1_guid, sizeof(GUID))) {
int v1, v2;
get_guid(pb, &g);
v1 = get_le32(pb);
v2 = get_le16(pb);
+#if 0
} else if (!memcmp(&g, &codec_comment_header, sizeof(GUID))) {
int len, v1, n, num;
char str[256], *q;
diff --git a/libavformat/asf.h b/libavformat/asf.h
index c9661b97a2..8dcf7716f1 100644
--- a/libavformat/asf.h
+++ b/libavformat/asf.h
@@ -143,6 +143,10 @@ static const GUID stream_header = {
0xB7DC0791, 0xA9B7, 0x11CF, { 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 },
};
+static const GUID ext_stream_header = {
+ 0x14E6A5CB, 0xC672, 0x4332, { 0x83, 0x99, 0xA9, 0x69, 0x52, 0x06, 0x5B, 0x5A },
+};
+
static const GUID audio_stream = {
0xF8699E40, 0x5B4D, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B },
};
@@ -200,6 +204,14 @@ static const GUID simple_index_header = {
0x33000890, 0xE5B1, 0x11CF, { 0x89, 0xF4, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0xCB },
};
+static const GUID ext_stream_embed_stream_header = {
+ 0x3afb65e2, 0x47ef, 0x40f2, { 0xac, 0x2c, 0x70, 0xa9, 0x0d, 0x71, 0xd3, 0x43}
+};
+
+static const GUID ext_stream_audio_stream = {
+ 0x31178c9d, 0x03e1, 0x4528, { 0xb5, 0x82, 0x3d, 0xf9, 0xdb, 0x22, 0xf5, 0x03}
+};
+
/* I am not a number !!! This GUID is the one found on the PC used to
generate the stream */
static const GUID my_guid = {