#include <vlc_input.h>
#include <vlc_demux.h>
#include <vlc_access.h>
-#include <vlc_vout.h>
+#include <vlc_picture.h>
+#include <vlc_charset.h>
+#include <vlc_fs.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <arpa/inet.h>
+#include <errno.h>
/* From GStreamer's v4l plugin:
* Because of some really cool feature in video4linux1, also known as
#include <linux/videodev.h>
#include "videodev_mjpeg.h"
+#ifdef HAVE_LIBV4L1
+#include <libv4l1.h>
+#endif
/*****************************************************************************
* Module descriptior
*****************************************************************************/
es_out_id_t *p_es;
};
+#ifndef HAVE_LIBV4L1
+# define v4l1_close close
+# define v4l1_ioctl ioctl
+# define v4l1_mmap mmap
+# define v4l1_munmap munmap
+# define v4l1_open vlc_open
+#endif
+
/*****************************************************************************
* Open: opens v4l device
*****************************************************************************
es_format_Init( &fmt, VIDEO_ES, p_sys->i_fourcc );
fmt.video.i_width = p_sys->i_width;
fmt.video.i_height = p_sys->i_height;
- fmt.video.i_aspect = 4 * VOUT_ASPECT_FACTOR / 3;
+ fmt.video.i_sar_num = 4 * fmt.video.i_height;
+ fmt.video.i_sar_den = 3 * fmt.video.i_width;
/* Setup rgb mask for RGB formats */
switch( p_sys->i_fourcc )
demux_sys_t *p_sys = p_demux->p_sys;
free( p_sys->psz_device );
- if( p_sys->i_fd >= 0 ) close( p_sys->i_fd );
+ if( p_sys->i_fd >= 0 ) v4l1_close( p_sys->i_fd );
if( p_sys->b_mjpeg )
{
int i_noframe = -1;
- ioctl( p_sys->i_fd, MJPIOC_QBUF_CAPT, &i_noframe );
+ v4l1_ioctl( p_sys->i_fd, MJPIOC_QBUF_CAPT, &i_noframe );
}
if( p_sys->p_video_mmap && p_sys->p_video_mmap != MAP_FAILED )
{
if( p_sys->b_mjpeg )
- munmap( p_sys->p_video_mmap, p_sys->mjpeg_buffers.size *
+ v4l1_munmap( p_sys->p_video_mmap, p_sys->mjpeg_buffers.size *
p_sys->mjpeg_buffers.count );
else
- munmap( p_sys->p_video_mmap, p_sys->vid_mbuf.size );
+ v4l1_munmap( p_sys->p_video_mmap, p_sys->vid_mbuf.size );
}
free( p_sys );
/* Special for access_demux */
case DEMUX_CAN_PAUSE:
case DEMUX_CAN_SEEK:
- case DEMUX_SET_PAUSE_STATE:
case DEMUX_CAN_CONTROL_PACE:
pb = (bool*)va_arg( args, bool * );
*pb = false;
case DEMUX_GET_PTS_DELAY:
pi64 = (int64_t*)va_arg( args, int64_t * );
- *pi64 = (int64_t)var_GetInteger( p_demux, "v4l-caching" ) * 1000;
+ *pi64 = var_GetInteger( p_demux, "v4l-caching" ) * 1000;
return VLC_SUCCESS;
case DEMUX_GET_TIME:
{
demux_sys_t *p_sys = p_demux->p_sys;
- char *psz_dup = strdup( p_demux->psz_path );
+ char *psz_dup = strdup( p_demux->psz_location );
char *psz_parser = psz_dup;
while( *psz_parser && *psz_parser != ':' )
}
else if( !strncmp( psz_parser, "fps=", strlen( "fps=" ) ) )
{
- p_sys->f_fps = strtof( psz_parser + strlen( "fps=" ),
- &psz_parser );
+ p_sys->f_fps = us_strtof( psz_parser + strlen( "fps=" ),
+ &psz_parser );
}
else if( !strncmp( psz_parser, "adev=", strlen( "adev=" ) )
|| !strncmp( psz_parser, "samplerate=", strlen( "samplerate=" ) )
struct mjpeg_params mjpeg;
int i;
- if( ( i_fd = open( psz_device, O_RDWR ) ) < 0 )
+ if( ( i_fd = v4l1_open( psz_device, O_RDWR ) ) < 0 )
{
msg_Err( p_demux, "cannot open device (%m)" );
goto vdev_failed;
}
- if( ioctl( i_fd, VIDIOCGCAP, &p_sys->vid_cap ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGCAP, &p_sys->vid_cap ) < 0 )
{
msg_Err( p_demux, "cannot get capabilities (%m)" );
goto vdev_failed;
}
vid_channel.channel = p_sys->i_channel;
- if( ioctl( i_fd, VIDIOCGCHAN, &vid_channel ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGCHAN, &vid_channel ) < 0 )
{
msg_Err( p_demux, "cannot get channel infos (%m)" );
goto vdev_failed;
}
vid_channel.norm = p_sys->i_norm;
- if( ioctl( i_fd, VIDIOCSCHAN, &vid_channel ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSCHAN, &vid_channel ) < 0 )
{
msg_Err( p_demux, "cannot set channel (%m)" );
goto vdev_failed;
if( p_sys->i_tuner >= 0 )
{
vid_tuner.tuner = p_sys->i_tuner;
- if( ioctl( i_fd, VIDIOCGTUNER, &vid_tuner ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGTUNER, &vid_tuner ) < 0 )
{
msg_Err( p_demux, "cannot get tuner (%m)" );
goto vdev_failed;
/* FIXME FIXME to be checked FIXME FIXME */
//vid_tuner.mode = p_sys->i_norm;
- if( ioctl( i_fd, VIDIOCSTUNER, &vid_tuner ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSTUNER, &vid_tuner ) < 0 )
{
msg_Err( p_demux, "cannot set tuner (%m)" );
goto vdev_failed;
if( p_sys->i_frequency >= 0 )
{
int driver_frequency = p_sys->i_frequency * 16 /1000;
- if( ioctl( i_fd, VIDIOCSFREQ, &driver_frequency ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSFREQ, &driver_frequency ) < 0 )
{
msg_Err( p_demux, "cannot set frequency (%m)" );
goto vdev_failed;
if( p_sys->i_audio >= 0 )
{
vid_audio.audio = p_sys->i_audio;
- if( ioctl( i_fd, VIDIOCGAUDIO, &vid_audio ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGAUDIO, &vid_audio ) < 0 )
{
msg_Err( p_demux, "cannot get audio (%m)" );
goto vdev_failed;
/* unmute audio */
vid_audio.flags &= ~VIDEO_AUDIO_MUTE;
- if( ioctl( i_fd, VIDIOCSAUDIO, &vid_audio ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSAUDIO, &vid_audio ) < 0 )
{
msg_Err( p_demux, "cannot set audio (%m)" );
goto vdev_failed;
* or height */
if( p_sys->b_mjpeg )
{
- struct quicktime_mjpeg_app1 *p_app1;
+ struct quicktime_mjpeg_app1 p_app1;
int32_t i_offset;
- if( ioctl( i_fd, MJPIOC_G_PARAMS, &mjpeg ) < 0 )
+ if( v4l1_ioctl( i_fd, MJPIOC_G_PARAMS, &mjpeg ) < 0 )
{
msg_Err( p_demux, "cannot get mjpeg params (%m)" );
goto vdev_failed;
mjpeg.APP_len = 40;
/* aligned */
- p_app1 = (struct quicktime_mjpeg_app1 *)mjpeg.APP_data;
- p_app1->i_reserved = 0;
- p_app1->i_tag = VLC_FOURCC( 'm','j','p','g' );
- p_app1->i_field_size = 0;
- p_app1->i_padded_field_size = 0;
- p_app1->i_next_field = 0;
+ p_app1.i_reserved = 0;
+ p_app1.i_tag = VLC_FOURCC( 'm','j','p','g' );
+ p_app1.i_field_size = 0;
+ p_app1.i_padded_field_size = 0;
+ p_app1.i_next_field = 0;
/* XXX WARNING XXX */
/* these's nothing magic about these values. We are dangerously
* assuming the encoder card is encoding mjpeg-a and is not throwing
* does conform to standards outside of Apple Quicktime.
*/
i_offset = 0x2e;
- p_app1->i_DQT_offset = hton32( i_offset );
+ p_app1.i_DQT_offset = hton32( i_offset );
i_offset = 0xb4;
- p_app1->i_DHT_offset = hton32( i_offset );
+ p_app1.i_DHT_offset = hton32( i_offset );
i_offset = 0x258;
- p_app1->i_SOF_offset = hton32( i_offset );
+ p_app1.i_SOF_offset = hton32( i_offset );
i_offset = 0x26b;
- p_app1->i_SOS_offset = hton32( i_offset );
+ p_app1.i_SOS_offset = hton32( i_offset );
i_offset = 0x279;
- p_app1->i_data_offset = hton32( i_offset );
+ p_app1.i_data_offset = hton32( i_offset );
+ memcpy(mjpeg.APP_data, &p_app1, sizeof(struct quicktime_mjpeg_app1));
/* SOF and SOS aren't specified by the mjpeg API because they aren't
* optional. They will be present in the output. */
mjpeg.jpeg_markers = JPEG_MARKER_DHT | JPEG_MARKER_DQT;
- if( ioctl( i_fd, MJPIOC_S_PARAMS, &mjpeg ) < 0 )
+ if( v4l1_ioctl( i_fd, MJPIOC_S_PARAMS, &mjpeg ) < 0 )
{
msg_Err( p_demux, "cannot set mjpeg params (%m)" );
goto vdev_failed;
{
struct video_window vid_win;
- if( ioctl( i_fd, VIDIOCGWIN, &vid_win ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGWIN, &vid_win ) < 0 )
{
msg_Err( p_demux, "cannot get win (%m)" );
goto vdev_failed;
if( !p_sys->b_mjpeg )
{
/* set hue/color/.. */
- if( ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 )
{
struct video_picture vid_picture = p_sys->vid_picture;
{
vid_picture.contrast = p_sys->i_contrast;
}
- if( ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 )
{
msg_Dbg( p_demux, "v4l device uses brightness: %d",
vid_picture.brightness );
}
/* Find out video format used by device */
- if( ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGPICT, &p_sys->vid_picture ) == 0 )
{
struct video_picture vid_picture = p_sys->vid_picture;
char *psz;
free( psz );
if( vid_picture.palette &&
- !ioctl( i_fd, VIDIOCSPICT, &vid_picture ) )
+ !v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) )
{
p_sys->vid_picture = vid_picture;
}
{
/* Try to set the format to something easy to encode */
vid_picture.palette = VIDEO_PALETTE_YUV420P;
- if( ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 )
{
p_sys->vid_picture = vid_picture;
}
else
{
vid_picture.palette = VIDEO_PALETTE_YUV422P;
- if( ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCSPICT, &vid_picture ) == 0 )
{
p_sys->vid_picture = vid_picture;
}
p_sys->mjpeg_buffers.count = 8;
p_sys->mjpeg_buffers.size = MJPEG_BUFFER_SIZE;
- if( ioctl( i_fd, MJPIOC_REQBUFS, &p_sys->mjpeg_buffers ) < 0 )
+ if( v4l1_ioctl( i_fd, MJPIOC_REQBUFS, &p_sys->mjpeg_buffers ) < 0 )
{
msg_Err( p_demux, "mmap unsupported" );
goto vdev_failed;
}
- p_sys->p_video_mmap = mmap( 0,
+ p_sys->p_video_mmap = v4l1_mmap( 0,
p_sys->mjpeg_buffers.size * p_sys->mjpeg_buffers.count,
PROT_READ | PROT_WRITE, MAP_SHARED, i_fd, 0 );
if( p_sys->p_video_mmap == MAP_FAILED )
/* queue up all the frames */
for( i = 0; i < (int)p_sys->mjpeg_buffers.count; i++ )
{
- if( ioctl( i_fd, MJPIOC_QBUF_CAPT, &i ) < 0 )
+ if( v4l1_ioctl( i_fd, MJPIOC_QBUF_CAPT, &i ) < 0 )
{
msg_Err( p_demux, "unable to queue frame" );
goto vdev_failed;
else
{
/* Fill in picture_t fields */
- vout_InitPicture( VLC_OBJECT(p_demux), &p_sys->pic, p_sys->i_fourcc,
- p_sys->i_width, p_sys->i_height, p_sys->i_width *
- VOUT_ASPECT_FACTOR / p_sys->i_height );
- if( !p_sys->pic.i_planes )
+ if( picture_Setup( &p_sys->pic, p_sys->i_fourcc,
+ p_sys->i_width, p_sys->i_height,
+ 1, 1 ) )
{
msg_Err( p_demux, "unsupported chroma" );
goto vdev_failed;
(char*)&p_sys->i_fourcc );
/* Allocate mmap buffer */
- if( ioctl( i_fd, VIDIOCGMBUF, &p_sys->vid_mbuf ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCGMBUF, &p_sys->vid_mbuf ) < 0 )
{
msg_Err( p_demux, "mmap unsupported" );
goto vdev_failed;
}
- p_sys->p_video_mmap = mmap( 0, p_sys->vid_mbuf.size,
+ p_sys->p_video_mmap = v4l1_mmap( 0, p_sys->vid_mbuf.size,
PROT_READ|PROT_WRITE, MAP_SHARED,
i_fd, 0 );
if( p_sys->p_video_mmap == MAP_FAILED )
p_sys->vid_mmap.width = p_sys->i_width;
p_sys->vid_mmap.height = p_sys->i_height;
p_sys->vid_mmap.format = p_sys->vid_picture.palette;
- if( ioctl( i_fd, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 )
+ if( v4l1_ioctl( i_fd, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 )
{
msg_Warn( p_demux, "%4.4s refused", (char*)&p_sys->i_fourcc );
msg_Err( p_demux, "chroma selection failed" );
vdev_failed:
- if( i_fd >= 0 ) close( i_fd );
+ if( i_fd >= 0 ) v4l1_close( i_fd );
return -1;
}
p_sys->vid_mmap.frame = (p_sys->i_frame_pos + 1) % p_sys->vid_mbuf.frames;
- while( ioctl( p_sys->i_fd, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 )
+ while( v4l1_ioctl( p_sys->i_fd, VIDIOCMCAPTURE, &p_sys->vid_mmap ) < 0 )
{
if( errno != EAGAIN )
{
msg_Dbg( p_demux, "grab failed, trying again" );
}
- while( ioctl(p_sys->i_fd, VIDIOCSYNC, &p_sys->i_frame_pos) < 0 )
+ while( v4l1_ioctl(p_sys->i_fd, VIDIOCSYNC, &p_sys->i_frame_pos) < 0 )
{
if( errno != EAGAIN && errno != EINTR )
{
/* re-queue the last frame we sync'd */
if( p_sys->i_frame_pos != -1 )
{
- while( ioctl( p_sys->i_fd, MJPIOC_QBUF_CAPT,
+ while( v4l1_ioctl( p_sys->i_fd, MJPIOC_QBUF_CAPT,
&p_sys->i_frame_pos ) < 0 )
{
if( errno != EAGAIN && errno != EINTR )
}
/* sync on the next frame */
- while( ioctl( p_sys->i_fd, MJPIOC_SYNC, &sync ) < 0 )
+ while( v4l1_ioctl( p_sys->i_fd, MJPIOC_SYNC, &sync ) < 0 )
{
if( errno != EAGAIN && errno != EINTR )
{