d3dvideosink: add more null checks

This commit is contained in:
Aaron Boxer 2019-12-07 00:25:05 -06:00
parent 06862d7ff5
commit 84403dbae3

View file

@ -950,6 +950,7 @@ d3d_get_render_coordinates (GstD3DVideoSink * sink, gint in_x, gint in_y,
g_return_val_if_fail (out_x != NULL, FALSE); g_return_val_if_fail (out_x != NULL, FALSE);
g_return_val_if_fail (out_y != NULL, FALSE); g_return_val_if_fail (out_y != NULL, FALSE);
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
CHECK_WINDOW_HANDLE (sink, end, FALSE); CHECK_WINDOW_HANDLE (sink, end, FALSE);
@ -1024,6 +1025,7 @@ d3d_window_wndproc_unset (GstD3DVideoSink * sink)
{ {
WNDPROC cur_wnd_proc = NULL; WNDPROC cur_wnd_proc = NULL;
g_return_if_fail (GST_IS_D3DVIDEOSINK (sink));
LOCK_SINK (sink); LOCK_SINK (sink);
GST_DEBUG_OBJECT (sink, " "); GST_DEBUG_OBJECT (sink, " ");
@ -1066,6 +1068,7 @@ d3d_window_wndproc_set (GstD3DVideoSink * sink)
WNDPROC cur_wnd_proc; WNDPROC cur_wnd_proc;
gboolean ret = FALSE; gboolean ret = FALSE;
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
cur_wnd_proc = cur_wnd_proc =
@ -1104,6 +1107,7 @@ end:
static void static void
d3d_prepare_render_window (GstD3DVideoSink * sink) d3d_prepare_render_window (GstD3DVideoSink * sink)
{ {
g_return_if_fail (GST_IS_D3DVIDEOSINK (sink));
LOCK_SINK (sink); LOCK_SINK (sink);
if (sink->d3d.window_handle == NULL) { if (sink->d3d.window_handle == NULL) {
@ -1135,6 +1139,7 @@ void
d3d_set_window_handle (GstD3DVideoSink * sink, guintptr window_id, d3d_set_window_handle (GstD3DVideoSink * sink, guintptr window_id,
gboolean is_internal) gboolean is_internal)
{ {
g_return_if_fail (sink != NULL);
LOCK_SINK (sink); LOCK_SINK (sink);
if (sink->d3d.window_handle == (HWND) window_id) { if (sink->d3d.window_handle == (HWND) window_id) {
@ -1173,6 +1178,7 @@ end:
void void
d3d_set_render_rectangle (GstD3DVideoSink * sink) d3d_set_render_rectangle (GstD3DVideoSink * sink)
{ {
g_return_if_fail (sink != NULL);
LOCK_SINK (sink); LOCK_SINK (sink);
/* Setting the pointer lets us know render rect is set */ /* Setting the pointer lets us know render rect is set */
sink->d3d.render_rect = &sink->render_rect; sink->d3d.render_rect = &sink->render_rect;
@ -1194,6 +1200,7 @@ d3d_prepare_window (GstD3DVideoSink * sink)
HWND hWnd; HWND hWnd;
gboolean ret = FALSE; gboolean ret = FALSE;
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
/* if we already had an external window, then use it again */ /* if we already had an external window, then use it again */
@ -1286,6 +1293,7 @@ d3d_notify_device_lost (GstD3DVideoSink * sink)
static void static void
d3d_notify_device_reset (GstD3DVideoSink * sink) d3d_notify_device_reset (GstD3DVideoSink * sink)
{ {
g_return_if_fail (GST_IS_D3DVIDEOSINK (sink));
LOCK_SINK (sink); LOCK_SINK (sink);
if (sink->d3d.device_lost) { if (sink->d3d.device_lost) {
@ -1318,6 +1326,7 @@ d3d_init_swap_chain (GstD3DVideoSink * sink, HWND hWnd)
LOCK_SINK (sink); LOCK_SINK (sink);
LOCK_CLASS (sink, klass); LOCK_CLASS (sink, klass);
CHECK_REF_COUNT (klass, sink, error);
/* We need a display device */ /* We need a display device */
CHECK_D3D_DEVICE (klass, sink, error); CHECK_D3D_DEVICE (klass, sink, error);
@ -1386,15 +1395,14 @@ error:
static gboolean static gboolean
d3d_release_swap_chain (GstD3DVideoSink * sink) d3d_release_swap_chain (GstD3DVideoSink * sink)
{ {
GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink);
int ref_count; int ref_count;
gboolean ret = FALSE; gboolean ret = FALSE;
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
GST_DEBUG_OBJECT (sink, "Releasing Direct3D swap chain"); GST_DEBUG_OBJECT (sink, "Releasing Direct3D swap chain");
CHECK_D3D_DEVICE (klass, sink, end);
if (!sink->d3d.swapchain) { if (!sink->d3d.swapchain) {
ret = TRUE; ret = TRUE;
@ -1453,6 +1461,7 @@ d3d_resize_swap_chain (GstD3DVideoSink * sink)
LOCK_CLASS (sink, klass); LOCK_CLASS (sink, klass);
CHECK_REF_COUNT (klass, sink, end);
CHECK_WINDOW_HANDLE (sink, end, FALSE); CHECK_WINDOW_HANDLE (sink, end, FALSE);
CHECK_D3D_DEVICE (klass, sink, end); CHECK_D3D_DEVICE (klass, sink, end);
CHECK_D3D_SWAPCHAIN (sink, end); CHECK_D3D_SWAPCHAIN (sink, end);
@ -1550,6 +1559,7 @@ d3d_copy_buffer (GstD3DVideoSink * sink, GstBuffer * from, GstBuffer * to)
memset (&from_frame, 0, sizeof (from_frame)); memset (&from_frame, 0, sizeof (from_frame));
memset (&to_frame, 0, sizeof (to_frame)); memset (&to_frame, 0, sizeof (to_frame));
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
if (!sink->d3d.renderable || sink->d3d.device_lost) if (!sink->d3d.renderable || sink->d3d.device_lost)
@ -1731,6 +1741,7 @@ d3d_present_swap_chain (GstD3DVideoSink * sink)
HRESULT hr; HRESULT hr;
RECT dstr, srcr, *pDestRect = NULL, *pSrcRect = NULL; RECT dstr, srcr, *pDestRect = NULL, *pSrcRect = NULL;
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
if (!sink->d3d.renderable || sink->d3d.device_lost) { if (!sink->d3d.renderable || sink->d3d.device_lost) {
@ -1740,6 +1751,7 @@ d3d_present_swap_chain (GstD3DVideoSink * sink)
LOCK_CLASS (sink, klass); LOCK_CLASS (sink, klass);
CHECK_REF_COUNT (klass, sink, end);
CHECK_WINDOW_HANDLE (sink, end, FALSE); CHECK_WINDOW_HANDLE (sink, end, FALSE);
CHECK_D3D_DEVICE (klass, sink, end); CHECK_D3D_DEVICE (klass, sink, end);
CHECK_D3D_SWAPCHAIN (sink, end); CHECK_D3D_SWAPCHAIN (sink, end);
@ -1846,6 +1858,7 @@ d3d_stretch_and_copy (GstD3DVideoSink * sink, LPDIRECT3DSURFACE9 back_buffer)
HRESULT hr; HRESULT hr;
gboolean ret = FALSE; gboolean ret = FALSE;
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), FALSE);
LOCK_SINK (sink); LOCK_SINK (sink);
CHECK_WINDOW_HANDLE (sink, end, FALSE); CHECK_WINDOW_HANDLE (sink, end, FALSE);
@ -1934,6 +1947,7 @@ d3d_render_buffer (GstD3DVideoSink * sink, GstBuffer * buf)
LPDIRECT3DSURFACE9 surface = NULL; LPDIRECT3DSURFACE9 surface = NULL;
GstVideoCropMeta *crop = NULL; GstVideoCropMeta *crop = NULL;
g_return_val_if_fail (GST_IS_D3DVIDEOSINK (sink), GST_FLOW_ERROR);
LOCK_SINK (sink); LOCK_SINK (sink);
if (!sink->d3d.window_handle) { if (!sink->d3d.window_handle) {
@ -2666,6 +2680,7 @@ d3d_class_notify_device_lost_all (GstD3DVideoSinkClass * klass)
g_return_if_fail (klass != NULL); g_return_if_fail (klass != NULL);
LOCK_CLASS (NULL, klass); LOCK_CLASS (NULL, klass);
CHECK_REF_COUNT (klass, NULL, end);
if (!klass->d3d.device_lost) { if (!klass->d3d.device_lost) {
GList *lst, *clst; GList *lst, *clst;
klass->d3d.device_lost = TRUE; klass->d3d.device_lost = TRUE;
@ -2687,6 +2702,7 @@ d3d_class_notify_device_lost_all (GstD3DVideoSinkClass * klass)
/* Set timer to try reset at given interval */ /* Set timer to try reset at given interval */
SetTimer (klass->d3d.hidden_window, IDT_DEVICE_RESET_TIMER, 500, NULL); SetTimer (klass->d3d.hidden_window, IDT_DEVICE_RESET_TIMER, 500, NULL);
} }
end:
UNLOCK_CLASS (NULL, klass); UNLOCK_CLASS (NULL, klass);
} }