summaryrefslogtreecommitdiff
path: root/libavcodec/libtheoraenc.c
diff options
context:
space:
mode:
authorDavid Conrad <lessen42@gmail.com>2009-09-30 22:25:49 +0000
committerDavid Conrad <lessen42@gmail.com>2009-09-30 22:25:49 +0000
commit6945c2bc4cf27d8ca8e2bf49b49716cb72f30704 (patch)
tree74be6f74e181f4e0c85d3413c124ea0fe45c72b0 /libavcodec/libtheoraenc.c
parent7cee5421d672e9209f91ff5dea3432106a0fd0fa (diff)
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
Diffstat (limited to 'libavcodec/libtheoraenc.c')
-rw-r--r--libavcodec/libtheoraenc.c15
1 files changed, 13 insertions, 2 deletions
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");