libxvid: Add SSIM displaying through a libxvidcore plugin

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
pull/37/head
Timothy Gu 12 years ago committed by Michael Niedermayer
parent ccb212b6c3
commit 3b3c1ed076
  1. 37
      doc/encoders.texi
  2. 19
      libavcodec/libxvid.c

@ -1336,6 +1336,43 @@ be better than any of the two specified individually. In other
words, the resulting quality will be the worse one of the two words, the resulting quality will be the worse one of the two
effects. effects.
@item ssim
Set structural similarity (SSIM) displaying method. Possible values:
@table @samp
@item off
Disable displaying of SSIM information.
@item avg
Output average SSIM at the end of encoding to stdout. The format of
showing the average SSIM is:
@example
Average SSIM: %f
@end example
For users who are not familiar with C, %f means a float number, or
a decimal (e.g. 0.939232).
@item frame
Output both per-frame SSIM data during encoding and average SSIM at
the end of encoding to stdout. The format of per-frame information
is:
@example
SSIM: avg: %1.3f min: %1.3f max: %1.3f
@end example
For users who are not familiar with C, %1.3f means a float number
rounded to 3 digits after the dot (e.g. 0.932).
@end table
@item ssim_acc
Set SSIM accuracy. Valid options are integers within the range of
0-4, while 0 gives the most accurate result and 4 computes the
fastest.
@end table @end table
@section png @section png

@ -65,6 +65,8 @@ struct xvid_context {
unsigned char *inter_matrix; /**< I-Frame Quant Matrix */ unsigned char *inter_matrix; /**< I-Frame Quant Matrix */
int lumi_aq; /**< Lumi masking as an aq method */ int lumi_aq; /**< Lumi masking as an aq method */
int variance_aq; /**< Variance adaptive quantization */ int variance_aq; /**< Variance adaptive quantization */
int ssim; /**< SSIM information display mode */
int ssim_acc; /**< SSIM accuracy. 0: accurate. 4: fast. */
}; };
/** /**
@ -359,6 +361,7 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx) {
xvid_plugin_2pass2_t rc2pass2 = { 0 }; xvid_plugin_2pass2_t rc2pass2 = { 0 };
xvid_plugin_lumimasking_t masking_l = { 0 }; /* For lumi masking */ xvid_plugin_lumimasking_t masking_l = { 0 }; /* For lumi masking */
xvid_plugin_lumimasking_t masking_v = { 0 }; /* For variance AQ */ xvid_plugin_lumimasking_t masking_v = { 0 }; /* For variance AQ */
xvid_plugin_ssim_t ssim = { 0 };
xvid_gbl_init_t xvid_gbl_init = { 0 }; xvid_gbl_init_t xvid_gbl_init = { 0 };
xvid_enc_create_t xvid_enc_create = { 0 }; xvid_enc_create_t xvid_enc_create = { 0 };
xvid_enc_plugin_t plugins[7]; xvid_enc_plugin_t plugins[7];
@ -553,6 +556,17 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx) {
"Both lumi_aq and variance_aq are enabled. The resulting quality" "Both lumi_aq and variance_aq are enabled. The resulting quality"
"will be the worse one of the two effects made by the AQ.\n"); "will be the worse one of the two effects made by the AQ.\n");
/* SSIM */
if( x->ssim ) {
plugins[xvid_enc_create.num_plugins].func = xvid_plugin_ssim;
ssim.b_printstat = ( x->ssim == 2 );
ssim.acc = x->ssim_acc;
ssim.cpu_flags = xvid_gbl_init.cpu_flags;
ssim.b_visualize = 0;
plugins[xvid_enc_create.num_plugins].param = &ssim;
xvid_enc_create.num_plugins++;
}
/* Frame Rate and Key Frames */ /* Frame Rate and Key Frames */
xvid_correct_framerate(avctx); xvid_correct_framerate(avctx);
xvid_enc_create.fincr = avctx->time_base.num; xvid_enc_create.fincr = avctx->time_base.num;
@ -788,6 +802,11 @@ static av_cold int xvid_encode_close(AVCodecContext *avctx) {
static const AVOption options[] = { static const AVOption options[] = {
{ "lumi_aq", "Luminance masking AQ", OFFSET(lumi_aq), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, { "lumi_aq", "Luminance masking AQ", OFFSET(lumi_aq), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
{ "variance_aq", "Variance AQ", OFFSET(variance_aq), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, { "variance_aq", "Variance AQ", OFFSET(variance_aq), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
{ "ssim", "Show SSIM information to stdout", OFFSET(ssim), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, VE, "ssim" },
{ "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, "ssim" },
{ "avg", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, "ssim" },
{ "frame", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, INT_MIN, INT_MAX, VE, "ssim" },
{ "ssim_acc", "SSIM accuracy", OFFSET(ssim_acc), AV_OPT_TYPE_INT, { .i64 = 2 }, 0, 4, VE },
{ NULL }, { NULL },
}; };

Loading…
Cancel
Save