From 6945c2bc4cf27d8ca8e2bf49b49716cb72f30704 Mon Sep 17 00:00:00 2001 From: David Conrad Date: Wed, 30 Sep 2009 22:25:49 +0000 Subject: Support constant-quant encoding for libtheora Based on a patch by j f (gonzaz-z # operamail (d) com) Originally committed as revision 20109 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/libtheoraenc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'libavcodec/libtheoraenc.c') diff --git a/libavcodec/libtheoraenc.c b/libavcodec/libtheoraenc.c index 9da0d19944..f0285956da 100644 --- a/libavcodec/libtheoraenc.c +++ b/libavcodec/libtheoraenc.c @@ -106,11 +106,9 @@ static av_cold int encode_init(AVCodecContext* avc_context) } t_info.colorspace = OC_CS_UNSPECIFIED; t_info.pixelformat = OC_PF_420; - t_info.target_bitrate = avc_context->bit_rate; t_info.keyframe_frequency = avc_context->gop_size; t_info.keyframe_frequency_force = avc_context->gop_size; t_info.keyframe_mindistance = avc_context->keyint_min; - t_info.quality = 0; t_info.quick_p = 1; t_info.dropframes_p = 0; @@ -120,6 +118,19 @@ static av_cold int encode_init(AVCodecContext* avc_context) t_info.noise_sensitivity = 1; t_info.sharpness = 0; + if (avc_context->flags & CODEC_FLAG_QSCALE) { + /* to be constant with the libvorbis implementation, clip global_quality to 0 - 10 + Theora accepts a quality parameter p, which is: + * 0 <= p <=63 + * an int value + */ + t_info.quality = av_clip(avc_context->global_quality / (float)FF_QP2LAMBDA, 0, 10) * 6.3; + t_info.target_bitrate = 0; + } else { + t_info.target_bitrate = avc_context->bit_rate; + t_info.quality = 0; + } + /* Now initialise libtheora */ if (theora_encode_init( &(h->t_state), &t_info ) != 0) { av_log(avc_context, AV_LOG_ERROR, "theora_encode_init failed\n"); -- cgit v1.2.3