changeset 25125:a1e6345207a1

§³reate empty format arrays in case of error in init_chain_common. Fixes segfault for cards without audio capture pin in main capture filter.
author voroshil
date Sat, 24 Nov 2007 06:01:18 +0000
parents 8809817b2266
children 8152446e42b1
files stream/tvi_dshow.c
diffstat 1 files changed, 28 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/stream/tvi_dshow.c	Sat Nov 24 01:35:29 2007 +0000
+++ b/stream/tvi_dshow.c	Sat Nov 24 06:01:18 2007 +0000
@@ -2497,8 +2497,7 @@
         mp_msg(MSGT_TV, MSGL_DBG2, "Unable to use IAMStreamConfig for retriving available formats (Error:0x%x). Using EnumMediaTypes instead\n", (unsigned int)hr);
         hr = get_available_formats_pin(pBuilder, chain);
         if(FAILED(hr)){
-            chain->arpmt = calloc(1, sizeof(AM_MEDIA_TYPE *));
-            chain->arStreamCaps = calloc(1, sizeof(void*));
+            return hr;
         }
     }
     chain->nFormatUsed = 0;
@@ -2815,11 +2814,33 @@
         if(FAILED(hr))
             break;
 
-        // Audio chain initialization
-        init_chain_common(priv->pBuilder, priv->chains[1]);
-
-        // VBI chain initialization
-        init_chain_common(priv->pBuilder, priv->chains[2]);
+        /*
+           Audio chain initialization
+           Since absent audio stream is not fatal,
+           at least one NULL pointer should be kept in format arrays
+           (to avoid another additional check everywhere for array presence).
+        */
+        hr = init_chain_common(priv->pBuilder, priv->chains[1]);
+        if(FAILED(hr))
+        {
+            mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: Unable to initialize audio chain (Error:0x%x). Audio disabled\n", (unsigned long)hr);
+            priv->chains[1]->arpmt=calloc(1, sizeof(AM_MEDIA_TYPE*));
+            priv->chains[1]->arStreamCaps=calloc(1, sizeof(void*));
+        }
+
+        /*
+           VBI chain initialization
+           Since absent VBI stream is not fatal,
+           at least one NULL pointer should be kept in format arrays
+           (to avoid another additional check everywhere for array presence).
+        */
+        hr = init_chain_common(priv->pBuilder, priv->chains[2]);
+        if(FAILED(hr))
+        {
+            mp_msg(MSGT_TV, MSGL_V, "tvi_dshow: Unable to initialize VBI chain (Error:0x%x). Teletext disabled\n", (unsigned long)hr);
+            priv->chains[2]->arpmt=calloc(1, sizeof(AM_MEDIA_TYPE*));
+            priv->chains[2]->arStreamCaps=calloc(1, sizeof(void*));
+        }
 
         if (!priv->chains[0]->pStreamConfig)
             mp_msg(MSGT_TV, MSGL_INFO, MSGTR_TVI_DS_ChangingWidthHeightNotSupported);