Commit 6e0d8c06 authored by Michael Niedermayer's avatar Michael Niedermayer

mb_lmin/max to limit the per mb quality for the ratecontrol independant from the frame limits

Originally committed as revision 3928 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 957c743a
...@@ -106,8 +106,8 @@ static int video_qmin = 2; ...@@ -106,8 +106,8 @@ static int video_qmin = 2;
static int video_qmax = 31; static int video_qmax = 31;
static int video_lmin = 2*FF_QP2LAMBDA; static int video_lmin = 2*FF_QP2LAMBDA;
static int video_lmax = 31*FF_QP2LAMBDA; static int video_lmax = 31*FF_QP2LAMBDA;
static int video_mb_qmin = 2; static int video_mb_lmin = 2*FF_QP2LAMBDA;
static int video_mb_qmax = 31; static int video_mb_lmax = 31*FF_QP2LAMBDA;
static int video_qdiff = 3; static int video_qdiff = 3;
static int video_lelim = 0; static int video_lelim = 0;
static int video_celim = 0; static int video_celim = 0;
...@@ -2490,7 +2490,7 @@ static void opt_lmin(const char *arg) ...@@ -2490,7 +2490,7 @@ static void opt_lmin(const char *arg)
static void opt_qmin(const char *arg) static void opt_qmin(const char *arg)
{ {
video_qmin = atoi(arg); video_qmin = atoi(arg);
if (video_qmin < 0 || if (video_qmin < 1 ||
video_qmin > 31) { video_qmin > 31) {
fprintf(stderr, "qmin must be >= 1 and <= 31\n"); fprintf(stderr, "qmin must be >= 1 and <= 31\n");
exit(1); exit(1);
...@@ -2500,29 +2500,29 @@ static void opt_qmin(const char *arg) ...@@ -2500,29 +2500,29 @@ static void opt_qmin(const char *arg)
static void opt_qmax(const char *arg) static void opt_qmax(const char *arg)
{ {
video_qmax = atoi(arg); video_qmax = atoi(arg);
if (video_qmax < 0 || if (video_qmax < 1 ||
video_qmax > 31) { video_qmax > 31) {
fprintf(stderr, "qmax must be >= 1 and <= 31\n"); fprintf(stderr, "qmax must be >= 1 and <= 31\n");
exit(1); exit(1);
} }
} }
static void opt_mb_qmin(const char *arg) static void opt_mb_lmin(const char *arg)
{ {
video_mb_qmin = atoi(arg); video_mb_lmin = atof(arg)*FF_QP2LAMBDA;
if (video_mb_qmin < 0 || if (video_mb_lmin < 1 ||
video_mb_qmin > 31) { video_mb_lmin > FF_LAMBDA_MAX) {
fprintf(stderr, "qmin must be >= 1 and <= 31\n"); fprintf(stderr, "mblmin must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
exit(1); exit(1);
} }
} }
static void opt_mb_qmax(const char *arg) static void opt_mb_lmax(const char *arg)
{ {
video_mb_qmax = atoi(arg); video_mb_lmax = atof(arg)*FF_QP2LAMBDA;
if (video_mb_qmax < 0 || if (video_mb_lmax < 1 ||
video_mb_qmax > 31) { video_mb_lmax > FF_LAMBDA_MAX) {
fprintf(stderr, "qmax must be >= 1 and <= 31\n"); fprintf(stderr, "mblmax must be >= 1 and <= %d\n", FF_LAMBDA_MAX / FF_QP2LAMBDA);
exit(1); exit(1);
} }
} }
...@@ -3227,8 +3227,8 @@ static void opt_output_file(const char *filename) ...@@ -3227,8 +3227,8 @@ static void opt_output_file(const char *filename)
video_enc->rc_qsquish = video_qsquish; video_enc->rc_qsquish = video_qsquish;
video_enc->luma_elim_threshold = video_lelim; video_enc->luma_elim_threshold = video_lelim;
video_enc->chroma_elim_threshold = video_celim; video_enc->chroma_elim_threshold = video_celim;
video_enc->mb_qmin = video_mb_qmin; video_enc->mb_lmin = video_mb_lmin;
video_enc->mb_qmax = video_mb_qmax; video_enc->mb_lmax = video_mb_lmax;
video_enc->max_qdiff = video_qdiff; video_enc->max_qdiff = video_qdiff;
video_enc->qblur = video_qblur; video_enc->qblur = video_qblur;
video_enc->qcompress = video_qcomp; video_enc->qcompress = video_qcomp;
...@@ -3947,8 +3947,8 @@ const OptionDef options[] = { ...@@ -3947,8 +3947,8 @@ const OptionDef options[] = {
{ "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" }, { "qmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qmax}, "max video quantiser scale (VBR)", "q" },
{ "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" }, { "lmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmin}, "min video lagrange factor (VBR)", "lambda" },
{ "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" }, { "lmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_lmax}, "max video lagrange factor (VBR)", "lambda" },
{ "mbqmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmin}, "min macroblock quantiser scale (VBR)", "q" }, { "mblmin", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmin}, "min macroblock quantiser scale (VBR)", "q" },
{ "mbqmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_qmax}, "max macroblock quantiser scale (VBR)", "q" }, { "mblmax", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_mb_lmax}, "max macroblock quantiser scale (VBR)", "q" },
{ "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" }, { "qdiff", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qdiff}, "max difference between the quantiser scale (VBR)", "q" },
{ "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" }, { "qblur", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qblur}, "video quantiser scale blur (VBR)", "blur" },
{ "qsquish", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qsquish}, "how to keep quantiser between qmin and qmax (0 = clip, 1 = use differentiable function)", "squish" }, { "qsquish", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qsquish}, "how to keep quantiser between qmin and qmax (0 = clip, 1 = use differentiable function)", "squish" },
......
...@@ -17,7 +17,7 @@ extern "C" { ...@@ -17,7 +17,7 @@ extern "C" {
#define FFMPEG_VERSION_INT 0x000409 #define FFMPEG_VERSION_INT 0x000409
#define FFMPEG_VERSION "0.4.9-pre1" #define FFMPEG_VERSION "0.4.9-pre1"
#define LIBAVCODEC_BUILD 4741 #define LIBAVCODEC_BUILD 4742
#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVCODEC_VERSION FFMPEG_VERSION #define LIBAVCODEC_VERSION FFMPEG_VERSION
...@@ -1276,14 +1276,14 @@ typedef struct AVCodecContext { ...@@ -1276,14 +1276,14 @@ typedef struct AVCodecContext {
/** /**
* minimum MB quantizer. * minimum MB quantizer.
* - encoding: set by user. * - encoding: unused
* - decoding: unused * - decoding: unused
*/ */
int mb_qmin; int mb_qmin;
/** /**
* maximum MB quantizer. * maximum MB quantizer.
* - encoding: set by user. * - encoding: unused
* - decoding: unused * - decoding: unused
*/ */
int mb_qmax; int mb_qmax;
...@@ -1758,6 +1758,20 @@ typedef struct AVCodecContext { ...@@ -1758,6 +1758,20 @@ typedef struct AVCodecContext {
* - decoding: unused * - decoding: unused
*/ */
float border_masking; float border_masking;
/**
* minimum MB lagrange multipler.
* - encoding: set by user.
* - decoding: unused
*/
int mb_lmin;
/**
* maximum MB lagrange multipler.
* - encoding: set by user.
* - decoding: unused
*/
int mb_lmax;
} AVCodecContext; } AVCodecContext;
......
...@@ -506,8 +506,8 @@ static void adaptive_quantization(MpegEncContext *s, double q){ ...@@ -506,8 +506,8 @@ static void adaptive_quantization(MpegEncContext *s, double q){
float cplx_sum= 0.0; float cplx_sum= 0.0;
float cplx_tab[s->mb_num]; float cplx_tab[s->mb_num];
float bits_tab[s->mb_num]; float bits_tab[s->mb_num];
const int qmin= s->avctx->lmin; const int qmin= s->avctx->mb_lmin;
const int qmax= s->avctx->lmax; const int qmax= s->avctx->mb_lmax;
Picture * const pic= &s->current_picture; Picture * const pic= &s->current_picture;
const int mb_width = s->mb_width; const int mb_width = s->mb_width;
const int mb_height = s->mb_height; const int mb_height = s->mb_height;
......
...@@ -430,8 +430,8 @@ void avcodec_get_context_defaults(AVCodecContext *s){ ...@@ -430,8 +430,8 @@ void avcodec_get_context_defaults(AVCodecContext *s){
s->bit_rate_tolerance= s->bit_rate*10; s->bit_rate_tolerance= s->bit_rate*10;
s->qmin= 2; s->qmin= 2;
s->qmax= 31; s->qmax= 31;
s->mb_qmin= 2; s->mb_lmin= FF_QP2LAMBDA * 2;
s->mb_qmax= 31; s->mb_lmax= FF_QP2LAMBDA * 31;
s->rc_eq= "tex^qComp"; s->rc_eq= "tex^qComp";
s->qcompress= 0.5; s->qcompress= 0.5;
s->max_qdiff= 3; s->max_qdiff= 3;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment