avfilter/lensfun: add option db_path

The lensfun filter, at present, loads its database from a path hardcoded
at build time. This may not be known or available to end users.

Added option db_path allows custom path.
This commit is contained in:
Gyan Doshi 2022-04-10 11:27:27 +05:30
parent 1047fedd0f
commit 1405b65d22
2 changed files with 9 additions and 3 deletions

View File

@ -14700,6 +14700,10 @@ required.
The model of the lens (for example, "Canon EF-S 18-55mm f/3.5-5.6 IS STM"). This
option is required.
@item db_path
The full path to the lens database folder. If not set, the filter will attempt to
load the database from the install path when the library was built. Default is unset.
@item mode
The type of correction to apply. The following values are valid options:

View File

@ -73,7 +73,7 @@ typedef struct DistortionCorrectionThreadData {
typedef struct LensfunContext {
const AVClass *class;
const char *make, *model, *lens_model;
const char *make, *model, *lens_model, *db_path;
int mode;
float focal_length;
float aperture;
@ -97,6 +97,7 @@ static const AVOption lensfun_options[] = {
{ "make", "set camera maker", OFFSET(make), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
{ "model", "set camera model", OFFSET(model), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
{ "lens_model", "set lens model", OFFSET(lens_model), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
{ "db_path", "set path to database", OFFSET(db_path), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
{ "mode", "set mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=GEOMETRY_DISTORTION}, 0, VIGNETTING | GEOMETRY_DISTORTION | SUBPIXEL_DISTORTION, FLAGS, "mode" },
{ "vignetting", "fix lens vignetting", 0, AV_OPT_TYPE_CONST, {.i64=VIGNETTING}, 0, 0, FLAGS, "mode" },
{ "geometry", "correct geometry distortion", 0, AV_OPT_TYPE_CONST, {.i64=GEOMETRY_DISTORTION}, 0, 0, FLAGS, "mode" },
@ -136,9 +137,10 @@ static av_cold int init(AVFilterContext *ctx)
const lfLens **lenses;
db = lf_db_create();
if (lf_db_load(db) != LF_NO_ERROR) {
if ((lensfun->db_path ? lf_db_load_path(db, lensfun->db_path) : lf_db_load(db)) != LF_NO_ERROR) {
lf_db_destroy(db);
av_log(ctx, AV_LOG_FATAL, "Failed to load lensfun database\n");
av_log(ctx, AV_LOG_FATAL, "Failed to load lensfun database from %s path\n",
lensfun->db_path ? lensfun->db_path : "default");
return AVERROR_INVALIDDATA;
}