Mercurial > libavformat.hg
changeset 904:5d3dc3a6bbe7 libavformat
audio in dvr-ms demuxing support by (John Donaghy <johnfdonaghy gmail com<)
author | michael |
---|---|
date | Fri, 20 Jan 2006 23:48:16 +0000 |
parents | 68bc3ca12e79 |
children | dbc0145bbf11 |
files | asf.c asf.h |
diffstat | 2 files changed, 75 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/asf.c Thu Jan 19 23:36:50 2006 +0000 +++ b/asf.c Fri Jan 20 23:48:16 2006 +0000 @@ -60,6 +60,10 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ } 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;
--- a/asf.h Thu Jan 19 23:36:50 2006 +0000 +++ b/asf.h Fri Jan 20 23:48:16 2006 +0000 @@ -143,6 +143,10 @@ 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 @@ 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 = {