Commit 7747309f authored by Gildas Bazin's avatar Gildas Bazin

* modules/access/dshow/*: compilation fixes.
* include/vlc_common.h: added a couple of casts to TAB_APPEND().
parent 29920e21
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* Collection of useful common types and macros definitions * Collection of useful common types and macros definitions
***************************************************************************** *****************************************************************************
* Copyright (C) 1998, 1999, 2000 VideoLAN * Copyright (C) 1998, 1999, 2000 VideoLAN
* $Id: vlc_common.h,v 1.90 2003/11/24 00:39:00 fenrir Exp $ * $Id: vlc_common.h,v 1.91 2003/11/24 20:45:23 gbazin Exp $
* *
* Authors: Samuel Hocevar <sam@via.ecp.fr> * Authors: Samuel Hocevar <sam@via.ecp.fr>
* Vincent Seguin <seguin@via.ecp.fr> * Vincent Seguin <seguin@via.ecp.fr>
...@@ -448,11 +448,11 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */ ...@@ -448,11 +448,11 @@ typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */
#define TAB_APPEND( count, tab, p ) \ #define TAB_APPEND( count, tab, p ) \
if( (count) > 0 ) \ if( (count) > 0 ) \
{ \ { \
(tab) = realloc( (tab), sizeof( void ** ) * ( (count) + 1 ) ); \ (void *)(tab) = realloc( (tab), sizeof( void ** ) * ( (count) + 1 ) );\
} \ } \
else \ else \
{ \ { \
(tab) = malloc( sizeof( void ** ) ); \ (void *)(tab) = malloc( sizeof( void ** ) ); \
} \ } \
(void**)(tab)[(count)] = (void*)(p); \ (void**)(tab)[(count)] = (void*)(p); \
(count)++ (count)++
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* dshow.cpp : DirectShow access module for vlc * dshow.cpp : DirectShow access module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: dshow.cpp,v 1.15 2003/11/24 19:30:54 fenrir Exp $ * $Id: dshow.cpp,v 1.16 2003/11/24 20:45:23 gbazin Exp $
* *
* Author: Gildas Bazin <gbazin@netcourrier.com> * Author: Gildas Bazin <gbazin@netcourrier.com>
* *
...@@ -34,6 +34,63 @@ ...@@ -34,6 +34,63 @@
#include "filter.h" #include "filter.h"
/*****************************************************************************
* Access: local prototypes
*****************************************************************************/
static ssize_t Read ( input_thread_t *, byte_t *, size_t );
static ssize_t ReadDV ( input_thread_t *, byte_t *, size_t );
static int OpenDevice( input_thread_t *, string, vlc_bool_t );
static IBaseFilter *FindCaptureDevice( vlc_object_t *, string *,
list<string> *, vlc_bool_t );
static AM_MEDIA_TYPE EnumDeviceCaps( vlc_object_t *, IBaseFilter *,
int, int, int, int, int, int );
static bool ConnectFilters( IFilterGraph *, IBaseFilter *, IPin * );
static int FindDevicesCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
#if 0
/* Debug only, use this to find out GUIDs */
unsigned char p_st[];
UuidToString( (IID *)&IID_IAMBufferNegotiation, &p_st );
msg_Err( p_input, "BufferNegotiation: %s" , p_st );
#endif
/*
* header:
* fcc ".dsh"
* u32 stream count
* fcc "auds"|"vids" 0
* fcc codec 4
* if vids
* u32 width 8
* u32 height 12
* u32 padding 16
* if auds
* u32 channels 12
* u32 samplerate 8
* u32 samplesize 16
*
* data:
* u32 stream number
* u32 data size
* u8 data
*/
static void SetDWBE( uint8_t *p, uint32_t dw )
{
p[0] = (dw >> 24)&0xff;
p[1] = (dw >> 16)&0xff;
p[2] = (dw >> 8)&0xff;
p[3] = (dw )&0xff;
}
static void SetQWBE( uint8_t *p, uint64_t qw )
{
SetDWBE( p, (qw >> 32)&0xffffffff );
SetDWBE( &p[4], qw&0xffffffff );
}
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
...@@ -100,64 +157,6 @@ vlc_module_begin(); ...@@ -100,64 +157,6 @@ vlc_module_begin();
vlc_module_end(); vlc_module_end();
/*****************************************************************************
* Access: local prototypes
*****************************************************************************/
static ssize_t Read ( input_thread_t *, byte_t *, size_t );
static ssize_t ReadDV ( input_thread_t *, byte_t *, size_t );
static int OpenDevice( input_thread_t *, string, vlc_bool_t );
static IBaseFilter *FindCaptureDevice( vlc_object_t *, string *,
list<string> *, vlc_bool_t );
static AM_MEDIA_TYPE EnumDeviceCaps( vlc_object_t *, IBaseFilter *,
int, int, int, int, int, int );
static bool ConnectFilters( IFilterGraph *, IBaseFilter *, IPin * );
static int FindDevicesCallback( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
#if 0
/* Debug only, use this to find out GUIDs */
unsigned char p_st[];
UuidToString( (IID *)&IID_IAMBufferNegotiation, &p_st );
msg_Err( p_input, "BufferNegotiation: %s" , p_st );
#endif
/*
* header:
* fcc ".dsh"
* u32 stream count
* fcc "auds"|"vids" 0
* fcc codec 4
* if vids
* u32 width 8
* u32 height 12
* u32 padding 16
* if auds
* u32 channels 12
* u32 samplerate 8
* u32 samplesize 16
*
* data:
* u32 stream number
* u32 data size
* u8 data
*/
static void SetDWBE( uint8_t *p, uint32_t dw )
{
p[0] = (dw >> 24)&0xff;
p[1] = (dw >> 16)&0xff;
p[2] = (dw >> 8)&0xff;
p[3] = (dw )&0xff;
}
static void SetQWBE( uint8_t *p, uint64_t qw )
{
SetDWBE( p, (qw >> 32)&0xffffffff );
SetDWBE( &p[4], qw&0xffffffff );
}
/**************************************************************************** /****************************************************************************
* DirectShow elementary stream descriptor * DirectShow elementary stream descriptor
****************************************************************************/ ****************************************************************************/
...@@ -584,8 +583,8 @@ static int OpenDevice( input_thread_t *p_input, string devicename, ...@@ -584,8 +583,8 @@ static int OpenDevice( input_thread_t *p_input, string devicename,
/* Greatly simplifies the reading routine */ /* Greatly simplifies the reading routine */
int i_mtu = dshow_stream.header.video.bmiHeader.biWidth * int i_mtu = dshow_stream.header.video.bmiHeader.biWidth *
dshow_stream.header.video.bmiHeader.biHeight * 4; i_height * 4;
p_input->i_mtu = __MAX(p_input->i_mtu,i_mtu); p_input->i_mtu = __MAX( p_input->i_mtu, (unsigned int)i_mtu );
} }
else if( dshow_stream.mt.majortype == MEDIATYPE_Audio && else if( dshow_stream.mt.majortype == MEDIATYPE_Audio &&
...@@ -640,7 +639,7 @@ static int OpenDevice( input_thread_t *p_input, string devicename, ...@@ -640,7 +639,7 @@ static int OpenDevice( input_thread_t *p_input, string devicename,
dshow_stream.header.audio.wBitsPerSample / 8; dshow_stream.header.audio.wBitsPerSample / 8;
} }
p_pin->Release(); p_pin->Release();
p_input->i_mtu = __MAX( p_input->i_mtu, i_mtu ); p_input->i_mtu = __MAX( p_input->i_mtu, (unsigned int)i_mtu );
} }
else goto fail; else goto fail;
...@@ -825,6 +824,8 @@ static AM_MEDIA_TYPE EnumDeviceCaps( vlc_object_t *p_this, ...@@ -825,6 +824,8 @@ static AM_MEDIA_TYPE EnumDeviceCaps( vlc_object_t *p_this,
((VIDEOINFOHEADER *)p_mt->pbFormat)->bmiHeader.biWidth : 0; ((VIDEOINFOHEADER *)p_mt->pbFormat)->bmiHeader.biWidth : 0;
int i_current_height = p_mt->pbFormat ? int i_current_height = p_mt->pbFormat ?
((VIDEOINFOHEADER *)p_mt->pbFormat)->bmiHeader.biHeight : 0; ((VIDEOINFOHEADER *)p_mt->pbFormat)->bmiHeader.biHeight : 0;
if( i_current_height < 0 )
i_current_height = -i_current_height;
msg_Dbg( p_this, "EnumDeviceCaps: input pin " msg_Dbg( p_this, "EnumDeviceCaps: input pin "
"accepts chroma: %4.4s, width:%i, height:%i", "accepts chroma: %4.4s, width:%i, height:%i",
...@@ -1024,6 +1025,7 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer, ...@@ -1024,6 +1025,7 @@ static ssize_t Read( input_thread_t * p_input, byte_t * p_buffer,
{ {
int i_width = p_stream->header.video.bmiHeader.biWidth; int i_width = p_stream->header.video.bmiHeader.biWidth;
int i_height = p_stream->header.video.bmiHeader.biHeight; int i_height = p_stream->header.video.bmiHeader.biHeight;
if( i_height < 0 ) i_height = - i_height;
switch( p_stream->i_fourcc ) switch( p_stream->i_fourcc )
{ {
...@@ -1161,7 +1163,7 @@ static int DemuxOpen( vlc_object_t *p_this ) ...@@ -1161,7 +1163,7 @@ static int DemuxOpen( vlc_object_t *p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
if( strncmp( p_peek, ".dsh", 4 ) || if( memcmp( p_peek, ".dsh", 4 ) ||
( i_es = GetDWBE( &p_peek[4] ) ) <= 0 ) ( i_es = GetDWBE( &p_peek[4] ) ) <= 0 )
{ {
msg_Warn( p_input, "dshow plugin discarded (not a valid stream)" ); msg_Warn( p_input, "dshow plugin discarded (not a valid stream)" );
...@@ -1173,14 +1175,15 @@ static int DemuxOpen( vlc_object_t *p_this ) ...@@ -1173,14 +1175,15 @@ static int DemuxOpen( vlc_object_t *p_this )
{ {
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
msg_Err( p_input, "cannot init stream" ); msg_Err( p_input, "cannot init stream" );
return( VLC_EGENERIC ); return VLC_EGENERIC;
} }
p_input->stream.i_mux_rate = 0 / 50; p_input->stream.i_mux_rate = 0 / 50;
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
p_input->pf_demux = Demux; p_input->pf_demux = Demux;
p_input->pf_demux_control = demux_vaControlDefault; p_input->pf_demux_control = demux_vaControlDefault;
p_input->p_demux_data = p_sys = malloc( sizeof( demux_sys_t ) ); p_input->p_demux_data = p_sys =
(demux_sys_t *)malloc( sizeof( demux_sys_t ) );
p_sys->i_es = 0; p_sys->i_es = 0;
p_sys->es = NULL; p_sys->es = NULL;
...@@ -1195,7 +1198,7 @@ static int DemuxOpen( vlc_object_t *p_this ) ...@@ -1195,7 +1198,7 @@ static int DemuxOpen( vlc_object_t *p_this )
{ {
es_format_t fmt; es_format_t fmt;
if( !strncmp( p_peek, "auds", 4 ) ) if( !memcmp( p_peek, "auds", 4 ) )
{ {
es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( p_peek[4], p_peek[5], es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( p_peek[4], p_peek[5],
p_peek[6], p_peek[7] ) ); p_peek[6], p_peek[7] ) );
...@@ -1215,9 +1218,9 @@ static int DemuxOpen( vlc_object_t *p_this ) ...@@ -1215,9 +1218,9 @@ static int DemuxOpen( vlc_object_t *p_this )
TAB_APPEND( p_sys->i_es, p_sys->es, TAB_APPEND( p_sys->i_es, p_sys->es,
es_out_Add( p_input->p_es_out, &fmt ) ); es_out_Add( p_input->p_es_out, &fmt ) );
} }
else if( !strncmp( p_peek, "vids", 4 ) ) else if( !memcmp( p_peek, "vids", 4 ) )
{ {
es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( p_peek[4], p_peek[5], es_format_Init( &fmt, VIDEO_ES, VLC_FOURCC( p_peek[4], p_peek[5],
p_peek[6], p_peek[7] ) ); p_peek[6], p_peek[7] ) );
fmt.video.i_width = GetDWBE( &p_peek[8] ); fmt.video.i_width = GetDWBE( &p_peek[8] );
fmt.video.i_height = GetDWBE( &p_peek[12] ); fmt.video.i_height = GetDWBE( &p_peek[12] );
...@@ -1265,7 +1268,7 @@ static int Demux( input_thread_t *p_input ) ...@@ -1265,7 +1268,7 @@ static int Demux( input_thread_t *p_input )
int i_size; int i_size;
uint8_t *p_peek; uint8_t *p_peek;
mtime_t i_pts; mtime_t i_pcr;
if( stream_Peek( p_input->s, &p_peek, 16 ) < 16 ) if( stream_Peek( p_input->s, &p_peek, 16 ) < 16 )
{ {
...@@ -1281,7 +1284,7 @@ static int Demux( input_thread_t *p_input ) ...@@ -1281,7 +1284,7 @@ static int Demux( input_thread_t *p_input )
} }
i_size = GetDWBE( &p_peek[4] ); i_size = GetDWBE( &p_peek[4] );
i_pts = GetQWBE( &p_peek[8] ); i_pcr = GetQWBE( &p_peek[8] );
if( ( p_block = stream_Block( p_input->s, 16 + i_size ) ) == NULL ) if( ( p_block = stream_Block( p_input->s, 16 + i_size ) ) == NULL )
{ {
...@@ -1293,12 +1296,11 @@ static int Demux( input_thread_t *p_input ) ...@@ -1293,12 +1296,11 @@ static int Demux( input_thread_t *p_input )
p_block->i_buffer -= 16; p_block->i_buffer -= 16;
/* Call the pace control. */ /* Call the pace control. */
input_ClockManageRef( p_input, p_input->stream.p_selected_program, input_ClockManageRef( p_input, p_input->stream.p_selected_program, i_pcr );
i_pts );
p_block->i_dts = p_block->i_dts =
p_block->i_pts = i_pcr <= 0 ? 0 : p_block->i_pts = i_pcr <= 0 ? 0 :
input_ClockGetTS( p_input, p_input->stream.p_selected_program, i_pts ); input_ClockGetTS( p_input, p_input->stream.p_selected_program, i_pcr );
es_out_Send( p_input->p_es_out, p_sys->es[i_es], p_block ); es_out_Send( p_input->p_es_out, p_sys->es[i_es], p_block );
...@@ -1312,7 +1314,6 @@ static int Demux( input_thread_t *p_input ) ...@@ -1312,7 +1314,6 @@ static int Demux( input_thread_t *p_input )
static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name, static int FindDevicesCallback( vlc_object_t *p_this, char const *psz_name,
vlc_value_t newval, vlc_value_t oldval, void * ) vlc_value_t newval, vlc_value_t oldval, void * )
{ {
module_t *p_module;
module_config_t *p_item; module_config_t *p_item;
vlc_bool_t b_audio = VLC_FALSE; vlc_bool_t b_audio = VLC_FALSE;
int i; int i;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* filter.c : DirectShow access module for vlc * filter.c : DirectShow access module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: filter.cpp,v 1.7 2003/11/03 20:22:21 gbazin Exp $ * $Id: filter.cpp,v 1.8 2003/11/24 20:45:23 gbazin Exp $
* *
* Author: Gildas Bazin <gbazin@netcourrier.com> * Author: Gildas Bazin <gbazin@netcourrier.com>
* *
...@@ -570,28 +570,30 @@ STDMETHODIMP CaptureFilter::GetSyncSource(IReferenceClock **pClock) ...@@ -570,28 +570,30 @@ STDMETHODIMP CaptureFilter::GetSyncSource(IReferenceClock **pClock)
#ifdef DEBUG_DSHOW #ifdef DEBUG_DSHOW
msg_Dbg( p_input, "CaptureFilter::GetSyncSource" ); msg_Dbg( p_input, "CaptureFilter::GetSyncSource" );
#endif #endif
return E_NOTIMPL;
*pClock = NULL;
return NOERROR;
}; };
STDMETHODIMP CaptureFilter::Stop() STDMETHODIMP CaptureFilter::Stop()
{ {
#ifdef DEBUG_DSHOW #ifdef DEBUG_DSHOW
msg_Dbg( p_input, "CaptureFilter::Stop" ); msg_Dbg( p_input, "CaptureFilter::Stop" );
#endif #endif
return E_NOTIMPL; return S_OK;
}; };
STDMETHODIMP CaptureFilter::Pause() STDMETHODIMP CaptureFilter::Pause()
{ {
#ifdef DEBUG_DSHOW #ifdef DEBUG_DSHOW
msg_Dbg( p_input, "CaptureFilter::Pause" ); msg_Dbg( p_input, "CaptureFilter::Pause" );
#endif #endif
return E_NOTIMPL; return S_OK;
}; };
STDMETHODIMP CaptureFilter::Run(REFERENCE_TIME tStart) STDMETHODIMP CaptureFilter::Run(REFERENCE_TIME tStart)
{ {
#ifdef DEBUG_DSHOW #ifdef DEBUG_DSHOW
msg_Dbg( p_input, "CaptureFilter::Run" ); msg_Dbg( p_input, "CaptureFilter::Run" );
#endif #endif
return E_NOTIMPL; return S_OK;
}; };
/* IBaseFilter methods */ /* IBaseFilter methods */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment