| @@ -23,6 +23,8 @@ · 22 unmodified lines |
| 23 | 23 | |
| 24 | 24 | #include <float.h> |
| 25 | 25 | |
| 26 | +#include "config_components.h" |
| 27 | + |
| 26 | 28 | #include "libavutil/opt.h" |
| 27 | 29 | #include "libavutil/eval.h" |
| 28 | 30 | #include "libavutil/hwcontext.h" |
| @@ -101,48 +103,6 @@ typedef struct VPPContext{ · 72 unmodified lines |
| 101 | 103 | int has_passthrough; /* apply pass through mode if possible */ |
| 102 | 104 | } VPPContext; |
| 103 | 105 | |
| 104 | | −static const AVOption options[] = { |
| 105 | | − { "deinterlace", "deinterlace mode: 0=off, 1=bob, 2=advanced", OFFSET(deinterlace), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MFX_DEINTERLACING_ADVANCED, .flags = FLAGS, "deinterlace" }, |
| 106 | | − { "bob", "Bob deinterlace mode.", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags = FLAGS, "deinterlace" }, |
| 107 | | − { "advanced", "Advanced deinterlace mode. ", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_ADVANCED }, .flags = FLAGS, "deinterlace" }, |
| 108 | | − |
| 109 | | − { "denoise", "denoise level [0, 100]", OFFSET(denoise), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, |
| 110 | | − { "detail", "enhancement level [0, 100]", OFFSET(detail), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, |
| 111 | | − { "framerate", "output framerate", OFFSET(framerate), AV_OPT_TYPE_RATIONAL, { .dbl = 0.0 },0, DBL_MAX, .flags = FLAGS }, |
| 112 | | − { "procamp", "Enable ProcAmp", OFFSET(procamp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, .flags = FLAGS}, |
| 113 | | − { "hue", "ProcAmp hue", OFFSET(hue), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -180.0, 180.0, .flags = FLAGS}, |
| 114 | | − { "saturation", "ProcAmp saturation", OFFSET(saturation), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, |
| 115 | | − { "contrast", "ProcAmp contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, |
| 116 | | − { "brightness", "ProcAmp brightness", OFFSET(brightness), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -100.0, 100.0, .flags = FLAGS}, |
| 117 | | − |
| 118 | | − { "transpose", "set transpose direction", OFFSET(transpose), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 6, FLAGS, "transpose"}, |
| 119 | | − { "cclock_hflip", "rotate counter-clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 120 | | − { "clock", "rotate clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK }, .flags=FLAGS, .unit = "transpose" }, |
| 121 | | − { "cclock", "rotate counter-clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK }, .flags=FLAGS, .unit = "transpose" }, |
| 122 | | − { "clock_hflip", "rotate clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 123 | | − { "reversal", "rotate by half-turn", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL }, .flags=FLAGS, .unit = "transpose" }, |
| 124 | | − { "hflip", "flip horizontally", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 125 | | − { "vflip", "flip vertically", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 126 | | − |
| 127 | | − { "cw", "set the width crop area expression", OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, 0, 0, FLAGS }, |
| 128 | | − { "ch", "set the height crop area expression", OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, 0, 0, FLAGS }, |
| 129 | | − { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS }, |
| 130 | | − { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS }, |
| 131 | | − |
| 132 | | − { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, |
| 133 | | − { "width", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, |
| 134 | | − { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, |
| 135 | | − { "height", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, |
| 136 | | − { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, |
| 137 | | − { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, |
| 138 | | − { "scale_mode", "scale & format conversion mode: 0=auto, 1=low power, 2=high quality", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, .flags = FLAGS, "scale mode" }, |
| 139 | | − { "auto", "auto mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_DEFAULT}, INT_MIN, INT_MAX, FLAGS, "scale mode"}, |
| 140 | | − { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "scale mode"}, |
| 141 | | − { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "scale mode"}, |
| 142 | | − |
| 143 | | − { NULL } |
| 144 | | −}; |
| 145 | | − |
| 146 | 106 | static const char *const var_names[] = { |
| 147 | 107 | "iw", "in_w", |
| 148 | 108 | "ih", "in_h", |
| @@ -633,6 +593,30 @@ eof: · 484 unmodified lines |
| 633 | 593 | return 0; |
| 634 | 594 | } |
| 635 | 595 | |
| 596 | +static av_cold void vpp_uninit(AVFilterContext *ctx) |
| 597 | +{ |
| 598 | + ff_qsvvpp_close(ctx); |
| 599 | +} |
| 600 | + |
| 601 | +static const AVFilterPad vpp_inputs[] = { |
| 602 | + { |
| 603 | + .name = "default", |
| 604 | + .type = AVMEDIA_TYPE_VIDEO, |
| 605 | + .config_props = config_input, |
| 606 | + .get_buffer.video = ff_qsvvpp_get_video_buffer, |
| 607 | + }, |
| 608 | +}; |
| 609 | + |
| 610 | +static const AVFilterPad vpp_outputs[] = { |
| 611 | + { |
| 612 | + .name = "default", |
| 613 | + .type = AVMEDIA_TYPE_VIDEO, |
| 614 | + .config_props = config_output, |
| 615 | + }, |
| 616 | +}; |
| 617 | + |
| 618 | +#if CONFIG_VPP_QSV_FILTER |
| 619 | + |
| 636 | 620 | static int query_formats(AVFilterContext *ctx) |
| 637 | 621 | { |
| 638 | 622 | int ret; |
| @@ -660,10 +644,47 @@ static int query_formats(AVFilterContext *ctx) · 21 unmodified lines |
| 660 | 644 | &ctx->outputs[0]->incfg.formats); |
| 661 | 645 | } |
| 662 | 646 | |
| 663 | | −static av_cold void vpp_uninit(AVFilterContext *ctx) |
| 664 | | −{ |
| 665 | | − ff_qsvvpp_close(ctx); |
| 666 | | −} |
| 647 | +static const AVOption options[] = { |
| 648 | + { "deinterlace", "deinterlace mode: 0=off, 1=bob, 2=advanced", OFFSET(deinterlace), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MFX_DEINTERLACING_ADVANCED, .flags = FLAGS, "deinterlace" }, |
| 649 | + { "bob", "Bob deinterlace mode.", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags = FLAGS, "deinterlace" }, |
| 650 | + { "advanced", "Advanced deinterlace mode. ", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_ADVANCED }, .flags = FLAGS, "deinterlace" }, |
| 651 | + |
| 652 | + { "denoise", "denoise level [0, 100]", OFFSET(denoise), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, |
| 653 | + { "detail", "enhancement level [0, 100]", OFFSET(detail), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, |
| 654 | + { "framerate", "output framerate", OFFSET(framerate), AV_OPT_TYPE_RATIONAL, { .dbl = 0.0 },0, DBL_MAX, .flags = FLAGS }, |
| 655 | + { "procamp", "Enable ProcAmp", OFFSET(procamp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, .flags = FLAGS}, |
| 656 | + { "hue", "ProcAmp hue", OFFSET(hue), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -180.0, 180.0, .flags = FLAGS}, |
| 657 | + { "saturation", "ProcAmp saturation", OFFSET(saturation), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, |
| 658 | + { "contrast", "ProcAmp contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, |
| 659 | + { "brightness", "ProcAmp brightness", OFFSET(brightness), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -100.0, 100.0, .flags = FLAGS}, |
| 660 | + |
| 661 | + { "transpose", "set transpose direction", OFFSET(transpose), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 6, FLAGS, "transpose"}, |
| 662 | + { "cclock_hflip", "rotate counter-clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 663 | + { "clock", "rotate clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK }, .flags=FLAGS, .unit = "transpose" }, |
| 664 | + { "cclock", "rotate counter-clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK }, .flags=FLAGS, .unit = "transpose" }, |
| 665 | + { "clock_hflip", "rotate clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 666 | + { "reversal", "rotate by half-turn", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL }, .flags=FLAGS, .unit = "transpose" }, |
| 667 | + { "hflip", "flip horizontally", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 668 | + { "vflip", "flip vertically", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP }, .flags=FLAGS, .unit = "transpose" }, |
| 669 | + |
| 670 | + { "cw", "set the width crop area expression", OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, 0, 0, FLAGS }, |
| 671 | + { "ch", "set the height crop area expression", OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, 0, 0, FLAGS }, |
| 672 | + { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS }, |
| 673 | + { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS }, |
| 674 | + |
| 675 | + { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, |
| 676 | + { "width", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, |
| 677 | + { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, |
| 678 | + { "height", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, |
| 679 | + { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, |
| 680 | + { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, |
| 681 | + { "scale_mode", "scale & format conversion mode: 0=auto, 1=low power, 2=high quality", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, .flags = FLAGS, "scale mode" }, |
| 682 | + { "auto", "auto mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_DEFAULT}, INT_MIN, INT_MAX, FLAGS, "scale mode"}, |
| 683 | + { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "scale mode"}, |
| 684 | + { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "scale mode"}, |
| 685 | + |
| 686 | + { NULL } |
| 687 | +}; |
| 667 | 688 | |
| 668 | 689 | static const AVClass vpp_class = { |
| 669 | 690 | .class_name = "vpp_qsv", |
| @@ -672,23 +693,6 @@ static const AVClass vpp_class = { · 2 unmodified lines |
| 672 | 693 | .version = LIBAVUTIL_VERSION_INT, |
| 673 | 694 | }; |
| 674 | 695 | |
| 675 | | −static const AVFilterPad vpp_inputs[] = { |
| 676 | | − { |
| 677 | | − .name = "default", |
| 678 | | − .type = AVMEDIA_TYPE_VIDEO, |
| 679 | | − .config_props = config_input, |
| 680 | | − .get_buffer.video = ff_qsvvpp_get_video_buffer, |
| 681 | | − }, |
| 682 | | −}; |
| 683 | | − |
| 684 | | −static const AVFilterPad vpp_outputs[] = { |
| 685 | | − { |
| 686 | | − .name = "default", |
| 687 | | − .type = AVMEDIA_TYPE_VIDEO, |
| 688 | | − .config_props = config_output, |
| 689 | | − }, |
| 690 | | −}; |
| 691 | | − |
| 692 | 696 | const AVFilter ff_vf_vpp_qsv = { |
| 693 | 697 | .name = "vpp_qsv", |
| 694 | 698 | .description = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."), |
| @@ -703,3 +707,59 @@ const AVFilter ff_vf_vpp_qsv = { · 8 unmodified lines |
| 703 | 707 | .priv_class = &vpp_class, |
| 704 | 708 | .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, |
| 705 | 709 | }; |
| 710 | + |
| 711 | +#endif |
| 712 | + |
| 713 | +#if CONFIG_SCALE_QSV_FILTER |
| 714 | + |
| 715 | +static const AVOption qsvscale_options[] = { |
| 716 | + { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS }, |
| 717 | + { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS }, |
| 718 | + { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, |
| 719 | + |
| 720 | + { "mode", "set scaling mode", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, FLAGS, "mode"}, |
| 721 | + { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "mode"}, |
| 722 | + { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "mode"}, |
| 723 | + |
| 724 | + { NULL }, |
| 725 | +}; |
| 726 | + |
| 727 | +static av_cold int qsvscale_preinit(AVFilterContext *ctx) |
| 728 | +{ |
| 729 | + VPPContext *vpp = ctx->priv; |
| 730 | + |
| 731 | + vpp_preinit(ctx); |
| 732 | + vpp->has_passthrough = 0; |
| 733 | + |
| 734 | + return 0; |
| 735 | +} |
| 736 | + |
| 737 | +static const AVClass qsvscale_class = { |
| 738 | + .class_name = "scale_qsv", |
| 739 | + .item_name = av_default_item_name, |
| 740 | + .option = qsvscale_options, |
| 741 | + .version = LIBAVUTIL_VERSION_INT, |
| 742 | +}; |
| 743 | + |
| 744 | +const AVFilter ff_vf_scale_qsv = { |
| 745 | + .name = "scale_qsv", |
| 746 | + .description = NULL_IF_CONFIG_SMALL("Quick Sync Video scaling and format conversion"), |
| 747 | + |
| 748 | + .preinit = qsvscale_preinit, |
| 749 | + .init = vpp_init, |
| 750 | + .uninit = vpp_uninit, |
| 751 | + |
| 752 | + .priv_size = sizeof(VPPContext), |
| 753 | + .priv_class = &qsvscale_class, |
| 754 | + |
| 755 | + FILTER_INPUTS(vpp_inputs), |
| 756 | + FILTER_OUTPUTS(vpp_outputs), |
| 757 | + |
| 758 | + FILTER_SINGLE_PIXFMT(AV_PIX_FMT_QSV), |
| 759 | + |
| 760 | + .activate = activate, |
| 761 | + |
| 762 | + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, |
| 763 | +}; |
| 764 | + |
| 765 | +#endif |