diff options
Diffstat (limited to 'libvo/vo_v4l2.c')
-rw-r--r-- | libvo/vo_v4l2.c | 254 |
1 files changed, 0 insertions, 254 deletions
diff --git a/libvo/vo_v4l2.c b/libvo/vo_v4l2.c deleted file mode 100644 index 2f5d0f138a..0000000000 --- a/libvo/vo_v4l2.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * video output for V4L2 hardware MPEG decoders - * - * Copyright (C) 2007 Benjamin Zores - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#include <inttypes.h> -#include <linux/types.h> -#include <linux/videodev2.h> -#include <linux/ioctl.h> - -#include "mp_msg.h" -#include "subopt-helper.h" -#include "video_out.h" -#include "libmpcodecs/vfcap.h" -#include "libmpcodecs/mp_image.h" -#include "libmpdemux/mpeg_packetizer.h" -#include "vo_v4l2.h" - -#define DEFAULT_MPEG_DECODER "/dev/video16" -#define V4L2_VO_HDR "VO: [v4l2]" - -int v4l2_fd = -1; -static vo_mpegpes_t *pes; - -/* suboptions */ -static int output = -1; -static char *device = NULL; - -static const opt_t subopts[] = { - {"output", OPT_ARG_INT, &output, int_non_neg}, - {"device", OPT_ARG_MSTRZ, &device, NULL}, - {NULL} -}; - -int v4l2_write(const unsigned char *data, int len) -{ - if (v4l2_fd < 0) - return 0; - - return write(v4l2_fd, data, len); -} - -/* video out functions */ - -static int config(struct vo *vo, uint32_t width, uint32_t height, - uint32_t d_width, uint32_t d_height, - uint32_t fullscreen, uint32_t format) -{ - return 0; -} - -static int preinit(struct vo *vo, const char *arg) -{ - struct v4l2_output vout; - struct v4l2_ext_controls ctrls; - int err; - - if (subopt_parse(arg, subopts) != 0) { - mp_msg(MSGT_VO, MSGL_FATAL, - "\n-vo v4l2 command line help:\n" - "Example: mplayer -vo v4l2:device=/dev/video16:output=2\n" - "\nOptions:\n" - " device=/dev/videoX\n" - " Name of the MPEG decoder device file.\n" - " output=<0-...>\n" - " V4L2 id of the TV output.\n" - "\n"); - return -1; - } - - if (!device) - device = strdup(DEFAULT_MPEG_DECODER); - - v4l2_fd = open(device, O_RDWR); - if (v4l2_fd < 0) { - free(device); - mp_msg(MSGT_VO, MSGL_FATAL, "%s %s\n", V4L2_VO_HDR, strerror(errno)); - return -1; - } - - /* check for device hardware MPEG decoding capability */ - ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG; - ctrls.count = 0; - ctrls.controls = NULL; - - if (ioctl(v4l2_fd, VIDIOC_G_EXT_CTRLS, &ctrls) < 0) { - free(device); - mp_msg(MSGT_OPEN, MSGL_FATAL, "%s %s\n", V4L2_VO_HDR, strerror(errno)); - return -1; - } - - /* list available outputs */ - vout.index = 0; - err = 1; - mp_msg(MSGT_VO, MSGL_INFO, "%s Available video outputs: ", V4L2_VO_HDR); - while (ioctl(v4l2_fd, VIDIOC_ENUMOUTPUT, &vout) >= 0) { - err = 0; - mp_msg(MSGT_VO, MSGL_INFO, "'#%d, %s' ", vout.index, vout.name); - vout.index++; - } - if (err) { - mp_msg(MSGT_VO, MSGL_INFO, "none\n"); - free(device); - return -1; - } else - mp_msg(MSGT_VO, MSGL_INFO, "\n"); - - /* set user specified output */ - if (output != -1) { - if (ioctl(v4l2_fd, VIDIOC_S_OUTPUT, &output) < 0) { - mp_msg(MSGT_VO, MSGL_ERR, - "%s can't set output (%s)\n", V4L2_VO_HDR, strerror(errno)); - free(device); - return -1; - } - } - - /* display device name */ - mp_msg(MSGT_VO, MSGL_INFO, "%s using %s\n", V4L2_VO_HDR, device); - free(device); - - /* display current video output */ - if (ioctl(v4l2_fd, VIDIOC_G_OUTPUT, &output) == 0) { - vout.index = output; - if (ioctl(v4l2_fd, VIDIOC_ENUMOUTPUT, &vout) < 0) { - mp_msg(MSGT_VO, MSGL_ERR, - "%s can't get output (%s).\n", V4L2_VO_HDR, strerror(errno)); - return -1; - } else - mp_msg(MSGT_VO, MSGL_INFO, - "%s video output: %s\n", V4L2_VO_HDR, vout.name); - } else { - mp_msg(MSGT_VO, MSGL_ERR, - "%s can't get output (%s).\n", V4L2_VO_HDR, strerror(errno)); - return -1; - } - - return 0; -} - -static void draw_osd(struct vo *vo, struct osd_state *osd) -{ - /* do nothing */ -} - -static uint32_t draw_image(struct vo *vo, mp_image_t *mpi) -{ - pes = (vo_mpegpes_t *) (mpi->planes[0]); - return 0; -} - -static void flip_page(struct vo *vo) -{ - if (v4l2_fd < 0) - return; - - if (!pes) - return; - - send_mpeg_pes_packet(pes->data, pes->size, pes->id, - pes->timestamp ? pes->timestamp : vo_pts, 2, - v4l2_write); - - /* ensure flip_page() won't be called twice */ - pes = NULL; -} - -static int draw_slice(struct vo *vo, uint8_t *image[], int stride[], - int w, int h, int x, int y) -{ - return 0; -} - -static void uninit(struct vo *vo) -{ - if (v4l2_fd < 0) - return; - - /* close device */ - close(v4l2_fd); - v4l2_fd = -1; -} - -static void check_events(struct vo *vo) -{ - /* do nothing */ -} - -static int query_format(struct vo *vo, uint32_t format) -{ - if (format != IMGFMT_MPEGPES) - return 0; - - return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_TIMER; -} - -static int control(struct vo *vo, uint32_t request, void *data) -{ - switch (request) { - case VOCTRL_QUERY_FORMAT: - return query_format(vo, *((uint32_t *) data)); - case VOCTRL_DRAW_IMAGE: - return draw_image(vo, data); - } - - return VO_NOTIMPL; -} - -const struct vo_driver video_out_v4l2 = { - .is_new = false, - .info = &(const vo_info_t) { - "V4L2 MPEG Video Decoder Output", - "v4l2", - "Benjamin Zores", - "" - }, - .preinit = preinit, - .config = config, - .control = control, - .draw_slice = draw_slice, - .draw_osd = draw_osd, - .flip_page = flip_page, - .check_events = check_events, - .uninit = uninit, -}; |