From e095026ab4845e97c61dbf3c3bda149f9195398d Mon Sep 17 00:00:00 2001 From: Fabrice Bellard Date: Mon, 28 Oct 2002 00:55:25 +0000 Subject: [PATCH] unified wav header parsing - added extradata support Originally committed as revision 1092 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libav/asf.c | 19 +++--------------- libav/avi.h | 2 ++ libav/avidec.c | 16 ++------------- libav/wav.c | 61 ++++++++++++++++++++++++++++++++-------------------------- 4 files changed, 41 insertions(+), 57 deletions(-) diff --git a/libav/asf.c b/libav/asf.c index 1044a12..d0529c2 100644 --- a/libav/asf.c +++ b/libav/asf.c @@ -745,7 +745,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) ByteIOContext *pb = &s->pb; AVStream *st; ASFStream *asf_st; - int size, i, bps; + int size, i; INT64 gsize; av_set_pts_info(s, 32, 1, 1000); /* 32 bit pts in ms */ @@ -784,7 +784,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) asf->packet_size = asf->hdr.max_pktsize; asf->nb_packets = asf->hdr.packets_count; } else if (!memcmp(&g, &stream_header, sizeof(GUID))) { - int type, id, total_size; + int type, total_size; unsigned int tag1; INT64 pos1, pos2; @@ -819,20 +819,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) st->codec.codec_type = type; st->codec.frame_rate = 1000000; // us if (type == CODEC_TYPE_AUDIO) { - id = get_le16(pb); - st->codec.codec_tag = id; - st->codec.channels = get_le16(pb); - st->codec.sample_rate = get_le32(pb); - st->codec.bit_rate = get_le32(pb) * 8; - st->codec.block_align = get_le16(pb); /* block align */ - bps = get_le16(pb); /* bits per sample */ - st->codec.codec_id = wav_codec_get_id(id, bps); - size = get_le16(pb); - if (size > 0) { - st->extra_data = av_mallocz(size); - get_buffer(pb, st->extra_data, size); - st->extra_data_size = size; - } + get_wav_header(pb, &st->codec, 1); /* We have to init the frame size at some point .... */ pos2 = url_ftell(pb); if (gsize > (pos2 + 8 - pos1 + 24)) { diff --git a/libav/avi.h b/libav/avi.h index 043b622..cdd2076 100644 --- a/libav/avi.h +++ b/libav/avi.h @@ -17,6 +17,8 @@ typedef struct CodecTag { void put_bmp_header(ByteIOContext *pb, AVCodecContext *enc, CodecTag *tags); int put_wav_header(ByteIOContext *pb, AVCodecContext *enc); int wav_codec_get_id(unsigned int tag, int bps); +void get_wav_header(ByteIOContext *pb, AVCodecContext *codec, + int has_extra_data); extern CodecTag codec_bmp_tags[]; extern CodecTag codec_wav_tags[]; diff --git a/libav/avidec.c b/libav/avidec.c index 86d4af5..80ea928 100644 --- a/libav/avidec.c +++ b/libav/avidec.c @@ -51,7 +51,7 @@ int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) ByteIOContext *pb = &s->pb; UINT32 tag, tag1; int codec_type, stream_index, size, frame_period, bit_rate; - int i, bps; + int i; AVStream *st; /* check RIFF header */ @@ -160,19 +160,7 @@ int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) url_fskip(pb, size - 5 * 4); break; case CODEC_TYPE_AUDIO: - tag1 = get_le16(pb); - st->codec.codec_type = CODEC_TYPE_AUDIO; - st->codec.codec_tag = tag1; -#ifdef DEBUG - printf("audio: 0x%x\n", tag1); -#endif - st->codec.channels = get_le16(pb); - st->codec.sample_rate = get_le32(pb); - st->codec.bit_rate = get_le32(pb) * 8; - get_le16(pb); /* block align */ - bps = get_le16(pb); - st->codec.codec_id = wav_codec_get_id(tag1, bps); - url_fskip(pb, size - 4 * 4); + get_wav_header(pb, &st->codec, (size >= 18)); break; default: url_fskip(pb, size); diff --git a/libav/wav.c b/libav/wav.c index 7fb3bd3..172a5cb 100644 --- a/libav/wav.c +++ b/libav/wav.c @@ -1,6 +1,6 @@ /* * WAV encoder and decoder - * Copyright (c) 2001 Fabrice Bellard. + * Copyright (c) 2001, 2002 Fabrice Bellard. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,6 +29,8 @@ CodecTag codec_wav_tags[] = { { CODEC_ID_PCM_MULAW, 0x07 }, { CODEC_ID_ADPCM_MS, 0x02 }, { CODEC_ID_ADPCM_IMA_WAV, 0x11 }, + { CODEC_ID_WMAV1, 0x160 }, + { CODEC_ID_WMAV2, 0x161 }, { 0, 0 }, }; @@ -101,6 +103,32 @@ int put_wav_header(ByteIOContext *pb, AVCodecContext *enc) return hdrsize; } +void get_wav_header(ByteIOContext *pb, AVCodecContext *codec, + int has_extra_data) +{ + int id, bps, size; + + id = get_le16(pb); + codec->codec_type = CODEC_TYPE_AUDIO; + codec->codec_tag = id; + codec->fourcc = id; + codec->channels = get_le16(pb); + codec->sample_rate = get_le32(pb); + codec->bit_rate = get_le32(pb) * 8; + codec->block_align = get_le16(pb); + bps = get_le16(pb); /* bits per sample */ + codec->codec_id = wav_codec_get_id(id, bps); + if (has_extra_data) { + size = get_le16(pb); + if (size > 0) { + codec->extradata = av_mallocz(size); + get_buffer(pb, codec->extradata, size); + codec->extradata_size = size; + } + } +} + + int wav_codec_get_id(unsigned int tag, int bps) { int id; @@ -213,8 +241,6 @@ static int wav_read_header(AVFormatContext *s, int size; unsigned int tag; ByteIOContext *pb = &s->pb; - unsigned int id, channels, rate, bit_rate, extra_size, bps; - unsigned int blkalign; AVStream *st; /* check RIFF header */ @@ -231,34 +257,15 @@ static int wav_read_header(AVFormatContext *s, size = find_tag(pb, MKTAG('f', 'm', 't', ' ')); if (size < 0) return -1; - id = get_le16(pb); - channels = get_le16(pb); - rate = get_le32(pb); - bit_rate = get_le32(pb) * 8; - blkalign = get_le16(pb); /* block align */ - bps = get_le16(pb); /* bits per sample */ - if (size >= 18) { - /* wav_extra_size */ - extra_size = get_le16(pb); - /* skip unused data */ - url_fseek(pb, size - 18, SEEK_CUR); - } - - size = find_tag(pb, MKTAG('d', 'a', 't', 'a')); - if (size < 0) - return -1; - - /* now we are ready: build format streams */ st = av_new_stream(s, 0); if (!st) return AVERROR_NOMEM; - st->codec.codec_type = CODEC_TYPE_AUDIO; - st->codec.codec_tag = id; - st->codec.codec_id = wav_codec_get_id(id, bps); - st->codec.channels = channels; - st->codec.sample_rate = rate; - st->codec.block_align = blkalign; + get_wav_header(pb, &st->codec, (size >= 18)); + + size = find_tag(pb, MKTAG('d', 'a', 't', 'a')); + if (size < 0) + return -1; return 0; } -- 2.7.4