| @@ -2082,13 +2082,13 @@ typedef struct AVCodecContext { | |||||
| */ | */ | ||||
| int max_qdiff; | int max_qdiff; | ||||
| #if FF_API_MPV_OPT | |||||
| /** | /** | ||||
| * ratecontrol qmin qmax limiting method | |||||
| * 0-> clipping, 1-> use a nice continuous function to limit qscale wthin qmin/qmax. | |||||
| * - encoding: Set by user. | |||||
| * - decoding: unused | |||||
| * @deprecated use encoder private options instead | |||||
| */ | */ | ||||
| attribute_deprecated | |||||
| float rc_qsquish; | float rc_qsquish; | ||||
| #endif | |||||
| float rc_qmod_amp; | float rc_qmod_amp; | ||||
| int rc_qmod_freq; | int rc_qmod_freq; | ||||
| @@ -628,6 +628,12 @@ typedef struct MpegEncContext { | |||||
| int mpv_flags; ///< flags set by private options | int mpv_flags; ///< flags set by private options | ||||
| int quantizer_noise_shaping; | int quantizer_noise_shaping; | ||||
| /** | |||||
| * ratecontrol qmin qmax limiting method | |||||
| * 0-> clipping, 1-> use a nice continuous function to limit qscale wthin qmin/qmax. | |||||
| */ | |||||
| float rc_qsquish; | |||||
| /* temp buffers for rate control */ | /* temp buffers for rate control */ | ||||
| float *cplx_tab, *bits_tab; | float *cplx_tab, *bits_tab; | ||||
| @@ -672,7 +678,9 @@ typedef struct MpegEncContext { | |||||
| FF_MPV_OFFSET(chroma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\ | FF_MPV_OFFSET(chroma_elim_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },\ | ||||
| { "quantizer_noise_shaping", NULL, FF_MPV_OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\ | { "quantizer_noise_shaping", NULL, FF_MPV_OFFSET(quantizer_noise_shaping), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\ | ||||
| { "error_rate", "Simulate errors in the bitstream to test error concealment.", \ | { "error_rate", "Simulate errors in the bitstream to test error concealment.", \ | ||||
| FF_MPV_OFFSET(error_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, | |||||
| FF_MPV_OFFSET(error_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FF_MPV_OPT_FLAGS },\ | |||||
| {"qsquish", "how to keep quantizer between qmin and qmax (0 = clip, 1 = use differentiable function)", \ | |||||
| FF_MPV_OFFSET(rc_qsquish), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, 0, 99, FF_MPV_OPT_FLAGS}, | |||||
| extern const AVOption ff_mpv_generic_options[]; | extern const AVOption ff_mpv_generic_options[]; | ||||
| @@ -822,6 +822,13 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) | |||||
| FF_ENABLE_DEPRECATION_WARNINGS | FF_ENABLE_DEPRECATION_WARNINGS | ||||
| #endif | #endif | ||||
| #if FF_API_MPV_OPT | |||||
| FF_DISABLE_DEPRECATION_WARNINGS | |||||
| if (avctx->rc_qsquish != 0.0) | |||||
| s->rc_qsquish = avctx->rc_qsquish; | |||||
| FF_ENABLE_DEPRECATION_WARNINGS | |||||
| #endif | |||||
| if (avctx->b_frame_strategy == 2) { | if (avctx->b_frame_strategy == 2) { | ||||
| for (i = 0; i < s->max_b_frames + 2; i++) { | for (i = 0; i < s->max_b_frames + 2; i++) { | ||||
| s->tmp_frames[i] = av_frame_alloc(); | s->tmp_frames[i] = av_frame_alloc(); | ||||
| @@ -163,7 +163,9 @@ static const AVOption avcodec_options[] = { | |||||
| {"has_b_frames", NULL, OFFSET(has_b_frames), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, | {"has_b_frames", NULL, OFFSET(has_b_frames), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| {"block_align", NULL, OFFSET(block_align), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, | {"block_align", NULL, OFFSET(block_align), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| {"mpeg_quant", "use MPEG quantizers instead of H.263", OFFSET(mpeg_quant), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E}, | {"mpeg_quant", "use MPEG quantizers instead of H.263", OFFSET(mpeg_quant), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E}, | ||||
| {"qsquish", "how to keep quantizer between qmin and qmax (0 = clip, 1 = use differentiable function)", OFFSET(rc_qsquish), AV_OPT_TYPE_FLOAT, {.dbl = DEFAULT }, 0, 99, V|E}, | |||||
| #if FF_API_MPV_OPT | |||||
| {"qsquish", "deprecated, use encoder private options instead", OFFSET(rc_qsquish), AV_OPT_TYPE_FLOAT, {.dbl = DEFAULT }, 0, 99, V|E}, | |||||
| #endif | |||||
| {"rc_qmod_amp", "experimental quantizer modulation", OFFSET(rc_qmod_amp), AV_OPT_TYPE_FLOAT, {.dbl = DEFAULT }, -FLT_MAX, FLT_MAX, V|E}, | {"rc_qmod_amp", "experimental quantizer modulation", OFFSET(rc_qmod_amp), AV_OPT_TYPE_FLOAT, {.dbl = DEFAULT }, -FLT_MAX, FLT_MAX, V|E}, | ||||
| {"rc_qmod_freq", "experimental quantizer modulation", OFFSET(rc_qmod_freq), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E}, | {"rc_qmod_freq", "experimental quantizer modulation", OFFSET(rc_qmod_freq), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E}, | ||||
| {"rc_override_count", NULL, OFFSET(rc_override_count), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, | {"rc_override_count", NULL, OFFSET(rc_override_count), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX}, | ||||
| @@ -553,7 +553,7 @@ static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, | |||||
| av_dlog(s, "q:%f max:%f min:%f size:%f index:%f agr:%f\n", | av_dlog(s, "q:%f max:%f min:%f size:%f index:%f agr:%f\n", | ||||
| q, max_rate, min_rate, buffer_size, rcc->buffer_index, | q, max_rate, min_rate, buffer_size, rcc->buffer_index, | ||||
| s->avctx->rc_buffer_aggressivity); | s->avctx->rc_buffer_aggressivity); | ||||
| if (s->avctx->rc_qsquish == 0.0 || qmin == qmax) { | |||||
| if (s->rc_qsquish == 0.0 || qmin == qmax) { | |||||
| if (q < qmin) | if (q < qmin) | ||||
| q = qmin; | q = qmin; | ||||
| else if (q > qmax) | else if (q > qmax) | ||||
| @@ -159,5 +159,8 @@ | |||||
| #ifndef FF_API_AVCTX_TIMEBASE | #ifndef FF_API_AVCTX_TIMEBASE | ||||
| #define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) | #define FF_API_AVCTX_TIMEBASE (LIBAVCODEC_VERSION_MAJOR < 59) | ||||
| #endif | #endif | ||||
| #ifndef FF_API_MPV_OPT | |||||
| #define FF_API_MPV_OPT (LIBAVCODEC_VERSION_MAJOR < 59) | |||||
| #endif | |||||
| #endif /* AVCODEC_VERSION_H */ | #endif /* AVCODEC_VERSION_H */ | ||||