diff options
Diffstat (limited to 'libvo/vo_ivtv.c')
-rw-r--r-- | libvo/vo_ivtv.c | 305 |
1 files changed, 0 insertions, 305 deletions
diff --git a/libvo/vo_ivtv.c b/libvo/vo_ivtv.c deleted file mode 100644 index d745701159..0000000000 --- a/libvo/vo_ivtv.c +++ /dev/null @@ -1,305 +0,0 @@ -/* - * video output for WinTV PVR-150/250/350 (a.k.a IVTV) cards - * TV-Out through hardware MPEG decoder - * Based on some old code from ivtv driver authors. - * See http://ivtvdriver.org/index.php/Main_Page for more details on the - * cards supported by the ivtv driver. - * - * Copyright (C) 2006 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/ivtv.h> -#include <linux/ioctl.h> - -#include "mp_msg.h" -#include "subopt-helper.h" -#include "video_out.h" -#include "video_out_internal.h" -#include "vo_ivtv.h" -#include "libmpdemux/mpeg_packetizer.h" - -#define DEFAULT_MPEG_DECODER "/dev/video16" -#define IVTV_VO_HDR "VO: [ivtv]" - -/* ivtv private */ -int ivtv_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} -}; - -static const vo_info_t info = -{ - "IVTV MPEG Video Decoder TV-Out", - "ivtv", - "Benjamin Zores", - "" -}; -const LIBVO_EXTERN (ivtv) - -/* ivtv internals */ - -static uint32_t -ivtv_reset (int blank_screen) -{ - struct ivtv_cfg_stop_decode sd; - struct ivtv_cfg_start_decode sd1; - int flags = 0; - - if (blank_screen) - flags |= IVTV_STOP_FL_HIDE_FRAME; - sd.flags = flags; - - if (ioctl (ivtv_fd, IVTV_IOC_STOP_DECODE, &sd) < 0) - { - mp_msg (MSGT_VO, MSGL_ERR, - "IVTV_IOC_STOP_DECODE: %s\n", strerror (errno)); - return 1; - } - - sd1.gop_offset = 0; - sd1.muted_audio_frames = 0; - - if (ioctl (ivtv_fd, IVTV_IOC_START_DECODE, &sd1) < 0) - { - mp_msg (MSGT_VO, MSGL_ERR, - "IVTV_IOC_START_DECODE: %s\n", strerror (errno)); - return 1; - } - - return 0; -} - -int -ivtv_write (const unsigned char *data, int len) -{ - if (ivtv_fd < 0) - return 0; - - return write (ivtv_fd, data, len); -} - -/* video out functions */ - -static int -config (uint32_t width, uint32_t height, - uint32_t d_width, uint32_t d_height, - uint32_t fullscreen, char *title, uint32_t format) -{ - return 0; -} - -static int -preinit (const char *arg) -{ - struct v4l2_output vout; - int err; - - if (subopt_parse (arg, subopts) != 0) - { - mp_msg (MSGT_VO, MSGL_FATAL, - "\n-vo ivtv command line help:\n" - "Example: mplayer -vo ivtv: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); - - ivtv_fd = open (device, O_RDWR); - if (ivtv_fd < 0) - { - free (device); - mp_msg (MSGT_VO, MSGL_FATAL, "%s %s\n", IVTV_VO_HDR, strerror (errno)); - return -1; - } - - /* list available outputs */ - vout.index = 0; - err = 1; - mp_msg (MSGT_VO, MSGL_INFO, "%s Available video outputs: ", IVTV_VO_HDR); - while (ioctl (ivtv_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 (ivtv_fd, VIDIOC_S_OUTPUT, &output) < 0) - { - mp_msg (MSGT_VO, MSGL_ERR, - "%s can't set output (%s)\n", IVTV_VO_HDR, strerror (errno)); - free (device); - return -1; - } - } - - /* display device name */ - mp_msg (MSGT_VO, MSGL_INFO, "%s using %s\n", IVTV_VO_HDR, device); - free (device); - - /* display current video output */ - if (ioctl (ivtv_fd, VIDIOC_G_OUTPUT, &output) == 0) - { - vout.index = output; - if (ioctl (ivtv_fd, VIDIOC_ENUMOUTPUT, &vout) < 0) - { - mp_msg (MSGT_VO, MSGL_ERR, - "%s can't get output (%s).\n", IVTV_VO_HDR, strerror (errno)); - return -1; - } - else - mp_msg (MSGT_VO, MSGL_INFO, - "%s video output: %s\n", IVTV_VO_HDR, vout.name); - } - else - { - mp_msg (MSGT_VO, MSGL_ERR, - "%s can't get output (%s).\n", IVTV_VO_HDR, strerror (errno)); - return -1; - } - - /* clear output */ - ivtv_reset (1); - - return 0; -} - -static void -draw_osd (void) -{ - /* do nothing */ -} - -static int -draw_frame (uint8_t * src[]) -{ - pes = (vo_mpegpes_t *) src[0]; - return 0; -} - -static void -flip_page (void) -{ - if (ivtv_fd < 0) - return; - - if (!pes) - return; - - send_mpeg_pes_packet (pes->data, pes->size, pes->id, - pes->timestamp ? pes->timestamp : vo_pts, 2, - ivtv_write); - - /* ensure flip_page() won't be called twice */ - pes = NULL; -} - -static int -draw_slice (uint8_t *image[], int stride[], int w, int h, int x, int y) -{ - return 0; -} - -static void -uninit (void) -{ - if (ivtv_fd < 0) - return; - - /* clear output */ - ivtv_reset (1); - - /* close device */ - close (ivtv_fd); - ivtv_fd = -1; -} - -static void -check_events (void) -{ - /* do nothing */ -} - -static int -query_format (uint32_t format) -{ - if (format != IMGFMT_MPEGPES) - return 0; - - return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_TIMER; -} - -static int -control (uint32_t request, void *data) -{ - switch (request) - { - case VOCTRL_PAUSE: - case VOCTRL_RESUME: - return ivtv_reset (0); - - case VOCTRL_RESET: - return ivtv_reset (1); - - case VOCTRL_QUERY_FORMAT: - return query_format (*((uint32_t*) data)); - } - - return VO_NOTIMPL; -} |