diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2006-01-20 23:48:16 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2006-01-20 23:48:16 +0000 |
commit | 88141c9192549eb8adc492528568db4c45cb1f55 (patch) | |
tree | 8f313d964c960fe0ce4a08dd9bf358519b3f617a | |
parent | 82863d1e02bf27af6607a497104ecff4cc011963 (diff) | |
download | ffmpeg-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.c | 65 | ||||
-rw-r--r-- | libavformat/asf.h | 12 |
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 = { |