diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-04-10 20:58:15 +0100 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2016-04-10 20:59:55 +0100 |
commit | 6f69f7a8bf6a0d013985578df2ef42ee6b1c7994 (patch) | |
tree | 0c2ec8349ff1763d5f48454b8b9f26374dbd80b0 /libavformat/riffenc.c | |
parent | 60b75186b2c878b6257b43c8fcc0b1356ada218e (diff) | |
parent | 9200514ad8717c63f82101dc394f4378854325bf (diff) | |
download | ffmpeg-6f69f7a8bf6a0d013985578df2ef42ee6b1c7994.tar.gz |
Merge commit '9200514ad8717c63f82101dc394f4378854325bf'
* commit '9200514ad8717c63f82101dc394f4378854325bf':
lavf: replace AVStream.codec with AVStream.codecpar
This has been a HUGE effort from:
- Derek Buitenhuis <derek.buitenhuis@gmail.com>
- Hendrik Leppkes <h.leppkes@gmail.com>
- wm4 <nfxjfg@googlemail.com>
- Clément Bœsch <clement@stupeflix.com>
- James Almer <jamrial@gmail.com>
- Michael Niedermayer <michael@niedermayer.cc>
- Rostislav Pehlivanov <atomnuker@gmail.com>
Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diffstat (limited to 'libavformat/riffenc.c')
-rw-r--r-- | libavformat/riffenc.c | 174 |
1 files changed, 86 insertions, 88 deletions
diff --git a/libavformat/riffenc.c b/libavformat/riffenc.c index 33879ea1ab..36e6ac7455 100644 --- a/libavformat/riffenc.c +++ b/libavformat/riffenc.c @@ -51,7 +51,8 @@ void ff_end_tag(AVIOContext *pb, int64_t start) /* WAVEFORMATEX header */ /* returns the size or -1 on error */ -int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc, int flags) +int ff_put_wav_header(AVFormatContext *s, AVIOContext *pb, + AVCodecParameters *par, int flags) { int bps, blkalign, bytespersec, frame_size; int hdrsize; @@ -61,89 +62,89 @@ int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc, int flags) uint8_t *riff_extradata = temp; uint8_t *riff_extradata_start = temp; - if (!enc->codec_tag || enc->codec_tag > 0xffff) + if (!par->codec_tag || par->codec_tag > 0xffff) return -1; /* We use the known constant frame size for the codec if known, otherwise * fall back on using AVCodecContext.frame_size, which is not as reliable * for indicating packet duration. */ - frame_size = av_get_audio_frame_duration(enc, enc->block_align); + frame_size = av_get_audio_frame_duration2(par, par->block_align); - waveformatextensible = (enc->channels > 2 && enc->channel_layout) || - enc->sample_rate > 48000 || - enc->codec_id == AV_CODEC_ID_EAC3 || - av_get_bits_per_sample(enc->codec_id) > 16; + waveformatextensible = (par->channels > 2 && par->channel_layout) || + par->sample_rate > 48000 || + par->codec_id == AV_CODEC_ID_EAC3 || + av_get_bits_per_sample(par->codec_id) > 16; if (waveformatextensible) avio_wl16(pb, 0xfffe); else - avio_wl16(pb, enc->codec_tag); + avio_wl16(pb, par->codec_tag); - avio_wl16(pb, enc->channels); - avio_wl32(pb, enc->sample_rate); - if (enc->codec_id == AV_CODEC_ID_ATRAC3 || - enc->codec_id == AV_CODEC_ID_G723_1 || - enc->codec_id == AV_CODEC_ID_MP2 || - enc->codec_id == AV_CODEC_ID_MP3 || - enc->codec_id == AV_CODEC_ID_GSM_MS) { + avio_wl16(pb, par->channels); + avio_wl32(pb, par->sample_rate); + if (par->codec_id == AV_CODEC_ID_ATRAC3 || + par->codec_id == AV_CODEC_ID_G723_1 || + par->codec_id == AV_CODEC_ID_MP2 || + par->codec_id == AV_CODEC_ID_MP3 || + par->codec_id == AV_CODEC_ID_GSM_MS) { bps = 0; } else { - if (!(bps = av_get_bits_per_sample(enc->codec_id))) { - if (enc->bits_per_coded_sample) - bps = enc->bits_per_coded_sample; + if (!(bps = av_get_bits_per_sample(par->codec_id))) { + if (par->bits_per_coded_sample) + bps = par->bits_per_coded_sample; else bps = 16; // default to 16 } } - if (bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample) { - av_log(enc, AV_LOG_WARNING, + if (bps != par->bits_per_coded_sample && par->bits_per_coded_sample) { + av_log(s, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) " "and actually stored (%d) differ\n", - enc->bits_per_coded_sample, bps); + par->bits_per_coded_sample, bps); } - if (enc->codec_id == AV_CODEC_ID_MP2) { - blkalign = (144 * enc->bit_rate - 1)/enc->sample_rate + 1; - } else if (enc->codec_id == AV_CODEC_ID_MP3) { - blkalign = 576 * (enc->sample_rate <= (24000 + 32000)/2 ? 1 : 2); - } else if (enc->codec_id == AV_CODEC_ID_AC3) { + if (par->codec_id == AV_CODEC_ID_MP2) { + blkalign = (144 * par->bit_rate - 1)/par->sample_rate + 1; + } else if (par->codec_id == AV_CODEC_ID_MP3) { + blkalign = 576 * (par->sample_rate <= (24000 + 32000)/2 ? 1 : 2); + } else if (par->codec_id == AV_CODEC_ID_AC3) { blkalign = 3840; /* maximum bytes per frame */ - } else if (enc->codec_id == AV_CODEC_ID_AAC) { - blkalign = 768 * enc->channels; /* maximum bytes per frame */ - } else if (enc->codec_id == AV_CODEC_ID_G723_1) { + } else if (par->codec_id == AV_CODEC_ID_AAC) { + blkalign = 768 * par->channels; /* maximum bytes per frame */ + } else if (par->codec_id == AV_CODEC_ID_G723_1) { blkalign = 24; - } else if (enc->block_align != 0) { /* specified by the codec */ - blkalign = enc->block_align; + } else if (par->block_align != 0) { /* specified by the codec */ + blkalign = par->block_align; } else - blkalign = bps * enc->channels / av_gcd(8, bps); - if (enc->codec_id == AV_CODEC_ID_PCM_U8 || - enc->codec_id == AV_CODEC_ID_PCM_S24LE || - enc->codec_id == AV_CODEC_ID_PCM_S32LE || - enc->codec_id == AV_CODEC_ID_PCM_F32LE || - enc->codec_id == AV_CODEC_ID_PCM_F64LE || - enc->codec_id == AV_CODEC_ID_PCM_S16LE) { - bytespersec = enc->sample_rate * blkalign; - } else if (enc->codec_id == AV_CODEC_ID_G723_1) { + blkalign = bps * par->channels / av_gcd(8, bps); + if (par->codec_id == AV_CODEC_ID_PCM_U8 || + par->codec_id == AV_CODEC_ID_PCM_S24LE || + par->codec_id == AV_CODEC_ID_PCM_S32LE || + par->codec_id == AV_CODEC_ID_PCM_F32LE || + par->codec_id == AV_CODEC_ID_PCM_F64LE || + par->codec_id == AV_CODEC_ID_PCM_S16LE) { + bytespersec = par->sample_rate * blkalign; + } else if (par->codec_id == AV_CODEC_ID_G723_1) { bytespersec = 800; } else { - bytespersec = enc->bit_rate / 8; + bytespersec = par->bit_rate / 8; } avio_wl32(pb, bytespersec); /* bytes per second */ avio_wl16(pb, blkalign); /* block align */ avio_wl16(pb, bps); /* bits per sample */ - if (enc->codec_id == AV_CODEC_ID_MP3) { + if (par->codec_id == AV_CODEC_ID_MP3) { bytestream_put_le16(&riff_extradata, 1); /* wID */ bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */ bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */ bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */ bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */ - } else if (enc->codec_id == AV_CODEC_ID_MP2) { + } else if (par->codec_id == AV_CODEC_ID_MP2) { /* fwHeadLayer */ bytestream_put_le16(&riff_extradata, 2); /* dwHeadBitrate */ - bytestream_put_le32(&riff_extradata, enc->bit_rate); + bytestream_put_le32(&riff_extradata, par->bit_rate); /* fwHeadMode */ - bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); + bytestream_put_le16(&riff_extradata, par->channels == 2 ? 1 : 8); /* fwHeadModeExt */ bytestream_put_le16(&riff_extradata, 0); /* wHeadEmphasis */ @@ -154,40 +155,40 @@ int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc, int flags) bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */ bytestream_put_le32(&riff_extradata, 0); - } else if (enc->codec_id == AV_CODEC_ID_G723_1) { + } else if (par->codec_id == AV_CODEC_ID_G723_1) { bytestream_put_le32(&riff_extradata, 0x9ace0002); /* extradata needed for msacm g723.1 codec */ bytestream_put_le32(&riff_extradata, 0xaea2f732); bytestream_put_le16(&riff_extradata, 0xacde); - } else if (enc->codec_id == AV_CODEC_ID_GSM_MS || - enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) { + } else if (par->codec_id == AV_CODEC_ID_GSM_MS || + par->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) { /* wSamplesPerBlock */ bytestream_put_le16(&riff_extradata, frame_size); - } else if (enc->extradata_size) { - riff_extradata_start = enc->extradata; - riff_extradata = enc->extradata + enc->extradata_size; + } else if (par->extradata_size) { + riff_extradata_start = par->extradata; + riff_extradata = par->extradata + par->extradata_size; } /* write WAVEFORMATEXTENSIBLE extensions */ if (waveformatextensible) { int write_channel_mask = !(flags & FF_PUT_WAV_HEADER_SKIP_CHANNELMASK) && - (enc->strict_std_compliance < FF_COMPLIANCE_NORMAL || - enc->channel_layout < 0x40000); + (s->strict_std_compliance < FF_COMPLIANCE_NORMAL || + par->channel_layout < 0x40000); /* 22 is WAVEFORMATEXTENSIBLE size */ avio_wl16(pb, riff_extradata - riff_extradata_start + 22); /* ValidBitsPerSample || SamplesPerBlock || Reserved */ avio_wl16(pb, bps); /* dwChannelMask */ - avio_wl32(pb, write_channel_mask ? enc->channel_layout : 0); + avio_wl32(pb, write_channel_mask ? par->channel_layout : 0); /* GUID + next 3 */ - if (enc->codec_id == AV_CODEC_ID_EAC3) { - ff_put_guid(pb, ff_get_codec_guid(enc->codec_id, ff_codec_wav_guids)); + if (par->codec_id == AV_CODEC_ID_EAC3) { + ff_put_guid(pb, ff_get_codec_guid(par->codec_id, ff_codec_wav_guids)); } else { - avio_wl32(pb, enc->codec_tag); + avio_wl32(pb, par->codec_tag); avio_wl32(pb, 0x00100000); avio_wl32(pb, 0xAA000080); avio_wl32(pb, 0x719B3800); } } else if ((flags & FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX) || - enc->codec_tag != 0x0001 /* PCM */ || + par->codec_tag != 0x0001 /* PCM */ || riff_extradata - riff_extradata_start) { /* WAVEFORMATEX */ avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */ @@ -203,16 +204,16 @@ int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc, int flags) } /* BITMAPINFOHEADER header */ -void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, +void ff_put_bmp_header(AVIOContext *pb, AVCodecParameters *par, const AVCodecTag *tags, int for_asf, int ignore_extradata) { - int keep_height = enc->extradata_size >= 9 && - !memcmp(enc->extradata + enc->extradata_size - 9, "BottomUp", 9); - int extradata_size = enc->extradata_size - 9*keep_height; - enum AVPixelFormat pix_fmt = enc->pix_fmt; + int keep_height = par->extradata_size >= 9 && + !memcmp(par->extradata + par->extradata_size - 9, "BottomUp", 9); + int extradata_size = par->extradata_size - 9*keep_height; + enum AVPixelFormat pix_fmt = par->format; int pal_avi; - if (pix_fmt == AV_PIX_FMT_NONE && enc->bits_per_coded_sample == 1) + if (pix_fmt == AV_PIX_FMT_NONE && par->bits_per_coded_sample == 1) pix_fmt = AV_PIX_FMT_MONOWHITE; pal_avi = !for_asf && (pix_fmt == AV_PIX_FMT_PAL8 || @@ -221,32 +222,32 @@ void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, /* Size (not including the size of the color table or color masks) */ avio_wl32(pb, 40 + (ignore_extradata || pal_avi ? 0 : extradata_size)); - avio_wl32(pb, enc->width); + avio_wl32(pb, par->width); //We always store RGB TopDown - avio_wl32(pb, enc->codec_tag || keep_height ? enc->height : -enc->height); + avio_wl32(pb, par->codec_tag || keep_height ? par->height : -par->height); /* planes */ avio_wl16(pb, 1); /* depth */ - avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); + avio_wl16(pb, par->bits_per_coded_sample ? par->bits_per_coded_sample : 24); /* compression type */ - avio_wl32(pb, enc->codec_tag); - avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8); + avio_wl32(pb, par->codec_tag); + avio_wl32(pb, (par->width * par->height * (par->bits_per_coded_sample ? par->bits_per_coded_sample : 24)+7) / 8); avio_wl32(pb, 0); avio_wl32(pb, 0); /* Number of color indices in the color table that are used. * A value of 0 means 2^biBitCount indices, but this doesn't work * with Windows Media Player and files containing xxpc chunks. */ - avio_wl32(pb, pal_avi ? 1 << enc->bits_per_coded_sample : 0); + avio_wl32(pb, pal_avi ? 1 << par->bits_per_coded_sample : 0); avio_wl32(pb, 0); if (!ignore_extradata) { - if (enc->extradata_size) { - avio_write(pb, enc->extradata, extradata_size); + if (par->extradata_size) { + avio_write(pb, par->extradata, extradata_size); if (!for_asf && extradata_size & 1) avio_w8(pb, 0); } else if (pal_avi) { int i; - for (i = 0; i < 1 << enc->bits_per_coded_sample; i++) { + for (i = 0; i < 1 << par->bits_per_coded_sample; i++) { /* Initialize 1 bpp palette to black & white */ if (i == 0 && pix_fmt == AV_PIX_FMT_MONOWHITE) avio_wl32(pb, 0xffffff); @@ -262,30 +263,27 @@ void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, void ff_parse_specific_params(AVStream *st, int *au_rate, int *au_ssize, int *au_scale) { - AVCodecContext *codec = st->codec; + AVCodecParameters *par = st->codecpar; int gcd; int audio_frame_size; - /* We use the known constant frame size for the codec if known, otherwise - * fall back on using AVCodecContext.frame_size, which is not as reliable - * for indicating packet duration. */ - audio_frame_size = av_get_audio_frame_duration(codec, 0); + audio_frame_size = av_get_audio_frame_duration2(par, 0); if (!audio_frame_size) - audio_frame_size = codec->frame_size; + audio_frame_size = par->frame_size; - *au_ssize = codec->block_align; - if (audio_frame_size && codec->sample_rate) { + *au_ssize = par->block_align; + if (audio_frame_size && par->sample_rate) { *au_scale = audio_frame_size; - *au_rate = codec->sample_rate; - } else if (codec->codec_type == AVMEDIA_TYPE_VIDEO || - codec->codec_type == AVMEDIA_TYPE_DATA || - codec->codec_type == AVMEDIA_TYPE_SUBTITLE) { + *au_rate = par->sample_rate; + } else if (par->codec_type == AVMEDIA_TYPE_VIDEO || + par->codec_type == AVMEDIA_TYPE_DATA || + par->codec_type == AVMEDIA_TYPE_SUBTITLE) { *au_scale = st->time_base.num; *au_rate = st->time_base.den; } else { - *au_scale = codec->block_align ? codec->block_align * 8 : 8; - *au_rate = codec->bit_rate ? codec->bit_rate : - 8 * codec->sample_rate; + *au_scale = par->block_align ? par->block_align * 8 : 8; + *au_rate = par->bit_rate ? par->bit_rate : + 8 * par->sample_rate; } gcd = av_gcd(*au_scale, *au_rate); *au_scale /= gcd; |