History

avfilter/vf_libplacebo: implement rotation option

Flipping can already be accomplished by setting the crop_w/h expressions to their negative values, so together these options can implement any of the common frame orientations.

Niklas Haas committed 1 year ago

Commit 4f623b41 parent a79720e3 files · +35 −1Browse files

Showing the changes to libavfilter (2 of 3 files). Show all

Unified · Split

2 files
  1. libavfilter/avfilter.c +2 −1
  2. libavfilter/vf_libplacebo.c +23 −0
libavfilter/avfilter.c+2−1
@@ -1071,7 +1071,8 @@ int ff_filter_frame(AVFilterLink *link, AVFrame *frame) · 1070 unmodified lines
1071 strcmp(link->dst->filter->name, "format") &&1071 strcmp(link->dst->filter->name, "format") &&
1072 strcmp(link->dst->filter->name, "idet") &&1072 strcmp(link->dst->filter->name, "idet") &&
1073 strcmp(link->dst->filter->name, "null") &&1073 strcmp(link->dst->filter->name, "null") &&
1074 strcmp(link->dst->filter->name, "scale")) {1074 strcmp(link->dst->filter->name, "scale") &&
1075 strcmp(link->dst->filter->name, "libplacebo")) {
1075 av_assert1(frame->format == link->format);1076 av_assert1(frame->format == link->format);
1076 av_assert1(frame->width == link->w);1077 av_assert1(frame->width == link->w);
1077 av_assert1(frame->height == link->h);1078 av_assert1(frame->height == link->h);
libavfilter/vf_libplacebo.c+23−0
@@ -193,6 +193,7 @@ typedef struct LibplaceboContext { · 192 unmodified lines
193 int color_range;193 int color_range;
194 int color_primaries;194 int color_primaries;
195 int color_trc;195 int color_trc;
196 int rotation;
196 AVDictionary *extra_opts;197 AVDictionary *extra_opts;
197 198
198 int have_hwdevice;199 int have_hwdevice;
@@ -802,6 +803,13 @@ static void update_crops(AVFilterContext *ctx, LibplaceboInput *in, · 603 unmodified lines
802 image->crop.y0 = av_expr_eval(s->crop_y_pexpr, s->var_values, NULL);803 image->crop.y0 = av_expr_eval(s->crop_y_pexpr, s->var_values, NULL);
803 image->crop.x1 = image->crop.x0 + s->var_values[VAR_CROP_W];804 image->crop.x1 = image->crop.x0 + s->var_values[VAR_CROP_W];
804 image->crop.y1 = image->crop.y0 + s->var_values[VAR_CROP_H];805 image->crop.y1 = image->crop.y0 + s->var_values[VAR_CROP_H];
806 image->rotation = s->rotation;
807 if (s->rotation % PL_ROTATION_180 == PL_ROTATION_90) {
808 /* Libplacebo expects the input crop relative to the actual frame
809 * dimensions, so un-transpose them here */
810 FFSWAP(float, image->crop.x0, image->crop.y0);
811 FFSWAP(float, image->crop.x1, image->crop.y1);
812 }
805 813
806 if (src == ref) {814 if (src == ref) {
807 /* Only update the target crop once, for the 'reference' frame */815 /* Only update the target crop once, for the 'reference' frame */
@@ -1198,6 +1206,14 @@ static int libplacebo_config_input(AVFilterLink *inlink) · 390 unmodified lines
1198 AVFilterContext *avctx = inlink->dst;1206 AVFilterContext *avctx = inlink->dst;
1199 LibplaceboContext *s = avctx->priv;1207 LibplaceboContext *s = avctx->priv;
1200 1208
1209 if (s->rotation % PL_ROTATION_180 == PL_ROTATION_90) {
1210 /* Swap width and height for 90 degree rotations to make the size and
1211 * scaling calculations work out correctly */
1212 FFSWAP(int, inlink->w, inlink->h);
1213 if (inlink->sample_aspect_ratio.num)
1214 inlink->sample_aspect_ratio = av_inv_q(inlink->sample_aspect_ratio);
1215 }
1216
1201 if (inlink->format == AV_PIX_FMT_VULKAN)1217 if (inlink->format == AV_PIX_FMT_VULKAN)
1202 return ff_vk_filter_config_input(inlink);1218 return ff_vk_filter_config_input(inlink);
1203 1219
@@ -1386,6 +1402,13 @@ static const AVOption libplacebo_options[] = { · 182 unmodified lines
1386 {"smpte2084", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE2084}, INT_MIN, INT_MAX, STATIC, .unit = "color_trc"},1402 {"smpte2084", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE2084}, INT_MIN, INT_MAX, STATIC, .unit = "color_trc"},
1387 {"arib-std-b67", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_ARIB_STD_B67}, INT_MIN, INT_MAX, STATIC, .unit = "color_trc"},1403 {"arib-std-b67", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_ARIB_STD_B67}, INT_MIN, INT_MAX, STATIC, .unit = "color_trc"},
1388 1404
1405 {"rotate", "rotate the input clockwise", OFFSET(rotation), AV_OPT_TYPE_INT, {.i64=PL_ROTATION_0}, PL_ROTATION_0, PL_ROTATION_360, DYNAMIC, .unit = "rotation"},
1406 {"0", NULL, 0, AV_OPT_TYPE_CONST, {.i64=PL_ROTATION_0}, .flags = STATIC, .unit = "rotation"},
1407 {"90", NULL, 0, AV_OPT_TYPE_CONST, {.i64=PL_ROTATION_90}, .flags = STATIC, .unit = "rotation"},
1408 {"180", NULL, 0, AV_OPT_TYPE_CONST, {.i64=PL_ROTATION_180}, .flags = STATIC, .unit = "rotation"},
1409 {"270", NULL, 0, AV_OPT_TYPE_CONST, {.i64=PL_ROTATION_270}, .flags = STATIC, .unit = "rotation"},
1410 {"360", NULL, 0, AV_OPT_TYPE_CONST, {.i64=PL_ROTATION_360}, .flags = STATIC, .unit = "rotation"},
1411
1389 { "upscaler", "Upscaler function", OFFSET(upscaler), AV_OPT_TYPE_STRING, {.str = "spline36"}, .flags = DYNAMIC },1412 { "upscaler", "Upscaler function", OFFSET(upscaler), AV_OPT_TYPE_STRING, {.str = "spline36"}, .flags = DYNAMIC },
1390 { "downscaler", "Downscaler function", OFFSET(downscaler), AV_OPT_TYPE_STRING, {.str = "mitchell"}, .flags = DYNAMIC },1413 { "downscaler", "Downscaler function", OFFSET(downscaler), AV_OPT_TYPE_STRING, {.str = "mitchell"}, .flags = DYNAMIC },
1391 { "frame_mixer", "Frame mixing function", OFFSET(frame_mixer), AV_OPT_TYPE_STRING, {.str = "none"}, .flags = DYNAMIC },1414 { "frame_mixer", "Frame mixing function", OFFSET(frame_mixer), AV_OPT_TYPE_STRING, {.str = "none"}, .flags = DYNAMIC },

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t