summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/state_trackers/vdpau/decode.c20
-rw-r--r--src/gallium/state_trackers/vdpau/vdpau_private.h1
2 files changed, 12 insertions, 9 deletions
diff --git a/src/gallium/state_trackers/vdpau/decode.c b/src/gallium/state_trackers/vdpau/decode.c
index e884fb24191..d741c79efc3 100644
--- a/src/gallium/state_trackers/vdpau/decode.c
+++ b/src/gallium/state_trackers/vdpau/decode.c
@@ -130,6 +130,8 @@ vlVdpDecoderCreate(VdpDevice device,
ret = VDP_STATUS_ERROR;
goto error_handle;
}
+
+ pipe_mutex_init(vldecoder->mutex);
pipe_mutex_unlock(dev->mutex);
return VDP_STATUS_OK;
@@ -155,9 +157,10 @@ vlVdpDecoderDestroy(VdpDecoder decoder)
if (!vldecoder)
return VDP_STATUS_INVALID_HANDLE;
- pipe_mutex_lock(vldecoder->device->mutex);
+ pipe_mutex_lock(vldecoder->mutex);
vldecoder->decoder->destroy(vldecoder->decoder);
- pipe_mutex_unlock(vldecoder->device->mutex);
+ pipe_mutex_unlock(vldecoder->mutex);
+ pipe_mutex_destroy(vldecoder->mutex);
vlRemoveDataHTAB(decoder);
FREE(vldecoder);
@@ -477,8 +480,6 @@ vlVdpDecoderRender(VdpDecoder decoder,
// TODO: Recreate decoder with correct chroma
return VDP_STATUS_INVALID_CHROMA_TYPE;
- pipe_mutex_lock(vlsurf->device->mutex);
-
buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
@@ -489,6 +490,8 @@ vlVdpDecoderRender(VdpDecoder decoder,
dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
!buffer_support[vlsurf->video_buffer->interlaced]) {
+ pipe_mutex_lock(vlsurf->device->mutex);
+
/* destroy the old one */
if (vlsurf->video_buffer)
vlsurf->video_buffer->destroy(vlsurf->video_buffer);
@@ -510,6 +513,7 @@ vlVdpDecoderRender(VdpDecoder decoder,
return VDP_STATUS_NO_IMPLEMENTATION;
}
vlVdpVideoSurfaceClear(vlsurf);
+ pipe_mutex_unlock(vlsurf->device->mutex);
}
for (i = 0; i < bitstream_buffer_count; ++i) {
@@ -535,18 +539,16 @@ vlVdpDecoderRender(VdpDecoder decoder,
ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info);
break;
default:
- pipe_mutex_unlock(vlsurf->device->mutex);
return VDP_STATUS_INVALID_DECODER_PROFILE;
}
- if (ret != VDP_STATUS_OK) {
- pipe_mutex_unlock(vlsurf->device->mutex);
+ if (ret != VDP_STATUS_OK)
return ret;
- }
+ pipe_mutex_lock(vldecoder->mutex);
dec->begin_frame(dec, vlsurf->video_buffer, &desc.base);
dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes);
dec->end_frame(dec, vlsurf->video_buffer, &desc.base);
- pipe_mutex_unlock(vlsurf->device->mutex);
+ pipe_mutex_unlock(vldecoder->mutex);
return ret;
}
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
index 54545fe7640..0812767cb99 100644
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
@@ -387,6 +387,7 @@ typedef struct
typedef struct
{
vlVdpDevice *device;
+ pipe_mutex mutex;
struct pipe_video_codec *decoder;
} vlVdpDecoder;