diff options
author | Dave Airlie <[email protected]> | 2014-09-02 08:57:53 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2014-09-03 07:58:50 +1000 |
commit | f4ccf687a678919920ceed5f2a5892c8870e5f30 (patch) | |
tree | b1b3204f703221494fda383f812b6c0d78c495f2 /src/gallium | |
parent | 2da91188527d0878460eca5110867c6c1e665b64 (diff) |
vdpau: unlock the mutex on error paths in attribute setting.
Coverity pointed out we never dropped the lock here, so fix
it by using a common exit path.
Reviewed-by: Christian König <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/state_trackers/vdpau/mixer.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index a724aa5b254..4118eb86997 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -643,6 +643,7 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, const float *vdp_csc; float val; unsigned i; + VdpStatus ret; if (!(attributes && attribute_values)) return VDP_STATUS_INVALID_POINTER; @@ -676,8 +677,10 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL: val = *(float*)attribute_values[i]; - if (val < 0.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < 0.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->noise_reduction.level = val * 10; vlVdpVideoMixerUpdateNoiseReductionFilter(vmixer); @@ -685,41 +688,52 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA: val = *(float*)attribute_values[i]; - if (val < 0.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < 0.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->luma_key_min = val; break; case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA: val = *(float*)attribute_values[i]; - if (val < 0.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < 0.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->luma_key_max = val; break; case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL: val = *(float*)attribute_values[i]; - if (val < -1.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < -1.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->sharpness.value = val; vlVdpVideoMixerUpdateSharpnessFilter(vmixer); break; case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE: - if (*(uint8_t*)attribute_values[i] > 1) - return VDP_STATUS_INVALID_VALUE; + if (*(uint8_t*)attribute_values[i] > 1) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->skip_chroma_deint = *(uint8_t*)attribute_values[i]; vlVdpVideoMixerUpdateDeinterlaceFilter(vmixer); break; default: - pipe_mutex_unlock(vmixer->device->mutex); - return VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE; + ret = VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE; + goto fail; } } pipe_mutex_unlock(vmixer->device->mutex); return VDP_STATUS_OK; +fail: + pipe_mutex_unlock(vmixer->device->mutex); + return ret; } /** |