1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-10 06:10:52 +02:00

libxvid: Add SSIM displaying through a libxvidcore plugin

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Timothy Gu
2013-07-30 19:40:45 -07:00
committed by Michael Niedermayer
parent ccb212b6c3
commit 3b3c1ed076
2 changed files with 56 additions and 0 deletions

View File

@@ -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

View File

@@ -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 },
}; };