mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
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
This commit is contained in:
parent
7cee5421d6
commit
6945c2bc4c
@ -106,11 +106,9 @@ static av_cold int encode_init(AVCodecContext* avc_context)
|
|||||||
}
|
}
|
||||||
t_info.colorspace = OC_CS_UNSPECIFIED;
|
t_info.colorspace = OC_CS_UNSPECIFIED;
|
||||||
t_info.pixelformat = OC_PF_420;
|
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 = avc_context->gop_size;
|
||||||
t_info.keyframe_frequency_force = avc_context->gop_size;
|
t_info.keyframe_frequency_force = avc_context->gop_size;
|
||||||
t_info.keyframe_mindistance = avc_context->keyint_min;
|
t_info.keyframe_mindistance = avc_context->keyint_min;
|
||||||
t_info.quality = 0;
|
|
||||||
|
|
||||||
t_info.quick_p = 1;
|
t_info.quick_p = 1;
|
||||||
t_info.dropframes_p = 0;
|
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.noise_sensitivity = 1;
|
||||||
t_info.sharpness = 0;
|
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 */
|
/* Now initialise libtheora */
|
||||||
if (theora_encode_init( &(h->t_state), &t_info ) != 0) {
|
if (theora_encode_init( &(h->t_state), &t_info ) != 0) {
|
||||||
av_log(avc_context, AV_LOG_ERROR, "theora_encode_init failed\n");
|
av_log(avc_context, AV_LOG_ERROR, "theora_encode_init failed\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user