Mercurial > mplayer.hg
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);