[FFmpeg-devel] Add waveformat extensible support in wav muxer (SoC qualification task)

Michael Niedermayer michaelni
Tue Mar 31 17:12:45 CEST 2009


On Tue, Mar 31, 2009 at 07:47:59PM +0800, zhentan feng wrote:
[...]
> here is new patch attached below.
> 
> -- 
> Best wishes~

> Index: libavformat/riff.c
> ===================================================================
> --- libavformat/riff.c	(revision 18184)
> +++ libavformat/riff.c	(working copy)
> @@ -282,12 +282,19 @@
>  int put_wav_header(ByteIOContext *pb, AVCodecContext *enc)
>  {
>      int bps, blkalign, bytespersec;
> +    int waveformatextensible = 0;

redundant init


>      int hdrsize = 18;
> +    int64_t pos, update_size_pos;
>  
>      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);
> +    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) {
> @@ -324,8 +331,22 @@
>      put_le32(pb, bytespersec); /* bytes per second */
>      put_le16(pb, blkalign); /* block align */
>      put_le16(pb, bps); /* bits per sample */
> +
> +    if (waveformatextensible) {                     /* write WAVEFORMATEXTENSIBLE extensions */
> +        update_size_pos = url_ftell(pb);
> +        put_le16(pb, enc->extradata_size+22);       /* 22 is the size of WAVEFORMATEXTENSIBLE-WAVEFORMATEX */
> +        put_le16(pb, enc->bits_per_coded_sample);   /* ValidBitsPerSample || SamplesPerBlock || Reserved */
> +        put_le32(pb, enc->channel_layout);          /* dwChannelMask */
> +        put_le32(pb, enc->codec_tag);               /* GUID + next 3 */
> +        put_le32(pb, 0x00100000);
> +        put_le32(pb, 0xAA000080);
> +        put_le32(pb, 0x719B3800);
> +        hdrsize += 22;
> +    }
> +
>      if (enc->codec_id == CODEC_ID_MP3) {
> -        put_le16(pb, 12); /* wav_extra_size */
> +        if (!waveformatextensible)
> +            put_le16(pb, 12); /* wav_extra_size */
>          hdrsize += 12;
>          put_le16(pb, 1); /* wID */
>          put_le32(pb, 2); /* fdwFlags */
> @@ -333,7 +354,8 @@
>          put_le16(pb, 1); /* nFramesPerBlock */
>          put_le16(pb, 1393); /* nCodecDelay */
>      } else if (enc->codec_id == CODEC_ID_MP2) {
> -        put_le16(pb, 22); /* wav_extra_size */
> +        if (!waveformatextensible)
> +            put_le16(pb, 22); /* wav_extra_size */
>          hdrsize += 22;
>          put_le16(pb, 2);  /* fwHeadLayer */
>          put_le32(pb, enc->bit_rate); /* dwHeadBitrate */
> @@ -344,15 +366,18 @@
>          put_le32(pb, 0);  /* dwPTSLow */
>          put_le32(pb, 0);  /* dwPTSHigh */
>      } else if (enc->codec_id == CODEC_ID_GSM_MS) {
> -        put_le16(pb, 2); /* wav_extra_size */
> +        if (!waveformatextensible)
> +            put_le16(pb, 2); /* wav_extra_size */
>          hdrsize += 2;
>          put_le16(pb, enc->frame_size); /* wSamplesPerBlock */
>      } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
> -        put_le16(pb, 2); /* wav_extra_size */
> +        if (!waveformatextensible)
> +            put_le16(pb, 2); /* wav_extra_size */
>          hdrsize += 2;

>          put_le16(pb, enc->frame_size); /* wSamplesPerBlock */
> -    } else if(enc->extradata_size){
> +    } else if (enc->extradata_size){
> -        put_le16(pb, enc->extradata_size);
> +        if (!waveformatextensible)
> +            put_le16(pb, enc->extradata_size);
>          put_buffer(pb, enc->extradata, enc->extradata_size);

cosmetic


>          hdrsize += enc->extradata_size;
>          if(hdrsize&1){
> @@ -363,6 +388,14 @@
>          hdrsize -= 2;
>      }
>  
> +    if (!url_is_streamed(pb)){
> +        if (hdrsize > 40 && waveformatextensible) { /*  40 means 22 WAVEFORMATEXTENSBLE size + 18 */
> +            pos = url_ftell(pb);
> +            url_fseek(pb, update_size_pos, SEEK_SET);
> +            put_le16(pb, hdrsize - 18);
> +            url_fseek(pb, pos, SEEK_SET);
> +        }
> +    }

fails if url_is_streamed


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Frequently ignored awnser#1 FFmpeg bugs should be sent to our bugtracker. User
questions about the command line tools should be sent to the ffmpeg-user ML.
And questions about how to use libav* should be sent to the libav-user ML.
-------------- 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/20090331/ca881664/attachment.pgp>



More information about the ffmpeg-devel mailing list