1
mirror of https://code.videolan.org/videolan/vlc synced 2024-09-04 09:11:33 +02:00

Patch by Richard Hosking: Userptr IO buffers need to be aligned according to the V4L2 reference capture c example (which has been updated with this recently). Also, the reference program has the device close operations after the 'free' calls so they have been moved. This fixes the issue I was having with my device crashing vlc on close. Also fixed a typo in an error message and renamed a local function which was badly named by me.

This commit is contained in:
Jean-Paul Saman 2007-10-12 16:50:53 +00:00
parent 5d3ccc0d65
commit 17ed8b545d

View File

@ -158,7 +158,7 @@ static block_t* ProcessVideoFrame( demux_t *p_demux, uint8_t *p_frame );
static block_t* GrabAudio( demux_t *p_demux );
vlc_bool_t IsChromaSupported( demux_t *p_demux, unsigned int i_v4l2 );
unsigned int GetChromaFromFourcc( char *psz_fourcc );
unsigned int GetFourccFromString( char *psz_fourcc );
static int OpenVideoDev( demux_t *, char *psz_device );
static int OpenAudioDev( demux_t *, char *psz_device );
@ -192,6 +192,7 @@ struct buffer_t
{
void * start;
size_t length;
void * orig_userp;
};
struct demux_sys_t
@ -297,7 +298,7 @@ static int Open( vlc_object_t *p_this )
p_sys->i_sample_rate = val.i_int;
psz = var_CreateGetString( p_demux, "v4l2-chroma" );
p_sys->i_fourcc = GetChromaFromFourcc( psz );
p_sys->i_fourcc = GetFourccFromString( psz );
free( psz );
var_Create( p_demux, "v4l2-stereo", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
@ -489,7 +490,7 @@ static void ParseMRL( demux_t *p_demux )
}
char* chroma = strndup( psz_parser, i_len );
p_sys->i_fourcc = GetChromaFromFourcc( chroma );
p_sys->i_fourcc = GetFourccFromString( chroma );
free( chroma );
psz_parser += i_len;
@ -614,10 +615,6 @@ static void Close( vlc_object_t *p_this )
}
}
/* Close */
if( p_sys->i_fd_video >= 0 ) close( p_sys->i_fd_video );
if( p_sys->i_fd_audio >= 0 ) close( p_sys->i_fd_audio );
/* Free Video Buffers */
if( p_sys->p_buffers ) {
switch( p_sys->io )
@ -639,13 +636,17 @@ static void Close( vlc_object_t *p_this )
case IO_METHOD_USERPTR:
for( i = 0; i < p_sys->i_nbuffers; ++i )
{
free( p_sys->p_buffers[i].start );
free( p_sys->p_buffers[i].orig_userp );
}
break;
}
free( p_sys->p_buffers );
}
/* Close */
if( p_sys->i_fd_video >= 0 ) close( p_sys->i_fd_video );
if( p_sys->i_fd_audio >= 0 ) close( p_sys->i_fd_audio );
if( p_sys->p_block_audio ) block_Release( p_sys->p_block_audio );
if( p_sys->psz_device ) free( p_sys->psz_device );
if( p_sys->psz_vdev ) free( p_sys->psz_vdev );
@ -1031,6 +1032,10 @@ static int InitUserP( demux_t *p_demux, int i_fd, unsigned int i_buffer_size )
{
demux_sys_t *p_sys = p_demux->p_sys;
struct v4l2_requestbuffers req;
unsigned int i_page_size;
i_page_size = getpagesize();
i_buffer_size = ( i_buffer_size + i_page_size - 1 ) & ~( i_page_size - 1);
memset( &req, 0, sizeof(req) );
req.count = 4;
@ -1053,7 +1058,9 @@ static int InitUserP( demux_t *p_demux, int i_fd, unsigned int i_buffer_size )
for( p_sys->i_nbuffers = 0; p_sys->i_nbuffers < 4; ++p_sys->i_nbuffers )
{
p_sys->p_buffers[p_sys->i_nbuffers].length = i_buffer_size;
p_sys->p_buffers[p_sys->i_nbuffers].start = malloc( i_buffer_size );
p_sys->p_buffers[p_sys->i_nbuffers].start =
vlc_memalign( &p_sys->p_buffers[p_sys->i_nbuffers].orig_userp,
/* boundary */ i_page_size, i_buffer_size );
if( !p_sys->p_buffers[p_sys->i_nbuffers].start )
{
@ -1070,9 +1077,9 @@ open_failed:
}
/*****************************************************************************
* GetChromaFromFourcc: Returns the fourcc code from the given string
* GetFourccFromString: Returns the fourcc code from the given string
*****************************************************************************/
unsigned int GetChromaFromFourcc( char *psz_fourcc )
unsigned int GetFourccFromString( char *psz_fourcc )
{
if( strlen( psz_fourcc ) >= 4 )
{
@ -1487,8 +1494,6 @@ vlc_bool_t ProbeVideoDev( demux_t *p_demux, char *psz_device )
int i_fd;
demux_sys_t *p_sys = p_demux->p_sys;
/* msg_Dbg( p_demux, "main device='%s'", p_sys->psz_device ); */
if( ( i_fd = open( psz_device, O_RDWR ) ) < 0 )
{
msg_Err( p_demux, "cannot open video device (%m)" );
@ -1602,7 +1607,7 @@ vlc_bool_t ProbeVideoDev( demux_t *p_demux, char *psz_device )
{
if( ioctl( i_fd, VIDIOC_G_AUDIO, &p_sys->p_audios[ p_sys->i_audio] ) < 0 )
{
msg_Err( p_demux, "cannot get video input characteristics (%m)" );
msg_Err( p_demux, "cannot get audio input characteristics (%m)" );
goto open_failed;
}