d3dvideosink: add more null checks
authorAaron Boxer <aaron.boxer@collabora.com>
Sat, 7 Dec 2019 06:25:05 +0000 (00:25 -0600)
committerAaron Boxer <aaron.boxer@collabora.com>
Wed, 18 Dec 2019 18:15:05 +0000 (13:15 -0500)
sys/d3dvideosink/d3dhelpers.c

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