[FFmpeg-devel] Add waveformat extensible support in wav muxer (SoC qualification task)
Michael Niedermayer
michaelni
Thu Apr 2 19:55:45 CEST 2009
On Fri, Apr 03, 2009 at 01:25:37AM +0800, zhentan feng wrote:
[...]
> new patch attached below.
>
> zhentan
> --
> Best wishes~
> Index: libavformat/riff.c
> ===================================================================
> --- libavformat/riff.c (revision 18184)
> +++ libavformat/riff.c (working copy)
> @@ -282,18 +282,34 @@
> int put_wav_header(ByteIOContext *pb, AVCodecContext *enc)
> {
> int bps, blkalign, bytespersec;
> + int waveformatextensible;
> int hdrsize = 18;
> + int pre_size = 0;
>
> if(!enc->codec_tag || enc->codec_tag > 0xffff)
> return -1;
>
> - put_le16(pb, enc->codec_tag);
> + waveformatextensible = enc->channels > 2 && enc->channel_layout;
> + if (waveformatextensible) {
> + put_le16(pb, 0xfffe);
> + pre_size = 22; /* 22 is the size of WAVEFORMATEXTENSIBLE-WAVEFORMATEX */
> + } else
> + put_le16(pb, enc->codec_tag);
> +
> put_le16(pb, enc->channels);
> put_le32(pb, enc->sample_rate);
> if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) {
> bps = 0;
> + if (enc->codec_id == CODEC_ID_MP2) {
> + pre_size += 22; /* wav_extra_size */
> + } else if(enc->codec_id == CODEC_ID_MP3) {
> + pre_size += 12; /* wav_extra_size */
> + } else
> + pre_size += 2; /* wav_extra_size */
> } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || enc->codec_id == CODEC_ID_ADPCM_MS || enc->codec_id == CODEC_ID_ADPCM_G726 || enc->codec_id == CODEC_ID_ADPCM_YAMAHA) { //
> bps = 4;
> + if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV)
> + pre_size += 2; /* wav_extra_size */
> } else {
> if (!(bps = av_get_bits_per_sample(enc->codec_id)))
> bps = 16; // default to 16
> @@ -324,8 +340,30 @@
> put_le32(pb, bytespersec); /* bytes per second */
> put_le16(pb, blkalign); /* block align */
> put_le16(pb, bps); /* bits per sample */
> +
> + if (pre_size) {
> + if (waveformatextensible && pre_size == 22) {
> + put_le16(pb, pre_size + enc->extradata_size);
> + } else
> + put_le16(pb, pre_size);
> + } else {
> + if (enc->extradata_size) {
> + put_le16(pb, enc->extradata_size);
> + } else
> + return hdrsize - 2;
> + }
> +
this is still a mess
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Those who are too smart to engage in politics are punished by being
governed by those who are dumber. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090402/c5df842c/attachment.pgp>
More information about the ffmpeg-devel
mailing list