]> git.sesse.net Git - vlc/blobdiff - modules/access/dshow/dshow.cpp
dshow.cpp: Removed default preferred media types (I420) as it was reported by Paul...
[vlc] / modules / access / dshow / dshow.cpp
index 27e4e822f2b4a7fb3d0e413f001121a3a6b0ce73..e563ef27e25771e17c6b736e25bb315814b7f3f8 100644 (file)
@@ -18,7 +18,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
@@ -158,10 +158,10 @@ vlc_module_begin();
                 VLC_TRUE );
 
     add_bool( "dshow-config", VLC_FALSE, NULL, CONFIG_TEXT, CONFIG_LONGTEXT,
-              VLC_FALSE );
+              VLC_TRUE );
 
     add_bool( "dshow-tuner", VLC_FALSE, NULL, TUNER_TEXT, TUNER_LONGTEXT,
-              VLC_FALSE );
+              VLC_TRUE );
 
     add_integer( "dshow-tuner-channel", 0, NULL, CHANNEL_TEXT,
                  CHANNEL_LONGTEXT, VLC_TRUE );
@@ -206,7 +206,6 @@ typedef struct dshow_stream_t
     es_out_id_t     *p_es;
 
     vlc_bool_t      b_pts;
-
 } dshow_stream_t;
 
 /*****************************************************************************
@@ -282,7 +281,6 @@ static int CommonOpen( vlc_object_t *p_this, access_sys_t *p_sys,
 
     var_Create( p_this, "dshow-config", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
     var_Create( p_this, "dshow-tuner", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
-
     var_Create( p_this, "dshow-vdev", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
     var_Get( p_this, "dshow-vdev", &val );
     if( val.psz_string ) vdevname = string( val.psz_string );
@@ -325,12 +323,14 @@ static int CommonOpen( vlc_object_t *p_this, access_sys_t *p_sys,
     }
     if( val.psz_string ) free( val.psz_string );
 
+    p_sys->b_chroma = VLC_FALSE;
     var_Create( p_this, "dshow-chroma", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
     var_Get( p_this, "dshow-chroma", &val );
     if( val.psz_string && strlen( val.psz_string ) >= 4 )
     {
         i_chroma = VLC_FOURCC( val.psz_string[0], val.psz_string[1],
                                val.psz_string[2], val.psz_string[3] );
+        p_sys->b_chroma = VLC_TRUE;
     }
     if( val.psz_string ) free( val.psz_string );
 
@@ -832,88 +832,11 @@ static int OpenDevice( vlc_object_t *p_this, access_sys_t *p_sys,
                         p_sys->i_width, p_sys->i_height,
                         0, 0, 0, media_types, MAX_MEDIA_TYPES );
 
-    /* Find out if the pin handles MEDIATYPE_Stream, in which case we
-     * won't add a prefered media type as this doesn't seem to work well
-     * -- to investigate. */
-    vlc_bool_t b_stream_type = VLC_FALSE;
-    for( size_t i = 0; i < media_count; i++ )
-    {
-        if( media_types[i].majortype == MEDIATYPE_Stream )
-        {
-            b_stream_type = VLC_TRUE;
-            break;
-        }
-    }
-
-    size_t mt_count = 0;
     AM_MEDIA_TYPE *mt = NULL;
 
-    if( !b_stream_type && !b_audio )
-    {
-        // Insert prefered video media type
-        AM_MEDIA_TYPE mtr;
-        VIDEOINFOHEADER vh;
-
-        mtr.majortype            = MEDIATYPE_Video;
-        mtr.subtype              = MEDIASUBTYPE_I420;
-        mtr.bFixedSizeSamples    = TRUE;
-        mtr.bTemporalCompression = FALSE;
-        mtr.pUnk                 = NULL;
-        mtr.formattype           = FORMAT_VideoInfo;
-        mtr.cbFormat             = sizeof(vh);
-        mtr.pbFormat             = (BYTE *)&vh;
-
-        memset(&vh, 0, sizeof(vh));
-
-        vh.bmiHeader.biSize   = sizeof(vh.bmiHeader);
-        vh.bmiHeader.biWidth  = p_sys->i_width > 0 ? p_sys->i_width : 320;
-        vh.bmiHeader.biHeight = p_sys->i_height > 0 ? p_sys->i_height : 240;
-        vh.bmiHeader.biPlanes      = 3;
-        vh.bmiHeader.biBitCount    = 12;
-        vh.bmiHeader.biCompression = VLC_FOURCC('I','4','2','0');
-        vh.bmiHeader.biSizeImage   = vh.bmiHeader.biWidth * 12 *
-            vh.bmiHeader.biHeight / 8;
-        mtr.lSampleSize            = vh.bmiHeader.biSizeImage;
-
-        mt_count = 1;
-        mt = (AM_MEDIA_TYPE *)malloc( sizeof(AM_MEDIA_TYPE)*mt_count );
-        CopyMediaType(mt, &mtr);
-    }
-    else if( !b_stream_type )
-    {
-        // Insert prefered audio media type
-        AM_MEDIA_TYPE mtr;
-        WAVEFORMATEX wf;
-
-        mtr.majortype            = MEDIATYPE_Audio;
-        mtr.subtype              = MEDIASUBTYPE_PCM;
-        mtr.bFixedSizeSamples    = TRUE;
-        mtr.bTemporalCompression = FALSE;
-        mtr.lSampleSize          = 0;
-        mtr.pUnk                 = NULL;
-        mtr.formattype           = FORMAT_WaveFormatEx;
-        mtr.cbFormat             = sizeof(wf);
-        mtr.pbFormat             = (BYTE *)&wf;
-
-        memset(&wf, 0, sizeof(wf));
-
-        wf.wFormatTag = WAVE_FORMAT_PCM;
-        wf.nChannels = 2;
-        wf.nSamplesPerSec = 44100;
-        wf.wBitsPerSample = 16;
-        wf.nBlockAlign = wf.nSamplesPerSec * wf.wBitsPerSample / 8;
-        wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;
-        wf.cbSize = 0;
-
-        mt_count = 1;
-        mt = (AM_MEDIA_TYPE *)malloc( sizeof(AM_MEDIA_TYPE)*mt_count );
-        CopyMediaType(mt, &mtr);
-    }
-
     if( media_count > 0 )
     {
-        mt = (AM_MEDIA_TYPE *)realloc( mt, sizeof(AM_MEDIA_TYPE) *
-                                       (mt_count + media_count) );
+        mt = (AM_MEDIA_TYPE *)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * media_count);
 
         // Order and copy returned media types according to arbitrary
         // fourcc priority
@@ -934,20 +857,25 @@ static int OpenDevice( vlc_object_t *p_this, access_sys_t *p_sys,
             }
             if( slot_copy != c )
             {
-                mt[c+mt_count] = media_types[slot_copy];
+                mt[c] = media_types[slot_copy];
                 media_types[slot_copy] = media_types[c];
             }
             else
             {
-                mt[c+mt_count] = media_types[c];
+                mt[c] = media_types[c];
             }
         }
-        mt_count += media_count;
+    }
+    else {
+        /* capture device */
+        msg_Err( p_this, "capture device '%s' does not support required parameters !", devicename.c_str() );
+        p_device_filter->Release();
+        return VLC_EGENERIC;
     }
 
     /* Create and add our capture filter */
     CaptureFilter *p_capture_filter =
-        new CaptureFilter( p_this, p_sys, mt, mt_count );
+        new CaptureFilter( p_this, p_sys, mt, media_count );
     p_sys->p_graph->AddFilter( p_capture_filter, 0 );
 
     /* Add the device filter to the graph (seems necessary with VfW before
@@ -1217,15 +1145,19 @@ static size_t EnumDeviceCaps( vlc_object_t *p_this, IBaseFilter *p_filter,
                 BYTE *pSCC= (BYTE *)CoTaskMemAlloc(piSize);
                 if( NULL != pSCC )
                 {
+                    int i_priority = -1;
                     for( int i=0; i<piCount; ++i )
                     {
                         if( SUCCEEDED(pSC->GetStreamCaps(i, &p_mt, pSCC)) )
                         {
                             int i_current_fourcc = GetFourCCFromMediaType( *p_mt );
+                            int i_current_priority = GetFourCCPriority(i_current_fourcc);
 
-                            if( !i_current_fourcc || (i_fourcc && (i_current_fourcc != i_fourcc)) )
+                            if( !i_current_fourcc
+                             || (i_fourcc && (i_current_fourcc != i_fourcc))
+                             || (i_priority > i_current_priority) )
                             {
-                                // incompatible or unrecognized chroma, try next media type
+                                // incompatible or unwanted chroma, try next media type
                                 FreeMediaType( *p_mt );
                                 CoTaskMemFree( (PVOID)p_mt );
                                 continue;
@@ -1291,11 +1223,11 @@ static size_t EnumDeviceCaps( vlc_object_t *p_this, IBaseFilter *p_filter,
                                 // select this format as default
                                 if( SUCCEEDED( pSC->SetFormat(p_mt) ) )
                                 {
-                                    msg_Dbg( p_this, "EnumDeviceCaps: input pin video format configured");
-                                    // no need to check any more media types 
-                                    i = piCount;
+                                    i_priority = i_current_priority;
+                                    if( i_fourcc )
+                                        // no need to check any more media types 
+                                        i = piCount;
                                 }
-                                else FreeMediaType( *p_mt );
                             }
                             else if( p_mt->majortype == MEDIATYPE_Audio
                                     && p_mt->formattype == FORMAT_WaveFormatEx )
@@ -1348,9 +1280,10 @@ static size_t EnumDeviceCaps( vlc_object_t *p_this, IBaseFilter *p_filter,
                                 // select this format as default
                                 if( SUCCEEDED( pSC->SetFormat(p_mt) ) )
                                 {
-                                    msg_Dbg( p_this, "EnumDeviceCaps: input pin default format configured");
-                                    // no need to check any more media types 
-                                    i = piCount;
+                                    i_priority = i_current_priority;
+                                    if( i_fourcc )
+                                        // no need to check any more media types 
+                                        i = piCount;
                                 }
                             }
                             FreeMediaType( *p_mt );
@@ -1358,6 +1291,8 @@ static size_t EnumDeviceCaps( vlc_object_t *p_this, IBaseFilter *p_filter,
                         }
                     }
                     CoTaskMemFree( (LPVOID)pSCC );
+                    if( i_priority >= 0 )
+                        msg_Dbg( p_this, "EnumDeviceCaps: input pin default format configured");
                 }
             }
             pSC->Release();
@@ -1373,7 +1308,6 @@ static size_t EnumDeviceCaps( vlc_object_t *p_this, IBaseFilter *p_filter,
             continue;
         }
 
-
         while( p_enummt->Next( 1, &p_mt, NULL ) == S_OK )
         {
             int i_current_fourcc = GetFourCCFromMediaType( *p_mt );