ret = VDP_STATUS_ERROR;
goto error_handle;
}
+
+ pipe_mutex_init(vldecoder->mutex);
pipe_mutex_unlock(dev->mutex);
return VDP_STATUS_OK;
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);
// 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,
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);
return VDP_STATUS_NO_IMPLEMENTATION;
}
vlVdpVideoSurfaceClear(vlsurf);
+ pipe_mutex_unlock(vlsurf->device->mutex);
}
for (i = 0; i < bitstream_buffer_count; ++i) {
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;
}