Discussion:
[Libva] [PATCH V1][libva-intel-driver] Move the sharpness into the whole virtual VEBOX process
peng.chen
2016-09-22 05:57:47 UTC
Permalink
It fixes below issues:
https://bugs.freedesktop.org/show_bug.cgi?id=96987
https://bugs.freedesktop.org/show_bug.cgi?id=96988

Signed-off-by: peng.chen <***@intel.com>
---
src/gen75_picture_process.c | 34 +---------------------------------
src/gen75_picture_process.h | 2 --
src/gen75_vpp_vebox.c | 32 +++++++++++++++++++++++++++++++-
src/gen75_vpp_vebox.h | 5 +++++
4 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/src/gen75_picture_process.c b/src/gen75_picture_process.c
index 802452b..0b681f1 100644
--- a/src/gen75_picture_process.c
+++ b/src/gen75_picture_process.c
@@ -91,25 +91,6 @@ gen75_vpp_vebox(VADriverContextP ctx,
return va_status;
}

-static VAStatus
-gen75_vpp_gpe(VADriverContextP ctx,
- struct intel_video_process_context* proc_ctx)
-{
- VAStatus va_status = VA_STATUS_SUCCESS;
-
- if(proc_ctx->vpp_gpe_ctx == NULL){
- proc_ctx->vpp_gpe_ctx = vpp_gpe_context_init(ctx);
- }
-
- proc_ctx->vpp_gpe_ctx->pipeline_param = proc_ctx->pipeline_param;
- proc_ctx->vpp_gpe_ctx->surface_pipeline_input_object = proc_ctx->surface_pipeline_input_object;
- proc_ctx->vpp_gpe_ctx->surface_output_object = proc_ctx->surface_render_output_object;
-
- va_status = vpp_gpe_process_picture(ctx, proc_ctx->vpp_gpe_ctx);
-
- return va_status;
-}
-
VAStatus
gen75_proc_picture(VADriverContextP ctx,
VAProfile profile,
@@ -324,16 +305,9 @@ gen75_proc_picture(VADriverContextP ctx,
if (filter->type == VAProcFilterNoiseReduction ||
filter->type == VAProcFilterDeinterlacing ||
filter->type == VAProcFilterSkinToneEnhancement ||
+ filter->type == VAProcFilterSharpening ||
filter->type == VAProcFilterColorBalance){
gen75_vpp_vebox(ctx, proc_ctx);
- }else if(filter->type == VAProcFilterSharpening){
- if (proc_ctx->surface_pipeline_input_object->fourcc != VA_FOURCC_NV12 ||
- proc_ctx->surface_render_output_object->fourcc != VA_FOURCC_NV12) {
- status = VA_STATUS_ERROR_UNIMPLEMENTED;
- goto error;
- }
-
- gen75_vpp_gpe(ctx, proc_ctx);
}
}else if (pipeline_param->num_filters >= 2) {
unsigned int i = 0;
@@ -413,11 +387,6 @@ gen75_proc_context_destroy(void *hw_context)
proc_ctx->vpp_vebox_ctx = NULL;
}

- if(proc_ctx->vpp_gpe_ctx){
- vpp_gpe_context_destroy(ctx,proc_ctx->vpp_gpe_ctx);
- proc_ctx->vpp_gpe_ctx = NULL;
- }
-
free(proc_ctx);
}

@@ -433,7 +402,6 @@ gen75_proc_context_init(VADriverContextP ctx,
proc_context->base.run = gen75_proc_picture;

proc_context->vpp_vebox_ctx = NULL;
- proc_context->vpp_gpe_ctx = NULL;
proc_context->vpp_fmt_cvt_ctx = NULL;

proc_context->driver_context = ctx;
diff --git a/src/gen75_picture_process.h b/src/gen75_picture_process.h
index b0f9750..2ac9d4e 100644
--- a/src/gen75_picture_process.h
+++ b/src/gen75_picture_process.h
@@ -31,7 +31,6 @@
#include <va/va_vpp.h>
#include "i965_drv_video.h"
#include "gen75_vpp_vebox.h"
-#include "gen75_vpp_gpe.h"

struct intel_video_process_context
{
@@ -40,7 +39,6 @@ struct intel_video_process_context

struct intel_vebox_context *vpp_vebox_ctx;
struct hw_context *vpp_fmt_cvt_ctx;
- struct vpp_gpe_context *vpp_gpe_ctx;

VAProcPipelineParameterBuffer* pipeline_param;

diff --git a/src/gen75_vpp_vebox.c b/src/gen75_vpp_vebox.c
index d88a454..64a197e 100644
--- a/src/gen75_vpp_vebox.c
+++ b/src/gen75_vpp_vebox.c
@@ -115,6 +115,25 @@ vpp_surface_scaling(VADriverContextP ctx, struct object_surface *src_obj_surf,
return va_status;
}

+static VAStatus
+vpp_sharpness_filtering(VADriverContextP ctx,
+ struct intel_vebox_context *proc_ctx)
+{
+ VAStatus va_status = VA_STATUS_SUCCESS;
+
+ if(proc_ctx->vpp_gpe_ctx == NULL){
+ proc_ctx->vpp_gpe_ctx = vpp_gpe_context_init(ctx);
+ }
+
+ proc_ctx->vpp_gpe_ctx->pipeline_param = proc_ctx->pipeline_param;
+ proc_ctx->vpp_gpe_ctx->surface_pipeline_input_object = proc_ctx->frame_store[FRAME_IN_CURRENT].obj_surface;
+ proc_ctx->vpp_gpe_ctx->surface_output_object = proc_ctx->frame_store[FRAME_OUT_CURRENT].obj_surface;
+
+ va_status = vpp_gpe_process_picture(ctx, proc_ctx->vpp_gpe_ctx);
+
+ return va_status;
+}
+
void hsw_veb_dndi_table(VADriverContextP ctx, struct intel_vebox_context *proc_ctx)
{
struct i965_driver_data *i965 = i965_driver_data(ctx);
@@ -1610,6 +1629,9 @@ gen75_vebox_init_pipe_params(VADriverContextP ctx,
proc_ctx->filters_mask |= VPP_IECP_STD_STE;
proc_ctx->filter_iecp_std = filter;
break;
+ case VAProcFilterSharpening:
+ proc_ctx->filters_mask |= VPP_SHARP;
+ break;
default:
WARN_ONCE("unsupported filter (type: %d)\n", filter->type);
return VA_STATUS_ERROR_UNSUPPORTED_FILTER;
@@ -1750,6 +1772,11 @@ void gen75_vebox_context_destroy(VADriverContextP ctx,
{
int i;

+ if(proc_ctx->vpp_gpe_ctx){
+ vpp_gpe_context_destroy(ctx,proc_ctx->vpp_gpe_ctx);
+ proc_ctx->vpp_gpe_ctx = NULL;
+ }
+
if(proc_ctx->surface_input_vebox != VA_INVALID_ID){
i965_DestroySurfaces(ctx, &proc_ctx->surface_input_vebox, 1);
proc_ctx->surface_input_vebox = VA_INVALID_ID;
@@ -1815,6 +1842,7 @@ struct intel_vebox_context * gen75_vebox_context_init(VADriverContextP ctx)
proc_context->surface_output_scaled_object = NULL;
proc_context->filters_mask = 0;
proc_context->format_convert_flags = 0;
+ proc_context->vpp_gpe_ctx = NULL;

return proc_context;
}
@@ -2428,7 +2456,9 @@ gen9_vebox_process_picture(VADriverContextP ctx,
if (status != VA_STATUS_SUCCESS)
return status;

- if (proc_ctx->format_convert_flags & POST_COPY_CONVERT) {
+ if (proc_ctx->filters_mask & VPP_SHARP_MASK) {
+ vpp_sharpness_filtering(ctx, proc_ctx);
+ } else if (proc_ctx->format_convert_flags & POST_COPY_CONVERT) {
assert(proc_ctx->is_second_field);
/* directly copy the saved frame in the second call */
} else {
diff --git a/src/gen75_vpp_vebox.h b/src/gen75_vpp_vebox.h
index 31c5c4e..0b01a5c 100644
--- a/src/gen75_vpp_vebox.h
+++ b/src/gen75_vpp_vebox.h
@@ -37,6 +37,7 @@
#include "i965_drv_video.h"

#include "i965_post_processing.h"
+#include "gen75_vpp_gpe.h"

#define INPUT_SURFACE 0
#define OUTPUT_SURFACE 1
@@ -52,6 +53,8 @@
#define VPP_IECP_AOI 0x00002000
#define VPP_IECP_CSC_TRANSFORM 0x00004000
#define VPP_IECP_MASK 0x0000ff00
+#define VPP_SHARP 0x00010000
+#define VPP_SHARP_MASK 0x000f0000
#define MAX_FILTER_SUM 8

#define PRE_FORMAT_CONVERT 0x01
@@ -152,6 +155,8 @@ struct intel_vebox_context
unsigned int is_di_adv_enabled : 1;
unsigned int is_first_frame : 1;
unsigned int is_second_field : 1;
+
+ struct vpp_gpe_context *vpp_gpe_ctx;
};

VAStatus gen75_vebox_process_picture(VADriverContextP ctx,
--
1.9.1
Loading...