diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-12-30 03:46:24 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-12-30 03:46:24 +0100 |
commit | 00c0465dbc5acd27c736d612bbad95fdbe2ef96c (patch) | |
tree | cf193c53844909c70470cf23c3b95c7f218b3547 /libavcodec/libvorbis.c | |
parent | 6ed3565f08abf3b1c2a1d2d7fac768b18753530c (diff) | |
parent | 209c44526700b1bac04b9fe97c8a8fdcfbeeba00 (diff) | |
download | ffmpeg-00c0465dbc5acd27c736d612bbad95fdbe2ef96c.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
fate: split off DPCM codec FATE tests into their own file
fate: split off PCM codec FATE tests into their own file
libvorbis: K&R reformatting cosmetics
libmp3lame: K&R formatting cosmetics
fate: Add a video test for xxan decoder
mpegvideo_enc: K&R cosmetics (line 1000-2000).
avconv: K&R cosmetics
qt-faststart: Fix up indentation
indeo4: remove two unused variables
doxygen: cleanup style to support older doxy
fate: add more tests for VC-1 decoder
applehttpproto: Apply the same reload interval changes as for the demuxer
applehttp: Use half the target duration as interval if the playlist didn't update
applehttp: Use the last segment duration as reload interval
lagarith: add decode support for arith rgb24 mode
Conflicts:
avconv.c
libavcodec/libmp3lame.c
libavcodec/mpegvideo_enc.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/libvorbis.c')
-rw-r--r-- | libavcodec/libvorbis.c | 152 |
1 files changed, 79 insertions, 73 deletions
diff --git a/libavcodec/libvorbis.c b/libavcodec/libvorbis.c index 53993e3719..504447750e 100644 --- a/libavcodec/libvorbis.c +++ b/libavcodec/libvorbis.c @@ -37,63 +37,65 @@ #define OGGVORBIS_FRAME_SIZE 64 -#define BUFFER_SIZE (1024*64) +#define BUFFER_SIZE (1024 * 64) typedef struct OggVorbisContext { AVClass *av_class; - vorbis_info vi ; - vorbis_dsp_state vd ; - vorbis_block vb ; + vorbis_info vi; + vorbis_dsp_state vd; + vorbis_block vb; uint8_t buffer[BUFFER_SIZE]; int buffer_index; int eof; /* decoder */ - vorbis_comment vc ; + vorbis_comment vc; ogg_packet op; double iblock; -} OggVorbisContext ; +} OggVorbisContext; -static const AVOption options[]={ -{"iblock", "Sets the impulse block bias", offsetof(OggVorbisContext, iblock), AV_OPT_TYPE_DOUBLE, {.dbl = 0}, -15, 0, AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_ENCODING_PARAM}, -{NULL} +static const AVOption options[] = { + { "iblock", "Sets the impulse block bias", offsetof(OggVorbisContext, iblock), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -15, 0, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { NULL } }; static const AVClass class = { "libvorbis", av_default_item_name, options, LIBAVUTIL_VERSION_INT }; -static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) { - OggVorbisContext *context = avccontext->priv_data ; +static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) +{ + OggVorbisContext *context = avccontext->priv_data; double cfreq; - if(avccontext->flags & CODEC_FLAG_QSCALE) { + if (avccontext->flags & CODEC_FLAG_QSCALE) { /* variable bitrate */ - if(vorbis_encode_setup_vbr(vi, avccontext->channels, - avccontext->sample_rate, - avccontext->global_quality / (float)FF_QP2LAMBDA / 10.0)) + if (vorbis_encode_setup_vbr(vi, avccontext->channels, + avccontext->sample_rate, + avccontext->global_quality / (float)FF_QP2LAMBDA / 10.0)) return -1; } else { int minrate = avccontext->rc_min_rate > 0 ? avccontext->rc_min_rate : -1; int maxrate = avccontext->rc_min_rate > 0 ? avccontext->rc_max_rate : -1; /* constant bitrate */ - if(vorbis_encode_setup_managed(vi, avccontext->channels, - avccontext->sample_rate, minrate, avccontext->bit_rate, maxrate)) + if (vorbis_encode_setup_managed(vi, avccontext->channels, + avccontext->sample_rate, minrate, + avccontext->bit_rate, maxrate)) return -1; /* variable bitrate by estimate, disable slow rate management */ - if(minrate == -1 && maxrate == -1) - if(vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET, NULL)) + if (minrate == -1 && maxrate == -1) + if (vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET, NULL)) return -1; } /* cutoff frequency */ - if(avccontext->cutoff > 0) { + if (avccontext->cutoff > 0) { cfreq = avccontext->cutoff / 1000.0; - if(vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)) + if (vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)) return -1; } - if(context->iblock){ + if (context->iblock) { vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &context->iblock); } @@ -130,35 +132,39 @@ static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avcco } /* How many bytes are needed for a buffer of length 'l' */ -static int xiph_len(int l) { return (1 + l / 255 + l); } +static int xiph_len(int l) +{ + return (1 + l / 255 + l); +} -static av_cold int oggvorbis_encode_init(AVCodecContext *avccontext) { - OggVorbisContext *context = avccontext->priv_data ; +static av_cold int oggvorbis_encode_init(AVCodecContext *avccontext) +{ + OggVorbisContext *context = avccontext->priv_data; ogg_packet header, header_comm, header_code; uint8_t *p; unsigned int offset; - vorbis_info_init(&context->vi) ; - if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) { - av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed\n") ; - return -1 ; + vorbis_info_init(&context->vi); + if (oggvorbis_init_encoder(&context->vi, avccontext) < 0) { + av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed\n"); + return -1; } - vorbis_analysis_init(&context->vd, &context->vi) ; - vorbis_block_init(&context->vd, &context->vb) ; + vorbis_analysis_init(&context->vd, &context->vi); + vorbis_block_init(&context->vd, &context->vb); vorbis_comment_init(&context->vc); - vorbis_comment_add_tag(&context->vc, "encoder", LIBAVCODEC_IDENT) ; + vorbis_comment_add_tag(&context->vc, "encoder", LIBAVCODEC_IDENT); vorbis_analysis_headerout(&context->vd, &context->vc, &header, - &header_comm, &header_code); + &header_comm, &header_code); - avccontext->extradata_size= + avccontext->extradata_size = 1 + xiph_len(header.bytes) + xiph_len(header_comm.bytes) + header_code.bytes; p = avccontext->extradata = - av_malloc(avccontext->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); - p[0] = 2; - offset = 1; + av_malloc(avccontext->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); + p[0] = 2; + offset = 1; offset += av_xiphlacing(&p[offset], header.bytes); offset += av_xiphlacing(&p[offset], header_comm.bytes); memcpy(&p[offset], header.packet, header.bytes); @@ -169,56 +175,57 @@ static av_cold int oggvorbis_encode_init(AVCodecContext *avccontext) { offset += header_code.bytes; assert(offset == avccontext->extradata_size); -/* vorbis_block_clear(&context->vb); +#if 0 + vorbis_block_clear(&context->vb); vorbis_dsp_clear(&context->vd); - vorbis_info_clear(&context->vi);*/ + vorbis_info_clear(&context->vi); +#endif vorbis_comment_clear(&context->vc); - avccontext->frame_size = OGGVORBIS_FRAME_SIZE ; + avccontext->frame_size = OGGVORBIS_FRAME_SIZE; - avccontext->coded_frame= avcodec_alloc_frame(); - avccontext->coded_frame->key_frame= 1; + avccontext->coded_frame = avcodec_alloc_frame(); + avccontext->coded_frame->key_frame = 1; - return 0 ; + return 0; } - static int oggvorbis_encode_frame(AVCodecContext *avccontext, unsigned char *packets, - int buf_size, void *data) + int buf_size, void *data) { - OggVorbisContext *context = avccontext->priv_data ; - ogg_packet op ; - signed short *audio = data ; + OggVorbisContext *context = avccontext->priv_data; + ogg_packet op; + signed short *audio = data; int l; - if(data) { + if (data) { const int samples = avccontext->frame_size; - float **buffer ; + float **buffer; int c, channels = context->vi.channels; - buffer = vorbis_analysis_buffer(&context->vd, samples) ; + buffer = vorbis_analysis_buffer(&context->vd, samples); for (c = 0; c < channels; c++) { int co = (channels > 8) ? c : - ff_vorbis_encoding_channel_layout_offsets[channels-1][c]; - for(l = 0 ; l < samples ; l++) - buffer[c][l]=audio[l*channels+co]/32768.f; + ff_vorbis_encoding_channel_layout_offsets[channels - 1][c]; + for (l = 0; l < samples; l++) + buffer[c][l] = audio[l * channels + co] / 32768.f; } - vorbis_analysis_wrote(&context->vd, samples) ; + vorbis_analysis_wrote(&context->vd, samples); } else { - if(!context->eof) - vorbis_analysis_wrote(&context->vd, 0) ; + if (!context->eof) + vorbis_analysis_wrote(&context->vd, 0); context->eof = 1; } - while(vorbis_analysis_blockout(&context->vd, &context->vb) == 1) { + while (vorbis_analysis_blockout(&context->vd, &context->vb) == 1) { vorbis_analysis(&context->vb, NULL); - vorbis_bitrate_addblock(&context->vb) ; + vorbis_bitrate_addblock(&context->vb); - while(vorbis_bitrate_flushpacket(&context->vd, &op)) { + while (vorbis_bitrate_flushpacket(&context->vd, &op)) { /* i'd love to say the following line is a hack, but sadly it's * not, apparently the end of stream decision is in libogg. */ - if(op.bytes==1 && op.e_o_s) + if (op.bytes == 1 && op.e_o_s) continue; if (context->buffer_index + sizeof(ogg_packet) + op.bytes > BUFFER_SIZE) { av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow."); @@ -232,13 +239,13 @@ static int oggvorbis_encode_frame(AVCodecContext *avccontext, } } - l=0; - if(context->buffer_index){ - ogg_packet *op2= (ogg_packet*)context->buffer; + l = 0; + if (context->buffer_index) { + ogg_packet *op2 = (ogg_packet *)context->buffer; op2->packet = context->buffer + sizeof(ogg_packet); - l= op2->bytes; - avccontext->coded_frame->pts= av_rescale_q(op2->granulepos, (AVRational){1, avccontext->sample_rate}, avccontext->time_base); + l = op2->bytes; + avccontext->coded_frame->pts = av_rescale_q(op2->granulepos, (AVRational) { 1, avccontext->sample_rate }, avccontext->time_base); //FIXME we should reorder the user supplied pts and not assume that they are spaced by 1/sample_rate if (l > buf_size) { @@ -255,12 +262,12 @@ static int oggvorbis_encode_frame(AVCodecContext *avccontext, return l; } - -static av_cold int oggvorbis_encode_close(AVCodecContext *avccontext) { - OggVorbisContext *context = avccontext->priv_data ; +static av_cold int oggvorbis_encode_close(AVCodecContext *avccontext) +{ + OggVorbisContext *context = avccontext->priv_data; /* ogg_packet op ; */ - vorbis_analysis_wrote(&context->vd, 0) ; /* notify vorbisenc this is EOF */ + vorbis_analysis_wrote(&context->vd, 0); /* notify vorbisenc this is EOF */ vorbis_block_clear(&context->vb); vorbis_dsp_clear(&context->vd); @@ -269,10 +276,9 @@ static av_cold int oggvorbis_encode_close(AVCodecContext *avccontext) { av_freep(&avccontext->coded_frame); av_freep(&avccontext->extradata); - return 0 ; + return 0; } - AVCodec ff_libvorbis_encoder = { .name = "libvorbis", .type = AVMEDIA_TYPE_AUDIO, @@ -282,7 +288,7 @@ AVCodec ff_libvorbis_encoder = { .encode = oggvorbis_encode_frame, .close = oggvorbis_encode_close, .capabilities = CODEC_CAP_DELAY, - .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_NONE }, .long_name = NULL_IF_CONFIG_SMALL("libvorbis Vorbis"), .priv_class = &class, }; |