Signed-off-by: Nayan Deshmukh <nayan26deshm...@gmail.com> --- src/gallium/state_trackers/vdpau/mixer.c | 51 ++++++++++++++++-------- src/gallium/state_trackers/vdpau/output.c | 4 +- src/gallium/state_trackers/vdpau/vdpau_private.h | 6 ++- 3 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index dec79ff..f183412 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -69,7 +69,7 @@ vlVdpVideoMixerCreate(VdpDevice device, vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, true, &vmixer->csc); if (!debug_get_bool_option("G3DVL_NO_CSC", FALSE)) - vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc); + vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc, 1.f, 0.f); *mixer = vlAddDataHTAB(vmixer); if (*mixer == 0) { @@ -92,7 +92,6 @@ vlVdpVideoMixerCreate(VdpDevice device, case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8: case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9: case VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE: - case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: break; case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: @@ -107,6 +106,10 @@ vlVdpVideoMixerCreate(VdpDevice device, vmixer->noise_reduction.supported = true; break; + case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: + vmixer->luma_key.supported = true; + break; + default: goto no_params; } } @@ -148,8 +151,8 @@ vlVdpVideoMixerCreate(VdpDevice device, vmixer->video_height, max_size); goto no_params; } - vmixer->luma_key_min = 0.f; - vmixer->luma_key_max = 1.f; + vmixer->luma_key.luma_min = 1.f; + vmixer->luma_key.luma_max = 0.f; pipe_mutex_unlock(dev->mutex); return VDP_STATUS_OK; @@ -199,6 +202,7 @@ vlVdpVideoMixerDestroy(VdpVideoMixer mixer) vl_matrix_filter_cleanup(vmixer->sharpness.filter); FREE(vmixer->sharpness.filter); } + pipe_mutex_unlock(vmixer->device->mutex); DeviceReference(&vmixer->device, NULL); @@ -356,6 +360,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, if (vmixer->sharpness.filter) vl_matrix_filter_render(vmixer->sharpness.filter, dst->sampler_view, dst->surface); + } pipe_mutex_unlock(vmixer->device->mutex); @@ -490,7 +495,6 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8: case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9: case VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE: - case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: feature_supports[i] = false; break; @@ -506,6 +510,10 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer, feature_supports[i] = vmixer->noise_reduction.supported; break; + case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: + feature_supports[i] = vmixer->luma_key.supported; + break; + default: return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE; } @@ -548,7 +556,6 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8: case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9: case VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE: - case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: break; case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL: @@ -566,6 +573,12 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer, vlVdpVideoMixerUpdateNoiseReductionFilter(vmixer); break; + case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: + vmixer->luma_key.enabled = feature_enables[i]; + if (!debug_get_bool_option("G3DVL_NO_CSC", FALSE)) + vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc, vmixer->luma_key.luma_min, vmixer->luma_key.luma_max); + break; + default: pipe_mutex_unlock(vmixer->device->mutex); return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE; @@ -610,7 +623,6 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L8: case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L9: case VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE: - case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: break; case VDP_VIDEO_MIXER_FEATURE_SHARPNESS: @@ -621,6 +633,10 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer, feature_enables[i] = vmixer->noise_reduction.enabled; break; + case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY: + feature_enables[i] = vmixer->luma_key.enabled; + break; + default: return VDP_STATUS_INVALID_VIDEO_MIXER_FEATURE; } @@ -663,6 +679,7 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, color.f[3] = background_color->alpha; vl_compositor_set_clear_color(&vmixer->cstate, &color); break; + case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX: vdp_csc = attribute_values[i]; vmixer->custom_csc = !!vdp_csc; @@ -671,17 +688,15 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, else memcpy(vmixer->csc, vdp_csc, sizeof(vl_csc_matrix)); if (!debug_get_bool_option("G3DVL_NO_CSC", FALSE)) - vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc); + vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc, vmixer->luma_key.luma_min, vmixer->luma_key.luma_max); break; case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL: - val = *(float*)attribute_values[i]; if (val < 0.f || val > 1.f) { ret = VDP_STATUS_INVALID_VALUE; goto fail; } - vmixer->noise_reduction.level = val * 10; vlVdpVideoMixerUpdateNoiseReductionFilter(vmixer); break; @@ -692,25 +707,28 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, ret = VDP_STATUS_INVALID_VALUE; goto fail; } - vmixer->luma_key_min = val; + vmixer->luma_key.luma_min = val; + if (!debug_get_bool_option("G3DVL_NO_CSC", FALSE)) + vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc, vmixer->luma_key.luma_min, vmixer->luma_key.luma_max); break; + case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA: val = *(float*)attribute_values[i]; if (val < 0.f || val > 1.f) { ret = VDP_STATUS_INVALID_VALUE; goto fail; } - vmixer->luma_key_max = val; + vmixer->luma_key.luma_max = val; + if (!debug_get_bool_option("G3DVL_NO_CSC", FALSE)) + vl_compositor_set_csc_matrix(&vmixer->cstate, (const vl_csc_matrix *)&vmixer->csc, vmixer->luma_key.luma_min, vmixer->luma_key.luma_max); break; case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL: - val = *(float*)attribute_values[i]; if (val < -1.f || val > 1.f) { ret = VDP_STATUS_INVALID_VALUE; goto fail; } - vmixer->sharpness.value = val; vlVdpVideoMixerUpdateSharpnessFilter(vmixer); break; @@ -723,6 +741,7 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, vmixer->skip_chroma_deint = *(uint8_t*)attribute_values[i]; vlVdpVideoMixerUpdateDeinterlaceFilter(vmixer); break; + default: ret = VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE; goto fail; @@ -814,10 +833,10 @@ vlVdpVideoMixerGetAttributeValues(VdpVideoMixer mixer, break; case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA: - *(float*)attribute_values[i] = vmixer->luma_key_min; + *(float*)attribute_values[i] = vmixer->luma_key.luma_min; break; case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA: - *(float*)attribute_values[i] = vmixer->luma_key_max; + *(float*)attribute_values[i] = vmixer->luma_key.luma_max; break; case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL: *(float*)attribute_values[i] = vmixer->sharpness.value; diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index 2192f71..40a49dc 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -492,9 +492,9 @@ vlVdpOutputSurfacePutBitsYCbCr(VdpOutputSurface surface, if (!csc_matrix) { vl_csc_matrix csc; vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_BT_601, NULL, 1, &csc); - vl_compositor_set_csc_matrix(cstate, (const vl_csc_matrix*)&csc); + vl_compositor_set_csc_matrix(cstate, (const vl_csc_matrix*)&csc, 1.f, 0.f); } else { - vl_compositor_set_csc_matrix(cstate, csc_matrix); + vl_compositor_set_csc_matrix(cstate, csc_matrix, 1.f, 0.f); } vl_compositor_clear_layers(cstate); diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index 3b6647e..8673c6a 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -363,6 +363,11 @@ typedef struct struct vl_compositor_state cstate; struct { + bool supported, enabled; + float luma_min, luma_max; + } luma_key; + + struct { bool supported, enabled, spatial; struct vl_deint_filter *filter; } deint; @@ -382,7 +387,6 @@ typedef struct unsigned video_width, video_height; enum pipe_video_chroma_format chroma_format; unsigned max_layers, skip_chroma_deint; - float luma_key_min, luma_key_max; bool custom_csc; vl_csc_matrix csc; -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev