| @@ -23,6 +23,8 @@ · 22 unmodified lines |
| 23 | | 23 | |
| 24 | #include <float.h> | 24 | #include <float.h> |
| 25 | | 25 | |
| | 26 | #include "config_components.h" |
| | 27 | |
| 26 | #include "libavutil/opt.h" | 28 | #include "libavutil/opt.h" |
| 27 | #include "libavutil/eval.h" | 29 | #include "libavutil/eval.h" |
| 28 | #include "libavutil/hwcontext.h" | 30 | #include "libavutil/hwcontext.h" |
| @@ -101,48 +103,6 @@ typedef struct VPPContext{ · 72 unmodified lines |
| 101 | int has_passthrough; /* apply pass through mode if possible */ | 103 | int has_passthrough; /* apply pass through mode if possible */ |
| 102 | } VPPContext; | 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 | static const char *const var_names[] = { | 106 | static const char *const var_names[] = { |
| 147 | "iw", "in_w", | 107 | "iw", "in_w", |
| 148 | "ih", "in_h", | 108 | "ih", "in_h", |
| @@ -633,6 +593,30 @@ eof: · 484 unmodified lines |
| 633 | return 0; | 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 | static int query_formats(AVFilterContext *ctx) | 620 | static int query_formats(AVFilterContext *ctx) |
| 637 | { | 621 | { |
| 638 | int ret; | 622 | int ret; |
| @@ -660,10 +644,47 @@ static int query_formats(AVFilterContext *ctx) · 21 unmodified lines |
| 660 | &ctx->outputs[0]->incfg.formats); | 644 | &ctx->outputs[0]->incfg.formats); |
| 661 | } | 645 | } |
| 662 | | 646 | |
| 663 | static av_cold void vpp_uninit(AVFilterContext *ctx) | 647 | static const AVOption options[] = { |
| 664 | { | 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" }, |
| 665 | ff_qsvvpp_close(ctx); | 649 | { "bob", "Bob deinterlace mode.", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags = FLAGS, "deinterlace" }, |
| 666 | } | 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 | static const AVClass vpp_class = { | 689 | static const AVClass vpp_class = { |
| 669 | .class_name = "vpp_qsv", | 690 | .class_name = "vpp_qsv", |
| @@ -672,23 +693,6 @@ static const AVClass vpp_class = { · 2 unmodified lines |
| 672 | .version = LIBAVUTIL_VERSION_INT, | 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 | const AVFilter ff_vf_vpp_qsv = { | 696 | const AVFilter ff_vf_vpp_qsv = { |
| 693 | .name = "vpp_qsv", | 697 | .name = "vpp_qsv", |
| 694 | .description = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."), | 698 | .description = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."), |
| @@ -703,3 +707,59 @@ const AVFilter ff_vf_vpp_qsv = { · 8 unmodified lines |
| 703 | .priv_class = &vpp_class, | 707 | .priv_class = &vpp_class, |
| 704 | .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, | 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 |